Retropropagação: Cálculo de Gradiente para Treinamento de Redes Neurais

A retropropagação é o algoritmo central para treinar redes neurais artificiais. Ele calcula eficientemente o gradiente da função de perda em relação aos pesos e vieses da rede, permitindo atualizações iterativas dos pesos para minimizar os erros de previsão.

A retropropagação, abreviação de 'backward propagation of errors' (propagação reversa de erros), é o algoritmo fundamental que permite às redes neurais artificiais aprender. Ele calcula o gradiente de uma função de perda definida em relação a cada peso e viés dentro da rede. Essas informações de gradiente são então alimentadas em um algoritmo de otimização (por exemplo, descida de gradiente) para ajustar sistematicamente os parâmetros da rede. O objetivo é minimizar a discrepância entre as previsões da rede e os valores alvo reais. O processo envolve inerentemente duas passagens: uma passagem direta para gerar previsões e uma passagem reversa para propagar os sinais de erro e calcular os gradientes.

Etapas principais:

  1. Passagem direta: Os dados de entrada atravessam a rede, camada por camada. Cada neurone aplica uma soma ponderada de suas entradas, adiciona um viés e passa o resultado através de uma função de ativação para produzir uma saída.
  2. Cálculo da perda: Uma função de perda mede o erro entre a saída final da rede e o valor real.
  3. Passagem reversa (Cálculo do gradiente): Começando da camada de saída, o erro é propagado para trás. Usando a regra da cadeia do cálculo, o algoritmo calcula quanto cada peso e viés contribuiu para o erro geral (ou seja, o gradiente).
  4. Atualização de parâmetros: Um algoritmo de otimização utiliza esses gradientes calculados para ajustar os pesos e vieses, movendo-os em uma direção que reduz a perda.

Este ciclo se repete, permitindo que a rede refine progressivamente seus parâmetros internos e melhore sua precisão preditiva.

        graph LR
  Center["Retropropagação: Cálculo de Gradiente para Treinamento de Redes Neurais"]:::main
  Pre_linear_algebra["linear-algebra"]:::pre --> Center
  click Pre_linear_algebra "/terms/linear-algebra"
  Rel_gradient_descent["gradient-descent"]:::related -.-> Center
  click Rel_gradient_descent "/terms/gradient-descent"
  Rel_deep_learning["deep-learning"]:::related -.-> Center
  click Rel_deep_learning "/terms/deep-learning"
  classDef main fill:#7c3aed,stroke:#8b5cf6,stroke-width:2px,color:white,font-weight:bold,rx:5,ry:5;
  classDef pre fill:#0f172a,stroke:#3b82f6,color:#94a3b8,rx:5,ry:5;
  classDef child fill:#0f172a,stroke:#10b981,color:#94a3b8,rx:5,ry:5;
  classDef related fill:#0f172a,stroke:#8b5cf6,stroke-dasharray: 5 5,color:#94a3b8,rx:5,ry:5;
  linkStyle default stroke:#4b5563,stroke-width:2px;

      

🧒 Explique como se eu tivesse 5 anos

Pense em treinar uma rede neural como ensinar uma matéria difícil a um aluno. O aluno tenta responder a uma pergunta (passagem direta), recebe uma nota (perda), e você diz exatamente *como* ele errou e em que medida para cada conceito que usou (passagem reversa). Ele então ajusta sua compreensão desses conceitos (atualização de pesos) para se sair melhor da próxima vez. A retropropagação é esse mecanismo de feedback preciso para IA, permitindo que ela aprenda corrigindo seus próprios erros.

🤓 Expert Deep Dive

A retropropagação é um algoritmo eficiente para calcular o gradiente $
abla_{\theta} L(\theta; D)$ de uma função de perda $L$ em relação aos parâmetros $\theta$ (pesos $W$ e vieses $b$) de uma rede neural, dado um conjunto de dados $D = \{(x^{(i)}, y^{(i)})\}$. Ele utiliza a regra da cadeia do cálculo para decompor o cálculo do gradiente em uma sequência de operações locais realizadas camada por camada. Seja $a^{(l)}$ o vetor de ativação da camada $l$, e $z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}$ o vetor de pré-ativação. A saída da camada $l$ é $a^{(l)} = f(z^{(l)})$, onde $f$ é a função de ativação. A perda $L$ é tipicamente uma função da saída final $a^{(L)}$ e do alvo $y$. A passagem reversa calcula um termo de erro $\delta^{(l)}$ para cada camada $l$, começando pela camada de saída. Para a camada de saída $L$, $\delta^{(L)} = \frac{\partial L}{\partial a^{(L)}} \odot f'(z^{(L)})$, onde $\odot$ denota a multiplicação elemento a elemento e $f'$ é a derivada da função de ativação. Para camadas ocultas $l < L$, o termo de erro é calculado recursivamente: $\delta^{(l)} = ((W^{(l+1)})^T \delta^{(l+1)}) \odot f'(z^{(l)})$. Os gradientes da perda em relação aos parâmetros da camada $l$ são então derivados como $
abla_{W^{(l)}} L = \delta^{(l)} (a^{(l-1)})^T$ e $
abla_{b^{(l)}} L = \delta^{(l)}$. Esses gradientes são entradas essenciais para algoritmos de otimização como o Gradiente Descendente Estocástico (SGD) ou Adam, que atualizam $\theta$ para minimizar $L$.

🔗 Termos relacionados

Pré-requisitos:

📚 Fontes