パンケーキ日記

ふらっと思ったことや備忘録などパンケーキに全く関係ないことをつぶやく

※ パンケーキの情報はありません

誤差逆伝搬のメモ

VAEを実装しようとした.

そしたらことごとく勾配が合わなかった.

問題を簡単にしようとまずはKLダイバージェンスの項を考えずに,
単純に全結合からなるニューラルネットの復元誤差を考えた.

復元誤差を交差エントロピー誤差とし, 誤差逆伝搬させる.

勾配が合わない. 全く合わない...

次に, 復元誤差を二乗誤差として誤差逆伝搬させる.

合う. とても合う.

じゃあなぜ交差エントロピー誤差は合わない?

微分が間違っているとしか考えられない.

交差エントロピー誤差は, あるD次元入力一つ

\boldsymbol{x} = [x_1, x_2,  \dots, x_D ]

に対してD次元分の総和として

 {\displaystyle
L= - \sum_{d=1}^D \{  x_d \log \hat{x}_d + (1-x_d) \log (1-\hat{x}_d)\}
}

と表されるので( \hat{x}はVAEでデコードした値), データがN個ある場合では,

 {\displaystyle
L= - \sum_{n=1}^N \sum_{d=1}^D \{  x_{nd}  \log \hat{x}_{nd} + (1-x_{nd}) \log (1-\hat{x}_{nd})\}
}

と表せるはず.

今, 入力データxが1次元で1個だけあるとする.

そうすれば, 交差エントロピー誤差は

 {\displaystyle
L= - \{  x \log \hat{x} + (1-x) \log (1-\hat{x})\}
}

であるので, これを誤差逆伝搬させるために \hat{x}偏微分すれば,

 {\displaystyle
\frac{\partial{L}}{\partial \hat{x}} = - \left\{\frac{x}{\hat{x}} - \frac{(1-x)}{(1-\hat{x})} \right\} 
}

となるはずである.

なので, D次元の入力xがN個あれば(MATLABであれば),

L = - sum(sum(x./y - (1-x)./(1-y)))

とすればいいはず!! (xハットがyに代わりました)



そんなふうに考えていた時期が俺にもありました.


違いますね.


正しくは,

L = - (x./y - (1-x)./(1-y))

ですね...

総和などとる必要は無かった.

損失関数では全体の復元具合を表す一つの数値として全体の総和をとっているが,
勾配を伝えていくときには, 総和された損失関数の中の一つ一つの値を出力した
重みたちに対してそれぞれの勾配を伝えていかなければいけないので, 総和は取らない
(という認識です).

単純に微分したらそうなる

二乗誤差では確かに総和はとっていなかったのになんでだろ...