No aprendizado de máquina, a retropropagação (backpropagation) é um método de computação de gradiente comumente usado para treinar uma rede neural no cálculo de atualizações de parâmetros.

É uma aplicação eficiente da regra da cadeia em redes neurais. A retropropagação calcula o gradiente de uma função de perda em relação aos pesos da rede para um único exemplo de entrada-saída, e o faz de forma eficiente, calculando o gradiente uma camada de cada vez, iterando para trás a partir da última camada para evitar cálculos redundantes de termos intermediários na regra da cadeia; isso pode ser derivado por meio da programação dinâmica.

A rigor, o termo retropropagação refere-se apenas a um algoritmo para calcular eficientemente o gradiente, e não a como o gradiente é usado; mas o termo é frequentemente usado de forma livre para se referir a todo o algoritmo de aprendizado. Isso inclui a alteração de parâmetros do modelo na direção negativa do gradiente, como pela descida de gradiente estocástico, ou como um passo intermediário em um otimizador mais complicado, como a Estimativa de Momento Adaptativo (Adam)., "O termo retropropagação é frequentemente mal interpretado como significando todo o algoritmo de aprendizado para redes neurais de múltiplas camadas. A retropropagação refere-se apenas ao método para calcular o gradiente, enquanto outros algoritmos, como a descida de gradiente estocástico, são usados para realizar o aprendizado usando esse gradiente."

A retropropagação teve múltiplas descobertas e descobertas parciais, com uma história e terminologia emaranhadas. Veja a seção de história para mais detalhes. Alguns outros nomes para a técnica incluem "modo reverso da diferenciação automática" ou "acumulação reversa"., "O algoritmo de retropropagação descrito aqui é apenas uma abordagem para a diferenciação automática. É um caso especial de uma classe mais ampla de técnicas chamada de acumulação em modo reverso."

Visão geral A retropropagação calcula o gradiente no espaço de pesos de uma rede neural feedforward (de alimentação direta), em relação a uma função de perda. Denota-se:

: entrada (vetor de características) : saída alvo Para classificação, a saída será um vetor de probabilidades de classe (por exemplo, , e a saída alvo é uma classe específica, codificada pela one-hot/variável dummy (por exemplo, ). : função de perda ou "função de custo" Para classificação, esta é geralmente a entropia cruzada (XC, perda logarítmica), enquanto para regressão é geralmente a perda de erro quadrático (SEL). : o número de camadas : os pesos entre a camada e , onde é o peso entre o -ésimo nó na camada e o -ésimo nó na camada : funções de ativação na camada Para classificação, a última camada é geralmente a função logística para classificação binária, e softmax (softargmax) para classificação multiclasse, enquanto para as camadas ocultas isso era tradicionalmente uma função sigmoide (função logística ou outras) em cada nó (coordenada), mas hoje é mais variado, com o retificador (rampa, ReLU) sendo comum. : ativação do -ésimo nó na camada .

Na derivação da retropropagação, outras quantidades intermediárias são usadas, sendo introduzidas conforme necessário abaixo. Os termos de viés (bias) não são tratados de forma especial, uma vez que correspondem a um peso com uma entrada fixa de 1. Para a retropropagação, a função de perda específica e as funções de ativação não importam, desde que elas e suas derivadas possam ser avaliadas de forma eficiente. Funções de ativação tradicionais incluem sigmoide, tanh e ReLU. Swish, Mish, e muitas outras.

A rede em geral é uma combinação de composição de funções e multiplicação de matrizes:

Para um conjunto de treinamento, haverá um conjunto de pares de entrada-saída, . Para cada par de entrada-saída no conjunto de treinamento, a perda do modelo naquele par é o custo da diferença entre a saída prevista e a saída alvo :

Note a distinção: durante a avaliação do modelo, os pesos são fixos enquanto as entradas variam (e a saída alvo pode ser desconhecida), e a rede termina com a camada de saída (não inclui a função de perda). Durante o treinamento do modelo, o par de entrada-saída é fixo enquanto os pesos variam, e a rede termina com a função de perda.

A retropropagação calcula o gradiente para um par de entrada-saída fixo , onde os pesos podem variar. Cada componente individual do gradiente, pode ser calculado pela regra da cadeia; mas fazer isso separadamente para cada peso é ineficiente. A retropropagação calcula o gradiente de forma eficiente evitando cálculos duplicados e não calculando valores intermediários desnecessários, calculando o gradiente de cada camada – especificamente o gradiente da entrada ponderada de cada camada, denotado por – de trás para frente.

Informalmente, o ponto-chave é que, como a única maneira de um peso em afetar a perda é através do seu efeito na próxima camada, e o faz linearmente, são os únicos dados de que você precisa para calcular os gradientes dos pesos na camada , e então os gradientes dos pesos da camada anterior podem ser calculados por e repetidos recursivamente. Isso evita a ineficiência de duas maneiras. Primeiro, evita a duplicação porque, ao calcular o gradiente na camada , é desnecessário recalcular todas as derivadas nas camadas posteriores a cada vez. Segundo, evita cálculos intermediários desnecessários, porque em cada estágio calcula diretamente o gradiente dos pesos em relação à saída final (a perda), em vez de calcular desnecessariamente as derivadas dos valores das camadas ocultas em relação às mudanças nos pesos .

A retropropagação pode ser expressa para redes feedforward simples em termos de multiplicação de matrizes, ou mais geralmente em termos do grafo adjunto.

Multiplicação de matrizes Para o caso básico de uma rede feedforward (de alimentação direta), onde os nós em cada camada estão conectados apenas aos nós da camada imediatamente seguinte (sem pular nenhuma camada), e há uma função de perda que calcula uma perda escalar para a saída final, a retropropagação pode ser entendida simplesmente por multiplicação de matrizes. Essencialmente, a retropropagação avalia a expressão para a derivada da função de custo como um produto de derivadas entre cada camada da direita para a esquerda – "para trás" (backwards) – com o gradiente dos pesos entre cada camada sendo uma simples modificação dos produtos parciais (o "erro retropropagado").

Dado um par de entrada-saída , a perda é:

Para calcular isso, começa-se com a entrada e trabalha-se para a frente; denote a entrada ponderada de cada camada oculta como e a saída da camada oculta como a ativação . Para a retropropagação, a ativação , bem como as derivadas (avaliadas em ), devem ser armazenadas em cache para uso durante a passagem para trás.

A derivada da perda em termos das entradas é dada pela regra da cadeia; note que cada termo é uma derivada total, avaliada no valor da rede (em cada nó) na entrada :

onde é uma matriz diagonal.

Esses termos são: a derivada da função de perda; as derivadas das funções de ativação; e as matrizes de pesos:

O gradiente é a transposta da derivada da saída em termos da entrada, de modo que as matrizes são transpostas e a ordem de multiplicação é invertida, mas as entradas são as mesmas:

A retropropagação consiste então essencialmente em avaliar essa expressão da direita para a esquerda (equivalentemente, multiplicar a expressão anterior para a derivada da esquerda para a direita), calculando o gradiente em cada camada ao longo do caminho; há uma etapa adicional, porque o gradiente dos pesos não é apenas uma subexpressão: há uma multiplicação extra.

Introduzindo a quantidade auxiliar para os produtos parciais (multiplicando da direita para a esquerda), interpretada como o "erro no nível " e definida como o gradiente dos valores de entrada no nível :

Note que é um vetor, de comprimento igual ao número de nós no nível ; cada componente é interpretado como o "custo atribuível a (ao valor de) esse nó".

O gradiente dos pesos na camada é então:

O fator de deve-se ao fato de que os pesos entre o nível e afetam o nível proporcionalmente às entradas (ativações): as entradas são fixas, os pesos variam.

O pode ser facilmente calculado recursivamente, indo da direita para a esquerda, como:

Os gradientes dos pesos podem, portanto, ser calculados usando algumas multiplicações de matrizes para cada nível; isto é a retropropagação.

Comparado a computar ingenuamente para a frente (usando o para ilustração):

Existem duas diferenças principais na retropropagação:

Calcular em termos de evita a óbvia multiplicação duplicada das camadas e posteriores. Multiplicar começando de – propagando o erro para trás – significa que cada passo simplesmente multiplica um vetor () pelas matrizes de pesos e derivadas das ativações . Em contrapartida, multiplicar para a frente, começando das alterações numa camada anterior, significa que cada multiplicação multiplica uma matriz por uma matriz. Isso é muito mais custoso e corresponde a rastrear cada caminho possível de uma mudança em uma camada para a frente até as mudanças na camada (para multiplicar por , com multiplicações adicionais para as derivadas das ativações), o que calcula desnecessariamente as quantidades intermediárias de como as mudanças de peso afetam os valores dos nós ocultos.

Grafo adjunto Para grafos mais gerais, e outras variações avançadas, a retropropagação pode ser entendida em termos de diferenciação automática, onde a retropropagação é um caso especial de acumulação reversa (ou "modo reverso").

Intuição

Motivação O objetivo de qualquer algoritmo de aprendizado supervisionado é encontrar uma função que melhor mapeie um conjunto de entradas para sua saída correta. A motivação para a retropropagação é treinar uma rede neural de múltiplas camadas de modo que ela possa aprender as representações internas apropriadas para permitir o aprendizado de qualquer mapeamento arbitrário de entrada para saída.

O aprendizado como um problema de otimização Para entender a derivação matemática do algoritmo de retropropagação, ajuda primeiro desenvolver alguma intuição sobre a relação entre a saída real de um neurônio e a saída correta para um exemplo de treinamento específico. Considere uma rede neural simples com duas unidades de entrada, uma unidade de saída e nenhuma unidade oculta, e na qual cada neurônio usa uma saída linear (ao contrário da maioria dos trabalhos em redes neurais, nos quais o mapeamento das entradas para as saídas é não linear) que é a soma ponderada de sua entrada. miniaturadaimagem|250x250px|Uma rede neural simples com duas unidades de entrada (cada uma com uma única entrada) e uma unidade de saída (com duas entradas) Inicialmente, antes do treinamento, os pesos serão definidos aleatoriamente. Em seguida, o neurônio aprende a partir de exemplos de treinamento, que neste caso consistem em um conjunto de tuplas onde e são as entradas para a rede e é a saída correta (a saída que a rede deve produzir dadas essas entradas, quando tiver sido treinada). A rede inicial, dados e , calculará uma saída que provavelmente difere de (dados os pesos aleatórios). Uma função de perda é usada para medir a discrepância entre a saída alvo e a saída calculada . Para problemas de análise de regressão, o erro quadrático pode ser usado como uma função de perda; para classificação, a entropia cruzada categórica pode ser usada.

Como exemplo, considere um problema de regressão usando o erro quadrático como perda:

onde é a discrepância ou erro.