Eu queria treinar uma rede com não linearidades que sofrem com o desaparecimento (ou o problema do gradiente explodindo, embora principalmente o desaparecimento). Sei que a maneira padrão (atual) é usar a normalização de lote 1 [BN] 1 ou simplesmente abandonar a não linearidade e usar as unidades ReLu Rectifier / ReLu .
Eu queria duas coisas:
- Fique com minha não linearidade, então não quero abandoná-lo e usar o ReLu (ou seja, não é permitido o ReLu!). Re-parametrizar a não-linearidade é bom, digamos, colocando um multiplicativo na frente dele como em por exemplo.
- Idealmente, eu não queria depender muito da normalização de lotes (ou, pelo menos, se for usado, ele deve ser usado de uma maneira nova, além da maneira como foi usado no artigo original ou generalizar para muitas não linearidades). Uma das razões pelas quais eu queria evitar o Batch Normalize é porque parece funcionar apenas para não linearidades específicas. Por exemplo, para sigmóides, tanh, mas não está claro como eles funcionariam para outras não linearidades, dizem gaussianos.
A razão pela qual tenho essas restrições é porque eu gostaria de lidar com o problema de desaparecer gradiente ou explodir gradientes contando o problema diretamente, em vez de invadir uma solução que funcione apenas para não linearidades específicas ou apenas evitar o problema empurrando um ReLu.
Fiquei pensando, com essas duas restrições, quais são as formas alternativas de lidar com o problema do gradiente que desaparece? (outra não linearidade em consideração seria o núcleo gaussiano RBF com pré-ativação da norma euclidiana, sigmoide, tanh, etc.)
As possíveis idéias (vagas) que eu tinha em mente seriam:
- Tenha uma boa inicialização para que as não linearidades de saturação não comecem já saturadas (as não linearidades saturadas resultam em gradientes próximos de zero).
- Para o RBF, da mesma forma, um bom init pode ser importante porque os gaussianos geralmente têm um valor grande próximo de 0 (ou seja, quando os filtros são semelhantes à sua ativação ou dados). Assim, tê-los muito grandes ou muito pequenos tem problemas semelhantes de gradiente de fuga.
- Eu realmente não sei se isso é muito constrangedor, mas seria bom se houvesse uma maneira diferente de usar a normalização de lotes, além da sugestão tradicional no artigo original (ou talvez alguma idéia do BN que generalize para um conjunto maior de linearidades, atualmente parece que a maior parte da pesquisa é para mostrar que funciona para sigmóides, até onde eu sei).
- Outra idéia poderia ser que, em vez de não ter linearidade , temos que . Se , significa que as não linearidades não são multiplicadas para trás várias vezes para cada camada, de modo a evitar "desaparecer" nas camadas anteriores. Isso pode tornar a regra de aprendizado instável, então talvez um regularizador possa ser uma boa ideia.a θ ( z ) a ∈ R a > 1
- Um otimizador que lida intrinsecamente com o gradiente de fuga (ou pelo menos atualiza cada parâmetro de maneira diferente). Por exemplo, se é uma camada mais próxima da entrada, a etapa de aprendizado deve ser maior. Seria bom que o algoritmo de aprendizado levasse isso em conta por si só, para lidar com o gradiente de fuga.
Se houver alguma sugestão sobre como lidar com o gradiente de fuga que não seja a norma de lote ou o ReLu, eu adoraria ouvir sobre eles!
Parece que o gradiente de fuga ocorre principalmente porque as não linearidades têm a propriedade de que e também porque e depois de multiplicá-lo várias vezes, ele explode ou desaparece. Dizer explicitamente o problema pode ajudar a resolvê-lo. O problema é que isso faz com que as camadas inferiores não atualizem ou dificultam o sinal através da rede. Seria bom manter esse sinal fluindo pela rede, durante a passagem para frente e para trás (e também durante o treinamento, não apenas na inicialização).| θ ′ ( s ) | < 1
1 : Ioffe S. e Szegedy C. (2015),
"Normalização de lotes: acelerando o treinamento em rede profunda reduzindo a mudança de Covariável Interna",
Anais da 32ª Conferência Internacional sobre Aprendizado de Máquina , Lille, França, 2015.
Journal of Machine Learning Research: Volume W&CP 37
Respostas:
Você já olhou para o RMSProp? Dê uma olhada neste conjunto de slides de Geoff Hinton:
Visão geral da descida do gradiente de mini-lote
Especificamente na página 29, intitulada 'rmsprop: uma versão em lote de rprop', embora provavelmente valha a pena ler o conjunto completo para ter uma idéia mais completa de algumas das idéias relacionadas.
Também estão relacionados as taxas de aprendizado não mais pesadas de Yan Le Cun
e SMORMS3 de Brandyn Webb .
A idéia principal é olhar para o sinal de gradiente e se é flip-flopping ou não; se for consistente, você deseja seguir nessa direção e, se o sinal não estiver dando um salto, qualquer passo que você deu deve estar OK, desde que não seja muito pequeno, então existem maneiras de controlar o tamanho do passo para mantê-lo sensível e que são um pouco independentes do gradiente real.
Portanto, a resposta curta para lidar com gradientes que desaparecem ou explodem é simplesmente - não use a magnitude do gradiente!
fonte
Alguns dos meus entendimentos podem não estar corretos.
A causa do problema do gradiente de fuga é que
sigmoid
tanh
(e o RBF) saturam nos dois lados (-inf
einf
), por isso é muito provável que a entrada dessa não linearidade caia nas regiões saturadas.Além disso, as redes residuais ou as redes rodoviárias fornecem outra maneira de lidar com os gradientes de fuga (por meio de atalhos). Pela minha experiência, essa arquitetura é treinada de maneira mais rápida do que apenas conectar a perda à última camada.
Além disso, a dificuldade de treinar redes profundas não se deve apenas ao gradiente de fuga , mas também a outros fatores (por exemplo, a mudança covariável interna). Existe uma normalização recente da camada de papel sobre outra maneira de fazer a normalização, mas não diz sobre o desaparecimento de gradientes, mas talvez você esteja interessado.
fonte