弱教師あり学習　snorkelの実装

#1.はじめに
初投稿です。
大学のゼミナールでsnorkelというpythonライブラリの実装を行ったので、snorkelについての簡単な説明とsnorkelの実装について投稿しました。
snorkelは日本語の情報が少なく、私自身ライブラリの実装に苦戦したので、snorkelの実装の参考になればなと思いこの記事を書きました。
**【注意】**Windowsでの実装となっています。
#2.snorkelとは
snorkelについて軽く説明します。
![alt](https://d229noksprj98s.cloudfront.net/wp-content/uploads/2020/07/labelling-data-using-snorkel.png)

+ snorkelはstanford大学で開発された、教師付き学習で必要になるラベル付きデータを簡単に作成することができるオープンソースのpythonライブラリ。
+ 通常、データのラベル付けは手作業によって行われており、大量のラベル付きデータの作成は時間とコストがかかる。
+ また、データの評価は時間とともに変化するので、ラベル付けされた古いデータは適切なデータであるとは限らない。
+ そこで、snorkelを用いいることで、ラベル付けされていないデータ(生データ)を機械的にラベル付き訓練データへと変換することができるようになる。
+ データの評価方法は変更できるので、ラベル付けされた大量のデータのラベル変更が容易にできる。
+ この手法は弱教師あり学習と呼ばれている。

snorkelの詳しい概要や機能についてはこちらを参考にしてください。
>・[snorkel AI(会社のページ)](https://snorkel.ai/)
>・[snorkel(ライブラリのページ)](https://www.snorkel.org/)


#3.snorkelの実装
snorkelの実装の手順は以下の順で行います。
・[3.1.Git Bashのインストール](3.1.Git Bashのインストール)
・[3.2.Windows版Linuxの実装](3.2.Windows版Linuxの実装])
・[3.3.snorkelのインストール](3.3.snorkelのインストール)
3.1と3.2は自分が参考にしたqiitaの記事を載せているだけです。

##3.1.Gitのインストール
Gitのインストールは以下のqiitaの記事を参考にしてください。
>・[いまさらGit for Windowsのインストール、GitHubに接続してみた。](https://qiita.com/manabu-watanabe/items/ecf1b434baf305adaa00)

##3.2.Windows版Linuxの実装
snorkelの実装はWindowsであればdockerかWindows Subsystem for Linux(以下WSLと略します)で実装すると書いてあり、dockerで行うとエラーが多いといわれたのでWSLで実装しました。
WSLの実装方法は以下のqiitaの記事を参考にしてください。
>・[Windows Subsystem for Linux (WSL1) をインストールしてみよう！]
(https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)

**【補足】**

+ 「Windowsの機能の有効化または無効化」で「Windows Subsystem for Linux」が見つからない人は「Linux用Windows サブシステム」と書かれている項目を探してください。
+ 記事に書かれている「パッケージのアップデート」まで実行してください。

##3.3.snorkelのインストール
snorkelのインストール手順が載っている[Gettting started](https://github.com/snorkel-team/snorkel-tutorials#getting-started)に沿って、snorkel(snorkel-tutorials)をインストールしていきます。

1.コマンドプロンプト（CLI）を開き、以下のコマンドを入力して一般ユーザーを作成します。

```bash
bash                    #bashを開く？
adduser <name>          # ユーザを作成
usermod -aG sudo <name> # 作成したユーザへ管理者権限を付与
su <name>               # 作成したユーザへ変更
cd                      # ホーム階層へ移動
```
2.sudoコマンドを用いたモジュールのインストールを行います。

```bash
sudo apt install unzip                       #unzipを入れないとエラーが出たので入れた
sudo add-apt-repository ppa:deadsnakes/ppa　 #同様にエラーが出たため入れた
sudo apt-get install python3.6               #snorkelはpython3.6を用いている
sudo apt-get install python3-virtualenv      #仮想環境を作るためのモジュール
sudo apt install curl                        #あとで使う
sudo apt install jupyter-notebook            #jupyter-notebookのインストール
```
3.[Gettting started](https://github.com/snorkel-team/snorkel-tutorials#getting-started)に従ってgit cloneとsnorkel-tutorials用のディレクトリを作成します。

```bash
git clone https://github.com/snorkel-team/snorkel-tutorials.git
cd snorkel-tutorials
```
4.python3のコマンドを用いて以下のモジュールをインストールします。
 tensorboardとtensorlowが競合するというエラーが表示されますが気にしないでください。

```bash
python3 -m pip install tensorboard　
#1.15.0以上であればよい
pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.14.0-py3-none-any.whl
#tensorlowの1.14.0を入れる
python3 -m pip install pandas==0.25 #pandasの0.25を入れる
```
5.[Gettting started](https://github.com/snorkel-team/snorkel-tutorials#getting-started)に従ってvirtualenvの仮想環境を作るとエラーが出るため、venvを用いて以下のようにpython3.6の仮想環境を作成します。

```bash
python3.6 -m venv --without-pip .envspam                 #pipなしで仮想環境を作る
source .envspam/bin/activate                             #仮想環境を開く
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py  #仮想環境下でpipを再インストール
python get-pip.py
```
6.requirementsのインストールを行います。エラーが起こる場所はほとんどこの場所でした。

```bash
pip3 install -r requirements.txt
pip3 install -r spam/requirements.txt
```
7.最後にjupyter notebookでspamのディレクトリを開いておしまいです。jupyter notebookが開けない人は下2つのコマンドからURLを取得しコピペしてください。

```bash
jupyter notebook spam
jupyter notebook --no-browser --port=8888 spam  #spamのディレクトリを開く
jupyter notebook --no-browser --port=8000 ./    #現在のディレクトリ(snorkel-tutorials)を開く
```
おまけ.snorkelの各チュートリアル(8つ)を実行する際に必要なモジュールのインストールは以下のコマンドを打ち込むことで解決できます。

```bash
pip install pytorch-transformers
pip install pil
pip install torchvision
pip install gdown
```
#4.終わりに
Linux(Ubuntu)を用いた環境作り自体初めてだったので研究室の先生に何度も質問しながら実装することができました。
今回はsnorkelの実装について書きましたが、次回はチュートリアルの一つであるYoutube spamの説明やゼミナールの発表内容についての記事を書こうと思うので、見てもらえると幸いです。
ありがとうございました。

**【追記】**
3.3のおまけを追加し、文脈がおかしい箇所を修正しました。(2021/02/25)