2016-06-13 3 views
7

J'essaie de calculer la dérivée de la fonction d'activation pour softmax. J'ai trouvé ceci: https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function personne ne semble donner la dérivation appropriée pour la façon dont nous obtiendrions les réponses pour i = j et i! = J. Quelqu'un pourrait-il expliquer cela s'il vous plaît? Je suis confondu avec les dérivées lorsqu'une sommation est impliquée comme dans le dénominateur de la fonction d'activation softmax.Dérivée d'une explication de fonction softmax

Répondre

13

Le dérivé d'une somme est la somme des dérivés, à savoir:

d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx 

pour obtenir les dérivés de p_j par rapport à o_i nous commençons par:

d_i(p_j) = d_i(exp(o_j)/Sum_k(exp(o_k))) 

j'ai décidé d'utiliser d_i pour la dérivée par rapport à o_i pour faciliter la lecture. En utilisant la règle de produits, nous obtenons:

 d_i(exp(o_j))/Sum_k(exp(o_k)) + exp(o_j) * d_i(1/Sum_k(exp(o_k))) 

En regardant le premier terme, le dérivé sera 0 si i != j, cela peut être représenté par un delta function que j'appellerai D_ij. Cela donne (pour le premier terme):

= D_ij * exp(o_j)/Sum_k(exp(o_k)) 

Ce qui est juste notre fonction originale multipliée par D_ij

= D_ij * p_j 

Pour le second terme, lorsque nous tirons chaque élément de la somme individuellement, le seul non terme -Zero sera quand , cela nous donne (sans oublier la règle de puissance car la somme est dans le dénominateur)

= -exp(o_j) * Sum_k(d_i(exp(o_k))/Sum_k(exp(o_k))^2 
    = -exp(o_j) * exp(o_i)/Sum_k(exp(o_k))^2 
    = -(exp(o_j)/Sum_k(exp(o_k))) * (exp(o_j)/Sum_k(exp(o_k))) 
    = -p_j * p_i 

Mettre les deux t nsemble nous obtenons la formule étonnamment simple:

D_ij * p_j - p_j * p_i 

Si vous voulez vraiment que nous pouvons diviser en i = j et i != j cas:

i = j: D_ii * p_i - p_i * p_i = p_i - p_i * p_i = p_i * (1 - p_i) 

    i != j: D_ij * p_i - p_i * p_j = -p_i * p_j 

Quelle est notre réponse.

+0

Merci beaucoup! C'est si clair. Je n'aurais pas pu demander une meilleure explication! :) Je suis content de comprendre la dérivation complètement maintenant. Je vais renvoyer ceci à celui sans réponse sur l'échange math.stack! – Roshini

+0

@SirGuy ne devrait pas être votre troisième expression 'd_i (exp (o_j))/Sum_k (exp (o_k)) + exp (o_j) * d_i (1/Sum_k (exp (o_k)))'? Exp expiré avant le dernier 'o_k' –

+0

@BenjaminCrouzier Merci, corrigé – SirGuy

3

Pour ce que ça vaut, voici ma dérivation basée sur la réponse de SirGuy: (N'hésitez pas à pointer les erreurs si vous en trouvez).

enter image description here

+0

merci beaucoup pour cela! Je n'ai qu'un doute: pourquoi 'Σ_k ((d e^{o_k})/do_i)' évalue-t-il à 'e^{o_i}' de l'étape 4 à 5? Je serais très reconnaissant pour toutes les idées que vous pouvez offrir sur cette question. – duhaime

+1

@duhaime Bonne question. Pensez à tous les termes de cette somme un par un et voyez ce qui arrive à chaque terme. Vous voyez que vous avez deux cas: Quand i = k, le terme est 'd/do_i e^o_i' qui est' e^o_i'. Quand i! = K, vous obtenez un tas de zéros. –

+0

Génial, merci beaucoup! – duhaime