MNIST
の単純な3層ニューラルネットワークでbackpropagation
を理解しようとしています。numpy:softmax関数の導関数を計算する
weights
とbias
という入力層があります。ラベルはMNIST
なので10
クラスベクトルです。
第2層はlinear tranform
です。第3層は、出力を確率として得るためにsoftmax activation
です。
Backpropagation
は、各ステップで微分を計算し、これを勾配と呼びます。
以前のレイヤーでは、global
またはprevious
のグラディエントがlocal gradient
に追加されます。私は、誘導体はに関連して説明されるトラブルソフトマックスの説明を通過し、その誘導体、さらにはソフトマックス自体
def softmax(x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps/np.sum(exps)
のコードサンプルを与えるオンラインsoftmax
いくつかのリソースのlocal gradient
を計算が生じていますi = j
およびi != j
の場合。これは私が作ってみた簡単なコードスニペットで、私の理解を確認するために期待していた。
def softmax(self, x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps/np.sum(exps)
def forward(self):
# self.input is a vector of length 10
# and is the output of
# (w * x) + b
self.value = self.softmax(self.input)
def backward(self):
for i in range(len(self.value)):
for j in range(len(self.input)):
if i == j:
self.gradient[i] = self.value[i] * (1-self.input[i))
else:
self.gradient[i] = -self.value[i]*self.input[j]
その後self.gradient
がベクトルであるlocal gradient
です。これは正しいです?これを書くには良い方法がありますか?
これは非常に明確ではない...あなたが実際に計算するためにどのような勾配をしようとしていますか? SMはR^nからR^nへのマップなので、n^2の偏微分dSM [i]/dx [k] ... – Julien
を定義することができます@JulienBernu質問を更新しました。何かご意見は? –