Por que os pesos das redes neurais devem ser inicializados com números aleatórios? [fechadas]


105

Estou tentando construir uma rede neural do zero. Em toda a literatura de IA, há um consenso de que os pesos devem ser inicializados em números aleatórios para que a rede convirja mais rapidamente.

Mas por que os pesos iniciais das redes neurais são inicializados como números aleatórios?

Eu tinha lido em algum lugar que isso é feito para "quebrar a simetria" e fazer a rede neural aprender mais rápido. Como quebrar a simetria faz com que ele aprenda mais rápido?

Inicializar os pesos para 0 não seria uma ideia melhor? Dessa forma os pesos seriam capazes de encontrar seus valores (sejam positivos ou negativos) mais rapidamente?

Existe alguma outra filosofia subjacente por trás da randomização dos pesos, além de esperar que eles fiquem perto de seus valores ótimos quando inicializados?


8
Este parece ser um ajuste melhor para validação cruzada .
Sycorax de

2
Estou votando para fechar esta questão porque não se trata de programação conforme definido no centro de ajuda, mas sobre a teoria e metodologia geral de ML.
desertnaut

Respostas:


140

Romper a simetria é essencial aqui, e não por causa do desempenho. Imagine as 2 primeiras camadas do perceptron multicamadas (camadas de entrada e ocultas):

insira a descrição da imagem aqui

Durante a propagação direta, cada unidade na camada oculta recebe o sinal:

insira a descrição da imagem aqui

Ou seja, cada unidade oculta obtém a soma das entradas multiplicada pelo peso correspondente.

Agora imagine que você inicializou todos os pesos com o mesmo valor (por exemplo, zero ou um). Nesse caso, cada unidade oculta receberá exatamente o mesmo sinal . Por exemplo, se todos os pesos são inicializados em 1, cada unidade obtém um sinal igual à soma das entradas (e saídas sigmoid(sum(inputs))). Se todos os pesos forem zeros, o que é ainda pior, cada unidade oculta receberá o sinal zero. Não importa qual foi a entrada - se todos os pesos forem iguais, todas as unidades na camada oculta também serão as mesmas .

Este é o principal problema com a simetria e a razão pela qual você deve inicializar pesos aleatoriamente (ou, pelo menos, com valores diferentes). Observe que esse problema afeta todas as arquiteturas que usam conexões entre si.


1
Ótima explicação. Mas por que usar a palavra symmetrynão correlation? Quem usou a palavra primeiro?
nn0p de

1
@ nn0p: a correlação implica que 2 sinais mudam em uma direção semelhante, mas nem sempre e não exatamente com a mesma magnitude. Pelo menos até onde eu sei, a simetria não tem uma definição formal e é usada aqui para representar exatamente os mesmos sinais em todos os links entre os nós, o que torna o treinamento inútil.
namorada de

@amigo do que no caso de usarmos dropout, a randomização não é mais necessária. Estou errado?
emanuele

1
@emanuele O abandono é em si uma espécie de randomização, então sim, deve funcionar. Ainda, todas as conexões que não são "descartadas" a cada iteração, ainda obterão atualização simétrica, então eu acho que o aprendizado será bem lento e, portanto, recomendo ainda usar a inicialização aleatória em qualquer rede prática.
namorada de

Isso explica bem o forwardprop, mas e o backprop?
zell

74

Analogia:

Espero que seja uma boa analogia. Tentei explicar da forma mais simples possível.

Imagine que alguém o jogou de um helicóptero no topo de uma montanha desconhecida e você está preso lá. Em todo lugar está nublado. A única coisa que você sabe é que deve descer ao nível do mar de alguma forma. Que direção você deve seguir para chegar ao ponto mais baixo possível?

Se você não conseguisse encontrar um caminho para o nível do mar, o helicóptero o levaria novamente e o deixaria cair na mesma posição do topo da montanha. Você teria que seguir as mesmas direções novamente porque está se "inicializando" nas mesmas posições iniciais .

No entanto, cada vez que o helicóptero o deixa em algum lugar aleatório na montanha, você toma diferentes direções e passos. Portanto, haveria uma chance melhor de você chegar ao ponto mais baixo possível.

Isso é o que significa quebrar a simetria . A inicialização é assimétrica (o que é diferente ) para que você possa encontrar diferentes soluções para o mesmo problema.

Nesta analogia, onde você pousa são os pesos . Portanto, com pesos diferentes, há uma melhor chance de chegar ao ponto mais baixo ( ou mais baixo ).

Além disso, aumenta a entropia no sistema para que o sistema possa criar mais informações para ajudá-lo a encontrar os pontos mais baixos ( mínimos locais ou globais ).

insira a descrição da imagem aqui


10
Parece que o helicóptero o deixou em algum lugar aleatório na montanha várias vezes, no entanto, no aprendizado profundo, nós apenas inicializamos os pesos aleatoriamente apenas uma vez.
YuFeng Shen

1
Esta é uma explicação intuitiva real. Devemos também observar que os NNs quase nunca são convexos - então a randomização é o caminho ideal a seguir - mas se você tiver uma função de perda convexa, então é claro que não importa para onde você inicializa seus pesos.
Kingz

4
É uma boa analogia - mas faz mais sentido supor que você e seus amigos estão sendo jogados na montanha (ou seja, nós em uma rede) - no mesmo local ou pessoas diferentes em locais diferentes. E suponha que vocês possam se comunicar uns com os outros. Diferentes pontos com comunicação permitirão uma descida mais rápida. Mesmo local significa que todos provavelmente seguirão o mesmo caminho.
ahmedhosny

26

A resposta é bastante simples. Os algoritmos básicos de treinamento são gananciosos por natureza - eles não encontram o ótimo global, mas sim - a solução local "mais próxima". Como resultado, começar a partir de qualquer inicialização fixa viesa sua solução para algum conjunto específico de pesos. Se você fizer isso aleatoriamente (e possivelmente muitas vezes), é muito menos provável que você fique preso em alguma parte estranha da superfície de erro.

O mesmo argumento se aplica a outros algoritmos, que não são capazes de encontrar um ótimo global (k-means, EM, etc.) e não se aplica às técnicas de otimização global (como o algoritmo SMO para SVM).


Portanto, não é garantido que ele não ficará preso em mínimos locais apenas por randomização? Mas depois de várias execuções com pesos aleatórios diferentes, ele pode obter o mínimo global?
Shayan RC

1
Não há garantia, mas várias inicializações podem ajudar, pelo menos, a chegar perto do ótimo verdadeiro.
lejlot

Existe alguma fórmula ou regra padrão para definir o valor para inicializar os pesos ?? Tenho uma rede neural de feed-forward, multicamadas e back-propagation, onde a função sigmóide é usada.
lkkkk

há algumas regras práticas no livro de S.Haykin "redes neurais"
lejlot

3
Esta não é a razão pela qual as pessoas usam a inicialização aleatória, já que a maioria das pessoas não reinicia o treinamento muitas vezes com inicializações aleatórias diferentes e a rede ainda é capaz de chegar a um ótimo ótimo local.
cesarsalgado

4

Como você mencionou, o ponto principal é quebrar a simetria . Porque se você inicializar todos os pesos para zero, todos os neurônios (unidades) ocultos em sua rede neural farão exatamente os mesmos cálculos. Isso não é algo que desejamos porque queremos diferentes unidades ocultas para computar diferentes funções. No entanto, isso não é possível se você inicializar todos com o mesmo valor.


2
  1. Inicializar os pesos para 0 não seria uma ideia melhor? Dessa forma os pesos seriam capazes de encontrar seus valores (sejam positivos ou negativos) mais rapidamente?

  2. Como quebrar a simetria faz com que ele aprenda mais rápido?

Se você inicializar todos os pesos para zero, então todos os neurônios de todas as camadas executam o mesmo cálculo, dando a mesma saída e tornando toda a rede profunda inútil . Se os pesos fossem zero, a complexidade de toda a rede profunda seria a mesma de um único neurônio e as previsões não seriam nada melhores do que aleatórias.

Os nós que estão lado a lado em uma camada oculta conectada às mesmas entradas devem ter pesos diferentes para que o algoritmo de aprendizado atualize os pesos.

Ao tornar os pesos diferentes de zero (mas próximos de 0, como 0,1 etc), o algoritmo aprenderá os pesos nas próximas iterações e não ficará preso. Dessa forma, ocorre a quebra da simetria.

  1. Existe alguma outra filosofia subjacente por trás da randomização dos pesos, além de esperar que eles fiquem perto de seus valores ótimos quando inicializados?

Os algoritmos de otimização estocástica, como a descida do gradiente estocástico, usam a aleatoriedade na seleção de um ponto de partida para a pesquisa e na progressão da pesquisa.

A progressão da busca ou aprendizagem de uma rede neural é conhecida como convergência. Descobrir uma solução abaixo do ideal ou resultado ótimo local em convergência prematura.

Em vez de depender de um ótimo local, se você executar seu algoritmo várias vezes com pesos aleatórios diferentes, há uma melhor possibilidade de encontrar o ótimo global sem ficar preso ao ótimo local.

Após 2015, devido aos avanços na pesquisa de aprendizado de máquina, a Inicialização He-et-al é introduzida para substituir a inicialização aleatória

w=np.random.randn(layer_size[l],layer_size[l-1])*np.sqrt(2/layer_size[l-1])

Os pesos ainda são aleatórios, mas variam em alcance, dependendo do tamanho da camada anterior de neurônios.

Em resumo, pesos aleatórios diferentes de zero nos ajudam

  1. Saia do ótimo local
  2. Quebrando a simetria
  3. Alcance ótimos globais em outras iterações

1

Além da inicialização com valores aleatórios, os pesos iniciais não devem começar com valores grandes. Isso ocorre porque frequentemente usamos as funções tanh e sigmóide em camadas ocultas e camadas de saída. Se você olhar os gráficos das duas funções, após a propagação direta na primeira iteração resulta em valores mais altos, e esses valores correspondem aos locais nas funções sigmóide e tanh que convergem a derivada para zero. Isso leva a um arranque a frio do processo de aprendizagem e a um aumento do tempo de aprendizagem. Como resultado, se você iniciar os pesos aleatoriamente, poderá evitar esses problemas multiplicando esses valores por valores como "0,01" ou "0,001".


1

Em primeiro lugar, alguns algoritmos convergem mesmo com pesos iniciais zero. Um exemplo simples é uma Rede Perceptron Linear. Obviamente, muitas redes de aprendizagem requerem uma ponderação inicial aleatória (embora isso não seja uma garantia de obter a resposta mais rápida e melhor ).

As redes neurais usam retropropagação para aprender e atualizar pesos, e o problema é que, neste método, os pesos convergem para o ótimo local (custo / perda mínimo local), não para o ótimo global.

A ponderação aleatória ajuda a rede a se arriscar em cada direção no espaço disponível e gradualmente melhorá-las para chegar a uma resposta melhor e não se limitar a uma direção ou resposta.

[A imagem abaixo mostra um exemplo unidimensional de como a convergência. Dada a localização inicial, a otimização local é alcançada, mas não uma otimização global. Em dimensões mais altas, a ponderação aleatória pode aumentar as chances de estar no lugar certo ou de começar melhor, resultando em pesos convergentes para valores melhores.] [1]

[1]: https://i.stack.imgur.com/2dioT.png [Kalhor, A. (2020). Classificação e regressão NNs. Palestra.]

No caso mais simples, o novo peso é o seguinte:

W_new = W_old + D_loss

Aqui, o gradiente da função de custo é adicionado ao peso anterior para obter um novo peso. Se todos os pesos anteriores forem iguais, na próxima etapa todos os pesos podem ser iguais. Como resultado, neste caso, do ponto de vista geométrico, a rede neural está inclinada em uma direção e todos os pesos são iguais. Mas se os pesos forem diferentes, é possível atualizar os pesos em valores diferentes. (dependendo do fator de impacto que cada peso tem no resultado, isso afeta o custo e a atualização dos pesos. Assim, até mesmo um pequeno erro na ponderação inicial aleatória pode ser resolvido).

Este foi um exemplo muito simples, mas mostra o efeito da inicialização de ponderação aleatória no aprendizado. Isso permite que a rede neural vá para espaços diferentes em vez de ir para um lado. Como resultado, no processo de aprendizagem, vá até o melhor desses espaços


0

Vamos ser mais matemáticos. Na verdade, a razão pela qual respondo é que achei essa parte faltando nas outras respostas. Suponha que você tenha 2 camadas. Se olharmos para o algoritmo de retropropagação, o cálculo de

dZ2 = A2 - Y

dW2 = (1 / m) * dZ2 * A2.T

Vamos ignorar o DB2. (Desculpe, não desculpe;))

dZ1 = W2.T * dZ2. * g1 '(Z1)

...

O problema que você vê está em negrito. Calculando dZ1 (que é necessário para calcular dW1), W2 é 0. Nunca tivemos a chance de alterar os pesos para algo além de 0 e nunca teremos. Então, essencialmente, a rede neural não aprende nada. Eu acho que é pior do que regressão logística (unidade única). No caso da regressão logística, você aprende com mais iterações, pois obtém entradas diferentes graças a X. Nesse caso, as outras camadas estão sempre dando a mesma saída, então você não aprende nada.


0

Aprendi uma coisa: se você inicializar o peso para zeros, é óbvio que as unidades de ativação na mesma camada serão as mesmas, o que significa que terão os mesmos valores. Ao fazer backbrop, você descobrirá que todas as linhas do gradiente dW também são iguais, portanto, todas as linhas da matriz de peso W são as mesmas após as atualizações de descida do gradiente. Em geral, inicializar todos os pesos para zero resulta na falha da rede em quebrar a simetria. Isso significa que cada neurônio em cada camada aprenderá a mesma coisa, e você também pode estar treinando uma rede neural com n[l]=1n[l]=1para cada camada, e a rede não é mais poderosa do que um classificador linear, como a regressão logística. Curso de Andrew Ng:

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.