Retro-propagação (Backpropagation)

Ref.: Backpropagation: DeepAI (acessado em 04/03/2025) <-- Esta referência possui conteúdo incompleto, rever Dissertação de Mestrado, para recordar equações e nomenclatura adotada "antigamente".

Retro-propagação (Backpropagation)O que é Backpropagation?Equações de RetropropagaçãoDefinição de Rede Neural FeedforwardSímbolos De Fórmula De Rede Neural Feedforward ExplicadosFunção de perda para retropropagaçãoCalculando gradientes com a regra da cadeia.Calculando gradientes de forma mais eficiente com o algoritmo de retropropagaçãoCalculando a RetropropagaçãoDerivadas (compostas) na redeRetropropagação Padrão vs. Retropropagação Através do TempoAplicações de BackpropagaçãoRetropropagação em redes neurais convolucionais para reconhecimento facialBackpropagação para reconhecimento de falaHistórico de RetropropagaçãoReferências


O que é Backpropagation?

Backpropagation, abreviação de propagação para trás de erros, é um método amplamente utilizado para calcular derivadas dentro de redes neurais profundas feedforward. A retropropagação forma uma parte importante de uma série de algoritmos de aprendizagem supervisionados para treinar redes neurais feedforward, como o gradiente descendente estocástico.

Ao treinar uma rede neural por gradiente descendente, uma função de perda é calculada, que representa o quão longe as previsões da rede estão dos rótulos verdadeiros (true labels). A retro-propagação nos permite calcular o gradiente da função de perda em relação a cada um dos pesos da rede. Isso permite que cada peso seja atualizado individualmente para reduzir gradualmente a função de perda em muitas iterações de treinamento.

A retropropagação envolve o cálculo do gradiente que procede para trás através da rede feedforward desde a última camada até a primeira. Para calcular o gradiente em uma camada específica, os gradientes de todas as camadas a seguir são combinados através da regra da cadeia (da área de cálculo).

O algoritmo de retropropagação é fundamental para o aprendizado supervisionado de redes neurais profundas e permitiu o recente aumento na popularidade dos algoritmos de aprendizado profundo desde o início dos anos 2000.

Equações de Retropropagação

Definição de Rede Neural Feedforward

Vamos considerar uma rede neural feedforward multicamadas com camadas.

A saída da primeira camada oculta é dada por

<<Fórmula de primeira camada da rede neural Feedforward>>

e a saída da segunda camada é dada por

<<Fórmula de segunda camada de rede neural Feedforward>>

E assim por diante, cada camada recebe a saída da camada anterior como entrada. A saída da camada final é denotada:

<<Fórmula de última camada da rede neural Feedforward>>

Símbolos De Fórmula De Rede Neural Feedforward Explicados

Notação: <-- Falta definir uma "convensão"

TermoComentário
A saída da camada oculta
A função de ativação da camada oculta , que pode ser uma função sigmóide, uma unidade linear retificada (ReLU), uma função tanh ou similar.
A matriz de pesos ocultos na camada .
O vetor de entrada para a rede neural.
O número de camadas na rede neural.
A matriz de viés (bias) na camada .

Função de perda para retropropagação

Quando a rede feedforward aceita uma entrada e a passa pelas camadas para produzir uma saída, as informações fluem para frente através da rede. Isso é chamado de propagação para frente (forward propagation).

Durante o aprendizado supervisionado, a saída é comparada ao vetor do rótulo (labels) para dar uma função de perda, também chamada de função de custo, que representa o quão boa a rede é em fazer previsões:

<<Função de perda usada para backpropagation>>

A função de perda retorna um valor baixo quando a saída da rede está próxima do rótulo e um valor alto quando são diferentes. Portanto, no início do treinamento, a função de perda será muito grande, e um modelo totalmente treinado deve ter uma pequena função de perda, quando o conjunto de dados de treinamento for passado pela rede. Exemplos de funções de perda incluem a perda de entropia cruzada, a função de similaridade do cosseno e a perda de dobradiça (hinge loss).

Durante o treinamento, o objetivo é reduzir a função de perda no conjunto de dados de treinamento o máximo possível. Isso significa que os pesos da rede devem ser ajustados gradualmente para que seja reduzido.

Isso significa que devemos calcular a derivada de em relação a cada peso na rede:

<<Derivado da função de custo necessária para a retropropagação>>

Símbolos da fórmula da função de perda de retropropagação explicados:

TermoComentário
O peso da rede indo do nó na camada para o nó na camada .

Calculando gradientes com a regra da cadeia.

Como uma rede neural tem muitas camadas, a derivada de em um ponto no meio da rede pode estar muito distante da função de perda, que é calculada após a última camada.

Na verdade, depende dos valores de peso através de uma cadeia de muitas funções. Podemos usar a regra da cadeia do cálculo para calcular seus derivados. A regra da cadeia nos diz que para uma função dependendo de , onde depende de , o derivado de em relação a é dado por:

<<A regra da cadeia do cálculo>>

Calculando gradientes de forma mais eficiente com o algoritmo de retropropagação

Cada componente da derivada de em relação a cada peso na rede pode ser calculado individualmente usando a regra da cadeia. No entanto, seria extremamente ineficiente fazer isso separadamente para cada peso.

O algoritmo de backpropagação envolve primeiro o cálculo dos derivados na camada , que é a última camada. Esses derivados são um ingrediente na fórmula de regra da cadeia para a camada , para que possam ser salvos e reutilizados para a penúltima camada. E assim, na retropropagação, trabalhamos de trás para frente através da rede, indo da última camada para a primeira camada, a cada vez usando os últimos cálculos derivados através da regra da cadeia para obter as derivadas para a camada atual.

Dessa forma, o algoritmo de retropropagação nos permite calcular eficientemente o gradiente em relação a cada peso, evitando cálculos duplicados.

Calculando a Retropropagação

Exemplo de Cálculo de Backpropagation: Rede Feedforward com duas camadas ocultas e função de perda sigmoidal.

Definindo uma rede neural feedforward como um gráfico computacional

Vamos considerar que estamos treinando uma rede neural de feedforward simples com duas camadas ocultas. Podemos representar a rede durante o treinamento como o seguinte gráfico computacional:

<>

Portanto, cada exemplo de treinamento entra na rede como um par , onde é a observação e é o rótulo (label). A função de perda é calculada a partir da saída e o rótulo (label) . deve ser minimizado durante o treinamento.

Expressando a rede neural feedforward como uma combinação de funções

Vamos simplificar e definir os valores de viés (bias) para zero, e tratar os vetores como escalares, para tornar o cálculo mais conciso. Isso significa que nossa rede tem dois parâmetros para treinar,

??

E

??.

Então a saída da primeira camada oculta é:

<<falta equação>>

A saída da segunda camada oculta é:

<<falta equação>>

A saída da camada final é:

<<falta equação>>

E, finalmente, vamos escolher a função de erro médio quadrático simples como nossa função de perda (loss function):

<<falta equação>>

e vamos definir as funções de ativação em ambas as camadas ocultas para a função sigmoid:

<<falta equação>>

Derivadas (compostas) na rede

Será útil conhecer com antecedência as derivadas da função de perda e da função de ativação (sigmoide):

<<falta equação>>

Usando a retropropagação, primeiro calculamos:

<<equação>>

, então

<<nova equação>>

, e então

<<outra equação>>

, trabalhando para trás através da rede.

Podemos expressar a função de perda explicitamente como uma função de todos os pesos na rede substituindo a expressão para cada camada:

Retropropagação etapa 1: Calculando o gradiente na terceira e última camada

Primeiro, queremos calcular o gradiente do último peso na rede (camada 3). Aplicando a regra da cadeia e trabalhando ao contrário no gráfico computacional, o betemos:

<<falta equações !?>>

Retropropagação etapa 2: Calculando o gradiente na segunda (penúltima) camada

Em seguida, calcularemos o gradiente na camada 2. Como C está agora a dois passos da camada 2, temos que usar a regra da cadeia duas vezes:

<<faltam equações>>

Observe que o primeiro termo na expressão de regra da cadeia é o mesmo que o primeiro termo na expressão para a camada 3.

Passo de retropropagação 3: Calculando o gradiente na primeira camada

Finalmente, podemos calcular o gradiente em relação ao peso na camada 1, desta vez usando outra etapa da regra da cadeia.

<<falta equações !?>>

Os dois primeiros termos na expressão de regra de cadeia para a camada 1 são compartilhados com o cálculo do gradiente para a camada 2.

Isso significa que computacionalmente, não é necessário recalcular toda a expressão. Somente os termos que são específicos da camada atual devem ser avaliados. Os termos que são comuns às camadas anteriores podem ser reciclados.

Dessa forma, o algoritmo de backpropagation é extremamente eficiente, em comparação com uma abordagem ingênua, que envolveria a avaliação da regra da cadeia para cada peso na rede individualmente.

Uma vez que os gradientes sejam calculados, seria normal atualizar todos os pesos na rede com o objetivo de reduzir C. Há vários algoritmos para conseguir isso, e o mais conhecido é a descida de gradiente estocástico.

Retropropagação Padrão vs. Retropropagação Através do Tempo

A retropropagação depende da capacidade de expressar uma rede neural inteira em função de uma função de uma função de uma função... e assim por diante, permitindo que a regra da cadeia seja aplicada recursivamente.

Isso não pode ser aplicado se a rede neural não puder ser reduzida a uma única expressão de funções compostas - em outras palavras, se não puder ser expressa como um gráfo acíclico direcionado.

Uma rede neural recorrente processa uma série temporal de entrada, e a saída de um nó em um ponto no tempo é alimentada de volta para a rede no ponto de tempo seguinte. Isso significa que uma rede neural recorrente não pode ser expressa como um gráfico acíclico direcionado, uma vez que contém ciclos.

No entanto, é possível 'desenrolar' (unroll) uma rede neural recorrente e visualizá-la como uma rede neural feedforward. Cada passo de tempo é representado como uma única cópia da rede neural original.

<<falta equação !?>>

Desenrolando uma rede neural recorrente para representá-la como uma rede neural feedforward para retropropagação através do tempo

Como a retropropagação ao longo do tempo envolve a duplicação da rede, ela pode produzir uma grande rede neural de feedforward que é difícil de treinar, com muitas oportunidades para o algoritmo de backpropagação ficar preso em optima local.

Além disso, as interações entre entradas que estão distantes no tempo podem ser difíceis para a rede aprender, pois as contribuições do gradiente da interação se tornam cada vez menores em comparação com os efeitos locais. Isso é conhecido como o problema do desaparecimento do gradiente (vanishing gradient problem) e pode ser resolvido escolhendo funções de ativação ReLU e introduzindo a regularização na rede.

Aplicações de Backpropagação

A backpropagação e suas variantes, como a backpropagação ao longo do tempo, são amplamente utilizadas para treinar quase todos os tipos de redes neurais e permitiram o recente aumento na popularidade do aprendizado profundo. Uma pequena seleção de exemplos de aplicações de retropropagação é apresentada abaixo.

Retropropagação em redes neurais convolucionais para reconhecimento facial

As redes neurais convolucionais (Convolutional neural networks) são a técnica padrão de aprendizado profundo para processamento e reconhecimento de imagens, e são frequentemente treinadas com o algoritmo de retropropagação.

Em 2015, Parkhi, Vidaldi e Zisserman descreveram uma técnica para construir um reconhecimento facial. Eles usaram uma rede neural convolucional com 18 camadas e um banco de dados de rostos de celebridades.

Inicialmente, a rede foi treinada usando backpropagation em todas as 18 camadas. As imagens foram passadas para a rede em lotes, a função de perda foi calculada e os gradientes foram calculados primeiro para a camada 18, trabalhando de volta para a camada 1. Após cada lote (batch) de imagens, os pesos da rede foram atualizados.

Para refinar a rede para poder distinguir as nuances dos rostos humanos, os pesquisadores executaram um estágio de treinamento extra apenas para a camada 18, uma vez que a backpropagation tivesse sido executada para todas as 18 camadas. Os pesquisadores escolheram uma função de perda chamada perda de trigêmeos(!?) (triplet loss). A rede neural recebe uma entrada de três imagens de rosto de celebridades ao mesmo tempo, por exemplo, duas imagens de Matt Damon e uma imagem de Brad Pitt. A função de perda penaliza a rede se decidir que duas imagens da mesma pessoa são diferentes, e também penaliza a rede por classificar imagens de pessoas diferentes como semelhantes. Com o tempo, triplets de três imagens são passados pela rede e a função de perda é calculada, e os pesos da última camada são atualizados.

Backpropagação para reconhecimento de fala

O algoritmo de backpropagation foi aplicado para reconhecimento de fala. Um exemplo de implementação de um sistema de reconhecimento de voz para inglês e japonês, capaz de ser executado em dispositivos embarcados, foi desenvolvido pela Sony Corporation of Japan. O sistema foi projetado para ouvir um número limitado de comandos de um usuário.

Nesta implementação, um sinal de som de entrada é dividido em janelas de tempo e uma Transformada Rápida de Fourier (Fast Fourier Transform) é aplicada. A intensidade do som em diferentes frequências (o espectro do sinal) é tomada como uma característica (feature) e inserida em uma rede neural composta por cinco camadas. Os pesquisadores escolheram uma função de perda de entropia cruzada Softmax e conseguiram aplicar a retropropagação para treinar as cinco camadas para entender os comandos japoneses. Eles foram então capazes de mudar a rede para treinar em gravações de som em inglês e foram capazes de adaptar o sistema para reconhecer comandos em inglês. Este é um exemplo de transferência de aprendizado (transfer learning): um modelo de aprendizado de máquina pode ser treinado para uma tarefa e, em seguida, retreinado e adaptado para uma nova tarefa.

Histórico de Retropropagação

Augustin-Louis Cauchy (1789-1857), inventor da descendência gradiente. A imagem é de domínio público.

Em 1847, o matemático francês Baron Augustin-Louis Cauchy desenvolveu um método de descida de gradiente para resolver equações simultâneas. Ele estava interessado em resolver cálculos astronômicos em muitas variáveis, e teve a ideia de pegar a derivada de uma função e dar pequenos passos para minimizar um termo de erro.

No século seguinte, os métodos de descida de gradiente foram usados em todas as disciplinas para resolver problemas difíceis numericamente, onde uma solução algébrica exata teria sido impossível ou computacionalmente intratável.

Em 1970, o estudante de mestrado finlandês Seppo Linnainmaa descreveu um algoritmo eficiente para retropropagação de erros em redes escassamente (sparsely) conectadas em sua tese de mestrado na Universidade de Helsinque, embora ele não tenha se referido especificamente a redes neurais.

Em 1986, o psicólogo americano David Rumelhart e seus colegas publicaram um artigo influente aplicando o algoritmo de retropropagação de Linnainmaa a redes neurais multicamadas. Os anos seguintes viram vários avanços com base no novo algoritmo, como o artigo de Yann LeCun de 1989 aplicando retropropagação em redes neurais convolucionais para reconhecimento de dígitos escritos à mão.

Na década de 1980, vários pesquisadores derivaram independentemente a retropropagação considerando o tempo, a fim de permitir o treinamento de redes neurais recorrentes.

Nos últimos anos, as redes neurais profundas tornaram-se onipresentes (ubiquitous) e a retropropagação é muito importante para um treinamento eficiente. Embora o algoritmo tenha sido modificado para ser paralelizado e executado facilmente em várias GPUs, o algoritmo de backpropagação original de Linnainmaa e Rumelhart formam a espinha dorsal de toda a IA baseada em aprendizado profundo hoje.

Referências