Inicialização de peso CNN xavier

14

Em alguns tutoriais, constatei que a inicialização do peso "Xavier" (artigo: Entendendo a dificuldade de treinar redes neurais profundas de avanço ) é uma maneira eficiente de inicializar os pesos das redes neurais.

Para camadas totalmente conectadas, havia uma regra prática nesses tutoriais:

Var(W)=2nin+nout,simpler alternative:Var(W)=1nin

em que representa a variação das ponderações para uma camada, inicializadas com uma distribuição normal e n i n , n o u t é a quantidade de neurónios no pai e na camada corrente.Var(W)ninnout

Existem regras práticas semelhantes para as camadas convolucionais?

Estou lutando para descobrir o que seria melhor inicializar os pesos de uma camada convolucional. Por exemplo, em uma camada em que a forma dos pesos é (5, 5, 3, 8), então o tamanho do kernel é 5x5, filtrando três canais de entrada (entrada RGB) e criando 8mapas de recursos ... seria 3considerada a quantidade de neurônios de entrada? Ou melhor 75 = 5*5*3, porque a entrada são 5x5patches para cada canal de cores?

Eu aceitaria ambos, uma resposta específica que esclareça o problema ou uma resposta mais "genérica" ​​que explique o processo geral de encontrar a inicialização correta dos pesos e, de preferência, vincular fontes.

daniel451
fonte

Respostas:

13

Nesse caso, a quantidade de neurônios deve ser 5*5*3.

[c/(in+out),c/(in+out)]

É implementado como uma opção em quase todas as bibliotecas de redes neurais. Aqui você pode encontrar o código fonte da implementação de Keras da inicialização de Xavier Glorot.

dontloo
fonte
1
1106[0.1,0.01]
@ascenator desculpe, eu não sei muito sobre como os pesos mudam durante o treinamento. às vezes, resultados estranhos podem vir de taxas de aprendizado muito grandes / pequenas.
dontloo
106103
0

Eu segundo a resposta de Eric aqui. Eu também tomo o "sqrt" do termo e não apenas esse termo. Apesar disso, quando você conecta o sigmóide na sua rede à saída "RelU" ..., isso pode causar a paralisação do treinamento. Isso ocorre devido à saída "Relu" ilimitada, que pode fazer com que o gradiente no sigmóide caia para 0 e nenhum aprendizado acontece. Portanto, nos casos, tenho um fator "scaleDown" para minha rede que pesará o desvio de inicialização por esse fator. Eu continuo ajustando empiricamente os pesos até que o aprendizado aconteça. Uma maneira simples de encontrar é salvar o modelo imediatamente após 1 iteração e dar uma olhada na saída RELU (conectada ao sigmoid). Continue ajustando os pesos até que esta saída RELU seja razoável. E então use esses pesos para o treinamento. É um bom começo. Se ainda entrar em colapso após algumas iterações, pesá-los um pouco mais até alcançar a estabilidade. É apenas um truque que eu usei. Funcionou para mim na minha configuração. Então, compartilhando minha experiência. Coisas diferentes funcionam para configurações diferentes.

Então boa sorte!

Sarnath K
fonte