こんにちは、DSOC R&Dの糟谷です。
ニューラルネットの世界は日進月歩、まさにDog Yearの様相を呈しております。
私も2004年に卒業論文のテーマとしてリカレントニューラルネットについて研究しておりました。現役で研究していた時代から15年、Dog Yearにかけて犬に例えると、小型犬の15歳は人間でいうと76歳らしいですから、私はニューラルネットについては老人ということになります。
'パーセプトロン''バックプロパゲーション'など、当時からある知識は覚えていますが、逆にそれが邪魔をして、最新の知識をいきなり吸収しようとすると拒絶反応が出てしまいます。「あの時の理論では、~と言われていたじゃないか、今は何が変わったのか」と疑問を持ってしまって勉強が進みません。
そんなわけで、失われた15年を取り戻すべく、歴史をたどって一つひとつ知識を埋めていこうと思います。
ディープラーニングの歴史
さて、歴史について調べるためWikipediaのディープラーニングの歴史の欄を読んでいきましょう。
ja.wikipedia.org
(ソースがWikipediaでいいのかという議論はご勘弁ください)
長らく冬の時代が続いていたニューラルネットワークであるが、2006年にジェフリー・ヒントンによってスタックドオートエンコーダなど多層にネットワークを積み重ねる手法が提唱され、さらに2012年には物体の認識率を競うILSVRCにおいてジェフリー・ヒントン率いるトロント大学のチームがディープラーニングによって従来の手法(エラー率26%)に比べてエラー率17%と実に10%もの劇的な進歩を遂げたことが機械学習の研究者らに衝撃を与えた。
とあります。
2006年のオートエンコーダーが一つのブレークスルーのきっかけであったようです。その後2012年のAlexNetで大ブレークしたということで、この二つをしっかり理解することを目標とします。
なお、私は冬の時代にニューラルネットをあきらめ、当時もっと実用的であったSVMなどの機械学習アルゴリズムやDPマッチングを用いた最近傍法を使用するように方向転換しました。
Wikipediaに書かれているように、当時は3層ですべての関数が近似でき、勾配が消失して4層以上やっても精度が変わらないという話もあり、4層以上にしてみようと思ったこともありますが、実験まではしなかったのを覚えています。思い込みは怖いですね。
オートエンコーダー
というわけで今回はオートエンコーダーを試していきます。
オートエンコーダーについて書かれた2006年のレポートはこちらから読むことができます。
オートエンコーダーは、入力層と出力層に同じベクトルを与えて学習させます。この時、中間層のニューロンの数を入出力層より小さくし、中間層の出力を取り出すと、データを圧縮できるというアイデアです。
ただ、画像ならJPEGやPNGなどといった、いわゆる圧縮方法と異なり、データ量が劇的に減るわけではなく、ロスも大きいです。一方、圧縮されたベクトルは元データの重要な部分だけを含むので、パターン認識をするのに効果的です。
上記レポートによるとオートエンコーダーは主成分分析を非線形に拡張したものであるとして提案されています。
スタックドオートエンコーダーは、オートエンコーダーで圧縮したベクトルをさらに同様の方法で圧縮するというようなことを繰り返し、データを圧縮します。圧縮する層と展開する層をつなげて、最後に全体を学習することで効果的に多層のニューラルネットワークを学習することができます。
上記のレポートでは2000次元を1000次元に、1000次元を500次元に、500次元を30次元に圧縮していきます。
しかし、ここで疑問が出てきます。3層のニューラルネットワークですべての関数が近似できるとしたら、いきなり2000次元を30次元に圧縮することはできないのでしょうか。本当に多層に分けて少しずつやっていくのが効果的なのでしょうか。
実験
そんなわけで、実験してみます。自身の勉強のため、ニューラルネットのプログラムはすべてC#で自分で実装しました。
上記の文献では制限付きボルツマンマシンのコントラスティブ・ダイバージェンス法という学習を用いていますが、今回は普通にバックプロパゲーションで学習してしまいます。
学習するデータとしては、MNISTの手書き数字画像1000件を用いました。
MNISTの画像は28×28の784次元のベクトルと考えることができます。
これを50次元に圧縮するのに、3層(784=>50=>784)と5層(784=>100=>50=>100=>784)の場合を評価しました。さらに30次元に圧縮するのに、3層(784=>30=>784)と5層(784=>100=>30=>100=>784)の場合を評価しました。
評価は学習に使用したデータとは別のデータ100件を用意し、圧縮と復元を行った画像の二乗誤差と画像自体の目視で行いました。
また、今回ファインチューニングは時間の関係で実施できずでした。今後トライしていきたいと思います。
実験結果はこちらです。
確かに一足飛びに50次元に圧縮するより、100に圧縮するステップを踏んでからさらに圧縮するほうが誤差は小さいようです。特に図から、100に圧縮したほうが周囲に出るごま塩ノイズが抑えられていることが分かります。おそらくニューラルネットが100にするステップで画像外側には、あまり白が出てこないことを学習しているのだと考えられます。
30に圧縮する例では100を経由して圧縮することで、ちょっと判別できない文字も増えてきましたが、何とか学習はしていそうです。一方、直接30に圧縮しようとすると、7のような0のような全部同じ結果を返すように学習されてしまいます。ニューラルネットさんが難しすぎて学習をあきらめてしまったようですね。
これらのことから多層化は有効そうです。もう何層か足すともっとよくなりそうですね。
そもそも3層ですべての関数を近似できるのは十分な中間層がある場合であり、今回のように中間層をなるべく減らしたいとするなら前提が違っていることになります。
まとめ
今回はディープラーニングの歴史のスタート地点、オートエンコーダーについて見ていきました。
実際に作って実験してみると、なるほど多層化面白いなと思えてきます。失われていた歴史が動き始めました。
次のエポックはWikipediaによると、2012年のAlexNetと言われています。AlexNetはReLUやMaxプーリングなどの新しい要素が満載なので長い旅になりそうです。次回はこちらの構成要素について一緒に検証していきましょう。
でも、もしかしたら、もう少しオートエンコーダーを検証するかもしれません。というのも、オートエンコーダーで圧縮したデータは本当にパターン認識に役に立つのか? などまだ私の中で整理できていないことも多いので。(MNISTだと左右を正規化して6*5の30次元に縮小したほうが、オートエンコーダーより使い勝手が良さそうなので別のデータで試さないといけなそうです)
それではまた。