Modelos de sequĂȘncia-sequĂȘncia-parte 1

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:

FicheiroO que hĂĄ nele?
tensorflow / tensorflow / python / ops / seq2seq.pyBiblioteca para criar modelos de sequĂȘncia para sequĂȘncia
modelos / tutoriais / rnn / translate / seq2seq_model.pyModelos de tradução neural sequĂȘncia a sequĂȘncia
modelos / tutoriais / rnn / translate / data_utils.pyFunçÔes auxiliares para preparar dados de tradução
modelos / tutoriais / rnn / translate / translate.pyO binĂĄrio que treina e executa o modelo de conversĂŁo

NoçÔes bĂĄsicas de sequĂȘncia a sequĂȘncia

O 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 seq2seq

Como 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.

Source: https://habr.com/ru/post/pt430780/


All Articles