深層学習ライブラリ Keras
ここ1年くらいDeep Learning Tutorialを読みながらTheanoというライブラリで深層学習のアルゴリズムを実装してきた。
深層学習の基本的なアルゴリズムならTheanoでガリガリ書くこともできたがより高度なアルゴリズムをTheanoでスクラッチから書くのはとてもきつい*1。
そんなわけでPylearn2、Lasagne、nolearnなどのTheanoベースのラッパーライブラリをいろいろ調べていたのだが、結局のところKerasというライブラリが一番よさげだと思った。KerasはバックエンドとしてTheanoとTensorflowの両方が使え、より高レイヤな表現(たぶんChainerと同レベル)で深層学習のさまざまなアルゴリズムが記述できる。TheanoやTensorflowは完全に隠蔽されており、Kerasで書かれたプログラムはまったく修正せずにTheanoとTensorflowをいつでも切り替えられる。
Kerasの特徴は
- Modularity
- Minimalism
- Easy extensibility
- Work with Python
の4つ。バックエンドのTheanoによる記述がシンプルで読みやすかったのが調べてみようと思ったきっかけ。
Kerasのメイン開発者はGoogleのFrançois Cholletさん。GithubとTwitterのアイコンがいかした人だ。KerasはGoogleのメインプロダクトではなさそうだがTensorflowのラッパーライブラリとしても将来有望に感じている。下のGithubにおける深層学習ライブラリランキングの結果を見ても人気が高く、海外では開発者も多そうだ。ただこれはCholletさんによる独自集計のようなので多少割引が必要かも(?)
The state of deep learning frameworks: March 2016. pic.twitter.com/awrollWEq9
— François Chollet (@fchollet) 2016年3月15日
Kerasによる実装例
Kerasのサンプルコードを見てみよう。たとえば、MNISTの分類を行う多層ニューラルネットワークは下のように実装できる。素のTheanoによる実装(2015/6/18)と比べるとかなりシンプルに書けることがわかる。個人的な意見だがネットワーク構造の書き方はChainerによる実装(2015/10/5)よりも直感的かもしれない。
- ニューラルネットの構造は
model
にさまざまなレイヤをadd()
することで構築する。 - 活性化関数やDropoutも層とみなす。
model
のコンパイル時に最適化アルゴリズム(例ではRMSprop)と誤差関数(例では交差エントロピー)を指定する。誤差関数として平均二乗誤差も使える。- 最適化アルゴリズムは基本的なSGDからより効率的なAdam、RMSpropまで一通りそろっている。実装もシンプルなのでアルゴリズムの勉強にもなる。
- 学習はscikit-learn(2015/8/10)と同じく
fit()
というメソッドでできる。Kerasは基本的に教師あり学習しか考えておらずRBMのような教師なし学習を実装するには自作が必要。 - 収束判定のEarly-stoppingはコールバックとして実装されており、収束したら自動的にループが止まるようになっている。
- バリデーションデータは明示的に指定することもできるが、例のように訓練データの10%だけ使うといった指定ができる。
fit()
の戻り値のhistory
オブジェクトに各エポックのコストや精度が保存されるためあとで結果をプロットするのに使える。verbose=1
と指定することで下のように学習の進捗をリアルタムに棒グラフで表示してくれる。各エポックにかかった時間、訓練データのloss/accuracy、バリデーションデータのloss/accuracyも一緒に表示される。あとどれくらい学習に時間がかかりそうか見積もりできて便利!
Using Theano backend. Using gpu device 0: GeForce GTX 760 Ti OEM (CNMeM is disabled, CuDNN not available) train samples: (60000L, 784L) test samples: (10000L, 784L) building the model ... Train on 54000 samples, validate on 6000 samples Epoch 1/100 54000/54000 [==============================] - 3s - loss: 0.2969 - acc: 0.9092 - val_loss: 0.1136 - val_acc: 0.9640 Epoch 2/100 54000/54000 [==============================] - 3s - loss: 0.1204 - acc: 0.9631 - val_loss: 0.0855 - val_acc: 0.9765 Epoch 3/100 54000/54000 [==============================] - 3s - loss: 0.0839 - acc: 0.9739 - val_loss: 0.0706 - val_acc: 0.9815 Epoch 4/100 28032/54000 [==============>...............] - ETA: 1s - loss: 0.0660 - acc: 0.9797
当然ながら畳み込みニューラルネットやリカレントニューラルネットを書く機能もある。たとえば、畳み込みニューラルネットのモデルは下のように書ける。
またBatch Normalization、ZCA白色化、Data Augmentationなどを行うクラス(ImageDataGenerator)も用意されている。
最先端手法の実装
最先端の論文に出てくるようなアルゴリズムもKerasによる実装が公開されている。最近話題になったAlphaGoのクローンなんてのもあるけどどうやって学習・実行するんだろう・・・
- Gaussian RBM
- Deep dream
- Neural style transfer
- Generative adversarial network
- DCGAN
- VGG-16
- Deep Q-learning - Lasagne版 はもっとすごい
- Music generation
- AlphaGo
というわけでDeep LearningライブラリKerasの紹介でした。日本ではあまり話題になっていないようでQiitaではまだ5件くらいしか投稿がない・・・今後しばらくは海外のサイトに潜入していろんな人のKerasによる実装から最先端の手法を勉強していきたい。
Keras関連の記事(NEW!)
- 深層学習ライブラリ Keras(2016/3/28)
- Kerasはじめます(2016/10/18)
- Kerasのインストール(2016/10/24)
- Kerasによる2クラスロジスティック回帰(2016/10/30)
- Kerasによる2クラス分類(Pima Indians Diabetes)(2016/11/3)
- Kerasによる多クラス分類(Iris)(2016/11/8)
- KerasでMNIST(2016/11/9)
- Kerasによる畳み込みニューラルネットワークの実装(2016/11/20)
- KerasでCIFAR-10の一般物体認識(2016/11/27)
- Kerasによるデータ拡張(2016/12/12)
- KerasでVGG16を使う(2017/1/4)
- VGG16のFine-tuningによる犬猫認識 (1)(2017/1/8)
- VGG16のFine-tuningによる犬猫認識 (2)(2017/1/10)
- VGG16のFine-tuningによる17種類の花の分類(2017/1/31)
- 畳み込みニューラルネットワークの可視化(2017/2/16)
*1:GoogleのTensorflowも調べてみたがこれもTheanoと同じ低レイヤのライブラリでこれを使って高度なアルゴリズムをスクラッチから記述するのは同様にきつい
制限ボルツマンマシン (RBM) の導出 (2)
制限ボルツマンマシン (RBM) の導出 (1) (2016/3/20)のつづき。前回は可視層を固定したときの隠れ層の分布と隠れ層を固定したときの可視層の分布を導出した。今回は、RBMの対数尤度関数の導出とそのパラメータでの偏微分の式を導出していきたい。
深層学習 Deep Learning (監修:人工知能学会)
- 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
- 出版社/メーカー: 近代科学社
- 発売日: 2015/11/05
- メディア: 単行本
- この商品を含むブログ (1件) を見る
対数尤度関数
可視変数の分布
尤度関数を定義するにあたって観測データが与えられる可視変数のみの分布が必要になる。まずは下の式 (2.44) を導出する。
まず左辺を展開していく。この展開は前回もやったので途中は多少はしょった。
ここで
とおくと
が得られる。あれ?右辺と同じにならない・・・というわけで今度は右辺を展開していく。
左辺と右辺が同じ式になったので
となり、式 (2.44) が導出できた。
尤度関数
この尤度関数を得るために先ほどの可視変数のみの分布が必要になる。展開は対数をとってからにしよう。
対数尤度関数
この導出で先ほどの可視変数の分布(式2.44)を利用した。また、 は観測データ を含むためインデックス に依存する。
対数尤度関数のパラメータに対する勾配の導出
RBMは可視層のバイアスパラメータ 、隠れ層のバイアスパラメータ 、重みパラメータ の3種類があるのでそれぞれ偏微分を求める。
可視層のバイアスパラメータ (2.45)
先ほどの対数尤度関数を で偏微分すると下の式になる。対数尤度関数の2項目は と無関係の項なので消えてしまう。3項目の は の関数なので偏微分の対象として残る。
2項目の偏微分をさらに進める。ここも前回やったので多少はしょる。
よって、
となり、式 (2.45) が導出できた。
隠れ層のバイアスパラメータ (2.46)
対数尤度関数を で偏微分すると下の式になる。対数尤度関数の1項目は と無関係の項なので消えてしまう。 なんてない?と思ったが、 と が を含むので偏微分の対象となる。
1つめの偏微分を進める。
2つめの偏微分を進める。
これらの結果を合わせると
となり、式 (2.46) が導出できた。
重みパラメータ (2.47)
式 (2.46) とほとんど同じだが導出しておこう。式の大部分はコピペで作れるから(笑)対数尤度関数を で偏微分すると下の式になる。
1つめの偏微分を進める。
2つめの偏微分を進める。
これらの結果を合わせると
となり、式 (2.47) が導出できた。
近似計算の必要性
コスト関数(costまたはloss)は対数尤度関数にマイナス記号をつけた負の対数尤度関数(Negative Log Likelihood: NLL)とすればよい。対数尤度関数の最大化はコスト関数の最小化と同じ意味になる。そのためコスト関数のパラメータによる勾配は
となる。よって、あとは一般的な勾配降下法を使えばパラメータを学習できる!と思いきやRBMの場合はそう簡単にはいかない。
これらの式の右辺の1項目は観測データから求められるが、2項目は現在のパラメータ におけるモデルの期待値なのでモデルの変数集合のあらゆる の状態について確率を重みとした和を取る必要がある。
この計算はRBMのユニット数が多くなると指数関数的に増加する。たとえば、MNISTデータの場合、可視層のユニット数は でそれぞれが0または1をとるので最低でも 個の重み付き和を計算しないといけない。さらに隠れ層のユニットが入るとその組み合わせはさらに膨大になる。
このように2項目の期待値は厳密には求められないため近似的に求めようという話になりMCMCの一種であるGibbs sampling、平均場近似という近似手法が導入された。しかし、ニューラルネットの場合、上の勾配の計算はパラメータ が更新されるたびに何度も何度も再計算が必要なためこれらの近似手法でさえまだ計算コストが高い。そういう状況で提案されたのがHintonさんによるContrastive divergence (CD) 法であり、ニューラルネットワークのブレークスルーになったという流れだと理解している。
ここまで来てようやくRBMの実装に取りかかれる。RBMの数式は確率が入るためこれまでの手法に比べてかなり複雑だけれど、実装もそれに劣らず複雑なので気合いを入れて取り掛かりたい。
制限ボルツマンマシン (RBM) の導出 (1)
ボルツマンマシン(隠れ変数あり)の導出(2016/3/12)のつづき。Deep Learningの基礎モデルとして有名な制限ボルツマンマシン(Restricted Boltzmann Machine: RBM)を導出したい。深層学習の2.7節に当たる。前回と同様に表記法はこの本に準拠する。
深層学習 Deep Learning (監修:人工知能学会)
- 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
- 出版社/メーカー: 近代科学社
- 発売日: 2015/11/05
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 可視変数のみのボルツマンマシンの導出(2.4節)
- 隠れ変数ありのボルツマンマシンの導出(2.5節)
- 制限ボルツマンマシンの導出(2.7節)
この本の説明も十分わかりやすいが制限ボルツマンマシンのよい解説をいくつか見つけたので参考にしたサイトを上げておく。
- 制限付きボルツマンマシンの初心者向けガイド
- RBMから考えるDeep Learning ~黒魔術を添えて~
- Restricted Boltzmann Machine の導出に至る自分用まとめ (PDF)
- Theano 入門
- Theano で Deep Learning <6>: 制約付きボルツマンマシン <前編>
- RBMのtheanoコード解説
- コンストラスティブ・ダイバージェンス法を用いた制限ボルツマンマシン(RBM)の実装
- scikit-learnのRBM
- An Introduction to Restricted Boltzmann Machines (PDF)
- Learning Deep Architecture for AI Chapter 5 Energy-Based Models and Boltzmann Machines (PDF)
- A Practical Guide to Training Restricted Boltzmann Machines (PDF)
ほとんどの資料は最終的な式しか書かれておらずどうやって導出したのかぱっと見ではわからなかった。この記事ではその導出過程をまとめておきたい。
定義
エネルギー関数
可視層と隠れ層のバイアス項を分けている。
ボルツマン分布
分配関数
可視層を固定した上での隠れ層の条件付き分布 (2.42) の導出
RBMの特殊なグラフ構造で成り立つ下の式 (2.42) を導出する。
この式は可視層のユニットを固定すると隠れ軸のユニット間で条件付き独立性が成り立つことを意味している。実際は、RBMを無向グラフィカルモデルとみなすと二つの隠れユニット間の経路を可視層が遮断するので条件付き独立が成り立つことは数式がなくてもグラフ構造を見るだけですぐにわかる。
さっそく導出しよう。
まず分子から展開する。
この段階では何でこんな展開が必要なのか意味不明だがあとできいてくる。
次に分母を展開。分子とほとんど同じだが周辺化のための がついてまわる。
この式の後半部分をさらに細かく展開する。
ここで隠れユニットの数はm個でバイナリユニット(0または1の値を取る)と仮定している。この展開では2式目から3式目への変換に気付けるかがキモな気がする。下のように同じ構造でもっと簡単な式で確認すると納得できる。
これまでの分母の展開をまとめると結局
となる。さらに分子と分母の結果をまとめると
分子と分母の前半部分はまったく同じなのでばっさり消える。ここで
と置く。2つめの式はシグモイド信念(sigmoid belief)と呼ばれる式とのこと。この本以外ではお目にかかったことないけど。最終的に
となり、式 (2.42) が得られた。証明終了!
この本には載っていないが、ついでに隠れ層のj番目のユニットが1を取る確率も導出しておこう。この式はユニットから値をサンプリングするときに重要になる。
隠れ層を固定した上での可視層の条件付き分布 (2.43) の導出
次に式 (2.43) を導出する。これが最終目標。
先ほどは可視層を固定したときの隠れ層の分布だったが、今回は逆で隠れ層を固定したときの可視層の分布だ。こちらはhとvが逆なだけでほとんど同じだけど導出しておこう。途中は少しはしょる。
分子は
分母は
分子と分母から
ここで
と置くと
となり、式 (2.43) が導出できた!
ついでに可視層のi番目のユニットが1を取る確率も導出しておこう。
長くなったのでいったんここで切る。次はRBMの対数尤度関数とパラメータでの偏微分の式を導出したい。