Retropropagação

Considere uma base de treino composta pelas observações \(x_{i,1}\), \(x_{i,2}\), \(x_{i,3}\) e \(y_i\), \(i=1, 2, \ldots, n\). Suponha que queremos encontrar parâmetros para ajustar esta base à rede apresentada na Figura 1.

Perceptron com 2 camadas ocultas de 2 e 3 neurônios
Figura 1: Perceptron com 2 camadas ocultas de 2 e 3 neurônios

Na prática procuramos os valores de \((\mathbf{\hat{w}},\mathbf{\hat\Theta})\), isto é, os valores de \(\hat{w}_{k,j}\) e \(\hat\Theta_j\), tais que

\[ (\mathbf{\hat{w}},\mathbf{\hat\Theta}) = \arg\min_{\mathbf{\hat{w}},\mathbf{\hat\Theta}} \ \ \sum_{i=1}^n \left( \hat{y}_i - y_i \right)^2 = \arg\min_{\mathbf{\hat{w}},\mathbf{\hat\Theta}} \ \ \sum_{i=1}^n \dfrac{1}{2} \left( \hat{y}_i - y_i \right)^2 = \arg\min_{\mathbf{\hat{w}},\mathbf{\hat\Theta}} \ \ J(\mathbf{\hat{w}},\mathbf{\hat\Theta}) \] sendo \(\hat{y}_i\) função dos parâmetros \(\hat{w}_{k,j}\) e \(\hat\Theta_j\) e \(J\) a função a ser minimizada, chamada de função objetivo.

Se a gente conseguisse escrever a função que relaciona \(\hat{y}_i\) e os valores de \((\mathbf{\hat{w}},\mathbf{\hat\Theta})\), conseguiríamos definir a função \(J\) e aplicar o gradiente descendente para encontrar o seu ponto de mínimo. O problema é que não temos essa relação. Mas suponha que ela fosse conhecida, ou seja, suponha \[ \hat{y}_i = f_i(\mathbf{\hat{w}},\mathbf{\hat\Theta}). \] Se fossemos aplicar o gradiente descendente para encontrar o ponto de mínimo da função \(J\), seguiríamos os seguintes passos:

  1. Escolher um ponto inicial \((\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0) = (\hat{w}_{1,4}^0, \hat{w}_{1,5}^0, \hat{w}_{2,4}^0, \ldots, \hat{w}_{8,F}^0, \hat\Theta_F^0 )\).

  2. Encontrar \(\nabla J\left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0 \right)\).

  3. Determinar o próximo ponto do processo iterativo: \[ (\mathbf{{\hat{w}^1}},\mathbf{\hat\Theta^1}) = (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0) - \delta \nabla J\left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0 \right). \]

Como encontrar o vetor \((\mathbf{w}_1,\mathbf{\Theta}_1)\) supondo \(f_i\) conhecida.

\[ \begin{array}{ll} (\mathbf{\hat{w}}^1,\mathbf{\hat\Theta}^1) &= (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0) - \delta \nabla J\left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0 \right), \quad \text{ sendo } J(\mathbf{\hat{w}},\mathbf{\hat\Theta}) = \sum_{i=1}^n \dfrac{1}{2} \left( \hat{y}_i - y_i \right)^2 \\ &= (\hat{w}^0_{14},\hat{w}^0_{15},\ldots, \hat{w}^0_{8F}, \hat{\Theta}^0_{F}) - \delta \left( \dfrac{\partial J}{\partial \hat{w}^0_{14}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0), \dfrac{\partial J}{\partial \hat{w}^0_{15}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0), \ldots , \dfrac{\partial J}{\partial \hat{w}^0_{8F}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0), \dfrac{\partial J}{\partial \hat\Theta_{F}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0) \right)\\ &= \left( \hat{w}_{14}^0 - \delta \dfrac{\partial J}{\partial \hat{w}_{14}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0), \hat{w}_{15}^0 - \delta \dfrac{\partial J}{\partial \hat{w}_{15}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0), \ldots , \hat{w}_{8F}^0 - \delta \dfrac{\partial J}{\partial \hat{w}_{8F}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0), \hat\Theta_F^0 - \delta \dfrac{\partial J}{\partial \hat\Theta_{F}} (\mathbf{\hat{w}}^0,\mathbf{\hat\Theta}^0) \right) \end{array} \]

Dessa forma, pelo método do gradiente descendente, a atualização da estimativa para um parâmetro desconhecido qualquer \(w\) é dado por \[ \hat{w}^{1} = \hat{w}^{0}-\delta \frac{\partial J}{\partial \hat{w}}(\mathbf{\hat{w}}^{0},\mathbf{\hat\Theta}^{0}) \]

Não é preciso conhecer a expressão de \(\frac{\partial J}{\partial \hat{w}}\) em qualquer ponto, mas somente no ponto \((\mathbf{w}^0,\mathbf{\Theta}^{0})\). Esta será a conta feita agora.

\[ \begin{array}{ll} \frac{\partial J}{\partial \hat{w}}\left(\mathbf{w}^0,\mathbf{\Theta}^0\right) &=& \frac{\partial}{\partial \hat{w}} \sum_{i=1}^n \dfrac{1}{2} \left( \hat{y}_i^0 - y_i \right)^2 \\ &=& \sum_{i=1}^n \frac{\partial}{\partial \hat{w}} \left( \dfrac{1}{2} \left( \hat{y}_i^0 - y_i \right)^2 \right)\\ &=& \sum_{i=1}^n \left( \left( \hat{y}_i^0 - y_i \right) \frac{\partial \hat{y}_i^0 }{\partial \hat{w}} \right) \\ &=& \sum_{i=1}^n \left( \left( \hat{y}_i^0 - y_i \right) \frac{\partial f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) }{\partial \hat{w}} \right) \end{array} \] Juntando as duas equações é possível definir a regra de atualização da estimativa de cada parâmetro, \[ \hat{w}^{1} = \hat{w}^{0}-\delta \sum_{i=1}^n \left( \left( \hat{y}_i^0 - y_i \right) \frac{\partial f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) }{\partial \hat{w}} \right) \] A expressão acima é quase toda conhecida, a única grandeza desconhecida, por enquanto, é $ $. A partir de agora vamos buscar uma forma de definir o valor desta grandeza para todos \(i\) e todo \(w\).

A ideia inicial é perceber que, uma vez determinado valores quaisquer para os parâmetros desconhecidos, é possível calcular o valor de cada “sinal” que entra e sai das funções de ativação de cada neurônio da rede. Estes sinais estão representados na Figura 2 como \(e^0_{i,j}\) e \(s^0_{i,j}\), sendo, respectivamente, identificados como o sinal de entrada e sinal de saída da função ativação do neurônio \(j\) para a \(i\)-ésima observação das covariáveis supondo atribuído os valores \(\left(\mathbf{\hat{w}^0},\mathbf{\hat\Theta^0}\right)\) aos parâmetros desconhecidos.

Perceptron com 2 camadas ocultas de 2 e 3 neurônios
Figura 2: Perceptron com 2 camadas ocultas de 2 e 3 neurônios

Então, neste momento, não sabemos o valor de $ $ mas sabemos os valores de \(e^0_{i,j}\) e \(s^0_{i,j}\) para todo \(i\) e todo \(j\). Veja que é possível escrever,

\[ \frac{\partial}{\partial \hat{w}} f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) = \frac{\partial}{\partial \hat{w}} g \left( \hat{w}^0_{6F}s^0_{i,6} + \hat{w}^0_{7F}s^0_{i,7} + \hat{w}^0_{8F}s^0_{i,8} + \hat\Theta_F^0 \right) = \frac{\partial}{\partial \hat{w}} g \left( e^0_{i,F} \right) \]

Essa ideia será aplicada a seguir.

Atualização do limiar do neurônio de saída

Suponha \(w=\Theta_F\).

\[ \frac{\partial}{\partial \hat\Theta_F^0} f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) = \frac{\partial}{\partial \hat\Theta_F^0} g \left( e^0_{i,F} \right) = g' \left( e^0_{i,F} \right) \dfrac{\partial e^0_{i,F}}{\partial \hat\Theta_F^0} = g' \left( e^0_{i,F} \right) \dfrac{\partial}{\partial \hat\Theta_F^0}\left( \hat{w}^0_{6F}s^0_{i,6} + \hat{w}^0_{7F}s^0_{i,7} + \hat{w}^0_{8F}s^0_{i,8} + \hat\Theta_F^0 \right) = g'\left( e^0_{i,F} \right) \]

Com isso chega-se em: \[ \hat\Theta^1 = \hat\Theta^0 - \delta \sum_{i=1}^n \left[ \left( \hat{y}_i^0 - y_i \right) g'\left( e^0_{i,F} \right) \right] \] e agora já é possível atualizar a estimativa para o parâmetro \(\Theta_F\) para a próxima iteração.

Atualização dos pesos sinápticos que entram no neurônio de saída.

Suponha \(w=\hat{w}_{j,F}\), sendo \(j=6, 7, 8\).

\[ \frac{\partial}{\partial \hat{w}_{j,F}^0} f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) = \frac{\partial}{\partial \hat{w}_{j,F}^0} g \left( e^0_{i,F} \right) = g' \left( e^0_{i,F} \right) \frac{\partial e^0_{i,F}}{\partial \hat{w}_{j,F}^0} = g' \left( e^0_{i,F} \right) \frac{\partial }{\partial \hat{w}_{j,F}^0}\left( \hat{w}^0_{6F}s^0_{i,6} + \hat{w}^0_{7F}s^0_{i,7} + \hat{w}^0_{8F}s^0_{i,8} + \hat\Theta_F^0 \right) = g'\left( e^0_{i,F}\right) s_{i,j}^0 \]

Com isso chega-se em: \[ \hat{w}_{j,F}^1 = \hat{w}_{j,F}^0 - \delta \sum_{i=1}^n \left[ \left( \hat{y}_i^0 - y_i \right) g'\left( e^0_{i,F}\right) s_{i,j}^0 \right] \]

Atualização dos limiares dos neurônios da última camada oculta

Suponha \(w=\hat{\Theta}_{j}\), sendo \(j=6, 7, 8\).

\[ \begin{array}{ll} \frac{\partial}{\partial \hat\Theta_j^0} f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) &= \frac{\partial}{\partial \hat\Theta_j^0} g\left( e^0_{i,F} \right) = g'\left( e^0_{i,F} \right) \frac{\partial e^0_{i,F}}{\partial \hat\Theta_j^0} = g'\left( e^0_{i,F} \right) \frac{\partial }{\partial \hat\Theta_j^0} \left( \hat{w}^0_{6F}s^0_{i,6} + \hat{w}^0_{7F}s^0_{i,7} + \hat{w}^0_{8F}s^0_{i,8} + \hat\Theta_F^0 \right)\\ &= g'\left( e^0_{i,F} \right) \hat{w}^0_{jF} \frac{\partial s^0_{i,j} }{\partial \hat\Theta_j^0} = g'\left( e^0_{i,F} \right) \hat{w}^0_{jF} \frac{\partial }{\partial \hat\Theta_j^0} g(e^0_{i,j}) = g'\left( e^0_{i,F} \right) \hat{w}^0_{jF} g'\left( e^0_{i,j} \right) \frac{\partial }{\partial \hat\Theta_j^0} e^0_{i,j} \\ &= g'\left( e^0_{i,F} \right) \hat{w}^0_{jF} g'\left( e^0_{i,j} \right) \frac{\partial }{\partial \hat\Theta_j^0} \left( \hat{w}^0_{4j}s^0_{i,4} + \hat{w}^0_{5j}s^0_{i,5} + \hat\Theta_j^0 \right) = g'\left( e^0_{i,F} \right) \hat{w}^0_{jF} g'\left( e^0_{i,j} \right) \end{array} \]

Com isso chega-se em: \[ \begin{array}{ll} \hat{\Theta}_{j}^1 &= \hat{\Theta}_{j}^0 - \delta \sum_{i=1}^n \left[ \left( \hat{y}_i^0 - y_i \right) g'\left( e^0_{i,F} \right) \hat{w}^0_{jF} g'\left( e^0_{i,j} \right) \right]\\ &= \hat{\Theta}_{j}^0 - \delta \ \hat{w}^0_{jF} \sum_{i=1}^n \left[ \left( \hat{y}_i^0 - y_i \right) g'\left( e^0_{i,F} \right) g'\left( e^0_{i,j} \right) \right] \end{array} \]

Atualização dos pesos sinápticos que entram nos neurônios da última camada oculta

Suponha \(w=\hat{w}_{lj}\), sendo \(l = 4, 5\) e \(j=6, 7, 8\).

\[ \begin{array}{ll} \frac{\partial}{\partial \hat{w}_{lj}^0} f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) &= \frac{\partial}{\partial \hat{w}_{lj}^0} g \left( e^0_{i,F} \right) = g' \left( e^0_{i,F} \right) \frac{\partial e^0_{i,F}}{\partial \hat{w}_{lj}^0} = g' \left( e^0_{i,F} \right) \frac{\partial }{\partial \hat{w}_{lj}^0} \left( \hat{w}^0_{6F}s^0_{i,6} + \hat{w}^0_{7F}s^0_{i,7} + \hat{w}^0_{8F}s^0_{i,8} + \hat\Theta_F^0 \right)\\ &= g' \left( e^0_{i,F} \right) \hat{w}^0_{jF} \frac{\partial s^0_{i,j}}{\partial \hat{w}_{lj}^0} = g' \left( e^0_{i,F} \right) \hat{w}^0_{jF} \frac{\partial }{\partial \hat{w}_{lj}^0} g(e^0_{i,j}) = g' \left( e^0_{i,F} \right) \hat{w}^0_{jF} g'(e^0_{i,j}) \frac{\partial e^0_{i,j}}{\partial \hat{w}_{lj}^0}\\ &= g' \left( e^0_{i,F} \right) \hat{w}^0_{jF} g'(e^0_{i,j}) \frac{\partial }{\partial \hat{w}_{lj}^0} \left( \hat{w}^0_{4j}s^0_{i,4} + \hat{w}^0_{5j}s^0_{i,5} + \hat\Theta_6^j \right) = g' \left( e^0_{i,F} \right) \hat{w}^0_{jF} g'(e^0_{i,j}) s^0_{i,l} \end{array} \]

Com isso chega-se em: \[ \hat{w}_{j,k}^1 = \hat{w}_{j,k}^0 - \delta \sum_{i=1}^n \left[ \left( \hat{y}_i^0 - y_i \right) g' \left( e^0_{i,F} \right) \hat{w}^0_{jF} g'(e^0_{i,j}) s^0_{i,l} \right] = \hat{w}_{j,k}^0 - \delta \ \hat{w}^0_{jF} \sum_{i=1}^n \left[ \left( \hat{y}_i^0 - y_i \right) g' \left( e^0_{i,F} \right) g'(e^0_{i,j}) s^0_{i,l} \right] \]

Atualização dos limiares dos neurônios da primeira camada oculta

Suponha \(w=\hat{\Theta}_{j}\), sendo \(j=4, 5\).

\[ \begin{array}{ll} \frac{\partial}{\partial \hat\Theta_j^0} f_i \left( \mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0} \right) &= \frac{\partial}{\partial \hat\Theta_j^0} g\left( e^0_{i,F} \right) = g'\left( e^0_{i,F} \right) \frac{\partial e^0_{i,F}}{\partial \hat\Theta_j^0} = g'\left( e^0_{i,F} \right) \frac{\partial }{\partial \hat\Theta_j^0} \left( \hat{w}^0_{6F}s^0_{i,6} + \hat{w}^0_{7F}s^0_{i,7} + \hat{w}^0_{8F}s^0_{i,8} + \hat\Theta_F^0 \right)\\ &= g'\left( e^0_{i,F} \right) \left( \hat{w}^0_{6F}\frac{\partial s^0_{i,6}}{\partial \hat\Theta_j^0} + \hat{w}^0_{7F}\frac{\partial s^0_{i,7}}{\partial \hat\Theta_j^0} + \hat{w}^0_{8F}\frac{\partial s^0_{i,8}}{\partial \hat\Theta_j^0} \right) = g'\left( e^0_{i,F} \right) \left( \hat{w}^0_{6F}\frac{\partial }{\partial \hat\Theta_j^0} g(e^0_{i,6}) + \hat{w}^0_{7F}\frac{\partial}{\partial \hat\Theta_j^0} g(e^0_{i,7})+ \hat{w}^0_{8F}\frac{\partial}{\partial \hat\Theta_j^0}g(e^0_{i,8}) \right)\\ &= g'\left( e^0_{i,F} \right) \left( \hat{w}^0_{6F} g'(e^0_{i,6}) \frac{\partial e^0_{i,6}}{\partial \hat\Theta_j^0} + \hat{w}^0_{7F} g'(e^0_{i,7}) \frac{\partial e^0_{i,7}}{\partial \hat\Theta_j^0} + \hat{w}^0_{8F} g'(e^0_{i,8}) \frac{\partial e^0_{i,8}}{\partial \hat\Theta_j^0} \right) \\ &= g'\left( e^0_{i,F} \right) \left( \hat{w}^0_{6F} g'(e^0_{i,6}) \hat{w}^0_{j6} \frac{\partial s^0_{i,j}}{\partial \hat\Theta_j^0} + \hat{w}^0_{7F} g'(e^0_{i,7}) \hat{w}^0_{j7} \frac{\partial s^0_{i,j}}{\partial \hat\Theta_j^0} + \hat{w}^0_{8F} g'(e^0_{i,8}) \hat{w}^0_{j8} \frac{\partial s^0_{i,j}}{\partial \hat\Theta_j^0} \right) \\ &= g'\left( e^0_{i,F} \right) \left( \hat{w}^0_{6F} g'(e^0_{i,6}) \hat{w}^0_{j6} \frac{\partial }{\partial \hat\Theta_j^0} g(e^0_{i,j}) + \hat{w}^0_{7F} g'(e^0_{i,7}) \hat{w}^0_{j7} \frac{\partial }{\partial \hat\Theta_j^0} g(e^0_{i,j}) + \hat{w}^0_{8F} g'(e^0_{i,8}) \hat{w}^0_{j8} \frac{\partial }{\partial \hat\Theta_j^0} g(e^0_{i,j}) \right)\\ &= g'\left( e^0_{i,F} \right) \left( \hat{w}^0_{6F} g'(e^0_{i,6}) \hat{w}^0_{j6} g'(e^0_{i,j}) + \hat{w}^0_{7F} g'(e^0_{i,7}) \hat{w}^0_{j7} g'(e^0_{i,j}) + \hat{w}^0_{8F} g'(e^0_{i,8}) g'(e^0_{i,j}) \right) \end{array} \]

Com isso chega-se em: \[ \begin{array} \hat{\Theta}_{k}^1 &=& \hat{\Theta}_{k}^0 - \delta \sum_{i=1}^n \left( \hat{y}_i^0 - y_i \right) g'\left( e^0_{i,F} \right) \left( \hat{w}^0_{6F} g'(e^0_{i,6}) \hat{w}^0_{j6} g'(e^0_{i,j}) + \hat{w}^0_{7F} g'(e^0_{i,7}) \hat{w}^0_{j7} g'(e^0_{i,j}) + \hat{w}^0_{8F} g'(e^0_{i,8}) g'(e^0_{i,j}) \right) \\ &=& \hat{\Theta}_{k}^0 - \delta \sum_{i=1}^n \left( \hat{y}_i^0 - y_i \right) g'\left( e^0_{i,F} \right) \left( \sum_{l=6}^8 \left( \hat{w}^0_{lF} g'(e^0_{i,l}) \hat{w}^0_{jl} \right) \right) g'(e^0_{i,j}) \end{array} \]

Atualização dos pesos sinápticos que entram nos neurônios da primeira camada oculta

Faltam essas contas

O algoritmo de Retropropagação

Passo 1: Inicialização

Uma vez definida a arquitetura da rede, defina valores iniciais de forma aleatória para os pesos sinápticos e limiares. Esses valores podem ser obtidos a partir de uma distribuição uniforme de média zero e serão chamados de \((\mathbf{\hat{w}}^0,\mathbf{\hat\Theta^0})\). Na Figura 3 são os valores em vermelho.

Passo 2: Computação para frente (Propagação)

Para cada observação \(i\), calcula-se o valor na entrada e na saída de toda função de ativação, \(e^0_{ik}\) e \(s^0_{ik}\). Começa pelos valores mais à esquerda e termina nos mais a direita, sendo o último deles o valor de \(\hat{y}^0_i\).

Passo 3: Computação para trás (Retropropagação)

Atuliza-se os valores dos pesos sinápticos e limiar de cada neurônio, começando pelos parâmetros mais à direita e terminando com os mais à esquerda.

O processo iterativo

Os passos 2 e 3 são repetidos até que se chegue a um dos critérios de parada, como por exemplo, foi atingido um número máximo de iterações ou o valor da função objetivo já atingiu uma estabilidade em seguidas mudanças de parâmetros.

Algoritmo de Retropropagação - Retropropagação
Figura 3: Algoritmo de Retropropagação - Retropropagação