numpy : calculer la dérivée de la fonction softmax
J'essaie de comprendre backpropagation
dans un simple 3 couches de réseau de neurones avec MNIST
.
Il y a la couche d'entrée avec weights
et un bias
. Les étiquettes sont MNIST
c'est donc un 10
classe vector.
La deuxième couche est un linear tranform
. La troisième couche est la softmax activation
pour obtenir la sortie en probabilités.
Backpropagation
calcule la dérivée à chaque pas, à chaque appel de ce gradient.
Couches précédentes ajoute le global
ou previous
gradient local gradient
. J'ai de la difficulté du calcul de la local gradient
de la softmax
Plusieurs ressources en ligne par le biais de l'explication de la softmax et de ses dérivés, et même de donner des exemples de code de la softmax lui-même
def softmax(x):
"""Compute the softmax of vector x."""
exps = np.exp(x)
return exps / np.sum(exps)
La dérivée est expliqué à l'égard de quand i = j
et quand i != j
. C'est un simple extrait de code, je suis venu avec, espère-pour vérifier ma compréhension:
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]
Puis self.gradient
est le local gradient
qui est un vecteur. Est-ce correct? Est-il une meilleure façon d'écrire cela?
J'ai mis à jour la question. Toutes les pensées?
OriginalL'auteur Sam Hammamy | 2016-11-13
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous avez une couche de 3-NN avec
W1
,b1
pour est associée à la transformation linéaire de la couche d'entrée à la couche cachée etW2
,b2
est associé avec de la transformation linéaire de couche cachée à la couche de sortie.Z1
etZ2
sont le vecteur d'entrée à la couche cachée et la couche de sortie.a1
eta2
représente la sortie de la couche cachée et la couche de sortie.a2
est votre sortie prédite.delta3
etdelta2
sont les erreurs (backpropagated) et vous pouvez voir les gradients de la perte de fonction dans les paramètres du modèle.Il s'agit d'un scénario pour une couche de 3-NN (couche d'entrée, une seule couche cachée et une couche de sortie). Vous pouvez suivre la procédure décrite ci-dessus pour calculer les gradients de ce qui devrait être facile à calculer! Depuis une autre réponse à ce post déjà signalé le problème dans ton code, je ne suis pas répéter les mêmes.
Pouvez-vous expliquer les noms des couches dans vos équations? La couche d'entrée, dans votre cas, est z1? Combien de couches cachées et quels sont-ils?
J'ai mis à jour ma réponse @SamHammamy
Incroyable! Merci beaucoup! Dieu vous bénisse et bonne chance dans vos études de Doctorat!
Je vais mettre à jour cette bibliothèque je suis en train de faire correspondre la ci-dessus. github.com/autojazari/xiaonet/blob/master/xiaonet.py de modifier la question une fois fini
OriginalL'auteur Wasi Ahmad
Comme je l'ai dit, vous avez
n^2
dérivées partielles.Si vous faites le calcul, vous trouvez que
dSM[i]/dx[k]
estSM[i] * (dx[i]/dx[k] - SM[i])
de sorte que vous devriez avoir:au lieu de
Par la voie, cela peut être calculée de façon plus concise, comme (vectorisé):
Oui, il est......
Je pense que j'ai un autre déconnecter. Est la transformation linéaire dans @wasi la réponse de la couche cachée?
Je pense que oui. Notez que la plupart des gens considèrent le dernier transformation linéaire + le SM comme une seule couche. En général, une couche est une transformation linéaire suivie d'une non-linéarité (sigmoïde, tanh, SM, relu, ou quoi que...)
OriginalL'auteur Julien
np.exp n'est pas stable car il a Inf.
Donc, vous devez soustraire le maximum en x.
Si x est une matrice, veuillez vérifier la fonction softmax dans ce cahier(https://github.com/rickiepark/ml-learn/blob/master/notebooks/5.%20multi-layer%20perceptron.ipynb)
OriginalL'auteur Haesun Park