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_regularizer
substitui weight_regularizer
- embora não esteja muito claro na documentação.
Da definição de kernel_regularizer
:
kernel_regularizer: função regularizer aplicada à kernel
matriz 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 só 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
kernel_regularizer
substituiçãoweight_regularizer
?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.
fonte