Target Propagationの仕組み

この記事は、Deep Learning Advent Calendar 2016の23日目の記事です。

現在、Deep Learningではニューラルネットワークを学習させる手法として、誤差逆伝搬法がほとんどの場合使われています。

ですが、誤差逆伝播法(Back Propagation)は生物学的妥当性がない、要するに実際に人の脳とは違うのではないかということが言われており、 Difference Target Propagation という手法がICLR2015 workshopにて提案されました。

ここではDifference Target Propagationの元になっているTarget Propagationから解説し、Differenceの方を紹介しようと思います。

※ちなみにBack Propagationについては別の記事で詳しく書いているので知らない方は見てみるといいかもしれません。

Back Propagationの生物学的妥当性について

論文内で、Back Propagationは生物学的妥当性がない理由を6個あげています。

  1. Back Propagationの計算は純粋に線形であるのに対し、脳は線形と非線形である。
  2. 脳でBack Propagationが行われているのなら、非線形な順伝播(Feedforward Propagation)の導関数を正確に把握できている必要がある。
  3. Back PropagationとFeedforward Propagationの重みは対称であるべき。
  4. ニューロン(このブログの別記事ではノードと呼んでました)間の伝達は、実際の脳では確率的なバイナリ値である。
  5. Feedforward PropagationとBack Propagationをする際の値の変動を正確に計測する必要がある。
  6. 出力目標値がどこへ向かうのかが不鮮明。

どれもまぁそうだよなぁという気持ちになりますね。

結論から言うと論文では、Target Propagationは1~4までの問題を解決していて、5,6については将来に期待してくれと書かれています。

頑張って欲しいですね(しんどそう)

Target Propagationの仕組み

※Back Propagationを理解している前提で書いています。

式の定義

まず、ニューラルネットワークの内部をいちいち書くのが煩わしいため、i番目の隠れ層{h_{i}}を以下のように定義します。

{\displaystyle
h_{i}=f_{i}(h_{i-1})=s_{i}(W_{i})
}

また、{h_{i}}から{h_{j}}まで行く途中のパラメータをすべてまとめちゃって、以下のように書きます。

{\displaystyle
h_{j}=h_{j}(h_{i};\theta^{i,j}_{W})
}

また、層の数を{M}とすると、最後の層は{h_{M}}です。これを使って、入力が{(x,y)}の時のネットワーク全体の誤差を以下のように書きます。

{\displaystyle
L(h_{M}(x;\theta^{0,M}_{W}), y)
}

上の式たちを使って、誤差を以下のようにi番目の層を使って書くことができます。({0~M}{0~i}, {i~M}に分解してるだけ)

{\displaystyle
L(h_{M}(x;\theta^{0,M}_{W}), y)=L(h_{M}(h_{i}(x;\theta^{0,i}_{W});\theta^{i,M}_{W}), y)
}

定義はこれでひと段落です。

Back Propagationでは誤差を各層のパラメータで偏微分して、その層の誤差を次の層に伝播していきました。

ただ、そこで誤差が消えたり(勾配消失問題)するので、いろいろ工夫したりしていました。

Target Propagationは全体の誤差を小さくする際に、各層{h_{i};\theta^{0,i}_{W}}を全体の誤差が小さくなるような値{\hat{h}_{i}}に近づけるのを目標にします。

それを数式にすると、以下のような式になります。

{\displaystyle
L(h_{M}(\hat{h}_{i};\theta^{i,M}_{W}), y) < L(h_{M}(h_{i}(x;\theta^{0,i}_{W});\theta^{i,M}_{W}), y)
}

ちなみに、{\hat{h}_{i}}をi番目の層のTaegetと呼びます。名前的にもTarget Propagationの中核となるやつです。

パラメータの更新

要するにTarget Propagationは何をしたいかというと、{h_{i}}をTarget{\hat{h}_{i}}に近づけるように重みを更新したいんです。

i番目の層のTarget{\hat{h}_{i}}{h_{i}}との二乗誤差(MSE)は以下のようになります。(二乗誤差はただの例です)

{\displaystyle
L_{i}(\hat{h}_{i},h_{i})=||\hat{h}_{i}-h_{i};\theta^{0,i}_{W}||^{2}_{2}
}

そうすると、{W}は次のように更新することができます。

{\displaystyle
W^{t+1}_{i}=W^{t}_{i}-\eta_{f_{i}}\frac{\partial L_{i}(\hat{h}_{i},h_{i})}{\partial W_{i}}
}

これを書き換えると、以下のようになります。

{\displaystyle
W^{t+1}_{i}=W^{t}_{i}-\eta_{f_{i}}\frac{\partial L_{i}(\hat{h}_{i},h_{i})}{\partial h_{i}}\frac{\partial h_{i}(x;\theta^{0,i}_{W})}{\partial W_{i}}
}

右辺の偏微分に注目してみると、{\hat{h}_{i}}は定数なため、i番目の層の中のパラメータで完結していることがわかります。 そのため、複数の層でまたがってるBack Propagationと比較してそこまで線形性が強くないことがわかります。

ちなみに{\eta_{f_{i}}}は学習率で、層ごとに定義されます。

Targetの決め方

一番最後のTargetは、全体の誤差の勾配を引くことによって求めることができます。

{\displaystyle
\hat{h}_{M}=h_{M}-\hat{\eta}\frac{\partial L_{M}(\hat{h}_{M}, y)}{\partial h_{M}}
}

ここで、{\hat{\eta}}を0.5にして、誤差関数をMSEとすると、Targetがyと等しくなるそうです。 さすがに僕は気力が無くて確かめてないのですが、数学界隈の確かめた人によると式変形めっちゃ頑張れば本当にyになるそうです。すごいですねw

さて、中間層のTargetの求め方ですが、approximate inverseという方法を使います。

まず、次の式が成り立つような{g(x)}を求めます。

{\displaystyle
f_{i}(g_{i}(h_{i})) \approx h_{i}
}

以下のような式で考えても構いません。

{\displaystyle
g_{i}(f_{i}(h_{i-1})) \approx h_{i-1}
}

この時、Targetをg_{i+1}を用いて以下のように定義できます。

{\displaystyle
\hat{h}_{i} = g_{i+1}(\hat{h}_{i+1})
}

各関数の関係を図にすると、以下のようになります。

f:id:palloc:20161222234625p:plain

これをみると、{g_{i}}{f_{i}}逆関数であれば、完全に点が一致することがわかります。

ですが、逆関数を正確に求めるのはとても難しいので、{g_{i}}{f_{i}}{g_{i}}をペアにしてauto-encoderの様に計算すると、decoderにあたる部分が{g_{i}}として得られます。

計算としては、各層で以下の誤差を最小にするようにして、{g_{i}}を得ます。

{\displaystyle
L^{inv}_{i}=||g_{i}(f_{i}(h_{i-1}))-h_{i-1}||^2_2
}

以上がTargetの求め方です。

Defference Target Propagationについて

上で{g_{i}}を求めたのですが、どうしても完全な逆関数を求めるのは難しいです。 そのため、以下のようにしてTargetを定義してみます。

{\displaystyle
\hat{h}_{i-1}=h_{i-1}+g_{i}(\hat{h}_{i})-g_{i}(h_{i})
}

これでTarget Propagationをする手法がDefference Target Propagationです。

Defference Target Propagationの利点

離散的な値を扱うことができるため、確率ネットワークなどが使用できるのがまず挙げられます。

また、確率的なので生物学的妥当性もあると言えます。

論文を読んでみた感想

研究があまり進んでない手法の一つになるんですかね、実用例があまりないみたいです。 理由として通常のBack Propagationと同様にReLUなどを活性化関数に使用するのが適しておらず、まだまだ基礎研究の最中な感じがする手法ですね。

個人的には人間の脳により近い手法ということで、いわゆる汎用AIなどに今後活用できるのではないでしょうか。

参考文献