人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

深層学習ライブラリ Keras

ここ1年くらいDeep Learning Tutorialを読みながらTheanoというライブラリで深層学習のアルゴリズムを実装してきた。

深層学習の基本的なアルゴリズムならTheanoでガリガリ書くこともできたがより高度なアルゴリズムをTheanoでスクラッチから書くのはとてもきつい*1

そんなわけでPylearn2Lasagnenolearnなどの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さんによる独自集計のようなので多少割引が必要かも(?)

Kerasによる実装例

Kerasのサンプルコードを見てみよう。たとえば、MNISTの分類を行う多層ニューラルネットワークは下のように実装できる。素のTheanoによる実装(2015/6/18)と比べるとかなりシンプルに書けることがわかる。個人的な意見だがネットワーク構造の書き方はChainerによる実装(2015/10/5)よりも直感的かもしれない。

  • ニューラルネットの構造はmodelにさまざまなレイヤをadd()することで構築する。
  • 活性化関数やDropoutも層とみなす。
  • modelのコンパイル時に最適化アルゴリズム(例ではRMSprop)と誤差関数(例では交差エントロピー)を指定する。誤差関数として平均二乗誤差も使える。
  • 最適化アルゴリズムは基本的なSGDからより効率的なAdamRMSpropまで一通りそろっている。実装もシンプルなのでアルゴリズムの勉強にもなる。
  • 学習は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のクローンなんてのもあるけどどうやって学習・実行するんだろう・・・

というわけでDeep LearningライブラリKerasの紹介でした。日本ではあまり話題になっていないようでQiitaではまだ5件くらいしか投稿がない・・・今後しばらくは海外のサイトに潜入していろんな人のKerasによる実装から最先端の手法を勉強していきたい。

Keras関連の記事(NEW!

*1:GoogleのTensorflowも調べてみたがこれもTheanoと同じ低レイヤのライブラリでこれを使って高度なアルゴリズムをスクラッチから記述するのは同様にきつい

制限ボルツマンマシン (RBM) の導出 (2)

制限ボルツマンマシン (RBM) の導出 (1) (2016/3/20)のつづき。前回は可視層を固定したときの隠れ層の分布と隠れ層を固定したときの可視層の分布を導出した。今回は、RBMの対数尤度関数の導出とそのパラメータでの偏微分の式を導出していきたい。

深層学習 Deep Learning (監修:人工知能学会)

深層学習 Deep Learning (監修:人工知能学会)

  • 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
  • 出版社/メーカー: 近代科学社
  • 発売日: 2015/11/05
  • メディア: 単行本
  • この商品を含むブログ (1件) を見る

対数尤度関数

可視変数の分布

尤度関数を定義するにあたって観測データが与えられる可視変数のみの分布が必要になる。まずは下の式 (2.44) を導出する。

f:id:aidiary:20160320085001p:plain

まず左辺を展開していく。この展開は前回もやったので途中は多少はしょった。

f:id:aidiary:20160320085210p:plain

ここで

f:id:aidiary:20160320085300p:plain

とおくと

f:id:aidiary:20160320085321p:plain

が得られる。あれ?右辺と同じにならない・・・というわけで今度は右辺を展開していく。

f:id:aidiary:20160320085711p:plain

左辺と右辺が同じ式になったので

f:id:aidiary:20160320085451p:plain

となり、式 (2.44) が導出できた。

尤度関数

f:id:aidiary:20160320085834p:plain

この尤度関数を得るために先ほどの可視変数のみの分布が必要になる。展開は対数をとってからにしよう。

対数尤度関数

f:id:aidiary:20160320085938p:plain

この導出で先ほどの可視変数の分布(式2.44)を利用した。また、\lambda_j は観測データ v_i^{(\mu)} を含むためインデックス \mu に依存する。

対数尤度関数のパラメータに対する勾配の導出

RBMは可視層のバイアスパラメータ b_i、隠れ層のバイアスパラメータ c_j、重みパラメータ w_{ij} の3種類があるのでそれぞれ偏微分を求める。

可視層のバイアスパラメータ (2.45)

先ほどの対数尤度関数を b_i で偏微分すると下の式になる。対数尤度関数の2項目は b_i と無関係の項なので消えてしまう。3項目の Z(\theta)b_i の関数なので偏微分の対象として残る。

f:id:aidiary:20160320132744p:plain

2項目の偏微分をさらに進める。ここも前回やったので多少はしょる。

f:id:aidiary:20160320090644p:plain

よって、

f:id:aidiary:20160320092846p:plain

となり、式 (2.45) が導出できた。

隠れ層のバイアスパラメータ (2.46)

対数尤度関数を c_j で偏微分すると下の式になる。対数尤度関数の1項目は c_j と無関係の項なので消えてしまう。c_j なんてない?と思ったが、\lambda_j^{(\mu)}Z(\theta)c_j を含むので偏微分の対象となる。

f:id:aidiary:20160320091251p:plain

1つめの偏微分を進める。

f:id:aidiary:20160320091406p:plain

2つめの偏微分を進める。

f:id:aidiary:20160320091428p:plain

これらの結果を合わせると

f:id:aidiary:20160320091450p:plain

となり、式 (2.46) が導出できた。

重みパラメータ (2.47)

式 (2.46) とほとんど同じだが導出しておこう。式の大部分はコピペで作れるから(笑)対数尤度関数を w_{ij} で偏微分すると下の式になる。

f:id:aidiary:20160320091742p:plain

1つめの偏微分を進める。

f:id:aidiary:20160320091809p:plain

2つめの偏微分を進める。

f:id:aidiary:20160320091905p:plain

これらの結果を合わせると

f:id:aidiary:20160320091925p:plain

となり、式 (2.47) が導出できた。

近似計算の必要性

コスト関数(costまたはloss)は対数尤度関数にマイナス記号をつけた負の対数尤度関数(Negative Log Likelihood: NLL)とすればよい。対数尤度関数の最大化はコスト関数の最小化と同じ意味になる。そのためコスト関数のパラメータによる勾配は

f:id:aidiary:20160320134211p:plain

となる。よって、あとは一般的な勾配降下法を使えばパラメータを学習できる!と思いきやRBMの場合はそう簡単にはいかない。

これらの式の右辺の1項目は観測データから求められるが、2項目は現在のパラメータ \theta におけるモデルの期待値なのでモデルの変数集合のあらゆる v_i, h_j の状態について確率を重みとした和を取る必要がある。

この計算はRBMのユニット数が多くなると指数関数的に増加する。たとえば、MNISTデータの場合、可視層のユニット数は 28 \cdot 28 = 784 でそれぞれが0または1をとるので最低でも  2^{784} 個の重み付き和を計算しないといけない。さらに隠れ層のユニットが入るとその組み合わせはさらに膨大になる。

このように2項目の期待値は厳密には求められないため近似的に求めようという話になりMCMCの一種であるGibbs sampling平均場近似という近似手法が導入された。しかし、ニューラルネットの場合、上の勾配の計算はパラメータ \theta が更新されるたびに何度も何度も再計算が必要なためこれらの近似手法でさえまだ計算コストが高い。そういう状況で提案されたのがHintonさんによるContrastive divergence (CD) 法であり、ニューラルネットワークのブレークスルーになったという流れだと理解している。

ここまで来てようやくRBMの実装に取りかかれる。RBMの数式は確率が入るためこれまでの手法に比べてかなり複雑だけれど、実装もそれに劣らず複雑なので気合いを入れて取り掛かりたい。

制限ボルツマンマシン (RBM) の導出 (1)

ボルツマンマシン(隠れ変数あり)の導出(2016/3/12)のつづき。Deep Learningの基礎モデルとして有名な制限ボルツマンマシン(Restricted Boltzmann Machine: RBM)を導出したい。深層学習の2.7節に当たる。前回と同様に表記法はこの本に準拠する。

深層学習 Deep Learning (監修:人工知能学会)

深層学習 Deep Learning (監修:人工知能学会)

  • 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
  • 出版社/メーカー: 近代科学社
  • 発売日: 2015/11/05
  • メディア: 単行本
  • この商品を含むブログ (1件) を見る

  • 可視変数のみのボルツマンマシンの導出(2.4節)
  • 隠れ変数ありのボルツマンマシンの導出(2.5節)
  • 制限ボルツマンマシンの導出(2.7節)

この本の説明も十分わかりやすいが制限ボルツマンマシンのよい解説をいくつか見つけたので参考にしたサイトを上げておく。

ほとんどの資料は最終的な式しか書かれておらずどうやって導出したのかぱっと見ではわからなかった。この記事ではその導出過程をまとめておきたい。

定義

エネルギー関数

f:id:aidiary:20160316185653p:plain

可視層と隠れ層のバイアス項を分けている。

ボルツマン分布

f:id:aidiary:20160316185748p:plain

分配関数

f:id:aidiary:20160316185808p:plain

可視層を固定した上での隠れ層の条件付き分布 (2.42) の導出

RBMの特殊なグラフ構造で成り立つ下の式 (2.42) を導出する。

f:id:aidiary:20160316190021p:plain

f:id:aidiary:20160316190603p:plain

この式は可視層のユニットを固定すると隠れ軸のユニット間で条件付き独立性が成り立つことを意味している。実際は、RBMを無向グラフィカルモデルとみなすと二つの隠れユニット間の経路を可視層が遮断するので条件付き独立が成り立つことは数式がなくてもグラフ構造を見るだけですぐにわかる。

さっそく導出しよう。

f:id:aidiary:20160316190913p:plain

まず分子から展開する。

f:id:aidiary:20160316195706p:plain

この段階では何でこんな展開が必要なのか意味不明だがあとできいてくる。

次に分母を展開。分子とほとんど同じだが周辺化のための  \displaystyle \sum_{h} がついてまわる。

f:id:aidiary:20160316195712p:plain

この式の後半部分をさらに細かく展開する。

f:id:aidiary:20160316191439p:plain

ここで隠れユニットの数はm個でバイナリユニット(0または1の値を取る)と仮定している。この展開では2式目から3式目への変換に気付けるかがキモな気がする。下のように同じ構造でもっと簡単な式で確認すると納得できる。

f:id:aidiary:20160316191555p:plain

f:id:aidiary:20160316191602p:plain

これまでの分母の展開をまとめると結局

f:id:aidiary:20160316191833p:plain

となる。さらに分子と分母の結果をまとめると

f:id:aidiary:20160316204627p:plain

分子と分母の前半部分はまったく同じなのでばっさり消える。ここで

f:id:aidiary:20160316192052p:plain

f:id:aidiary:20160316192212p:plain

と置く。2つめの式はシグモイド信念(sigmoid belief)と呼ばれる式とのこと。この本以外ではお目にかかったことないけど。最終的に

f:id:aidiary:20160316192103p:plain

となり、式 (2.42) が得られた。証明終了!

この本には載っていないが、ついでに隠れ層のj番目のユニットが1を取る確率も導出しておこう。この式はユニットから値をサンプリングするときに重要になる。

f:id:aidiary:20160316204043p:plain

隠れ層を固定した上での可視層の条件付き分布 (2.43) の導出

次に式 (2.43) を導出する。これが最終目標。

f:id:aidiary:20160316203150p:plain

先ほどは可視層を固定したときの隠れ層の分布だったが、今回は逆で隠れ層を固定したときの可視層の分布だ。こちらはhとvが逆なだけでほとんど同じだけど導出しておこう。途中は少しはしょる。

f:id:aidiary:20160316203233p:plain

分子は

f:id:aidiary:20160316203242p:plain

分母は

f:id:aidiary:20160316210144p:plain

分子と分母から

f:id:aidiary:20160316203259p:plain

ここで

f:id:aidiary:20160316203306p:plain

と置くと

f:id:aidiary:20160316203311p:plain

となり、式 (2.43) が導出できた!

ついでに可視層のi番目のユニットが1を取る確率も導出しておこう。

f:id:aidiary:20160316204142p:plain

長くなったのでいったんここで切る。次はRBMの対数尤度関数とパラメータでの偏微分の式を導出したい。