Como funciona a atenção em redes neurais recorrentes codificador-decodificador

Como funciona a atenção em redes neurais recorrentes codificador-decodificador

Atenção é um mecanismo que foi desenvolvido para melhorar o desempenho do Encoder-Decoder RNN na tradução automática.

Neste tutorial, você descobrirá o mecanismo de atenção para o modelo Codificador-Decodificador.

Depois de concluir este tutorial, você saberá:

  • Sobre o modelo codificador-decodificador e mecanismo de atenção para tradução automática.
  • Como implementar passo a passo o mecanismo de atenção.
  • Aplicativos e extensões para o mecanismo de atenção.

Comece seu projeto com meu novo livro Deep Learning for Natural Language Processing, incluindo tutoriais passo a passo e a Código-fonte Python arquivos para todos os exemplos.

Vamos começar.

  • Atualização dezembro / 2017: Corrigido um pequeno erro de digitação na Etapa 4, obrigado Cynthia Freeman.

Visão geral do tutorial

Este tutorial é dividido em 4 partes; eles estão:

  1. Modelo codificador-decodificador
  2. Modelo de atenção
  3. Exemplo Trabalhado de Atenção
  4. Extensões para Atenção

Modelo codificador-decodificador

O modelo Encoder-Decoder para redes neurais recorrentes foi apresentado em dois artigos.

Ambos desenvolveram a técnica para abordar a natureza sequência a sequência da tradução automática, em que as sequências de entrada diferem em comprimento das sequências de saída.

Ilya Sutskever, et al. faça isso no artigo “Aprendizado de Sequência para Sequência com Redes Neurais” usando LSTMs.

Kyunghyun Cho, et al. faça isso no artigo “Aprendendo representações de frases usando RNN Encoder – Decoder for Statistical Machine Translation“. Este trabalho e alguns dos mesmos autores (Bahdanau, Cho e Bengio) desenvolveram seu modelo específico posteriormente para desenvolver um modelo de atenção. Portanto, daremos uma olhada rápida no modelo codificador-decodificador conforme descrito neste artigo.

De alto nível, o modelo é composto por dois submodelos: um codificador e um decodificador.

  • Codificador: O codificador é responsável por percorrer as etapas de tempo de entrada e codificar toda a sequência em um vetor de comprimento fixo denominado vetor de contexto.
  • Decodificador: O decodificador é responsável por percorrer as etapas de tempo de saída durante a leitura do vetor de contexto.
Modelo de rede neural recorrente codificador-decodificador.

Modelo de rede neural recorrente codificador-decodificador.
Retirado de "Representações de frases de aprendizagem usando RNN Encoder – Decoder for Statistical Machine Translation"

propomos uma nova arquitetura de rede neural que aprende a codificar uma sequência de comprimento variável em uma representação vetorial de comprimento fixo e a decodificar uma dada representação vetorial de comprimento fixo de volta em uma sequência de comprimento variável.

- Aprendizagem de representações de frases usando RNN Encoder – Decoder for Statistical Machine Translation, 2014.

A chave para o modelo é que todo o modelo, incluindo o codificador e o decodificador, é treinado de ponta a ponta, em vez de treinar os elementos separadamente.

O modelo é descrito genericamente de forma que diferentes modelos RNN específicos possam ser usados ​​como codificador e decodificador.

Em vez de usar o popular Long Short-Term Memory (LSTM) RNN, os autores desenvolvem e usam seu próprio tipo simples de RNN, mais tarde chamado de Gated Recurrent Unit, ou GRU.

Além disso, ao contrário do Sutskever, et al. modelo, a saída do decodificador da etapa de tempo anterior é alimentada como uma entrada para decodificar a próxima etapa de tempo de saída. Você pode ver isso na imagem acima, onde a saída y2 usa o vetor de contexto (C), o estado oculto passado da decodificação de y1, bem como a saída y1.

… Ambos y

- Aprendizagem de representações de frases usando RNN Encoder – Decoder for Statistical Machine Translation, 2014

Modelo de atenção

A atenção foi apresentada por Dzmitry Bahdanau, et al. em seu artigo “Tradução Automática Neural Aprendendo Conjuntamente a Alinhar e Traduzir”, que se lê como uma extensão natural de seu trabalho anterior sobre o modelo Codificador-Decodificador.

A atenção é proposta como uma solução para a limitação do modelo Codificador-Decodificador que codifica a seqüência de entrada para um vetor de comprimento fixo a partir do qual decodificar cada passo de tempo de saída. Acredita-se que esse problema seja mais problemático na decodificação de sequências longas.

Um problema potencial com essa abordagem de codificador-decodificador é que uma rede neural precisa ser capaz de compactar todas as informações necessárias de uma sentença fonte em um vetor de comprimento fixo. Isso pode tornar difícil para a rede neural lidar com frases longas, especialmente aquelas que são mais longas do que as frases no corpus de treinamento.

- Tradução automática neural por Jointly Learning to Align and Translate, 2015.

A atenção é proposta como um método para alinhar e traduzir.

O alinhamento é o problema da tradução automática que identifica quais partes da sequência de entrada são relevantes para cada palavra na saída, enquanto a tradução é o processo de usar as informações relevantes para selecionar a saída apropriada.

… Introduzimos uma extensão para o modelo codificador-decodificador que aprende a alinhar e traduzir em conjunto. Cada vez que o modelo proposto gera uma palavra em uma tradução, ele (soft-) busca um conjunto de posições em uma frase fonte onde se concentram as informações mais relevantes. O modelo então prevê uma palavra-alvo com base nos vetores de contexto associados a essas posições de origem e todas as palavras-alvo geradas anteriormente.

- Tradução automática neural por Jointly Learning to Align and Translate, 2015.

Em vez de codificar a sequência de entrada em um único vetor de contexto fixo, o modelo de atenção desenvolve um vetor de contexto que é filtrado especificamente para cada etapa de tempo de saída.

Exemplo de Atenção

Exemplo de Atenção
Retirado de “Neural Machine Translation by Jointly Learning to Align and Translate”, 2015.

Tal como acontece com o papel do codificador-decodificador, a técnica é aplicada a um problema de tradução automática e usa unidades GRU em vez de células de memória LSTM. Nesse caso, uma entrada bidirecional é usada onde as sequências de entrada são fornecidas tanto para frente quanto para trás, que são então concatenadas antes de serem passadas para o decodificador.

Em vez de reiterar as equações para calcular a atenção, veremos um exemplo prático.

Precisa de ajuda com Deep Learning for Text Data?

Faça meu curso intensivo de e-mail gratuito de 7 dias agora (com código).

Clique para se inscrever e também obter uma versão gratuita do Ebook em PDF do curso.

Comece Seu Crash-Course GRÁTIS Agora

Exemplo Trabalhado de Atenção

Nesta seção, tornaremos a atenção concreta com um pequeno exemplo trabalhado. Especificamente, passaremos pelos cálculos com termos não vetorizados.

Isso lhe dará uma compreensão suficientemente detalhada para que você possa dar atenção à sua própria implementação de codificador-decodificador.

Este exemplo trabalhado é dividido nas seguintes 6 seções:

  1. Problema
  2. Codificação
  3. Alinhamento
  4. Ponderação
  5. Vetor de contexto
  6. Decodificar

1. Problema

O problema é um problema simples de previsão de sequência a sequência.

Existem três etapas de tempo de entrada:

O modelo é necessário para prever 1 intervalo de tempo:

Neste exemplo, iremos ignorar o tipo de RNN sendo usado no codificador e decodificador e ignorar o uso de uma camada de entrada bidirecional. Esses elementos não são salientes para a compreensão do cálculo da atenção no decodificador.

2. Codificação

No modelo codificador-decodificador, a entrada seria codificada como um único vetor de comprimento fixo. Esta é a saída do modelo do codificador para a última etapa de tempo.

O modelo de atenção requer acesso à saída do codificador para cada etapa de tempo de entrada. O artigo se refere a eles como “anotações”Para cada passo de tempo. Nesse caso:

3. Alinhamento

O decodificador emite um valor de cada vez, que é passado para talvez mais camadas antes de finalmente emitir uma previsão (y) para a etapa de tempo de saída atual.

O modelo de alinhamento pontua (e) quão bem cada entrada codificada (h) corresponde à saída atual do (s) decodificador (es).

O cálculo da pontuação requer a saída do decodificador da etapa de tempo de saída anterior, por exemplo, s (t-1). Ao pontuar a primeira saída do decodificador, será 0.

A pontuação é executada usando uma função a (). Podemos pontuar cada anotação (h) para a primeira etapa de tempo de saída da seguinte maneira:

Usamos dois subscritos para essas pontuações, por exemplo, e11, onde o primeiro “1” representa a etapa de tempo de saída e o segundo “1” representa a etapa de tempo de entrada.

Podemos imaginar que, se tivéssemos um problema de sequência para sequência com duas etapas de tempo de saída, mais tarde poderíamos pontuar as anotações para a segunda etapa de tempo da seguinte forma (assumindo que já tivéssemos calculado nosso s1):

A função a () é chamada de modelo de alinhamento no artigo e é implementada como uma rede neural feedforward.

Esta é uma rede tradicional de uma camada onde cada entrada (s (t-1) e h1, h2 e h3) é ponderada, uma função de transferência tangente hiperbólica (tanh) é usada e a saída também é ponderada.

4. Ponderação

Em seguida, as pontuações de alinhamento são normalizadas usando uma função softmax.

A normalização das pontuações permite que sejam tratadas como probabilidades, indicando a probabilidade de cada etapa de tempo de entrada codificada (anotação) ser relevante para a etapa de tempo de saída atual.

Essas pontuações normalizadas são chamadas de pesos de anotação.

Por exemplo, podemos calcular os pesos de anotação softmax (a) dados as pontuações de alinhamento calculadas (e) da seguinte forma:

Se tivéssemos duas etapas de tempo de saída, os pesos de anotação para a segunda etapa de tempo de saída seriam calculados da seguinte forma:

5. Vetor de contexto

Em seguida, cada anotação (h) é multiplicada pelos pesos de anotação (a) para produzir um novo vetor de contexto assistido a partir do qual a etapa de tempo de saída atual pode ser decodificada.

Temos apenas uma etapa de tempo de saída para simplificar, portanto, podemos calcular o vetor de contexto de elemento único da seguinte maneira (com colchetes para facilitar a leitura):

O vetor de contexto é uma soma ponderada das anotações e pontuações de alinhamento normalizadas.

Se tivéssemos duas etapas de tempo de saída, o vetor de contexto seria composto de dois elementos [c1, c2], calculado da seguinte forma:

6. Decodificar

A decodificação é então realizada de acordo com o modelo Codificador-Decodificador, embora neste caso usando o vetor de contexto assistido para o intervalo de tempo atual.

A saída do (s) decodificador (es) é referida como um estado oculto no papel.

Isso pode ser alimentado em camadas adicionais antes de finalmente sair do modelo como uma previsão (y1) para ...

Você também pode estar interessado em