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 é , ondeé o número de neurónios de saída.
Se eu der, então eu recebo
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, ), 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.
neural-networks
Correu
fonte
fonte
Respostas:
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,
e como a ameba afirmou, você também deve derivar as entradas fora da diagonal do jacobiano, que produzem
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
Portanto, o jacobiano é uma matriz quadrada[J]ij=hi(δij−hj)
Dada a matriz jacobiana definida acima, isso é implementado trivialmente como o produto da matriz e o vetor de erro de saída:
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
fonte
A derivada está errada. Deveria ser,
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.tnk tnk
Observe que os t são constantes. Portanto, minimizar esse funcional é equivalente a minimizar,
que tem a vantagem de que o jacobiano assume uma forma muito conveniente, a saber,
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.
fonte
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=-hjhkj≠k∂jhj=∂hj∂zj=hj(1−hj) ∂khj=−hjhk j≠k
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 ∂ Cj j
fonte