クーの自由研究

冬の到来:空気が教えてくれるよ。う~んと深呼吸して、鼻がツンとしたら、それが冬のはじまり。

自己符号化器の自由研究(その2) 隠れ層を初期化で操ってみる

おおまかな内容

中間層(隠れ層)の初期状態について実験します。強制的に初期状態を特定の状態にしてどのように学習がすすむのかを確認します。

なぜやるのか

実験を100回以上もやっていると、ランダムで作成される中間層の重みWの初期パターンから、特定のばらつき部分が発達(?)してWが形成されていく感じがしてきました。直線的な発達ではなくこまかく微調整しながら(曲線的に方向をかえながらといった感覚)進んでいくように思えます。Wの初期値と活性化関数をみれば、どのあたりの特徴が発展していきそうかおおまかに想像できるくらいになりました。(4~5パターン想像したどれかには該当します。)ボクの学習能力もすてたものではありません。それならば、最終的に形成されることの多い「ガボールフィルタ」の形の情報を初期状態にしたら、そこから効率的に発達していくのではないかと考えました。ボク、とっても気になります。

準備と実験のやり方 

ガボールフィルタとはWikiページにあるように、「画像処理でよくつかわれるフィルタ」であり、「初期視覚野にある単純型細胞の活動をモデル化できる」となっています。具体的には輪郭や方向性のある縞模様などを選択的に抽出できます。

このガボールフイルタは「位相」と「方向」をもっているので、これをくるくる回しながら配置していけば「いい感じのフィルタセット」になる『はず』です。

半径5ピクセル(中心が1ピクセルで直径だと9ピクセル)で、方向を45°づつ、位相を160°づつ増加させつつ、中心を1ドットづつずらしていきます。方向は8回で、位相は18回で元の状態(0°)になります。端のほうはフィルタが切れないように配置するので、「Wの左側の中心開始位置(5ドット目)~右側の中心終了位置(24ドット目)の20ドット」×「縦も同様に20ドット」の400パターンのWを準備します。

このことから、中間層Wの個数は400ノードとします。

実験の結果

以下のようになりました。

 f:id:np2LKoo:20160818050326p:plain

400ノードあるので約10分かかりましたが、かなりよい再現性をもつ自己符号化器ができました。Wの初期値が通常のランダムパターンの場合、1024Epoch(1/1000subscaleなのでおよそ1Epoch相当)でImg-diff(元イメージとの差の指標値)が6618.4でした。ガボールフィルタセットを初期値にした場合は512EpochでImg-diffが6625.7なので、ほぼほぼ半分の時間で同等性能に到達しており、効果がありました。

バイアスbは0から始めているので、開始「直後」の再現性は高くないですが、bが調整されてくると4Epoch( 1/1000subscaleなのでおよそ0.004Epoch相当)くらいで結構いい線いきます。立ち上がりがとってもいいです。1024Epoch以降でも(コストやエントロピーやimg-diffが)下がりそうです。

 

まとめ

重みWの初期値にガボールフィルタセットを用いることにより、学習が効率的に進むことがわかりました。

感想・思ったこと・考えたこと

局所性をもつガボールフィルタを方向と位相をかえながら設定したことによって、畳み込みに似た効果が得られたのではないかと思います。また、全般的にバランスが取れた(局所的フィルタのセットで、まんべんなく画像全体を網羅)重みWの初期値といえるので、特徴の分散の基底としても有効に働いたのだと思いました。

ボクとPythonとなめくじ(Slug/Bug)で3すくみ

Img-diff(元イメージとの差の指標値)は模索中で、もう少しよさげな値をだす方法に変えようと思っています。各重み(ドット)の256諧調補正した値の差の2乗を全ドット分足してそ、の平方根をImg-diffとするあたりがよいような気がしています。

あと、ドロップアウトの実装ができました。(今回はドロップアウトなしで実験しています)いろんなサンプルをみましたが、なかなかボクの自己符号化器プログラムに切り貼りできるものがなかったので、自分でコーディングしました。ロジックには自信がありませんが、ちゃんとドロップアウトしたいい感じで学習できているので「よし」としようと思います。ロジック的に合っていると思っても発散したり、逆に多少バグがあってもちゃんと収束していったりするので、プログラムの誤りを見つけるのがとても難しいです。

次回は学習済データを初期値として再利用する実験をしたいと思っています。