A idéia é que você deseja inicializar os pesos de forma a garantir um bom fluxo de dados para frente e para trás na rede. Ou seja, você não deseja que as ativações diminuam ou aumentem consistentemente à medida que avança na rede.
Esta imagem mostra as ativações de um ReLU Multi-Layer Perceptron de 5 camadas em 3 estratégias diferentes de inicialização após uma passagem do MNIST pela rede.
Nos três casos, os pesos são calculados a partir de uma distribuição normal centralizada em zero, determinada pelo seu desvio padrão. Você pode ver que, se os pesos iniciais forem muito pequenos (o desvio padrão é pequeno), as ativações serão bloqueadas e, se forem muito grandes, as ativações explodirão. O valor do meio, aproximadamente à direita, pode ser encontrado definindo os pesos de forma que a variação das ativações e atualizações de gradiente permaneça aproximadamente a mesma que você passa pela rede.
Eu escrevi um post sobre a inicialização do peso que entra em mais detalhes, mas a idéia básica é a seguinte.
Se denota as ativações da ésima camada, o tamanho da camada e os pesos que os conectam à -st camada, então um podemos mostrar que, para as funções de ativação com , temosx(i)iniw(i)(i+1)ff′(s)≈1
Var(x(i+1))=niVar(x(i))Var(w(i))
Para conseguir , portanto, precisamos impor a condiçãoVar(x(i+1))=Var(x(i))
Var(w(i))=1ni.
Se denotarmos por , no passe para trás, queremos da mesma forma∂L∂x(i)jΔ(i)j
Var(Δ(i))=ni+1Var(Δ(i+1))Var(w(i)).
A menos que , tenhamos que comprometer-se entre essas duas condições, e uma escolha razoável é a média harmônicani=ni+1
Var(w(i))=2ni+ni+1.
Se amostrarmos pesos de uma distribuição normal , satisfazeremos essa condição com . Para uma distribuição uniforme , devemos tomar desde que . Chegamos assim à inicialização do Glorot. Essa é a estratégia de inicialização padrão para as camadas de convolução densa e 2D no Keras, por exemplo.N(0,σ)σ=2ni+ni+1−−−−−√U(−a,a)a=6ni+ni+1−−−−−√Var(U(−a,a))=a2/3
A inicialização do Glorot funciona muito bem para ativações triviais e , mas não funciona tão bem para . Felizmente, como zera apenas as entradas negativas, ele remove aproximadamente metade da variação e isso é facilmente alterado multiplicando uma de nossas condições acima por duas:tanhReLUf(s)=ReLU(s)
Var(w(i))=2ni.