Acabo de ouvir que é uma boa ideia escolher pesos iniciais de uma rede neural no intervalo , onde é o número de entradas para um dado neurônio. Supõe-se que os conjuntos sejam normalizados - média 0, variação 1 (não sei se isso importa).
Por que essa é uma boa ideia?
Respostas:
Suponho que você esteja usando neurônios logísticos e que esteja treinando por gradiente de descida / propagação traseira.
A função logística é quase plana para grandes entradas positivas ou negativas. A derivada em uma entrada de é cerca de , mas em a derivada é de cerca de . Isso significa que se a entrada de um neurônio logístico for , então, para um determinado sinal de treinamento, o neurônio aprenderá cerca de vezes mais lentamente que se a entrada for .2 1/10 10 1/22000 10 2200 2
Se você deseja que o neurônio aprenda rapidamente, é necessário produzir um enorme sinal de treinamento (como uma função de perda de entropia cruzada) ou deseja que o derivado seja grande. Para aumentar a derivada, defina os pesos iniciais para obter entradas no intervalo .[−4,4]
Os pesos iniciais que você fornece podem ou não funcionar. Depende de como as entradas são normalizadas. Se as entradas forem normalizadas com média e desvio padrão , uma soma aleatória de termos com pesos uniformes em terá média e variância , independente de . A probabilidade de você obter uma soma fora de é pequena. Isso significa que, à medida que você aumenta , você não está causando a saturação dos neurônios para que eles não aprendam.0 1 d (−1d√,1d√) 0 13 d [−4,4] d
Com entradas que não são normalizadas, esses pesos podem não ser eficazes para evitar a saturação.
fonte
[1] aborda a questão:
Primeiro, os pesos não devem ser definidos como zeros, a fim de quebrar a simetria ao retrograr:
Algumas estratégias de inicialização:
W = np.random.randn(ndim, ndim); u, s, v = np.linalg.svd(W)
, use-au
como sua matriz de inicialização.Além disso, o pré-treinamento não supervisionado pode ajudar em algumas situações:
Algumas bibliotecas da RNA também possuem algumas listas interessantes, como Lasanha :
[1] Bengio, Yoshua. " Recomendações práticas para o treinamento baseado em gradiente de arquiteturas profundas. " Redes Neurais: Truques do comércio. Springer Berlin Heidelberg, 2012. 437-478.
[2] LeCun, Y., Bottou, L., Orr, GB e Muller, K. (1998a). Backprop eficiente. Em redes neurais, truques do comércio .
[3] Glorot, Xavier e Yoshua Bengio. " Entendendo a dificuldade de treinar redes neurais profundas de avanço ". Conferência internacional sobre inteligência artificial e estatística. 2010.
fonte
A explicação a seguir é retirada do livro: Redes Neurais para Reconhecimento de Padrões, de Christopher Bishop. Grande livro! Suponha que você tenha branqueado as entradas anteriormente para as unidades de entrada, ou seja, e
A questão é: como escolher melhor os pesos ?. A idéia é escolher valores dos pesos aleatoriamente após uma distribuição que ajude o processo de otimização a convergir para uma solução significativa.
Você tem para ativar as unidades na primeira camada, que . Agora, como você escolhe os pesos independentemente das entradas, e onde sigma é a variação da distribuição de pesos. Para obter esse resultado, é necessário lembrar que os pesos são inicializados independentemente um do outro, ou seja,
fonte
Bem, apenas como uma atualização, Explorando profundamente os retificadores: superando o desempenho em nível humano n A classificação ImageNet de He et al introduziu uma inicialização especificamente com a inicialização,
w = U([0,n]) * sqrt(2.0/n)
onden
está o número de entradas do seu NN. Eu já vi essa inicialização usada em muitos trabalhos recentes (também com ReLU). Na verdade, eles mostram como isso começa a reduzir a taxa de erro muito mais rapidamente do que o (-1 / n, 1 / n) que você mencionou. Para obter uma explicação completa, consulte o documento, mas veja a rapidez com que ele converge:fonte
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) i ni w(i) (i+1) f f′(s)≈1
Para conseguir , portanto, precisamos impor a condiçãoVar(x(i+1))=Var(x(i))
Se denotarmos por , no passe para trás, queremos da mesma forma∂L∂x(i)j Δ(i)j
A menos que , tenhamos que comprometer-se entre essas duas condições, e uma escolha razoável é a média harmônicani=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:tanh ReLU f(s)=ReLU(s)
fonte
Uma outra técnica que alivia o problema da inicialização do peso é a Normalização em Lote . Ele atua para padronizar a média e a variação de cada unidade, a fim de estabilizar o aprendizado, conforme descrito no artigo original . Na prática, as redes que usam BN (Normalização em lote) são significativamente mais robustas à inicialização incorreta. O BN funciona da seguinte maneira: Calculamos a média e a variação empíricas de cada minilote e padronizamos a entrada e forme a saída escalandoxiBN(xi)xiγβ
O BN apresenta dois parâmetros extras ( e ) por ativação que permitem que o tenha qualquer desvio médio e padrão. A razão para isso é normalizar pode reduzir seu poder expressivo. Essa nova parametrização possui uma melhor dinâmica de aprendizado: na parametrização antiga, a média de era determinada por uma interação complicada entre os parâmetros de todas as camadas anteriores - portanto, pequenas alterações nos parâmetros da rede ampliam à medida que a rede se torna mais profunda. Na nova parametrização, a média de é determinada por que aprendemos junto comp x i x i x i x i p yγ β x^i xi xi x^i β γ durante o treinamento. Assim, a Normalização em lote estabiliza o aprendizado.
Como resultado, a Normalização em lote permite um treinamento mais rápido usando taxas de aprendizado muito mais altas e alivia o problema de uma má inicialização. O BN também possibilita o uso de não linearidades de saturação, impedindo que a rede fique presa nos modos de saturação. Em resumo, a Normalização em lote é uma transformação diferenciável que introduz ativações normalizadas na rede. Na prática, uma camada BN pode ser inserida imediatamente após uma camada totalmente conectada.
fonte