オートエンコーダをザッと知りたい人はこちら。
こんにちは。今日も張り切っていきましょう
まずは今日の参考文献です。
深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト
ディープラーニングは隠れ層をめっちゃ増やしたニューラルネットワークと
以前紹介したかと思います。このアイデア自体は昔からあったのですが
「層を増やしても全然複雑なことできないんだけど・・」
いいアイデアではあったんですが、
結局入力層と隠れ層、出力層からなる3層の単純なもので
サポートベクターマシンやランダムフォレストと比べて
人気が出ませんでした。
そんなニューラルネットワークが冷め始めている中2006年にトロント大学の
ジェフリーヒントンさんがオートエンコーダ(自己符号化器)を取り入れ、
その問題が解消されたのです。
オートエンコーダとは
可視層と隠れ層の二層からなるネットワークです。
可視層は入力層と出力層がセットになったものだと考えてください。
こんな感じです。
オートエンコーダの流れとしては入力層(可視層)→隠れ層→出力層(可視層)という
流れです。可視層に入ったものが隠れ層に渡され再び可視層に渡されるのです。
一見すると「意味あるのこれ?」と思いますよね・・。
入れたものと同じものが出力されてなんの意味があるのかと。
オートエンコーダのポイントは可視層ではなく・・
「隠れ層での次元削減」です。ん?次元削減??
次元削減とは元の情報量を保ちつつ情報をより低い次元にするというものです。
簡単に言うと情報が「要約」されるようなことで、例えば
皆さんは学校でのテスト勉強をどのようにしてましたか?
色々あると思いますが出題範囲をノートなどにまとめて覚えていませんでしたか?
次元削減はこの感覚です。そしてノートを見返して出題範囲を思い出してテストに
臨んでいたかと思います。
オートエンコーダも同じで
「情報が与えられる→その情報を要約する→要約したものから同じ情報を引っ張り出す」をやっているのです。
与えられた情報を要約して同じ情報を返す必要があるので当然ですが
要約のクオリティーが高まりますよね?
結果的に隠れ層に大事な情報が残り、複雑な表現を可能にするよね。と言うものです。
この入力層(可視層)→隠れ層における処理をencode(エンコード)と呼び、
隠れ層→出力層(可視層)の流れをdecode(デコード)と言います。
オートエンコーダ1つでは当然ディープニューラルネットワークとは言えませんね。
層がたった2つだけですから。ではどのように層をたくさん重ねたのでしょうか?
実はオートエンコーダを積み重ねて1つのディープニューラルネットワーク(DNN)
を作り層を重ねました。この手法を積層オートエンコーダと言います。
積層オートエンコーダとはオートエンコーダを1つずつ学習させて
ニューラルネットワークの入力層側から積み上げて行ったものです。
つまり入力層側から順番に学習させて行ったものです。
ちょっと簡単に2つのオートエンコーダを積み重ねて見ると、
2つのオートエンコーダAとBがあるとして、まずはAで可視層と隠れ層の学習を行い、重みが調整されます。
次にAの隠れ層がそのままオートエンコーダBの可視層になり学習が行われます。
オートエンコーダの数は3個でも10個でも
順番に学習させることが肝心になります。
これにより隠れ層の重みが調整されて全体でも重みが調整されるのです。
このようにあらかじめオートエンコーダによりモデルを学習させることを
事前学習と言います。
ここで注意するのはオートエンコーダを積み重ねるだけでは出力層がいつまでも
できないことです。そこで積層オートエンコーダでは出力層を足してあげて
初めてディープニューラルネットワークとなります。
ただ!!出力層の重みも調整してあげないといけません。ここでネットワーク全体で
微調整を行なって完成です。この最後の仕上げとなる全体の微調整を
ファインチューニングといいます。
ディープニューラルネットワークを作るのに事前学習→ファインチューニングで
完成されるのです。
しかし、今でのその手法を用いているかと言われるとそうでもないんです。
実は事前学習で計算量が膨大になりコストが高すぎるのです。
できることなら事前学習なしでネットワーク全体を学習させたいですよね。
そこで活性化関数を工夫するというテクニックを行うことで事前学習をしなくても
ネットワーク全体を一気に学習することが可能になりました。
というのも勾配消失問題を解決できたからなのですよ!!!
ここで来た勾配消失問題。点と点が線になりました。
活性化関数についての記事はこちらに貼っておきますね。
よかったら見てください。