目次
AUTO_ENCODER
簡単に言えば。
単純にコピーするのではなくて、途中の隠れ層に自己学習させておいて、その学習結果を元に復元する・・みたいなことをします。
2つのパーツ
で構成されます。
なので、例えば学習だけさせておいて切り離して、デコーダーの部分だけ動かせば「学習結果を元に画像を生成する」・・みたいにも使えるわけです。
もっと詳しく知りたい時は、こちらの画像にリンクをはってますので、どうぞ。
まあ、これは見てみるのが一番よくわかります。
Neural Network Consoleのサンプルプロジェクト
ニューラルネットワークコンソール(Neural Network Console)を立ち上げ、プロジェクトの一覧から、06_auto_encoder.sdcproj を選択して開きます。
サンプルのままで何も変更することはありません。
28✕28サイズの二次元データの入力が、隠れ層にあたるAffineレイヤーで、256サイズの一次元データに次元圧縮され、出力でまた二次元に戻されているのが、わかります。
学習の実行
さて、学習をします。
学習曲線はこんな感じです。
分類問題ではないのですけど、きっちり特徴を学習している感じはわかります。
評価の実行
続けて評価です。
評価すると、元データ画像(X:image)と、学習済の出力(X')を比較してみることができます。
元画僧と生成された画像の比較
横にならべて比較してみます。
左が元画像(input)、右がAUTOENCODERの出力です。
どうですか。
学習をして、より特徴のはっきりした画像として出力しているように見えます。
特に下2つの「9」なんか見事じゃないですか?
完全に穴がつぶれてたり、一部が切れたりしているのを、整形してきれいな「9」の形になっていますものね。
こういうのを見ると、イメージわきますね。
例えば、ディープラーニングで画家の絵を学習させて、その画家の特徴をもった絵をかかせるとか、作曲家の楽曲を学習させて、その特徴をもった音楽を作曲させるみたいなアプローチも、この延長線上に(もちろん、全然別物の技術でしょうけど)あるという感じが。
AUTO_ENCODERは実用用途としては使われていない
上記の結果を見れば、「AUTO_ENCODERで事前学習させた結果を、分類問題を解くニューラルネットワークのインプットに使うといいんじゃないか?」っていうのは、すぐに思いつきます。
上で紹介した記事を見ても、実際にされてたみたいです。
でも、残念ながら、そういう用途では今はほとんど使われないっぽいんですね。
記事をちょっと引用してみます。
では、オートエンコーダが今のディープラーニングを支えているのかというと、そうでもなさそうだ。
深層学習ライブラリKerasのオートエンコーダのチュートリアルには、もう今では実用的な用途としてはめったに使われてないと書かれている。
オートエンコーダは画像のノイズ除去や可視化程度でしか利用目的がないとされている。
実は、その後ディープラーニングのアルゴリズムは改良を重ね、事前学習をせずにランダム値を採用しても十分な精度が出るようになったのだ。
なるほど。
じゃあ、こうやって遊ぶより他に何の約にもたたないのか?というと、そんなことはありません。
オートエンコーダの研究は進み、生成モデルで活用されはじめた。
ということなんですね。
オートエンコーダーの発展系の事例
下の記事にも、Variational Autoencoder という発展系の事例が紹介されています。
それを使えば、こんな感じに学習データにないセレブっぽい顔を、学習して生成することができるというんですね。
AutoEncoderなかなか恐るべしです。
正直、いきなりこういう発展系を見せられても、ピンとこないんですが、今回みたいにシンプルなAutoEncoderを体験した後なら、感覚的に、ちょっと身近な気がします。
ではでは。