ディープラーニングの入門にChainer(on Jupyter Notebook)でのハンズオン形式での実践が最適だった

f:id:karaage:20171002221628p:plain:w640

Chainerでディープラーニング

 ここのところ、ディープラーニングはTensorFlowを使っていました。その前はChainerも使っていたのですが、Chainer v2.0になり、以前画像認識とか試していたコードも動かなくなってしまい、やる気を失っていたのですよね。

 そんな折、たまたまNVIDIAの機械学習のセミナを受ける機会があったのですが、GPU(Titan)積んだサーバに、Jupyterの環境が構築されていて、参加者はサーバにアクセスしてエンターキー連打していくだけでそれっぽい結果が出て、凄いやった気分になるし、絶対初心者は自分で環境出来ないからNVIDIAの環境にお金払うことになるしで、とてもよく設計されたセミナでした。

 と書くと凄い悪徳セミナのようですが、Jupyterを使って、説明を読んでから、実際にコードを実行してその結果を確認していくというハンズオン形式は、理論と実践を一気にやれるので、かなり学習効率高いのではないのかと実感したのも事実です。セミナで使ったJupyter Notebookはネットで公開しちゃダメと言われたのですが、講師もPFNの人だったので、どうせネットに同じような内容で公開してるだろと探したら、ほぼ同じものや、もっと良さそうなものがGitHubに転がっていたので、復習がてらforkして自分のMacに環境構築して、GPU無しで動くように修正してみました。

 このハンズオン形式のチュートリアル、あんまり知られてないようで、勿体無いなと感じたので、環境構築も含め公開してみたいと思います。ちなみに、この記事ではディープラーニングでのニューラルネットワークの最適化を「学習」、人間がディープラーニングの学習することをを「勉強」と使い分けます。あまり勉強という言葉は好きではないのですが、紛らわしいので。

 そもそも、ディープラーニングって人工知能とか機械学習と何が違うの?という人は、以下の記事をみてみるか、そのままそっ閉じしていただいた方が良いかと思います。

Chainerのハンズオン形式でのディープラーニング入門

 教科書となるのは、PFNのエンジニアの@sla さんと、@mitmul さんの以下のリポジトリです。

chainer-handson/chainer.ipynb at master · hido/chainer-handson · GitHub

GitHub - mitmul/chainer-handson: ハンズオンの資料

 ただ、LinuxでCUDA使うことが前提になっていたり、そのままではリンク切れで動かないところや、学習に時間がかかり過ぎるなど、個人環境で試すには色々問題があったので、forkしてMacでCPUだけでも環境構築してCtrl+Enterを押していけば動くように改造しましたので、今回はこちらを使っていきます。

GitHub - karaage0703/chainer-handson-1: Self-learning hands-on for Chainer by Jupyter notebook

GitHub - karaage0703/chainer-handson-2: ハンズオンの資料

環境設定

 環境設定は、以下記事を参考にして雑にセットアップして下さい。

 ターミナル開いて、記事の通りにひたすらコマンドをコピペしていけば環境セットアップできるはずです。できなかったらゴメンなさい。以下にpip freezeで出力されるライブラリのバージョン(関連する1部のみ)を記載しておきます。今回の内容は、Chainer ver2で全て動作しました。Macでしか動作確認はしていませんが、Linuxでも基本的にはほぼそのままで動くと思います。

$ pip freeze
chainer==2.1.0
jupyter==1.0.0
numpy==1.12.1
matplotlib==2.0.2
Pillow==4.1.1

事前学習

 ディープラーニングの概略に関しては、以下参照下さい。

 あとは、やはり以下の本を読むのが良いでしょう(名著です)。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 ざっと一通り本を読んでから、実践しながらわからないところを本で調べるというのが一番良いかなと個人的には思います。Chainerに関する本は、読まなくてもよいかなと(個人的には)思います。

Chainerでのネットワークの設計から学習・テストまでの流れ(MNIST)

 まずは、MNISTという手書きの文字認識を例題に、Chainerでの学習の流れから、ネットワークの設計のコツ、テストまでを手を動かしながら勉強しましょう。

 今回は、以下のリポジトリを使います。

GitHub - karaage0703/chainer-handson-1: Self-learning hands-on for Chainer by Jupyter notebook

 元々は、GPUでの学習を想定しているようですが、iMac 2017年モデル(3.6GHz Intel Core i7/ Memory 16G) くらいなら、CPUでも20秒もかからず学習終わりました。

 試すには、以下コマンド実行して、ファイルをダウンロード(clone)した後、Jupyter Notebookを起動して下さい。

$ git clone https://github.com/karaage0703/chainer-handson-1
$ cd ./chainer-handson-1
$ jupyter notebook

 最後の行を実行すると、以下のようなJupyterの画面が表示されます

f:id:karaage:20171002221620p:plain:w640
 こんなの

 chainer-ja.ipynbというjupyterのノートブックをクリックしましょう。すると以下のようにノートブックが開かれます。

f:id:karaage:20171002221628p:plain:w640

 あとは、解説を「ふむふむ」と頷きながら読み、ひたすらコードを実行していくだけです。コードの実行はCtrlキーを押しながらEnterです。

f:id:karaage:20171002221636p:plain:w640
 環境が正しくセットアップされていると、ブラウザ上でpythonのコードが実行されていきます

 このチュートリアルで、ディープラーニングでの学習の仕方とChainerの基本的な使い方が習得できるようになっています。素晴らしいですね。もし途中でエラーが出たら、環境設定がうまくいっていないので、エラーメッセージと格闘しましょう。良くあるのが、ライブラリのバージョン違いですね。

Trainerを使った学習

 続いては、TrainerというChainerで学習を行う時の便利な機能に関して勉強しましょう。実は、先ほどのチュートリアルでもTrainerを使っているのですが、ここでは、Trainerを使わない例と使う例の両方を実践することによって理解を深めます。また、ネットワークの設計や、最適化に関しても詳しく書いてあるので、こちらで先ほどのチュートリアルを補完するのが良いと思います(例えば、学習率の設定の仕方は先ほどのチュートリアルには書いてありません)。

 ここからは、以下のリポジトリを使用していきます。

GitHub - karaage0703/chainer-handson-2: ハンズオンの資料

 実践に関しては、以下コマンド実行ください。

$ git clone https://github.com/karaage0703/chainer-handson-2
$ cd ../chainer-handson-2
$ jupyter notebook

 あとは、先ほどと同じ要領で以下のTrainerを使わない例と

1-Write-the-training-loop_ja

 以下のTrainerを使った例を読みながらコードを1行ずつ実行していくと理解が深まるでしょう(きっと)

2-Try-Trainer-class_ja.ipynb

ネットワークの作り方(CIFAR10)

 CIFAR10という32x32サイズの小さなカラー画像の画像認識を例題に、ネットワークを変えると認識率がどのように変わるかを実際に体感しながら勉強します。

 ここは、先ほどのリポジトリの以下ファイルを使用します。

3-Write-your-own-network_ja.ipynb

 上記ファイルを開いて、先ほどと同様に説明を読みながら、Ctrl+Enterを押してコードを実行していきましょう。ここでは、CPUだと学習に11時間くらいかかりました。寝ている間に計算させるか、私の結果だけを見て満足するなどして下さい。

データのN増しの効果確認

 次は、以下のファイルを使用して、データのN増しの効果を確認します。

4-Write-your-own-dataset-class_ja.ipynb

 TensorFlowだと、データN増しできる関数が用意されていたりするのですが、ここではnumpyの標準機能で、クロップや反転を行っています。汎用性があるので、これはこれで参考になりますね。こちらも学習に10時間程度かかるので、学習まで実際にやるかはお好みで。

応用例(146種類のアニメキャラクタ顔画像を90%以上の精度で分類)

 一般的なデータセットを使って、分類をさせてみるという応用例です。中身は以下のファイルとなります。

5-Write-new-dataset-class_ja.md

 データセットのダウンロードから、Caffeの学習済みのニューラルネットワークをファインチューニングして精度評価して、実際にテストしてみるという一連の流れを試しながら理解できます。これが出来るようになれば、自前のデータにも簡単に応用が利きそうですね。

Jupyterサーバを立てる

 ディープラーニングの勉強とは直接関係ないですが、Jupyterはサーバで実行して、他のPCのブラウザ上で実行するといったこともできます。デフォルトでは、外部からは設定できないので、以下実行して設定ファイルを生成します。

$ jupyter notebook --generate-config

 あとは、~/.jupyter/jupyter_notebook_config.pyを以下コマンドで編集します。

$ vim ~/.jupyter/jupyter_notebook_config.py

 設定ファイルを以下1行書き換えると、外部からアクセスが可能になります。

c.NotebookApp.ip = '*'

 あとは、jupyter notebookを起動した後に表示される以下のアドレスをコピペして、localhostをサーバのIPアドレスに書き換えてアクセスしましょう。

 Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=xxx

 具体的には、サーバのIPが192.168.100.10だったら、以下のようなアドレスをブラウザに入力します。

http://192.168.100.10:8888/?token=xxx

 例えば、機械学習用のサーバを1つ立てておけば、ブラウザさえあればいつでも、どこでも機械学習ができるので便利ですね。iPhoneからでもJupyter Notebookサーバにアクセスすることでも可能です。もっともまともに操作できないので、ほとんど役には立ちませんが。

f:id:karaage:20171011000141p:plain:w480

まとめ

 ディープラーニングの勉強用のJupyter Notebookと、CPUのみのローカル環境の構築方法、Jupyterサーバの立て方を紹介しました。

 やってることはCtrl + Enterを押していくだけなので、勉強にならないかと思いきや、文章読みながら1行ずつ実行して結果を見るという行為は、本を読むだけよりは断然理解した気になると思います。もちろん、写経したり自分でフルスクラッチで書く程ではないと思いますが、初心者でも気軽に試せますし、学習効率はかなり良いのではないかと思います。騙されたと思って一度試して見て下さい。本当に騙されたらゴメンなさい(ペコリ)。

 あと、日本語のチュートリアルがあるのも、やはり日本人にとっては嬉しいかなとは思います。問題は、Chainerのバージョンアップの速さですね。ver2が出たばかりというのに、既にver3がどうのとか。ver3でもこのチュートリアル動くのだろうか…

参考リンク

Chainerでアニメキャラクターの顔画像を分類する - Qiita

External examples · chainer/chainer Wiki · GitHub

GitHub - mitmul/chainer-handson: ハンズオンの資料

chainer-handson/chainer-tutorial-for-beginners_ja.md at master · mitmul/chainer-handson · GitHub

Deep LearningフレームワークChainerと最近の技術動向

Jupyter notebook を Web サーバー (Apache) で公開する | 計算化学屋のタマゴ