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.

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.


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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.