Traductor basado en seq2seq con encoders y decoders

Autor: | Última modificación: 12 de abril de 2024 | Tiempo de Lectura: 3 minutos
Temas en este post: ,

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo realizaremos el código de un traductor basado en seq2seq con encoders y decoders. El seq2seq se compone de dos modelos, que son el encoder y el decoder, y por esta razón, a continuación haremos la construcción de ambos.

¿Qué es seq2seq?

Para entender cómo funciona el traductor basado en seq2seq, debemos entender primero qué es el seq2seq. El seq2seq (Sequence-to-Sequence) es un modelo de deep learning que se utiliza para procesar secuencias de entrada y generar secuencias de salida en aplicaciones de procesamiento del lenguaje natural, como traducción automática, resumen de texto o respuesta a preguntas, entre otras.

El modelo consta de dos componentes principales: un codificador y un decodificador.

  • El codificador procesa la secuencia de entrada y la transforma en un vector de características, que se utiliza como entrada para el decodificador.
  • El decodificador genera la secuencia de salida paso a paso, tomando como entrada el vector de características y la secuencia previamente generada.

Seq2seq se basa en redes neuronales recurrentes (RNN), que son capaces de manejar secuencias de longitud variable y capturar dependencias a largo plazo. En particular, se utilizan las RNN con memoria de corto y largo plazo (LSTM) o las redes GRU, que son variantes de las RNN para el codificador y decodificador.

Seq2seq ha demostrado ser muy eficaz en la traducción automática y en otras tareas de procesamiento de lenguaje natural.

Traductor basado en seq2seq

Construcción del encoder

Como hemos mencionado, el traductor basado en seq2seq requiere de un encoder y un decoder para funcionar. Ahora veremos cómo construir el encoder.

Lo primero que haremos es construir nuestra capa de entrada, que es donde se van a recibir las representaciones de los textos en inglés. Posteriormente, generamos nuestro codificador, que en este caso va a ser una LSTM con 400 unidades, que corresponden al número de neuronas con las que se trabajará.

Esto va a recibir directamente la entrada. Si quisiéramos, podríamos optimizarlo más; le podríamos añadir embeddings previos o cualquier otro tipo de método que hemos estado viendo en otros posts del blog. No obstante, como este ya es un método bastante costoso de por sí, no le incluiremos características que lo hagan más complejo.

Definir el decoder

En nuestro ejercicio de traductor basado en seq2seq el siguiente paso es definir el decodificador o decoder. Es en este punto en donde entra la diferencia con otros modelos que hemos visto anteriormente. Lo que creamos, por tanto, es un RepeatVector. Con este RepeatVector, básicamente, generamos las predicciones, una a una, con el state que hemos recibido en un inicio.

Traductor basado en seq2seq

Está claro que esto está dentro de la misma red, porque no es una red distinta.

Si nos fijamos bien, son distintas capas, pero no están definidas dentro de un modelo diferente. Vemos que las capas se construyen dentro de un mismo modelo.

Traductor basado en seq2seq con encoders y decoders

Con esto definimos el RepeatVector de nuestro traductor basado en seq2seq. Después, la salida que generamos la pasamos a las LSTM para que vayan optimizando sus pesos. Es en este punto (señalado con rojo en la imagen) en el que entra la diferencia, ya que le decimos que la entrada de esta LSTM es lo que vamos recibiendo, paso a paso, del RepeatVector, e inicializamos las LSTM con el initial_state que hemos recibido del encoder. Es decir, no va a partir de cero, sino que va a partir de lo que le vamos a dar como resultado del encoder.

Veamos este ejercicio de traductor basado en seq2seq en la práctica:

#Traductor basado en seq2seq
from tensorflow.keras.layers import LSTM

learning_rate = 1 e  - 3

#Encoder
encoder_input_seq = Input (shape = tmp_x.shape [1:])
encoder_output, state_h, state_c = LSTM (units = 400, return_sequences = False, return_state = True) (encoder_input_seq)

#Decoder
decoder_input_seq = RepeatVector (max_french_sequence_length) (encoder_output)
decoder_out = LSTM (units = 400, return_sequences = True, return_state = False) (decoder_input_seq, initial_state = [state_h, state_c])
logits = TimeDistributed (Dense (units = french_vocab_size)) (decoder_out)

#Model
model = Model (encoder_input_seq, Activation ('softmax') (logits))
model.compile (loss = sparse_categorical_crossentropy, optimizer = Adam (lr = learning_rate), metrics = ['accuracy'])

model.fit (tmp_x, preproc_french_sentences, batch_size = 32, epochs = 1, validation_split = 0.2)

#Print prediction (s)
print (logits_to_text (model.predict (tmp_x [:1]) [0], french_tokenizer))
Traductor basado en seq2seq con encoders y decoders

¿Qué sigue?

Sabemos que el Big Data tiene muchísimas vertientes y, por tanto, hay muchísimos temas sobre los que puedes aprender. En KeepCoding te ofrecemos la posibilidad de aprender con los mejores profesionales, que te guiarán a través de la teoría y la práctica para que, en unos meses, puedas convertirte en un gran profesional del sector IT. Échale un vistazo al temario del Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp y descubre esta formación intensiva, íntegra y de alta calidad. ¡Solicita ya más información y da el paso que impulsará tu carrera!

Posts Relacionados

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado