クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

逆方向に微分伝達するなら、順方向に積分伝達でいいんじゃない?

なにごとにも相対性はあるものですよね

スラマッパギ~!かえるのクーの助手の「井戸中 聖」(いとなか あきら)でございます。

かぼちゃはスタッフでおいしくいただきました。

f:id:np2LKoo:20201101204526p:plain  f:id:np2LKoo:20201101205020j:plain

前回の思考実験で、逆伝搬しなくても学習していけそうな感じがしたので、その方向で実験していきます。

f:id:AssistantOfKoo:20201101231001p:plain

(あいかわらず全く無関係:高校でやった?はるか昔の記憶は忘却の彼方へ)

f:id:AssistantOfKoo:20201101235841j:plain f:id:AssistantOfKoo:20201102001829p:plain    f:id:AssistantOfKoo:20201102002343j:plain

そのまえに、ネタっぽくはあるのですが、別の思考実験で「ある程度であれば」順方向積分でも学習ができるイメージを持ったので、その実証実験をします。なお、思考実験では序盤と中盤くらいまではなんとか行けるのですが、終盤では積分による学習では収束が無理でした。

単純は至高

まずは、前回の思考実験のアルゴリズム?よりずっと簡略化した内容でやってみます。*1

なお、この単純順方向積分系アルゴリズムは思考実験上は「うまくいく行かないも、初期値次第」でした。学習?(というより「ほぼ」記憶)をすすめると「収束」ではなく「発散」にいきたがるので、いかに「中盤まで発散させないか」がポイントになります。

あくまで「思考実験」でのことなので、そもそもうまくいくかはわかりません。なお、前回は「思考実験」は前提条件も過程も結果も言語化しにくいことがわかりましたので、イメージ解説も省略します。実証実験にてその可否を確認していきます。

まぁ、できたとしても短期記憶用途ですかねぇ。

今回「前振り」だけなのでご了承ください。(ここしばらく、予告編だけなのを平にご容赦。構想は大事!!:よく構想n年とかあるじゃぁないですかぁ

f:id:AssistantOfKoo:20201101225654p:plain

はかせがぐうなのに、ちょきさめに負けるの図なの)

少し考えても分るとおり(or考えるまでもなく?)、ニューラルネットワークの逆方向への微分情報伝達による学習と、順方向への積分情報による学習?(というより記憶)は全く別物です。でも、条件を整備すれば、微小区間では「似たような挙動」を行うことができそうな「感じ」がします。

決定的な違いは、(当たり前ですが)微分情報による情報は上流のノードから情報がくるので、出力に近い方からノードの接続重さが加算されますが、積分情報は下流のノード(入力側)から情報がくるので、入力に近い方から重さが加算されます。

相対性をもつものは、極限では接合するはず

さて、自己符号化器(逆伝搬による学習)は絞られた分離情報の再統合なので「学習」の側面が強いですが、(そのものではないにせよ)「記憶」をしているともとらえることができます。であれば、順伝搬による「ノードへの記憶」(そのものの丸暗記記憶、もしくは一部分記憶)もその方法によっては「学習」(汎化) の側面を持たせられるはずである。というのが思考実験での感触です。

必要なもの感触

・入力ノードよりも非常に多くの中間ノードが必要

・中間ノード(記憶)が爆発的に増えるので、絞るしくみが必要(これが学習に相当するはず)

ただし絞るのは出力からのフィードバックを使わないことが、この実験の「縛り」です。

・順方向の活性化関数はReLU(max(0,x))ではなくシグモイド(1 / (1 + e ^ -x))関数がよい予感がします。(こちらのほうが積算発散しにくいため)

f:id:AssistantOfKoo:20201101220358p:plain    f:id:AssistantOfKoo:20201101235440j:plain

おおまかな手順

(0)ある程度の初期ノード(重さはランダムもしくは所定値)を準備

(1)入力値を加算用ノードに通し、活性化された場合は、そのノードに入力値を加算

(2)加算用ノードが活性化された場合、それと1:1の積計算用ノードに入力値を通し、それも活性化された場合は、その積計算用ノードに入力値を積計算(この手順は微妙。。。:これでなくとも何等かの入力情報分解のしくみは必要な感触です)

(2’)加算用ノードが活性化された場合、入力と加算用のノードの「差」を入力として一度のみ処理を行う。

※(2),(2')はノードの「重なり」部分の検出と「重ならない」部分の検出相当です。

(3)活性化されるノードがない場合はその入力値そのものを重さとした新たなノードを準備

(4)ある程度進めたところで一定以上値が盛られていないノードはリセットして再利用(忘却相当)

(5)ノード数が一定以上にまで増殖すれば、類似ノードをむりやり統合(ここがこの実験の

(5')一定フェーズごとにノード重さ自体を入力側に入力し、バイアスを調整する(あくまでデコード結果をフィードバッグするのではないことに注目!)

(6)最終盤にのみ出力デコードの差分からバイアス値のみをフィードバック学習

なんだか行けそうな気がする

f:id:AssistantOfKoo:20201102000150j:plain

この方法で、初期値さえ適切に設定できれば、中盤まではゆるく(そして超高速に!少ないデータ量で!)学習?ができそうな気がします。

 

f:id:AssistantOfKoo:20201101221555p:plain

それは気のせいなことの方が多いのは世の常と知りつつ。。。

 この路線がだめなら、カオスにして自己組織化作戦だぁ。

*1:あとで読み直すと、あまり簡略化しておらず、本質的には同じでした。