Keras: diferença entre Kernel e regularizadores de atividade

86

Percebi que weight_regularizer não está mais disponível no Keras e que, em seu lugar, há regularizer de atividade e kernel . Eu gostaria de saber:

  • Quais são as principais diferenças entre kernel e regularizadores de atividade ?
  • Posso usar activity_regularizer no lugar de weight_regularizer ?
Simone
fonte

Respostas:

85

O regularizador de atividade funciona em função da saída da rede, e é usado principalmente para regularizar unidades ocultas, enquanto o weight_regularizer, como o nome já diz, atua sobre os pesos, fazendo-os decair. Basicamente, você pode expressar a perda de regularização em função da saída ( activity_regularizer) ou dos pesos ( weight_regularizer).

O novo kernel_regularizersubstitui weight_regularizer- embora não esteja muito claro na documentação.

Da definição de kernel_regularizer:

kernel_regularizer: função regularizer aplicada à kernelmatriz de pesos (veja regularizer).

E activity_regularizer:

activity_regularizer: Função regularizer aplicada à saída da camada (sua "ativação"). (ver regularizador).

Edição importante : observe que há um bug no activity_regularizer que foi corrigido na versão 2.1.4 do Keras (pelo menos com o back-end do Tensorflow). Na verdade, nas versões mais antigas, a função de regularizador de atividade é aplicada à entrada da camada, em vez de ser aplicada à saída (as ativações reais da camada, conforme pretendido). Portanto, tome cuidado se você estiver usando uma versão mais antiga do Keras (anterior à 2.1.4), a regularização de atividades provavelmente não funcionará como esperado.

Você pode ver o commit no GitHub

Há cinco meses, François Chollet forneceu uma correção para o regularizador de atividades, que foi então incluído no Keras 2.1.4

Michele Tonutti
fonte
Você tem certeza absoluta sobre essa kernel_regularizersubstituição weight_regularizer?
Simone
3
Eu encontro muitos exemplos usando kernel_regularizer, mas não para activity_regularizer. Você pode comentar sobre os casos de uso para activity_regularizer?
Milad M
1
Por que você deseja regularizar a saída de camadas ocultas? É pela mesma razão que normalizamos as entradas para o intervalo (-1, 1) ou (0, 1). Isso é para manter as entradas das camadas subsequentes menores para auxiliar o processo de SGD?
Nagabhushan Baddi
1
@NagabhushanBaddi veja esta resposta: datascience.stackexchange.com/a/15195/32811
Michele Tonutti
1
@FinncentPrice Só posso presumir que costumava estar lá e agora não está mais
Michele Tonutti
34

Esta resposta está um pouco atrasada, mas é útil para os futuros leitores. Portanto, a necessidade é a mãe da invenção, como dizem. Eu só entendia quando precisava.
A resposta acima realmente não indica a diferença porque ambos acabam afetando os pesos, então qual é a diferença entre punir pelos próprios pesos ou a saída da camada?
Aqui está a resposta: encontrei um caso em que os pesos da rede são pequenos e agradáveis, variando entre [-0,3] a [+0,3].
Então, eu realmente não posso puni-los, não há nada de errado com eles. Um regularizador de kernel é inútil. No entanto, a saída da camada é ENORME, em 100's.
Lembre-se de que a entrada para a camada também é pequena, sempre menor que um. Mas esses pequenos valores interagem com os pesos de tal forma que produzem essas saídas massivas. Aqui percebi que o que preciso é de um regularizador de atividade, em vez de um regularizador de kernel. Com isso, estou punindo a camada por essas saídas grandes, não me importo se os pesos em si são pequenos, só quero impedi-lo de atingir tal estado, pois isso satura minha ativação sigmóide e causa toneladas de outros problemas como desaparecimento gradiente e estagnação.

Alex Deft
fonte
Verdadeiramente intuitivo.
Sarang Manjrekar