Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Propagação para Trás | Rede Neural do Zero
Introdução às Redes Neurais

bookPropagação para Trás

A propagação para trás (backprop) é o processo de calcular como a função de perda varia em relação a cada parâmetro da rede. O objetivo é atualizar os parâmetros na direção que reduz a perda.

Para isso, utiliza-se o algoritmo de gradiente descendente e calcula-se as derivadas da perda em relação aos valores de pré-ativação de cada camada (valores brutos antes da aplicação da função de ativação), propagando-os para trás.

Cada camada contribui para a previsão final, portanto, os gradientes devem ser calculados de forma estruturada:

  1. Realizar a propagação para frente;
  2. Calcular a derivada da perda em relação à pré-ativação de saída;
  3. Propagar essa derivada para trás pelas camadas usando a regra da cadeia;
  4. Calcular os gradientes para pesos e vieses para atualizá-los.
Note
Nota

Gradientes representam a taxa de variação de uma função em relação às suas entradas, ou seja, são suas derivadas. Eles indicam quanto uma pequena alteração nos pesos, vieses ou ativações afeta a função de perda, orientando o processo de aprendizado do modelo por meio do gradiente descendente.

Notação

Para tornar a explicação mais clara, vamos utilizar a seguinte notação:

  • WlW^l é a matriz de pesos da camada ll;
  • blb^l é o vetor de vieses da camada ll;
  • zlz^l é o vetor de pré-ativações da camada ll;
  • ala^l é o vetor de ativações da camada ll;

Portanto, definindo a0a^0 como xx (as entradas), a propagação para frente em um perceptron com n camadas pode ser descrita pela seguinte sequência de operações:

a0=x,......z1=W1a0+b1,zl=Wlal1+bl,zn=Wnan1+bn,a1=f1(z1),al=fl(zl),an=fn(zn),......y^=an.\begin{aligned} a^0 &= x, & &... & &...\\ z^1 &= W^1 a^0 + b^1, & z^l &= W^l a^{l-1} + b^l, & z^n &= W^n a^{n-1} + b^n,\\ a^1 &= f^1(z^1), & a^l &= f^l(z^l), & a^n &= f^n(z^n),\\ &... & &... & \hat y &= a^n. \end{aligned}

Para descrever a retropropagação matematicamente, introduzimos as seguintes notações:

  • dalda^l: derivada da função de perda em relação às ativações na camada ll;
  • dzldz^l: derivada da função de perda em relação às pré-ativações na camada ll (antes de aplicar a função de ativação);
  • dWldW^l: derivada da função de perda em relação aos pesos na camada ll;
  • dbldb^l: derivada da função de perda em relação aos biases na camada ll.

Cálculo dos Gradientes para a Camada de Saída

Na camada final nn, primeiro calculamos o gradiente da função de perda em relação às ativações da camada de saída, danda^n. Em seguida, utilizando a regra da cadeia, calculamos o gradiente da função de perda em relação às pré-ativações da camada de saída:

dzn=danfn(zn)dz^n = da^n \odot f'^n(z^n)
Note
Nota

O símbolo \odot representa multiplicação elemento a elemento. Como estamos trabalhando com vetores e matrizes, o símbolo de multiplicação usual \cdot representa o produto escalar. fnf'^n é a derivada da função de ativação da camada de saída.

Esta quantidade representa o quanto a função de perda é sensível a alterações na pré-ativação da camada de saída.

Após obtermos dzn\text d z^n, calculamos os gradientes para os pesos e vieses:

dWn=dzn(an1)Tdbn=dzn\begin{aligned} dW^n &= dz^n \cdot (a^{n-1})^T\\ db^n &= dz^n \end{aligned}

onde (an1)T(a^{n-1})^T é o vetor transposto de ativações da camada anterior. Considerando que o vetor original é um vetor nneurons×1n_{neurons} \times 1, o vetor transposto é 1×nneurons1 \times n_{neurons}.

Para propagar isso para trás, calculamos a derivada da perda em relação às ativações da camada anterior:

dan1=(Wn)Tdznda^{n-1} = (W^n)^T \cdot dz^n

Propagando Gradientes para as Camadas Ocultas

Para cada camada oculta ll, o procedimento é o mesmo. Dado dalda^l:

  1. Calcular a derivada da perda em relação às pré-ativações;
  2. Calcular os gradientes para os pesos e vieses;
  3. Calcular dal1da^{l-1} para propagar a derivada para trás.
dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

Esta etapa se repete até alcançarmos a camada de entrada.

Atualização de Pesos e Biases

Após calcularmos os gradientes para todas as camadas, atualizamos os pesos e biases utilizando o gradiente descendente:

Wl=WlαdWlbl=blαdbl\begin{aligned} W^l &= W^l - \alpha \cdot dW^l\\ b^l &= b^l - \alpha \cdot db^l \end{aligned}

onde α\alpha é a taxa de aprendizado, que controla o quanto ajustamos os parâmetros.

question mark

Durante a retropropagação, como uma rede neural atualiza seus pesos e vieses para minimizar a função de perda?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 7

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 4

bookPropagação para Trás

Deslize para mostrar o menu

A propagação para trás (backprop) é o processo de calcular como a função de perda varia em relação a cada parâmetro da rede. O objetivo é atualizar os parâmetros na direção que reduz a perda.

Para isso, utiliza-se o algoritmo de gradiente descendente e calcula-se as derivadas da perda em relação aos valores de pré-ativação de cada camada (valores brutos antes da aplicação da função de ativação), propagando-os para trás.

Cada camada contribui para a previsão final, portanto, os gradientes devem ser calculados de forma estruturada:

  1. Realizar a propagação para frente;
  2. Calcular a derivada da perda em relação à pré-ativação de saída;
  3. Propagar essa derivada para trás pelas camadas usando a regra da cadeia;
  4. Calcular os gradientes para pesos e vieses para atualizá-los.
Note
Nota

Gradientes representam a taxa de variação de uma função em relação às suas entradas, ou seja, são suas derivadas. Eles indicam quanto uma pequena alteração nos pesos, vieses ou ativações afeta a função de perda, orientando o processo de aprendizado do modelo por meio do gradiente descendente.

Notação

Para tornar a explicação mais clara, vamos utilizar a seguinte notação:

  • WlW^l é a matriz de pesos da camada ll;
  • blb^l é o vetor de vieses da camada ll;
  • zlz^l é o vetor de pré-ativações da camada ll;
  • ala^l é o vetor de ativações da camada ll;

Portanto, definindo a0a^0 como xx (as entradas), a propagação para frente em um perceptron com n camadas pode ser descrita pela seguinte sequência de operações:

a0=x,......z1=W1a0+b1,zl=Wlal1+bl,zn=Wnan1+bn,a1=f1(z1),al=fl(zl),an=fn(zn),......y^=an.\begin{aligned} a^0 &= x, & &... & &...\\ z^1 &= W^1 a^0 + b^1, & z^l &= W^l a^{l-1} + b^l, & z^n &= W^n a^{n-1} + b^n,\\ a^1 &= f^1(z^1), & a^l &= f^l(z^l), & a^n &= f^n(z^n),\\ &... & &... & \hat y &= a^n. \end{aligned}

Para descrever a retropropagação matematicamente, introduzimos as seguintes notações:

  • dalda^l: derivada da função de perda em relação às ativações na camada ll;
  • dzldz^l: derivada da função de perda em relação às pré-ativações na camada ll (antes de aplicar a função de ativação);
  • dWldW^l: derivada da função de perda em relação aos pesos na camada ll;
  • dbldb^l: derivada da função de perda em relação aos biases na camada ll.

Cálculo dos Gradientes para a Camada de Saída

Na camada final nn, primeiro calculamos o gradiente da função de perda em relação às ativações da camada de saída, danda^n. Em seguida, utilizando a regra da cadeia, calculamos o gradiente da função de perda em relação às pré-ativações da camada de saída:

dzn=danfn(zn)dz^n = da^n \odot f'^n(z^n)
Note
Nota

O símbolo \odot representa multiplicação elemento a elemento. Como estamos trabalhando com vetores e matrizes, o símbolo de multiplicação usual \cdot representa o produto escalar. fnf'^n é a derivada da função de ativação da camada de saída.

Esta quantidade representa o quanto a função de perda é sensível a alterações na pré-ativação da camada de saída.

Após obtermos dzn\text d z^n, calculamos os gradientes para os pesos e vieses:

dWn=dzn(an1)Tdbn=dzn\begin{aligned} dW^n &= dz^n \cdot (a^{n-1})^T\\ db^n &= dz^n \end{aligned}

onde (an1)T(a^{n-1})^T é o vetor transposto de ativações da camada anterior. Considerando que o vetor original é um vetor nneurons×1n_{neurons} \times 1, o vetor transposto é 1×nneurons1 \times n_{neurons}.

Para propagar isso para trás, calculamos a derivada da perda em relação às ativações da camada anterior:

dan1=(Wn)Tdznda^{n-1} = (W^n)^T \cdot dz^n

Propagando Gradientes para as Camadas Ocultas

Para cada camada oculta ll, o procedimento é o mesmo. Dado dalda^l:

  1. Calcular a derivada da perda em relação às pré-ativações;
  2. Calcular os gradientes para os pesos e vieses;
  3. Calcular dal1da^{l-1} para propagar a derivada para trás.
dzl=dalfl(zl)dWl=dzl(al1)Tdbl=dzldal1=(Wl)Tdzl\begin{aligned} dz^l &= da^l \odot f'^l(z^l)\\ dW^l &= dz^l \cdot (a^{l-1})^T\\ db^l &= dz^l\\ da^{l-1} &= (W^l)^T \cdot dz^l \end{aligned}

Esta etapa se repete até alcançarmos a camada de entrada.

Atualização de Pesos e Biases

Após calcularmos os gradientes para todas as camadas, atualizamos os pesos e biases utilizando o gradiente descendente:

Wl=WlαdWlbl=blαdbl\begin{aligned} W^l &= W^l - \alpha \cdot dW^l\\ b^l &= b^l - \alpha \cdot db^l \end{aligned}

onde α\alpha é a taxa de aprendizado, que controla o quanto ajustamos os parâmetros.

question mark

Durante a retropropagação, como uma rede neural atualiza seus pesos e vieses para minimizar a função de perda?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 7
some-alt