Camada Softmax em uma rede neural

43

Estou tentando adicionar uma camada softmax a uma rede neural treinada com retropropagação, então estou tentando calcular seu gradiente.

A saída do softmax é hj=ezjezi , ondejé o número de neurónios de saída.

Se eu der, então eu recebo

hjzj=hj(1hj)

Semelhante à regressão logística. No entanto, isso está errado, pois minha verificação numérica do gradiente falha.

O que estou fazendo errado? Pensei que também precisava calcular as derivadas cruzadas (ou seja, hjzk ), mas não tenho certeza de como fazer isso e manter a dimensão do gradiente a mesma para que ela se ajuste ao processo de propagação traseira.

Correu
fonte
3
Você deve melhorar o título da sua pergunta, pois não se trata de adicionar uma camada geral de softmax a um NN, pois a pergunta é específica sobre como a verificação de gradiente falha. Eu sugiro fortemente que mude o título para "Por que a retropropagação para de funcionar corretamente quando adiciono uma camada softmax à minha rede neural".
Charlie Parker

Respostas:

43

Sinto-me um pouco mal ao fornecer minha própria resposta para isso, porque ela é muito bem capturada por ameba e juampa, exceto talvez pela intuição final sobre como o jacobiano pode ser reduzido de volta a um vetor.

Você derivou corretamente o gradiente da diagonal da matriz jacobiana, ou seja,

hizj=hi(1hj):i=j

e como a ameba afirmou, você também deve derivar as entradas fora da diagonal do jacobiano, que produzem

hizj=hihj:ij

Essas definições de dois conceitos podem ser convenientemente combinadas usando uma construção chamada Delta Kronecker , para que a definição do gradiente se torne

hizj=hi(δijhj)

Portanto, o jacobiano é uma matriz quadrada [J]ij=hi(δijhj)

hixi

[x]k=i=1hi,k

Dada a matriz jacobiana definida acima, isso é implementado trivialmente como o produto da matriz e o vetor de erro de saída:

σl=Jσl+1

Se a camada softmax for sua camada de saída, combiná-la com o modelo de custo de entropia cruzada simplifica o cálculo para simplificar

σl=ht

th

Mranz
fonte
com σl=(σl,1,σl,2,...,σl,k)σl,j=Czj
Sim, está correto.
Mranz
Alguém poderia explicar quais são os termos do delta em minúsculas no Delta Kronecker e como calculá-los?
Danijar 6/10/2015
Estou preso nesse problema por um tempo. Esclarecer. Você tem um vetor (pré softmax) e depois calcula o softmax. Como os valores de softmax dependem de todos os valores de entrada, a matriz jacobiana real é necessária. Em seguida, você pega a matriz jacobiana e soma as linhas para obter um vetor de linha única, que você usa para a descida do gradiente como de costume. Tudo isso está 100% correto?
harveyslash
14

A derivada está errada. Deveria ser,

hjzk=hjδkjhjhk

C

nk=1Ctknlnyk(xn)

onde o superíndex é executado sobre o conjunto de amostras, é o valor do k-ésimo componente do destino para a n-ésima amostra. Aqui supõe-se que você esteja usando um esquema de codificação 1-C, ou seja, . Nesse caso, todos os t são zero, exceto o componente que representa sua classe correspondente, que é uma.tkntkn

Observe que os t são constantes. Portanto, minimizar esse funcional é equivalente a minimizar,

nk=1Ctknlnyk(xn)+nk=1Ctknlntkn=nk=1Ctknlnyk(xn)tkn

que tem a vantagem de que o jacobiano assume uma forma muito conveniente, a saber,

Ezj=hjtj

Eu recomendo que você obtenha uma cópia das redes neurais do Bishop para reconhecimento de padrões . IMHO ainda é o melhor livro sobre redes neurais.

jpmuc
fonte
14

Cada saída do softmax depende de todas as entradas, portanto o gradiente é de fato uma matriz jacobiana completa. Você calculou corretamente , mas você também precisa se . Eu acho que se você puder derivar a primeira expressão, também poderá facilmente derivar a segunda.khj=-hjhkjkjhj=hjzj=hj(1hj)khj=hjhkjk

Não tenho certeza do problema que você vê com a propagação traseira: na camada softmax você tem saídas e entradas , portanto um erro de cada saída deve ser propagado para cada entrada, e é exatamente por isso que você precisa de todo o jacobiano. Por outro lado, normalmente você teria uma função de custo associada à saída do softmax, por exemplo, que são as saídas desejadas (quando você faz a classificação, geralmente uma delas é igual a 1). e outros para 0). Então, de fato, você está interessado em , que pode ser calculado com uma regra de cadeia que resulta em uma expressão elegante e é realmente um vetor (não uma matriz).j C = - j t j log h j , t j Cjj

C=jtjloghj,
tjCzj
ameba diz Restabelecer Monica
fonte
11
Tentarei descrever melhor meu problema, de acordo com, por exemplo, este tutorial ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm , preciso multiplicar por elementos os pesos e o delta com o derivado (etapa número 3). Então, se eu tenho a matriz jacobiana completa, as dimensões não se encaixam. Obrigado.
Ran
Você sabe como proceder se não for um softmax, mas uma camada oculta usual? Imagine que cada unidade nesta camada obtenha entradas de todas as unidades da camada anterior (ou seja, esta camada está "totalmente conectada"), o que normalmente é o caso. Além disso, você também precisa propagar novamente os erros através dessa camada, e os derivados também formam uma matriz jacobiana. Se você está confuso sobre como fazê-lo, sua confusão não está relacionada ao softmax.
ameba diz Restabelecer Monica 12/12
11
Eu o implementei com sucesso para camadas lineares e sigmóides porque a derivada é um vetor, então não tive problemas com as dimensões.
Ran
Desculpe Ran, talvez eu esteja apenas sendo estúpido, mas se você tem uma camada sigmóide totalmente conectada à camada anterior, então a saída (ou entrada) de cada unidade ij terá derivada em relação à conexão de entrada de cada unidade na camada anterior, ou seja, todos os derivados formam uma matriz 2D, n'est-ce pas? i
ameba diz Restabelecer Monica 12/12