読者です 読者をやめる 読者になる 読者になる

人工知能伝習所

〜 AI x Big Data x IoTなトピックを、非エンジニアにも分かりやすくお届け 〜

岡谷貴之著「深層学習」の理解を助ける補助資料(第5章)

Deep Learning 読書感想

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

1日飛んでしまいましたが、引き続き青イルカ本を読む上で参考になりそうな資料を集めていきます。残り4章をスパッと紹介して切り上げようかとも思いましたが、いよいよ「深層学習」の入り口に入ってきたかな、という感もあるのでじっくりいきます。

5章 自己符号化器

自己符号化器(オートエンコーダ、autoencoder)とは、入力データを再現するデータを出力するよう、自分自身をトレーニングするニューラルネットワークです。下図のように、入力層(Input)に対して、少ない数の中間層(Hidden)を経て、入力層と同じユニット数の出力層(Output)から構成されます。


https://upload.wikimedia.org/wikipedia/commons/0/06/AutoEncoder.png


入力データを再現させるので、入力データと出力データは下記のようになります。これは、MNISTという0〜9の手書き数字の画像のデータセットで自己符号化器を動かした時の例です。上が入力データで、下が出力データ。ほとんど同じような手書き数字が出力されてますね。


https://blog.keras.io/img/ae/basic_ae_32.png


そんなことして何が嬉しいの?と思いました?。実は、入力層よりも少ないユニット数の中間層を使うことで、入力データをよく表す「特徴」を獲得できるのです。


たとえるなら、習字でお手本通り書く練習をしているうちに、漢字のトメ、ハネ、ハライといった基本動作が身につき、ほかの字も上手に書くことができるようなイメージでしょうか。「永字八法」といって、何千種類もある漢字でも、「永」の字を構成する8つの技法(=特徴)で表現できてしまうというわけです。


https://upload.wikimedia.org/wikipedia/commons/thumb/e/e2/8_Strokes_of_Han_Characters.svg/299px-8_Strokes_of_Han_Characters.svg.png


統計に詳しい方なら、主成分分析のような次元圧縮アルゴリズム、と言った方が伝わりやすいかもしれません。実際、自己符号化器の特殊なケースが主成分分析の結果とほぼ一致します。


自己符号化器では、入力データの特徴はネットワークの「重み」として得られます。一つの中間層ユニットに接続する入力層からのネットワークの本数は、入力層のユニット数と等しいので、入力データが画像の場合、一つの中間層ユニットに接続するネットワークの重みは、入力画像と同じ画素数の画像として表現(例えば、重みが小さいほど暗く、大きいほど明るいピクセルで表現)できます。


例えば、中間層を100個のユニットで構成している場合、入力画像と同じサイズの「重み画像」が100枚できることになります。下記は、MNISTの画像(画素数は28 x 28 = 784)を100個の中間層ユニットで自己符号化した際の100枚の「重み画像」の例です。ニューラルネットワークがどんな特徴を学習したのか、覗き見ているような気分になりますね。


http://kiyukuta.github.io/_images/b20.bmp


上の画像で見える特徴は、なんだか穴がポコポコあいているに見えるだけで、あまり「数字」の特徴をつかんでいるようには見えないですよね。「良い特徴」の定義は難しいですが、より少ない情報量で、より元のデータをうまく再現できるものほど、「良い特徴」であると言えそうです。


そんな、より「良い特徴」を得るためのテクニックが、5.4節の「スパース正則化」と、5.5節の「データの白色化」、それから5.7.2節の「デノイジング自己符号化器」です。


スパース正則化は、「より少ない中間層で表せる特徴ほど良い特徴のはずだ」という仮説のもと、出力誤差と一緒に活性化する中間層の数も最小化させるような手法です。


データの白色化は、訓練データの偏りや、データ間の相関をなくすことによって、より一般的な特徴を得るための手法です。


デノイジング自己符号化器は、入力にランダムなノイズをのせる一方、ノイズをのせる前のオリジナルなデータを再現するようトレーニングする事によって、ノイズに強い特徴を見いだすことができる手法です。


例えば、MNISTのデータセットでスパース正則な自己符号化を行うと、下図のように、数字を書く時のストロークっぽいものが特徴として現れたりします。人工知能が自分で見つけた「永字八法」的な特徴といえるでしょうか。


http://tnnf.readthedocs.io/en/latest/_images/multi_weights.png



また、自己符号化器を積み重ねて、「積層自己符号化器(SAE: stacked autoencoder)」とすることで、より抽象度の高い特徴を得ることもできます。数年前の「GoogleニューラルネットワークYouTubeの大量のインプットすると、猫を認識できるようになった」というニュースを覚えていらっしゃる方もいるでしょう。実はこれを実現したのが、9層の積層自己符号化器でした。


自己符号化器の積み重ね方にもテクニックがあります。それを解説しているのが5.6節「ディープネットの事前学習」です。目標とする多層ネットワークに対し、1層ずつ自己符号化を進め、得られた重みを使って層同士をつなぎ合わせていきます。こうすることによって、得られた多層ネットワークは、ネットワークの重みをすべてランダムに初期化した場合と比べ、勾配消失問題が起こる可能性がずっと小さく、学習がよりうまく進むそうです。


https://upload.wikimedia.org/wikipedia/commons/7/7e/Stacked_Autoencoders.png


このようにして作られた多層自己符号化器では、入力層に近いところでは線や点のような単純な形の特徴だけをとらえ、深い層にいくほど、「猫の顔」や「人の顔」など、より複雑で人間の感覚に近い特徴をとらえていることがわかります。


http://prog3.com/sbdm/img.ptcms/article/201510/23/562a32838972b_middle.jpg?_=56389



以上が、だいたい5章でカバーされている内容になるかと思います。


補足資料として、Googleの論文は下記にあります。
Building High-level Features Using Large Scale Unsupervised Learning


自己符号化器関連のプレゼン資料としては、下記が参考になりました。


www.slideshare.net


www.slideshare.net


www.slideshare.net


www.slideshare.net


[http://wbawakate.jp/wp-content/uploads/2015/10/Autoencoder.pdfhttp://wbawakate.jp/wp-content/uploads/2015/10/Autoencoder.pdf



自己符号化をアニメーションで追っかけてみたい方は、下記が参考になります。


・MNISTでのトレーニングの過程をGIFアニメ化
AutoEncoderが学習する過程をアニメーションにしてみた - shi3zの長文日記


・ランダムな重みがだんだんエッジの特徴に変化する様子
www.youtube.com


ブレードランナーを自己符号化器で再現し、元の画像と比較
www.youtube.com


・元気なお兄ちゃんがAutoencoderを解説。この兄ちゃん好きやわ〜。
www.youtube.com


・自己符号化器が画像圧縮にも使えることに言及
www.youtube.com



自己符号化器を実装してみたい方は下記がオススメ。手を動かした人ならではの解説は分かりやすいです。


qiita.com


aidiary.hatenablog.com


qiita.com


qiita.com


qiita.com


自己符号化器をC++で書きました。 - ニートがプログラミングするブログ


qiita.com


自己符号化器の適用領域や応用方法についても、いろいろ調べてみたいですが・・・今日はここまでにしておきます。