Como desenvolver um modelo codificador-decodificador para predição sequência a sequência em Keras

Como desenvolver um modelo codificador-decodificador para predição sequência a sequência em Keras

O modelo codificador-decodificador fornece um padrão para o uso de redes neurais recorrentes para resolver problemas desafiadores de predição de sequência a sequência, como tradução automática.

Modelos codificadores-decodificadores podem ser desenvolvidos na biblioteca de aprendizado profundo Keras Python e um exemplo de sistema de tradução automática neural desenvolvido com este modelo foi descrito no blog Keras, com código de amostra distribuído com o projeto Keras.

Este exemplo pode fornecer a base para o desenvolvimento de modelos LSTM de codificador-decodificador para seus próprios problemas de predição de sequência para sequência.

Neste tutorial, você descobrirá como desenvolver uma rede neural recorrente de codificador-decodificador sofisticada para problemas de predição de sequência a sequência com Keras.

Depois de concluir este tutorial, você saberá:

  • Como definir corretamente um modelo sofisticado de codificador-decodificador no Keras para previsão de sequência a sequência.
  • Como definir um problema de predição sequência a sequência planejado, mas escalonável, que pode ser usado para avaliar o modelo LSTM de codificador-decodificador.
  • Como aplicar o modelo LSTM de codificador-decodificador em Keras para resolver o problema de predição de sequência a sequência de inteiro escalável.

Comece seu projeto com meu novo livro Long Short-Term Memory Networks With Python, incluindo tutoriais passo a passo e a Código-fonte Python arquivos para todos os exemplos.

Vamos começar.

  • Atualização janeiro / 2020: API atualizada para Keras 2.3 e TensorFlow 2.0.
Como desenvolver um modelo codificador-decodificador para predição sequência a sequência em Keras

Como desenvolver um modelo codificador-decodificador para predição sequência a sequência em Keras
Foto de Björn Groß, alguns direitos reservados.

Visão geral do tutorial

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

  • Modelo codificador-decodificador em Keras
  • Problema escalonável de sequência a sequência
  • Codificador-decodificador LSTM para predição de sequência

Ambiente Python

Este tutorial presume que você tenha um ambiente Python SciPy instalado. Você pode usar o Python 2 ou 3 com este tutorial.

Você deve ter o Keras (2.0 ou superior) instalado com o back-end TensorFlow ou Theano.

O tutorial também supõe que você tenha o scikit-learn, Pandas, NumPy e Matplotlib instalados.

Se precisar de ajuda com seu ambiente, veja esta postagem:

Modelo codificador-decodificador em Keras

O modelo codificador-decodificador é uma forma de organizar redes neurais recorrentes para problemas de predição sequência a sequência.

Ele foi originalmente desenvolvido para problemas de tradução automática, embora tenha se mostrado bem-sucedido em problemas relacionados de previsão de sequência a sequência, como resumo de texto e resposta a perguntas.

A abordagem envolve duas redes neurais recorrentes, uma para codificar a sequência de origem, chamada de codificador, e a segunda para decodificar a sequência de origem codificada na sequência de destino, chamada de decodificador.

A biblioteca Python de aprendizado profundo Keras fornece um exemplo de como implementar o modelo codificador-decodificador para tradução automática (lstm_seq2seq.py) descrito pelo criador das bibliotecas na postagem: “Uma introdução de dez minutos ao aprendizado de sequência a sequência em Keras . ”

Para uma análise detalhada deste modelo, consulte a postagem:

Para obter mais informações sobre o uso de return_state, o que pode ser novo para você, consulte a postagem:

Para obter mais ajuda para começar a usar a API Keras Functional, consulte a postagem:

Usando o código daquele exemplo como ponto de partida, podemos desenvolver uma função genérica para definir uma rede neural recorrente codificador-decodificador. Abaixo está esta função chamada define_models ().

A função leva 3 argumentos, da seguinte maneira:

  • n_input: A cardinalidade da sequência de entrada, por exemplo, número de recursos, palavras ou caracteres para cada intervalo de tempo.
  • n_output: A cardinalidade da sequência de saída, por exemplo, número de recursos, palavras ou caracteres para cada intervalo de tempo.
  • n_units: O número de células a serem criadas nos modelos de codificador e decodificador, por exemplo, 128 ou 256.

A função então cria e retorna 3 modelos, da seguinte maneira:

  • Comboio: Modelo que pode ser treinado com base nas sequências de origem, destino e destino alterado.
  • inference_encoder: Modelo de codificador usado ao fazer uma previsão para uma nova sequência de origem.
  • inference_decoder Uso do modelo de decodificador ao fazer uma previsão para uma nova sequência de origem.

O modelo é treinado com base nas sequências de origem e destino, em que o modelo usa a origem e uma versão deslocada da sequência de destino como entrada e prevê toda a sequência de destino.

Por exemplo, uma sequência fonte pode ser [1,2,3] e a sequência alvo [4,5,6]. As entradas e saídas para o modelo durante o treinamento seriam:

O modelo deve ser chamado recursivamente ao gerar sequências de destino para novas sequências de origem.

A sequência de origem é codificada e a sequência de destino é gerada um elemento por vez, usando um caractere de “início de sequência” como '_' para iniciar o processo. Portanto, no caso acima, os seguintes pares de entrada-saída ocorreriam durante o treinamento:

Aqui você pode ver como o uso recursivo do modelo pode ser usado para construir sequências de saída.

Durante a previsão, o inference_encoder modelo é usado para codificar a sequência de entrada uma vez que retorna estados que são usados ​​para inicializar o inference_decoder modelo. A partir desse ponto, o inference_decoder modelo é usado para gerar previsões passo a passo.

A função abaixo nomeada Predict_sequence () pode ser usado após o modelo ser treinado para gerar uma sequência de destino dada uma sequência de origem.

Esta função leva 5 argumentos da seguinte maneira:

  • Infenc: Modelo de codificador usado ao fazer uma previsão para uma nova sequência de origem.
  • infdec: Uso do modelo do decodificador ao fazer uma previsão para uma nova sequência de origem.
  • fonte: Sequência de origem codificada.
  • n_steps: Número de intervalos de tempo na sequência de destino.
  • cardinalidade: A cardinalidade da sequência de saída, por exemplo, o número de recursos, palavras ou caracteres para cada intervalo de tempo.

A função então retorna uma lista contendo a sequência de destino.

Problema escalonável de sequência a sequência

Nesta seção, definimos um problema de predição sequência a sequência planejado e escalonável.

A sequência de origem é uma série de valores inteiros gerados aleatoriamente, como [20, 36, 40, 10, 34, 28], e a sequência alvo é um subconjunto pré-definido reverso da sequência de entrada, como os 3 primeiros elementos na ordem reversa [40, 36, 20].

O comprimento da sequência de origem é configurável; o mesmo ocorre com a cardinalidade da sequência de entrada e saída e o comprimento da sequência de destino.

Usaremos sequências de origem de 6 elementos, cardinalidade de 50 e sequências de destino de 3 elementos.

Abaixo estão mais alguns exemplos para tornar isso concreto.

Você é encorajado a explorar variações maiores e mais complexas. Publique suas descobertas nos comentários abaixo.

Vamos começar definindo uma função para gerar uma sequência de inteiros aleatórios.

Usaremos o valor 0 como preenchimento ou início do caractere de sequência, portanto, é ...

Você também pode estar interessado em