背景:いい加減ちゃんと理解した感じが欲しい
人工知能に関わる事象を全体的に振り返ろうと思いG検定の学習をし始めました。そこで、何回も目にしたことがあるAutoEncoderについての記述がありました。見るたびに思うのですが、いい加減、実装できるだろうと思い、いろいろ探して実装し、理解を深めました。
目的:およそ10年越しにAutoEncoderを理解します
結果:AutoEncoderを実装して、異常検知のメカニズムの理解が深まりました
構造:簡単なAutoEncoderの構造と動きを確認しました
具体的なコードは以下になります。また、全体のコードと合わせてご参照下さい。
encoded = Dense(encoding_dim, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)
autoencoder = Model(input=input_img, output=decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
これを図示すると以下の様になります。
この図は入力が784次元のデータを32次元に圧縮している事を表しています。そして、圧縮した物は潜在変数Zとします。その後、潜在変数Zは再び784次元に復元されます。復元されたデータは入力したデータと比べて、損失を算出します。損失が小さくなるように学習を繰り返し、重みを最適化していきます。今回の損失関数はbinary_crossentropyで最適化にはadadeltaを使っています。
方法
cedro3さんのコードを使わせて頂きました。また、ソニーの小林さんの解説動画「実践Deep Learning:Autoencoderを用いた教師なし異常検知」も大変参考になりました。
感想:深層生成モデルの理解に向かって進んでいる気がします
10年前は全く意味不明だったAutoEncoderでしたが、現在、明確な実感と共に理解した感じがあります。当時、松尾先生が言っていた事で意図が汲み取れないものもありますが、今回理解した事を元に進める感覚があります。また、この記事を書く時に調べたものにVAE(Variational Auto Encoder)があります。今回の物と何が違うのかというと、「潜在変数Zに確率分布を想定するかどうか」くらいしか分かっていません。次回は、確率分布を想定する事でどうなるのかまで理解できればと思っています。そこまで理解が進むと去年やっただけに終わった深層生成モデルの理解にも進めそうな気がしています。
参考
- 小林(2020.4)、実践Deep Learning:Autoencoderを用いた教師なし異常検知:工学的な解説
- cedro(2020.4)、Keras AutoEncoder で異常検知をやってみる
- cedro(2020.4)、Keras AutoEncoder で異常検知をやってみる(colab)