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?

Ce n'est donc pas clair... Ce gradient êtes-vous en train d'essayer de calculer? Le SM est une carte de R^n à R^n de sorte que vous pouvez définir n^2 dérivées partielles dSM[i]/dx[k]...
J'ai mis à jour la question. Toutes les pensées?

OriginalL'auteur Sam Hammamy | 2016-11-13