Bom dia a todos!
E novamente abrimos um novo fluxo para o curso
Data Scientist revisado: outro
excelente professor , um programa ligeiramente refinado com base em atualizaçÔes. Bem, como sempre,
liçÔes abertas interessantes e coleçÔes de materiais interessantes. Hoje começaremos a anålise dos modelos seq2seq do Tensor Flow.
Vamos lĂĄ
Como jĂĄ discutido no
tutorial da
RNN (recomendamos que vocĂȘ se familiarize com ele antes de ler este artigo), redes neurais recorrentes podem ser ensinadas a modelar o idioma. E surge uma pergunta interessante: Ă© possĂvel treinar a rede em determinados dados para gerar uma resposta significativa? Por exemplo, podemos ensinar uma rede neural a traduzir do inglĂȘs para o francĂȘs? Acontece que nĂłs podemos.
Este guia mostra como criar e treinar um sistema de ponta a ponta. Copie
o repositĂłrio principal do Tensor Flow e
o repositĂłrio do modelo TensorFlow do GitHub . Em seguida, vocĂȘ pode começar iniciando o programa de tradução:
cd models/tutorials/rnn/translate python translate.py --data_dir [your_data_directory]

Ela farĂĄ o download dos dados para tradução do inglĂȘs para o francĂȘs
no site do WMT'15 , prepararĂĄ-os para treinamento e treinamento. Isso exigirĂĄ cerca de 20 GB no disco rĂgido e muito tempo para baixar e preparar, para que vocĂȘ possa iniciar o processo agora e continuar lendo este tutorial.
O manual acessarĂĄ os seguintes arquivos:
Ficheiro | O que hĂĄ nele? |
---|
tensorflow / tensorflow / python / ops / seq2seq.py | Biblioteca para criar modelos de sequĂȘncia para sequĂȘncia |
modelos / tutoriais / rnn / translate / seq2seq_model.py | Modelos de tradução neural sequĂȘncia a sequĂȘncia |
modelos / tutoriais / rnn / translate / data_utils.py | FunçÔes auxiliares para preparar dados de tradução |
modelos / tutoriais / rnn / translate / translate.py | O binĂĄrio que treina e executa o modelo de conversĂŁo |
NoçÔes bĂĄsicas de sequĂȘncia a sequĂȘnciaO modelo bĂĄsico de sequĂȘncia a sequĂȘncia, conforme apresentado por
Cho et al., 2014 (
pdf ), consiste em duas redes neurais recorrentes (RNNs): um codificador (codificador) que processa os dados de entrada e um decodificador (decodificador) que gera os dados saĂda. A arquitetura bĂĄsica Ă© mostrada abaixo:

Cada retĂąngulo na figura acima representa uma cĂ©lula no RNN, geralmente uma cĂ©lula GRU - um bloco de recorrĂȘncia controlado ou uma cĂ©lula LSTM - memĂłria de curto prazo de longo prazo (leia o
tutorial do
RNN para saber mais sobre eles). Codificadores e decodificadores podem ter pesos comuns ou, mais frequentemente, usar diferentes conjuntos de parĂąmetros. CĂ©lulas multicamadas foram usadas com sucesso em modelos de sequĂȘncia a sequĂȘncia, por exemplo, para traduzir
Sutskever et al., 2014 (
pdf ).
No modelo bĂĄsico descrito acima, cada entrada deve ser codificada em um vetor de estado de tamanho fixo, pois essa Ă© a Ășnica coisa que Ă© transmitida ao decodificador. Para dar ao decodificador acesso mais direto aos dados de entrada, um mecanismo de atenção foi introduzido em
Bahdanau et al., 2014 (
pdf ). NĂŁo entraremos em detalhes do mecanismo de atenção (para isso vocĂȘ pode se familiarizar com o trabalho aqui); basta dizer que permite que o decodificador analise os dados de entrada em cada etapa de decodificação. Uma rede sequĂȘncia a sequĂȘncia multicamada com cĂ©lulas LSTM e o mecanismo de atenção no decodificador sĂŁo os seguintes:
Biblioteca TensorFlow seq2seqComo vocĂȘ pode ver acima, existem diferentes modelos de sequĂȘncia para sequĂȘncia. Todos eles podem usar cĂ©lulas RNN diferentes, mas todos aceitam dados de entrada do codificador e dados de entrada do decodificador. Essa Ă© a base da interface da biblioteca TensorFlow seq2seq (tensorflow / tensorflow / python / ops / seq2seq.py). Esse modelo bĂĄsico de RNN, codec, sequĂȘncia a sequĂȘncia funciona da seguinte maneira.
outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)
Na chamada indicada acima,
encoder_inputs
Ă© uma lista de tensores que representam os dados de entrada do codificador, correspondendo Ă s letras A, B, C da figura acima. Da mesma forma,
decoder_inputs
sĂŁo tensores que representam dados de entrada do decodificador. GO, W, X, Y, Z da primeira foto.
O argumento
cell
Ă© uma instĂąncia da classe
tf.contrib.rnn.RNNCell
que determina qual cĂ©lula serĂĄ usada no modelo. VocĂȘ pode usar cĂ©lulas existentes, por exemplo,
GRUCell
ou
LSTMCell
, ou pode escrever suas próprias. Além disso, o
tf.contrib.rnn
fornece shells para criar células de
tf.contrib.rnn
camadas, adicionando exceçÔes Ă entrada e saĂda de cĂ©lulas ou outras transformaçÔes. Confira o
Tutorial da
RNN para obter exemplos.
A chamada
basic_rnn_seq2seq
retorna dois argumentos:
outputs
e
states
. Ambos representam uma lista de tensores do mesmo comprimento que
decoder_inputs
.
outputs
correspondem aos dados de saĂda do decodificador a cada passo, na primeira imagem sĂŁo W, X, Y, Z, EOS. Os
states
retornados representam o estado interno do decodificador em cada etapa do tempo.
Em muitas aplicaçÔes que usam o modelo de sequĂȘncia a sequĂȘncia, a saĂda do decodificador no tempo t Ă© retornada Ă entrada do decodificador no tempo t + 1. Durante o teste, durante a decodificação de sequĂȘncia, Ă© assim que uma nova Ă© construĂda. Por outro lado, durante o treinamento, Ă© habitual transmitir ao decodificador os dados de entrada corretos a cada passo, mesmo que o decodificador tenha sido previamente confundido. As funçÔes no
seq2seq.py
suportam os dois modos com o argumento
feed_previous
. Por exemplo, considere o uso a seguir de um modelo RNN aninhado.
outputs, states = embedding_rnn_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols, num_decoder_symbols, embedding_size, output_projection=None, feed_previous=False)
No modelo
embedding_rnn_seq2seq
, todos os dados de entrada (
encoder_inputs
e
decoder_inputs
) são tensores inteiros que refletem valores discretos. Eles serão aninhados em uma representação restrita (para obter detalhes sobre o anexo, consulte o
Vector Views Guide ), mas para criar esses anexos, Ă© necessĂĄrio especificar o nĂșmero mĂĄximo de caracteres discretos:
num_encoder_symbols
no lado do codificador e
num_decoder_symbols
no lado do decodificador.
Na chamada acima, definimos
feed_previous
como False. Isso significa que o decodificador usarĂĄ os tensores
decoder_inputs
na forma em que sĂŁo fornecidos. Se
feed_previous
como True, o decodificador usarĂĄ apenas o primeiro elemento
decoder_inputs
. Todos os outros tensores da lista serĂŁo ignorados e o valor anterior da saĂda do decodificador serĂĄ usado. Isso Ă© usado para decodificar traduçÔes em nosso modelo de tradução, mas tambĂ©m pode ser usado durante o treinamento, para melhorar a estabilidade do modelo a seus erros. Aproximadamente como em
Bengio et al., 2015 (
pdf ).
Outro argumento importante usado acima Ă©
output_projection
. Sem esclarecimentos, as conclusĂ”es do modelo incorporado serĂŁo tensores da forma o nĂșmero de amostras de treinamento por
num_decoder_symbols
, uma vez que representam os logotipos de cada sĂmbolo gerado. Ao treinar modelos com dicionĂĄrios de saĂda grandes, por exemplo, com
num_decoder_symbols
grande, o armazenamento desses tensores grandes se torna impraticĂĄvel. Em vez disso, Ă© melhor retornar tensores menores, que serĂŁo projetados posteriormente no tensor grande usando a
output_projection
. Isso nos permite usar nossos modelos seq2seq com perdas de softmax amostradas, conforme descrito por
Jean et. al., 2014 (
pdf ).
Além de
basic_rnn_seq2seq
e
embedding_rnn_seq2seq
, existem vĂĄrios modelos de sequĂȘncia a sequĂȘncia no
seq2seq.py
. Preste atenção neles. Todos eles tĂȘm uma interface semelhante, por isso nĂŁo vamos nos aprofundar em seus detalhes. Para o nosso modelo de tradução abaixo, use
embedding_attention_seq2seq
.
Para ser continuado.