gradiente de desaparecimento e gradiente zero
Há um problema bem conhecido vanishing gradientno BackPropagationtreinamento de Feedforward Neural Network (FNN)(aqui não consideramos o gradiente de desaparecimento da Rede Neural Recorrente).
Eu não entendo por que gradiente de desaparecimento não significa que o gradiente zero seja a solução ideal que queremos? Eu vi uma resposta dizendo que gradiente de desaparecimento não é exatamente o gradiente zero, apenas significa que a atualização do parâmetro é muito lenta. No entanto, no gradiente decente, não queremos atingir o gradiente zero exato e vamos parar quando o parâmetro se alterar dentro$\epsilon,$ que é o mesmo caso de gradiente de desaparecimento.
Alguém pode me dar uma resposta clara?
Respostas
Gradiente relativamente baixo nem sempre significa que alcançamos um ponto crítico
Ter um valor baixo em um componente do gradiente não significa necessariamente que estamos próximos de um ponto crítico para aquele parâmetro. Isso significa que a função mudará pouco se fizermos uma atualização com base somente nesse componente de gradiente.
Por exemplo, pense sobre a função $f(w_1,w_2) = 0.001w_1^2 + w_2^2\rightarrow$ para um ponto com coordenadas semelhantes, teremos um componente gradiente $1000$ vezes maior no $w_2$ direção do que na $w_1$ direção.
Portanto, nessa função (que podemos interpretar como nossa função de custo), se inicializarmos nossos parâmetros com um valor semelhante, isso levará a uma melhoria muito mais lenta no $w_1$ direção, como podemos ver no próximo gráfico de contorno para uma taxa de aprendizagem de $0.5$:
Como podemos ver, mesmo estando longe do mínimo em $(0, 0)^T$, as melhorias em $w_1$ são muito pequenos, então precisamos de muitas iterações para atingir o mínimo em $w_1$. E atingiu o mínimo após$1000$iterações! Portanto, se inicializamos o algoritmo com um ponto mais distante, ele não teria atingido o mínimo.
Então agora entendemos que mesmo que tenhamos um valor baixo de gradiente, nossos parâmetros não precisam necessariamente estar próximos do valor que atinge o mínimo (ou um ponto crítico em geral) da função de custo. Em contraste, eles podem ver seu processo de aprendizagem severamente desacelerado .
Na prática, podemos evitar esse comportamento indesejado usando algumas modificações no método de descida gradiente. Por exemplo, veja Adagrad . Com este método, os componentes do gradiente são normalizados com base nos valores atuais e anteriores da magnitude do gradiente em cada direção. Assim, temos uma taxa de aprendizagem específica para cada dimensão.
Raciocínio com retropropagação usando um NN simples
Para ver por que esses componentes de gradiente menores podem ocorrer também em redes neurais, podemos fazer uso de um NN simples consistindo em apenas um neurônio por camada, assim como o próximo:
Como sabemos, o elemento do gradiente dado pela derivada da função de custo, $C$, em relação a um peso $w^l$ da camada $l$, em um NN totalmente conectado é dado pelo termo à esquerda: $$\frac{\partial C}{\partial w^l}= \delta^l (a^{l-1})^T \,\,\,\,\,\,\,\,\xrightarrow[]{\text{in our simple NN}}\,\,\,\,\,\,\,\, \frac{\partial C}{\partial w^l}=\delta^l a^{l-1}$$
Onde $\delta^l$ é o termo "erro" ($\partial C/\partial z^l$), e $a^{l-1}$ representa o vetor de ativações dos neurônios da camada anterior ($l-1$) Observe que no NN simples apresentado acima, não precisamos transpor$a^{l-1}$ pois é um escalar (um neurônio por camada $\rightarrow$ uma ativação por camada).
Normalmente, somos capazes de calcular facilmente o termo de "erro" da última camada ($\delta^L$), mas não sabemos como calculá-lo para as camadas anteriores, portanto, usamos a retropropagação :
$$\delta^l = \left((w^{l+1})^T\,\,\delta^{l+1}\right)\odot g(z^l) \,\,\,\,\,\,\,\,\xrightarrow[]{\text{in our simple NN}}\,\,\,\,\,\,\,\, \delta^l=w^{l+1} \,g(z^l) \,\,\delta^{l+1} $$
Onde $g(z^l)$ representa a função de ativação do neurônio dado o termo $z^l$.
Então, para qualquer camada $l$, como é o termo $\partial C/ \partial w^l$computado ?. Usando o raciocínio anterior para o NN simples, agora sabemos que:
$$ \begin{align} \delta^{l} &= w^{l+1} \,g(z^{l}) \,\,\color{blue}{\delta^{l+1}}\\ \\ & = w^{l+1} \,g(z^{l}) \,\,\color{blue}{w^{l+2} \,g(z^{l+1}) \,\,\delta^{l+2}}\\ \\ &= w^{l+1}\color{blue}{w^{l+2}...w^{L}}\,\,g(z^{l})\color{blue}{g(z^{l+1})...g(z^{L})\,\,\delta^L} \end{align} $$ Onde os termos azuis são equivalentes a $\delta^{l+1}$.
Como vimos anteriormente, este termo $\delta^l$ multiplicado pela ativação do neurônio da camada anterior $a^{l-1}$, nos dá o nosso desejado $\partial C/\partial w^l$:
$$ \frac{\partial C}{\partial w^l} = \delta^{l}a^{l-1} = w^{l+1}\color{blue}{w^{l+2}...w^{L}}\,\,g(z^{l})\color{blue}{g(z^{l+1})...g(z^{L})\,\,\delta^L} \,\,a^{l-1}$$
Agora podemos ver claramente que as atualizações feitas em um peso $w^l$ dependem diretamente dos valores de todos os pesos e ativações das camadas subsequentes.
Isso significa que, para qualquer valor de$w^l$ (pode estar muito longe do ótimo como na situação traçada no início), seu componente do gradiente pode tender a zero se algum dos pesos ou ativações, $g(z)$(ou uma combinação delas) das camadas subsequentes tendem a zero. Esse efeito indesejado, como você disse na pergunta, é conhecido como gradiente de desaparecimento .
Agora entendemos que mesmo que um peso apresente um valor de $\partial C/\partial w^l$perto de zero, isso não significa que atingimos um ponto crítico para esse peso. Além disso, o aprendizado desses parâmetros diminuirá significativamente porque suas atualizações são proporcionais a seus respectivos componentes do gradiente. Assim, eles podem ficar presos em um valor longe do mínimo!
Por fim, observe que esse efeito indesejado pode se tornar mais importante à medida que o número de camadas subsequentes aumenta.