Retropropagação - Backpropagation

No aprendizado de máquina , backpropagation ( backprop , BP ) é um algoritmo amplamente usado para treinar redes neurais feedforward . Existem generalizações de retropropagação para outras redes neurais artificiais (RNAs) e para funções em geral. Todas essas classes de algoritmos são chamadas genericamente de "retropropagação". No ajuste de uma rede neural , a retropropagação calcula o gradiente da 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 , ao contrário de um cálculo direto ingênuo do gradiente em relação a cada peso individualmente. Essa eficiência viabiliza o uso de métodos gradientes para treinar redes multicamadas, atualizando pesos para minimizar perdas; A descida gradiente ou variantes como a descida gradiente estocástica são comumente usadas. O algoritmo de retropropagação funciona calculando o gradiente da função de perda em relação a cada peso pela regra da cadeia , calculando o gradiente uma camada por vez, iterando para trás a partir da última camada para evitar cálculos redundantes de termos intermediários na regra da cadeia; este é um exemplo de programação dinâmica .

O termo retropropagação refere-se estritamente ao algoritmo para calcular o gradiente, não como o gradiente é usado; no entanto, o termo é frequentemente usado vagamente para se referir a todo o algoritmo de aprendizagem, incluindo como o gradiente é usado, como por descida gradiente estocástica. A retropropagação generaliza a computação de gradiente na regra delta , que é a versão de camada única da retropropagação e, por sua vez, é generalizada por diferenciação automática , onde a retropropagação é um caso especial de acumulação reversa (ou "modo reverso"). O termo retropropagação e seu uso geral em redes neurais foi anunciado em Rumelhart, Hinton & Williams (1986a) , depois elaborado e popularizado em Rumelhart, Hinton & Williams (1986b) , mas a técnica foi redescoberta independentemente muitas vezes e teve muitos predecessores datando à década de 1960; veja § História . Uma visão geral moderna é fornecida no livro de aprendizagem profunda de Goodfellow, Bengio & Courville (2016) .

Visão geral

A retropropagação calcula o gradiente no espaço de peso de uma rede neural feedforward, em relação a uma função de perda . Denote:

  • : entrada (vetor de recursos)
  • : saída de destino
    Para classificação, a saída será um vetor de probabilidades de classe (por exemplo ,, e a saída de destino é uma classe específica, codificada pela variável one-hot / dummy (por exemplo, ).
  • : função de perda ou "função de custo"
    Para classificação, isso geralmente é entropia cruzada (XC, perda logarítmica ), enquanto para regressão é geralmente 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 esta era tradicionalmente uma função sigmóide (função logística ou outras) em cada nó (coordenada), mas hoje é mais variado, com retificador ( rampa , ReLU ) sendo comum.

Na derivação da retropropagação, outras quantidades intermediárias são usadas; eles são apresentados conforme necessário abaixo. Os termos de polarização não são tratados de maneira especial, pois correspondem a um peso com uma entrada fixa de 1. Para fins de retropropagação, a função de perda específica e as funções de ativação não importam, desde que elas e seus derivados possam ser avaliados de forma eficiente.

A rede geral é uma combinação de composição de função e multiplicação de matriz :

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

Observe 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 fixo de entrada e saída , onde os pesos podem variar. Cada componente individual do gradiente pode ser calculado pela regra da cadeia; no entanto, fazer isso separadamente para cada peso é ineficiente. A retropropagação calcula o gradiente com eficiência, evitando cálculos duplicados e não computando 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, uma vez que a única maneira de um peso afetar a perda é por meio de seu efeito na próxima camada, e o faz linearmente , são os únicos dados que você precisa para calcular os gradientes dos pesos na camada e, em seguida, você pode calcular a camada anterior e repetir recursivamente. Isso evita a ineficiência de duas maneiras. Em primeiro lugar, evita a duplicação porque ao calcular o gradiente na camada , você não precisa recalcular todas as derivadas nas camadas posteriores a cada vez. Em segundo lugar, evita cálculos intermediários desnecessários porque em cada estágio ele calcula diretamente o gradiente dos pesos em relação à saída final (a perda), em vez de computar desnecessariamente os derivados dos valores das camadas ocultas com 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 de gráfico adjunto .

Multiplicação da matriz

Para o caso básico de uma rede feedforward, onde os nós em cada camada são conectados apenas aos nós na próxima camada imediata (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 entendido 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 das derivadas entre cada camada da direita para a esquerda - "para trás" - com o gradiente dos pesos entre cada camada sendo uma modificação simples dos produtos parciais (o " erro propagado para trás ").

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

Para calcular isso, começa-se com a entrada e avança; denotam a entrada ponderada de cada camada como e a saída da camada como a ativação . Para retropropagação, a ativação , bem como os derivados (avaliados em ), devem ser armazenados em cache para uso durante a passagem para trás.

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

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

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

A retropropagação consiste essencialmente em avaliar esta expressão da direita para a esquerda (equivalentemente, multiplicando a expressão anterior para a derivada da esquerda para a direita), computando o gradiente em cada camada no caminho; há uma etapa adicional, porque o gradiente dos pesos não é apenas uma subexpressão: há uma multiplicação extra.

Apresentando 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 :

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

O gradiente dos pesos na camada é então:

O fator de é porque 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 como:

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

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

existem duas diferenças principais com a retropropagação:

  1. A computação em termos de evita a óbvia multiplicação duplicada de camadas e além.
  2. Multiplicar a partir de - propagando o erro para trás - significa que cada passo simplesmente multiplica um vetor ( ) pelas matrizes de pesos e derivadas de ativações . Em contraste, multiplicar para a frente, começando com as mudanças em uma camada anterior, significa que cada multiplicação multiplica uma matriz por uma matriz . Isso é muito mais caro e corresponde a rastrear todos os caminhos possíveis de uma mudança em uma camada para frente às mudanças na camada (para multiplicar por , com multiplicações adicionais para as derivadas das ativações), o que computa desnecessariamente as quantidades intermediárias de como o peso as mudanças afetam os valores dos nós ocultos.

Gráfico adjunto

Para gráficos 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 mapeie melhor um conjunto de entradas para sua saída correta. A motivação para a retropropagação é treinar uma rede neural de várias camadas de modo que possa aprender as representações internas apropriadas para permitir que aprenda qualquer mapeamento arbitrário de entrada para saída.

Aprendizagem como um problema de otimização

Para entender a derivação matemática do algoritmo de retropropagação, ajuda primeiro a 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, em que o mapeamento de entradas para saídas é não linear) que é o soma ponderada de sua entrada.

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 treino, os pesos serão definidos de forma aleatória. Em seguida, o neurônio aprende com os exemplos de treinamento , que neste caso consistem em um conjunto de tuplas onde e são as entradas para a rede e t é a saída correta (a saída que a rede deve produzir dadas essas entradas, quando for treinada). A rede inicial, fornecida e , calculará uma saída y que provavelmente difere de t (dados pesos aleatórios). Uma função de perda é usada para medir a discrepância entre a saída alvo t e a saída calculada y . 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 quadrado como uma perda:

onde E é a discrepância ou erro.

Considere a rede em um caso de treinamento único: . Assim, a entrada e são 1 e 1 respectivamente e a saída correta, t é 0. Agora, se a relação for traçada entre a saída y da rede no eixo horizontal e o erro E no eixo vertical, o resultado é uma parábola. O mínimo da parábola corresponde à saída y que minimize o erro E . Para um único caso de treinamento, o mínimo também toca o eixo horizontal, o que significa que o erro será zero e a rede pode produzir uma saída y que corresponda exatamente à saída alvo t . Portanto, o problema de mapear entradas em saídas pode ser reduzido a um problema de otimização de encontrar uma função que produzirá o erro mínimo.

Superfície de erro de um neurônio linear para um único caso de treinamento

No entanto, a saída de um neurônio depende da soma ponderada de todas as suas entradas:

onde e são os pesos na conexão das unidades de entrada para a unidade de saída. Portanto, o erro também depende dos pesos que chegam ao neurônio, que é, em última análise, o que precisa ser alterado na rede para permitir o aprendizado.

Neste exemplo, ao injetar os dados de treinamento, a função de perda torna-se

Então, a função de perda assume a forma de um cilindro parabólico com sua base direcionada ao longo . Como todos os conjuntos de pesos que satisfazem minimizam a função de perda, neste caso, restrições adicionais são necessárias para convergir para uma solução única. Restrições adicionais podem ser geradas definindo condições específicas para os pesos ou injetando dados de treinamento adicionais.

Um algoritmo comumente usado para encontrar o conjunto de pesos que minimiza o erro é a descida do gradiente . Por retropropagação, a direção de descida mais íngreme é calculada da função de perda em relação aos pesos sinápticos presentes. Em seguida, os pesos podem ser modificados ao longo da direção de descida mais acentuada, e o erro é minimizado de forma eficiente.

Derivação

O método gradiente descendente envolve o cálculo da derivada da função de perda em relação aos pesos da rede. Isso normalmente é feito usando backpropagation. Assumindo um neurônio de saída, a função de erro quadrada é

Onde

é a perda para a saída e o valor alvo ,
é a saída de destino para uma amostra de treinamento, e
é a saída real do neurônio de saída.

Para cada neurônio , sua saída é definida como

onde a função de ativação é não linear e diferenciável (mesmo se o ReLU não estiver em um ponto). Uma função de ativação historicamente usada é a função logística :

que tem um derivado conveniente de:

A entrada para um neurônio é a soma ponderada das saídas dos neurônios anteriores. Se o neurônio está na primeira camada após a camada de entrada, o da camada de entrada são simplesmente as entradas para a rede. O número de unidades de entrada para o neurônio é . A variável denota o peso entre o neurônio da camada anterior e o neurônio da camada atual.

Encontrando a derivada do erro

Diagrama de uma rede neural artificial para ilustrar a notação usada aqui

O cálculo da derivada parcial do erro em relação a um peso é feito usando a regra da cadeia duas vezes:

 

 

 

 

( Eq. 1 )

No último fator do lado direito do acima, apenas um termo na soma depende , de modo que

 

 

 

 

( Eq. 2 )

Se o neurônio está na primeira camada após a camada de entrada, fica justo .

A derivada da saída do neurônio em relação à sua entrada é simplesmente a derivada parcial da função de ativação:

 

 

 

 

( Eq. 3 )

que para o caso de função de ativação logística é:

Esta é a razão pela qual a retropropagação requer que a função de ativação seja diferenciável . (No entanto, a função de ativação ReLU , que não é diferenciável em 0, tornou-se bastante popular, por exemplo, no AlexNet )

O primeiro fator é simples de avaliar se o neurônio está na camada de saída, porque então e

 

 

 

 

( Eq. 4 )

Se metade do erro quadrado é usado como função de perda, podemos reescrevê-lo como

No entanto, se estiver em uma camada interna arbitrária da rede, encontrar a derivada em relação a é menos óbvio.

Considerando como uma função com as entradas sendo todos os neurônios recebendo entrada do neurônio ,

e tomando a derivada total em relação a , uma expressão recursiva para a derivada é obtida:

 

 

 

 

( Eq. 5 )

Portanto, a derivada em relação a pode ser calculada se todas as derivadas em relação às saídas da próxima camada - aquelas mais próximas ao neurônio de saída - forem conhecidas. [Observe, se qualquer um dos neurônios no conjunto não estivesse conectado ao neurônio , eles seriam independentes e a derivada parcial correspondente sob a soma desapareceria para 0.]

Substituindo a Eq. 2 , Eq. 3 Eq.4 e Eq. 5 na Eq. 1 obtemos:

com

se é a função logística, e o erro é o erro quadrado:

Para atualizar o peso usando gradiente descendente, deve-se escolher uma taxa de aprendizado ,. A mudança no peso deve refletir o impacto de um aumento ou diminuição em . Se , um aumento aumenta ; inversamente, se , um aumento nas diminuições . O novo é adicionado ao peso antigo, e o produto da taxa de aprendizagem e do gradiente, multiplicado por garantias de que muda de uma forma que sempre diminui . Em outras palavras, na equação imediatamente abaixo, sempre muda de forma que seja diminuída:

Função de perda

A função de perda é uma função que mapeia valores de uma ou mais variáveis ​​em um número real que representa intuitivamente algum "custo" associado a esses valores. Para retropropagação, a função de perda calcula a diferença entre a saída da rede e sua saída esperada, depois que um exemplo de treinamento foi propagado pela rede.

Premissas

A expressão matemática da função de perda deve cumprir duas condições para que possa ser usada na retropropagação. O primeiro é que pode ser escrito como uma média sobre funções de erro , para exemplos de treinamento individual ,. A razão para essa suposição é que o algoritmo de retropropagação calcula o gradiente da função de erro para um único exemplo de treinamento, que precisa ser generalizado para a função de erro geral. A segunda suposição é que ele pode ser escrito como uma função das saídas da rede neural.

Função de perda de exemplo

Sejam vetores .

Selecione uma função de erro medindo a diferença entre duas saídas. A escolha padrão é o quadrado da distância euclidiana entre os vetores e :

A função de erro sobre exemplos de treinamento pode então ser escrita como uma média de perdas sobre exemplos individuais:

Limitações

A descida do gradiente pode encontrar um mínimo local em vez do mínimo global.
  • A descida do gradiente com retropropagação não tem garantia de encontrar o mínimo global da função de erro, mas apenas um mínimo local; além disso, ele tem problemas para cruzar planaltos no cenário de função de erro. Esse problema, causado pela não convexidade das funções de erro em redes neurais, foi considerado por muito tempo uma grande desvantagem, mas Yann LeCun et al. argumentam que em muitos problemas práticos, não é.
  • O aprendizado de retropropagação não requer normalização de vetores de entrada; no entanto, a normalização pode melhorar o desempenho.
  • A retropropagação requer que os derivados das funções de ativação sejam conhecidos no momento do projeto da rede.

História

O termo retropropagação e seu uso geral em redes neurais foi anunciado em Rumelhart, Hinton & Williams (1986a) , depois elaborado e popularizado em Rumelhart, Hinton & Williams (1986b) , mas a técnica foi redescoberta independentemente muitas vezes e teve muitos predecessores datando à década de 1960.

Os fundamentos da retropropagação contínua foram derivados no contexto da teoria de controle por Henry J. Kelley em 1960 e por Arthur E. Bryson em 1961. Eles usaram princípios de programação dinâmica . Em 1962, Stuart Dreyfus publicou uma derivação mais simples baseada apenas na regra da cadeia . Bryson e Ho o descreveram como um método de otimização de sistema dinâmico de múltiplos estágios em 1969. A retropropagação foi derivada por vários pesquisadores no início dos anos 60 e implementada para rodar em computadores já em 1970 por Seppo Linnainmaa . Paul Werbos foi o primeiro nos Estados Unidos a propor que ele pudesse ser usado para redes neurais depois de analisá-lo em profundidade em sua dissertação de 1974. Embora não seja aplicado a redes neurais, em 1970 Linnainmaa publicou o método geral de diferenciação automática (AD). Embora muito controverso, alguns cientistas acreditam que este foi realmente o primeiro passo para o desenvolvimento de um algoritmo de retropropagação. Em 1973, Dreyfus adapta os parâmetros dos controladores em proporção aos gradientes de erro. Em 1974, Werbos mencionou a possibilidade de aplicar este princípio a redes neurais artificiais, e em 1982 aplicou o método AD de Linnainmaa a funções não lineares.

Mais tarde, o método Werbos foi redescoberto e descrito em 1985 por Parker e em 1986 por Rumelhart , Hinton e Williams . Rumelhart, Hinton e Williams mostraram experimentalmente que este método pode gerar representações internas úteis de dados recebidos em camadas ocultas de redes neurais. Yann LeCun propôs a forma moderna do algoritmo de aprendizagem de retropropagação para redes neurais em sua tese de doutorado em 1987. Em 1993, Eric Wan ganhou um concurso internacional de reconhecimento de padrões por meio de retropropagação.

Durante os anos 2000, caiu em desgraça, mas voltou nos anos 2010, beneficiando-se de sistemas de computação baratos e poderosos baseados em GPU . Isso tem acontecido especialmente em reconhecimento de fala , visão de máquina , processamento de linguagem natural e pesquisa de aprendizagem de estrutura de linguagem (na qual tem sido usado para explicar uma variedade de fenômenos relacionados ao aprendizado de primeira e segunda língua).

A retropropagação de erro foi sugerida para explicar os componentes do ERP do cérebro humano , como o N400 e o P600 .

Veja também

Notas

Referências

Leitura adicional

links externos