2016-06-13 21 views
7

Sto provando a calcolare la derivata della funzione di attivazione per softmax. Ho trovato questo: https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function nessuno sembra dare la derivazione corretta per come avremmo ottenere le risposte per i = j e i! = J. Qualcuno potrebbe spiegarlo per favore! Sono confuso con i derivati ​​quando è coinvolta una sommatoria come nel denominatore per la funzione di attivazione softmax.Derivata di una spiegazione della funzione softmax

risposta

13

La derivata di una somma è la somma dei derivati, ossia:

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

per derivare i derivati ​​del p_j rispetto o_i si parte con:

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

Ho deciso di usare d_i per la derivata rispetto a o_i per semplificare la lettura. Utilizzando la regola del prodotto si ottiene:

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

Osservando il primo termine, il derivato sarà 0 se i != j, questo può essere rappresentata con un delta function che chiamerò D_ij. Questo dà (per il primo termine):

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

Che è solo la nostra funzione originale moltiplicato per D_ij

= D_ij * p_j 

Per il secondo termine, quando deriviamo ogni elemento della somma individualmente, l'unico non -Zero termine sarà quando , questo ci dà (non dimenticando la regola potere, perché la somma è al denominatore)

= -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 

Mettere i due t ogether otteniamo il sorprendentemente semplice formula:

D_ij * p_j - p_j * p_i 

Se si vuole veramente che possiamo dividerlo in i = j e i != j casi:

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 

che è la nostra risposta.

+0

grazie mille! Questo è così chiaro. Non avrei potuto chiedere una spiegazione migliore! :) Sono contento di aver compreso completamente la derivazione ora. Ho intenzione di riferire questo a quello senza risposta sullo scambio math.stack! – Roshini

+0

@SirGuy non dovrebbe la tua terza espressione essere 'd_i (exp (o_j))/Sum_k (exp (o_k)) + exp (o_j) * d_i (1/Sum_k (exp (o_k)))'? Manca exp prima dell'ultimo 'o_k' –

+0

@BenjaminCrouzier Grazie, risolto – SirGuy

3

Per quello che vale, ecco la mia derivazione basata sulla risposta di SirGuy: (Sentiti libero di indicare gli errori se ne trovi uno).

enter image description here

+0

grazie mille per questo! Ho solo un dubbio: perché 'Σ_k ((d e^{o_k})/do_i)' valuta 'e^{o_i}' dai punti 4 a 5? Sarei molto grato per qualsiasi intuizione che puoi offrire su questa domanda. – duhaime

+1

@duhaime Buona domanda. Pensa a tutti i termini di quella somma uno per uno e guarda cosa succede a ogni termine. Vedete che avete due casi: quando i = k, il termine è 'd/do_i e^o_i' che è' e^o_i'. Quando i! = K, ottieni un sacco di zeri. –

+0

Fantastico, grazie mille! – duhaime

Problemi correlati