Análise de sensibilidade em redes neurais profundas

14

Após uma pergunta já respondida ( Extraindo a importância do peso da rede de feed-forward de camada única ), procuro inferência sobre a relevância das entradas nas redes neurais.

Considerando uma rede profunda, onde reconstruir a importância da entrada retrocedendo as camadas a partir do nó de interesse de saída pode ser difícil ou demorado, eu queria saber se havia algum arcabouço teórico na realização de análise de sensibilidade para redes neurais, basicamente mude ligeiramente um entrada e considere como o nó de interesse principal muda.

Existe uma maneira canônica de realizar algum tipo de análise de sensibilidade em redes neurais?

Eu realmente gostaria de receber algum código Python para fazer isso, se houver algum

Tommaso Guerrini
fonte

Respostas:

12

A análise de sensibilidade que você sugere corresponde ao exame das derivadas parciais das saídas em relação às entradas. Digamos que o vetor de saída seja dado por y = f ( x ) , onde x R d é o vetor de entrada ef é a função que a rede implementa. O jacobiano das saídas escreve as entradas é:yRmy=f(x)xRdf

JEuj(x)=xjfEu(x)

O jacobiano fornece a taxa local de mudança de cada saída em cada entrada, por isso nos diz como se comportará em resposta a perturbações infinitesimais. Se começarmos com entrada x e adicione um valor infinitesimal Δ ao j th de entrada, esperamos que o i th saída para aumentar em Δ J i j ( x ) .fxΔjEuΔJEuj(x)

Se tiver grande magnitude, isso significa que a saída i é sensível à entrada j na vizinhança de x . Porque fJEuj(x)Eujxfé, em geral, não linear, essa noção de sensibilidade depende da entrada; pode ser grande em algumas regiões e próximo de zero em outras. Se você deseja algum tipo de medida resumida de quão fortemente as saídas dependem das entradas, você deve agregar vários valores de entrada. Por exemplo, você pode considerar o valor absoluto do jacobiano, calculado sobre todas as entradas no conjunto de treinamento (que atua como substituto do valor esperado na distribuição subjacente de entradas). Obviamente, esse tipo de resumo acabará descartando informações, podendo ser enganoso em algumas circunstâncias.

Você pode usar a regra de cadeia para derivar uma expressão para o jacobiano, da mesma forma que derivaria o gradiente da função de perda e escrever os parâmetros para uso com backprop. Você também pode computá-lo usando diferenciação automática, usando uma biblioteca como Theano, TensorFlow, etc. Não há muitas razões para realizar diferenciações finitas (ou seja, simular a perturbação e medir a mudança na saída), a menos que a função que sua rede implementa seja indiferenciada ( nesse caso, o jacobiano não existe).

Algumas advertências: se as entradas tiverem unidades / escalas diferentes umas das outras, as sensibilidades também terão unidades / escalas diferentes e não poderão ser comparadas diretamente. Padronizar / dimensionar as entradas é uma solução possível. Também é importante ter em mente que esse tipo de análise nos fala sobre o modelo em si, mas não necessariamente a distribuição subjacente que gerou os dados. Por exemplo, se duas entradas estiverem correlacionadas, o modelo pode acabar usando a primeira, mas não a segunda. Nesse caso, descobriríamos que a sensibilidade é alta para a primeira entrada e baixa para a segunda, mas não devemos concluir que a primeira entrada é inerentemente mais importante para prever a saída em geral.

Este artigo deve ser de interesse.

user20160
fonte
ótima resposta e ótimo artigo! Se alguém estiver interessado na implementação deste método, você pode encontrar uma boa aplicação do cálculo jacobian aqui: medium.com/unit8-machine-learning-publication/...
pcko1