TensorFlowを理解するための基礎情報共有(6)

前回の投稿からあっという間に1年が経過しましたが、皆さんいかがお過ごしでしょうか?TensorFlowの発表と公開(2015年11月)から1年以上経ち、巷の大企業の「人工知能を使った○○」という売り文句も耳慣れた感じがします。と同時に、スマホが普及する前に各社の各携帯電話で仕様が異なるために一般的にはまだモバイル・インターネットが普及していなかった頃(2005年ごろ)のような「敷居が高い」感じの足踏み感も伺えます。こうした俯瞰的な話を含めて今後は定期的に投稿していきますので宜しくお願いいたします。


前回はMNIST For ML Beginnersで難しい箇所について言及しました。

 前回 http://qiita.com/MATS_ELB/items/db85de80c72be28fc60b

今回は多くの方が足踏みする箇所に見えるDeep MNIST for Expertsについての補足説明です。Expertsになって急に難しくなりました。この章では「Multilayer Convolutional Network(多層畳み込みネットワーク)」という話がページ中盤から出てきて、まずはこの「多層畳み込みネットワーク」の考案のの背景にある話の流れから言及します。

 章の前半では「MNIST For ML Beginners」で登場したモデルの作り方が語られています(Pythonのコードは「MNIST For ML Beginners」と同じなので前回の記述を参照されたし)。このモデルは下記のような1層からなるモデルで、認識する28 pixel x 28 pixel(合計784 pixel)の画像を全てのピクセルを1行にした1次元の入力データとして学習および評価させるシンプルなものでした[図1]。

図1 MNIST For ML Beginnersで用いた一層の単純なニューラルネットワークモデル

これを使って1000回の学習(毎回50セットの画像を読ませたので学習した画像はのべ50000枚)を行ってみると精度は91%だったと。精度が低すぎる。この精度の低さは何が原因か考え下記のように考えたそうです。

 アイディア1:層を複数にしたらいいのでは?

理論上は入力と出力の関係を表す数式が細かくなって繊細になり精度が上がるはずなのだが、やってみたところニューラルネットワークの特徴である「学習(誤差逆伝播法/バックプロパゲーション:出力に出た誤差を修正するためひとつ手前の層の重みを調整し、そうするとその前の層の重みをこれくらい調整し。。。)」において、入力に近い層の重みがブレて精度が期待したほど上がらないという由々しき事態(過学習)に遭遇した。まるで、曲がらない棒で黒板を指すと棒の先は思い通りに定まるが、いろんな場所を指せるよう棒に関節をいくつもつけたら棒がクニャクニャ曲がって棒の先がうまく定まらないのと似た状態です。そこで再び考えた↓。

 アイディア2:学習する際に一部の重みを無視して感度を下げたらいいのでは?

ということで、学習する際に各層の各重み全てを修正するのではなくて、一部(確率的に選ぶことが多いようです)を学習時には無視して残りの重みだけ修正するという「学習感度を下げる」方法を編み出した。これを「Dropout(ドロップアウト)」と呼びます。これにより学習のブレは抑制できましたが、さらに下記のように考えた↓。

 アイディア3:そもそも、画像を1行のデータにして入力するのは適切なのか?

これは学習データが画像であるから改善方法として出るアイディアで全てのタイプの学習に適用される手法ではありませんが、例えば、画像に表現されている絵(A)が全体で右に1ピクセル移動した画像(B)があった場合、人間の脳はほぼ同じ絵と認識するはずなのに、画像を1行のデータにしてしまうと(A)と(B)はまったく異なるデータとなってしまい、ニューラルネットワークは非常に理不尽な学習をしてしまうだろうと。このような画像の枝葉末節な違いではなく、人間が映像を捉える時のように「少しざっくりと、画像としての特徴をつかむような」捉え方をしたデータをニューラルネットワークの入力にしてはどうかと。

上記の経緯を経て、本性で扱われる「多層畳み込みネットワーク」が考案されたとのことです。


次回の投稿では、技術や数学の観点を少し離れて、「この一年の機械学習・人工知能の発展推移を見て考える、あるべき今後と課題」に言及します。