Buen dia a todos!
Y nuevamente hemos abierto una nueva transmisión al curso revisado de
Data Scientist : otro
excelente maestro , un programa ligeramente refinado basado en actualizaciones. Bueno, como siempre, interesantes
lecciones abiertas y colecciones de materiales interesantes. Hoy comenzaremos el análisis de los modelos seq2seq de Tensor Flow.
Vamos
Como ya se discutió en el
tutorial de RNN (le recomendamos que se familiarice con él antes de leer este artículo), se puede enseñar a las redes neuronales recurrentes a modelar el lenguaje. Y surge una pregunta interesante: ¿es posible capacitar a la red en ciertos datos para generar una respuesta significativa? Por ejemplo, ¿podemos enseñarle a una red neuronal a traducir del inglés al francés? Resulta que podemos.
Esta guía le mostrará cómo crear y entrenar un sistema de extremo a extremo. Copie
el repositorio principal de Tensor Flow y
el repositorio de modelos TensorFlow de GitHub . Luego, puede comenzar iniciando el programa de traducción:
cd models/tutorials/rnn/translate python translate.py --data_dir [your_data_directory]

Ella descargará los datos para su traducción del inglés al francés desde
el sitio web de WMT'15 , los preparará para la capacitación y el entrenamiento. Esto requerirá aproximadamente 20 GB en el disco duro y bastante tiempo para descargar y preparar, por lo que puede comenzar el proceso ahora y continuar leyendo este tutorial.
El manual accederá a los siguientes archivos:
Archivo | Que hay en el |
---|
tensorflow / tensorflow / python / ops / seq2seq.py | Biblioteca para crear modelos de secuencia a secuencia |
modelos / tutoriales / rnn / translate / seq2seq_model.py | Modelos de traducción neural secuencia a secuencia |
modelos / tutoriales / rnn / translate / data_utils.py | Funciones de ayuda para preparar datos de traducción. |
modelos / tutoriales / rnn / translate / translate.py | El binario que entrena y ejecuta el modelo de traducción. |
Conceptos básicos de secuencia a secuenciaEl modelo básico de secuencia a secuencia, presentado por
Cho et al., 2014 (
pdf ), consta de dos redes neuronales recurrentes (RNN): un codificador (codificador) que procesa los datos de entrada y un decodificador (decodificador) que genera los datos. salida. La arquitectura básica se muestra a continuación:

Cada rectángulo en la imagen de arriba representa una celda en el RNN, generalmente una celda GRU - un bloque de recurrencia controlado, o una celda LSTM - memoria a corto plazo a largo plazo (lea el
tutorial RNN para obtener más información sobre ellos). Los codificadores y decodificadores pueden tener pesos comunes o, más a menudo, usar diferentes conjuntos de parámetros. Las células multicapa se han utilizado con éxito en modelos de secuencia a secuencia, por ejemplo, para traducir
Sutskever et al., 2014 (
pdf ).
En el modelo básico descrito anteriormente, cada entrada debe codificarse en un vector de estado de un tamaño fijo, ya que esto es lo único que se transmite al decodificador. Para dar al decodificador un acceso más directo a los datos de entrada, se introdujo un mecanismo de atención en
Bahdanau et al., 2014 (
pdf ). No entraremos en detalles sobre el mecanismo de atención (para esto puede familiarizarse con el trabajo aquí); basta con decir que permite que el decodificador busque en los datos de entrada en cada paso de decodificación. Una red de secuencia a secuencia multicapa con celdas LSTM y el mecanismo de atención en el decodificador es el siguiente:
Biblioteca TensorFlow seq2seqComo puede ver arriba, hay diferentes modelos de secuencia a secuencia. Todos ellos pueden usar diferentes celdas RNN, pero todos aceptan datos de entrada del codificador y datos de entrada del decodificador. Esta es la base de la interfaz de la biblioteca TensorFlow seq2seq (tensorflow / tensorflow / python / ops / seq2seq.py). Este modelo básico, RNN, códec, secuencia a secuencia funciona de la siguiente manera.
outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)
En la llamada indicada anteriormente,
encoder_inputs
es una lista de tensores que representan los datos de entrada del codificador, correspondientes a las letras A, B, C de la imagen de arriba. Del mismo modo, las
decoder_inputs
decodificador son tensores que representan datos de entrada del decodificador. GO, W, X, Y, Z desde la primera imagen.
El argumento de
cell
es una instancia de la clase
tf.contrib.rnn.RNNCell
que determina qué celda se utilizará en el modelo. Puede usar celdas existentes, por ejemplo,
GRUCell
o
LSTMCell
, o puede escribir las suyas. Además,
tf.contrib.rnn
proporciona shells para crear celdas multicapa, agregando excepciones a la entrada y salida de celdas u otras transformaciones. Consulte el
Tutorial de RNN para ver ejemplos.
La llamada
basic_rnn_seq2seq
devuelve dos argumentos:
outputs
y
states
. Ambos representan una lista de tensores de la misma longitud que
decoder_inputs
.
outputs
corresponde a los datos de salida del decodificador en cada paso de tiempo, en la primera imagen es W, X, Y, Z, EOS. Los
states
devueltos representan el estado interno del decodificador en cada paso de tiempo.
En muchas aplicaciones que usan el modelo de secuencia a secuencia, la salida del decodificador en el tiempo t se transmite de regreso a la entrada al decodificador en el tiempo t + 1. Durante las pruebas, durante la decodificación de secuencia, así es como se construye una nueva. Por otro lado, durante el entrenamiento es habitual transmitir al decodificador los datos de entrada correctos en cada paso de tiempo, incluso si el decodificador se había equivocado previamente. Las funciones en
seq2seq.py
admiten ambos modos con el argumento
feed_previous
. Por ejemplo, considere el siguiente uso de un modelo RNN anidado.
outputs, states = embedding_rnn_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols, num_decoder_symbols, embedding_size, output_projection=None, feed_previous=False)
En el modelo
embedding_rnn_seq2seq
, todos los datos de entrada (
encoder_inputs
y
decoder_inputs
) son tensores enteros que reflejan valores discretos. Se anidarán en una representación ajustada (para obtener detalles sobre el archivo adjunto, consulte la
Guía de vistas de vectores ), pero para crear estos archivos adjuntos, debe especificar el número máximo de caracteres discretos:
num_encoder_symbols
en el lado del codificador y
num_decoder_symbols
en el lado del decodificador.
En la llamada anterior, configuramos
feed_previous
en False. Esto significa que el decodificador utilizará los tensores
decoder_inputs
en la forma en que se proporcionan. Si establecemos
feed_previous
en True, el decodificador solo usará el primer elemento
decoder_inputs
. Todos los otros tensores de la lista serán ignorados, y en su lugar se usará el valor anterior de la salida del decodificador. Esto se usa para decodificar traducciones en nuestro modelo de traducción, pero también se puede usar durante el entrenamiento, para mejorar la estabilidad del modelo ante sus errores. Aproximadamente como en
Bengio et al., 2015 (
pdf ).
Otro argumento importante utilizado anteriormente es
output_projection
. Sin aclaración, las conclusiones del modelo incrustado serán tensores de la forma del número de muestras de entrenamiento por
num_decoder_symbols
, ya que representan los logiths de cada símbolo generado. Al entrenar modelos con diccionarios de salida grandes, por ejemplo con
num_decoder_symbols
grandes, almacenar estos tensores grandes no resulta práctico. En cambio, es mejor devolver tensores más pequeños, que posteriormente se proyectarán en el tensor grande utilizando
output_projection
. Esto nos permite utilizar nuestros modelos seq2seq con pérdidas softmax muestreadas, según lo descrito por
Jean et. al., 2014 (
pdf ).
Además de
basic_rnn_seq2seq
y
embedding_rnn_seq2seq
, hay varios modelos más de secuencia a secuencia en
seq2seq.py
. Presta atención a ellos. Todos tienen una interfaz similar, por lo que no profundizaremos en sus detalles. Para nuestro modelo de traducción a continuación, use
embedding_attention_seq2seq
.
Continuará