Aprendizaje Profundo¶

Transformers-la Revolución
¶

All you need is attention!

Profesores¶

  1. Alvaro Mauricio Montenegro Díaz, ammontenegrod@unal.edu.co
  2. Daniel Mauricio Montenegro Reyes, dextronomo@gmail.com

Asesora Medios y Marketing digital¶

  1. Maria del Pilar Montenegro, pmontenegro88@gmail.com

Referencias¶

  1. Aprendizaje Profundo-Diplomado
  2. Aprendizaje Profundo-PLN
  3. Ashish Vaswani et al., Attention Is All You Need, diciembre 2017.
  4. Dennis Rothman, Transformers for Natural Language processing, enero 2021.
  5. Varios,Dive into deep learning, enero 2021

Transformers
¶

Contenido Transformers¶

  • Transformers
    • Arquitectura original
    • Codificación-posicional
    • Enmascaramiento
    • Auto-atención de producto punto escalado
    • Capa de atención multi-cabeza
    • Capa Feed Forward
    • Transformer en acción
    • Capa codificadora
    • Capa decodificadora
    • Codificador
    • Decodificador
    • Transformer-chatbot
    • Transformer-traductor

Arquitectura original ¶

Transformer

Fuente: Attention Is All You Need (Vaswani et. al, 2017)

Codificación posicional¶

Codificación posicional discreta¶

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1000
  • 9: 1001
  • 10: 1010
  • 11: 1011
  • 12: 1100
  • 13: 1101
  • 14: 1110
  • 15: 1111

Codificación posicional continua en Transformer¶

Supongamos que $t$ es la posición deseada en una oración de entrada y que $p_t \in \mathbb{R}^d$ es su correspondiente codificación. Entonces la función codificadora $f:\mathbb{N}\to \mathbb{R}^d$ es definida componente a componente mediante

$$ p_t^{(i)} = f(t)^{(i)} = \begin{cases} sin(w_k\cdot t) & \text{si i = 2k}\\ cos(w_k\cdot t) & \text{si i = 2k+1}, \end{cases} $$

en donde

$$ w_k = \frac{1}{10000^{2k/d}} $$

Enmascaramiento¶

Enmascaramiento de los tokens de relleno (padding)¶

Se enmascaran todos los tokens de padding(relleno) en el lote de secuencia, para asegurar que el modelo no trate el relleno como entrada. Un valor de 0 en la máscara indica que esa posición en la secuencia no es relleno. Un valor de 1 en la máscara indica que esa posición en la secuencia es relleno.

Enmascaramiento de anticipación para la predicción de palabras¶

La máscara de anticipación se utiliza para enmascarar los tokens futuros en una secuencia. En otras palabras, la máscara indica qué entradas no deben usarse para hacer la predicción de la siguiente palabra predicha.

Esto significa que para predecir la tercera palabra, solo se utilizarán la primera y la segunda palabra. De manera similar, para predecir la cuarta palabra, solo se usarán la primera, la segunda y la tercera palabra y así sucesivamente.

Auto-atención de producto punto escalado¶

Atención de producto escalado

Fuente: Tensorflow transformer

La formula de auto-atención¶

Suponemos las tres entradas Q(query o consulta), K(key o clave) y V(value o valor). La ecuación para calcular los pesos de atención es

$$ \large \text{Attention}(Q,K,V) = softmax\left( \frac{QK^T}{\sqrt{d_k}} \right) V $$

en donde $d_k$ es el tamaño de entrada de la cabeza. En el transformer original el tamaño del embedding es 512 que se divide en 8 cabezas de tamaño $d_k=64$. Para que los tokens de relleno, usados para tener secuencias de igual tamaño, no tengan pesos de atención se les assigna un valor que tiene a $-\infty$, de tal manera que softmax les asigne el valor cero.

Capa de atención multi-cabeza¶

La razón de utlizar múltiples cabezas de atención es para permitir que cada cabez se enfoque en un subconjunto del espacio de inscrustación (embedding) de los tokens.

Atención multi-cabeza

Fuente: Tensorflow transformer

Capa Feed Forward¶

Esta es la capa dense en el borde superior del Transformer, luego de la atención multicabeza y de la capa residual. Consta de dos capas completamente conectadas con una activación ReLU en el medio.

Transformer en acción¶

El modelo Transformer sigue el mismo patrón general como un estándar seq2seq con atención. La sentencia de entrada se pasa a través N capas de codificación (codificadoras) que generan una salida para cada palabra/símbolo en la secuencia. El decodificador presta atención a la salida del codificador y a su propia entrada (atención propia) para predecir la siguiente palabra.

Transformer

Fuente: Attention Is All You Need (Vaswani et. al, 2017)

Capa codificadora¶

La capa codificadora corresponde al rectańgulo gris del encoder en la arquitectura del transformer arriba. Cada capa codificadora consta de subcapas:

  1. Atención multicabezal (con enmascaramiento de los tokens de padding)
  2. Redes densas hacia adelante (feed forward) (pointwise feed fordward).

Cada una de estas subcapas tiene una conexión residual a su alrededor seguida de una normalización de capa. Las conexiones residuales ayudan a evitar el problema del desvanecimiento del gradiente en las redes profundas.

La salida de cada subcapa es LayerNorm(x + Sublayer(x)) . La normalización se realiza en el d_model eje (última). Hay N capas de codificador en el transformador.

Capa decodificadora¶

La capa decodificadora corresponde al rectańgulo gris del deencoder en la arquitectura del transformer arriba. Cada capa decodificadora consta de subcapas:

  1. Atención multi-cabeza enmascarada (con máscara de anticipación y máscara de relleno)
  2. Atención multi-cabeza (con enmascaramiento de relleno). V (valor) y K (clave) reciben la salida del codificador como entradas. Q (consulta) recibe la salida de la subcapa multi-cabeza enmascarada.
  3. Redes densas hacia adelante (feed forward).

Cada una de estas subcapas tiene una conexión residual a su alrededor seguida de una normalización de capa. La salida de cada subcapa es LayerNorm(x + Sublayer(x)) . La normalización se realiza en el d_model eje (última).

Hay N capas decodificadoras en el transformer.

Codificador¶

El Encoder consta de:

  1. Incrustación de entrada
  2. Codificación posicional
  3. N capas de codificador

La entrada se somete a una incrustación (embedding) que se suma con la codificación posicional. La salida de esta suma es la entrada a las capas del codificador. La salida del codificador es la entrada al decodificador.

Decodificador¶

El Decoder consiste en:

  1. Incrustación de salida
  2. Codificación posicional
  3. N capas de decodificador

El objetivo se somete a una incrustación (embedding) que se suma con la codificación posicional. La salida de esta suma es la entrada a las capas del decodificador. La salida del decodificador es la entrada a la capa lineal final.

Transformer-chatbot¶

Preparación del conjunto de datos¶

Usaremos las conversaciones en películas y programas de televisión proporcionados por [Cornell Movie-Dialogs Corpus] (https://www.cs.cornell.edu/~cristian/Cornell_Movie-Dialogs_Corpus.html), que contiene más de 220 mil intercambios conversacionales. entre más de 10.000 pares de personajes de películas, como nuestro conjunto de datos.

movie_conversations.txt contiene una lista de los ID de conversación ymovie_lines.text contiene el texto asociado con cada ID de conversación. Para obtener más información sobre el conjunto de datos, consulte el archivo README en el archivo zip.

Preproceso de los textos¶

In [ ]:
def preprocess_sentence(sentence):
    sentence = sentence.lower().strip()
    # creating a space between a word and the punctuation following it
    # eg: "he is a boy." => "he is a boy ."
    sentence = re.sub(r"([?.!,])", r" \1 ", sentence)
    sentence = re.sub(r'[" "]+', " ", sentence)
    # removing contractions
    sentence = re.sub(r"i'm", "i am", sentence)
    sentence = re.sub(r"he's", "he is", sentence)
    sentence = re.sub(r"she's", "she is", sentence)
    sentence = re.sub(r"it's", "it is", sentence)
    sentence = re.sub(r"that's", "that is", sentence)
    sentence = re.sub(r"what's", "what is", sentence)
    sentence = re.sub(r"where's", "where is", sentence)
    sentence = re.sub(r"how's", "how is", sentence)
    sentence = re.sub(r"\'ll", " will", sentence)
    sentence = re.sub(r"\'ve", " have", sentence)
    sentence = re.sub(r"\'re", " are", sentence)
    sentence = re.sub(r"\'d", " would", sentence)
    sentence = re.sub(r"\'re", " are", sentence)
    sentence = re.sub(r"won't", "will not", sentence)
    sentence = re.sub(r"can't", "cannot", sentence)
    sentence = re.sub(r"n't", " not", sentence)
    sentence = re.sub(r"n'", "ng", sentence)
    sentence = re.sub(r"'bout", "about", sentence)
  # replacing everything with space except (a-z, A-Z, ".", "?", "!", ",")
  sentence = re.sub(r"[^a-zA-Z?.!,]+", " ", sentence)
    sentence = sentence.strip()
    return sentence

Estructura del archivo 'movie_lines.txt'¶

In [ ]:
L1045 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ They do not!

L1044 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ They do to!

L985 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ I hope so.

L984 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ She okay?

L925 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Let's go.

L924 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ Wow

L872 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Okay -- you're gonna need to learn how to lie.

L871 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ No

L870 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ I'm kidding.  You know how sometimes you just become this "persona"?  And you don't know how to quit?

L869 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Like my fear of wearing pastels?

Organización seq2seq¶

  • They do not! $\to$ They do to!
  • They do not! $\to$ I hope so.
  • I hope so. $\to$ She okay?
  • She okay? $\to$ Let's go.
  • Let's go. $\to$ Wow
  • Wow $\to$ Okay -- you're gonna need to learn how to lie.
  • Okay -- you're gonna need to learn how to lie. $\to$ No
  • No $\to$ I'm kidding. You know how sometimes you just become this "persona"? And you don't know how to quit?
  • I'm kidding. You know how sometimes you just become this "persona"? And you don't know how to quit? $\to$ Like my fear of wearing pastels?

Prueba del chatbot¶

output = predict('Where have you been?')

Input: Where have you been?

Output: i am going to leave you alone .

output = predict("It's a trap")

Input: It's a trap

Output: you know what ? he s dead . but you can t hear that , you ll be in there till you do it .

In [39]:
# feed the model with its previous output
sentence = 'I am not crazy, my mother had me tested.'
for _ in range(5):
  sentence = predict(sentence)
  print('')
Input: I am not crazy, my mother had me tested.
Output: you don t have a choice .

Input: you don t have a choice .
Output: i don t have a choice .

Input: i don t have a choice .
Output: what s wrong ?

Input: what s wrong ?
Output: you don t have to go . you don t understand

Input: you don t have to go . you don t understand
Output: i don t know . i m not sure that i do .

Transformer-traductor¶

Conjunto de datos¶

Usa los conjuntos de datos de TensorFlow para cargar el conjunto de datos de traducción portugués-inglés del Proyecto de traducción abierta de TED Talks.

Este conjunto de datos contiene aproximadamente 50000 ejemplos de entrenamiento, 1100 ejemplos de validación y 2000 ejemplos de prueba.

Orgainzación seq2seq¶

  1. e quando melhoramos a procura , tiramos a única vantagem da impressão , que é a serendipidade .
  2. mas e se estes fatores fossem ativos ?
  3. mas eles não tinham a curiosidade de me testar .
  1. and when you improve searchability , you actually take away the one advantage of print , which is serendipity .
  2. but what if it were active ?
  3. but they did n't test for curiosity .

Prueba del traductor¶

sentence = "Eu li sobre triceratops na enciclopédia."

ground_truth = "I read about triceratops in the encyclopedia."

BERT
¶

BERT-Transformer

Fuente:Bert el nuevo algoritmo de Google

Contenido Bert¶

  • BERT
    • Introducción a BERT
    • BERT-Input
    • BERT-Entrenamiento Cloze task
    • BERT-Entrenamiento predicción siguiente sentencia
    • BERT-Transferencia de conocimiento
    • Tokenizadores usados con Transformers

Introducción a BERT¶

Usaremos la implementación de HuggingFace in en Pytorch.

  • BERT es un modelo con incrustaciones de posición absoluta, por lo que generalmente se recomienda rellenar (padding) las entradas a la derecha en lugar de a la izquierda.

  • BERT tiene la estructura básica del codificador del transformer, con mpas cabezas, mas caps y tres embedding pocisionales que son aprendidod ene le entrenamiento.

  • BERT fue entrenado con el modelado de lenguaje enmascarado (MLM) y los objetivos de predicción de la siguiente oración (NSP). Es eficiente para predecir tokens enmascarados y en NLU en general, pero no es óptimo para la generación de texto.

BERT-Input¶

BERT-Arquitectura

Fuente:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

BERT-Entrenamiento Cloze task¶

BERT-predicción del token enmascarado/p>

Fuente:Finnish Language Modeling with Deep Transformer Models

BERT-Entrenamiento predicción siguiente sentencia¶

BERT-Predicción de la siguiente sentencia/p>

Fuente:geeksforgeeks

BERT-Transferencia de conocimiento¶

BERT-Transferencia de conocimiento

Fuente:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

Tokenizadores usados con Transformers¶

Los tokenizadores constituyen una parte clave del entubamiento de PLN. La traea de un tokenizador es transformar un texto en datos que pueden ser procesados por el modelo.

Los modelos solamente procesan números. Así que un tokenizador transforma un texto en bruto (raw text) en una secuencia de números.

Tokenizadores basados en palabras¶

Inicialmente vamos a pensar en tokenización basada en palabras (word-based). La siguiente imagen ilustra le meta inicial de un toeknizador: dividir el texto bruto en palabras (o subpalabras) para encontrar una representación numérica del texto.

Ejemplos de tokenización por palabras

Fuente: HuggingFace Transformers course

La división del texto en palabras puede hacerse directamente con la función split de Python.

In [2]:
tokenized_text = " Daniel es un profesor de inteligencia artificial".split()
print(tokenized_text)
['Daniel', 'es', 'un', 'profesor', 'de', 'inteligencia', 'artificial']

Tokenización basada en caracteres¶

En el otro extremo se encuentran los tokenizadores basados en caracteres. En general estos generan vocabularios mucho mas cortos. En este caso aparecen problemas diferentes a los tokenizadores por palabras. A diferencia de la tokenización por palabras en donde existen similaridades entre ellas, en la tokenizacipon por caracteres, tal similaridad se pierde. Además algunos problemas aparecen, relacionados con el manejo de la puntuación.

Sinembargo esto difiere entre lso diferente lenguajes naturales. Por ejemplo en chino, cada caracter carga más información que un caracter en un lenguaje latino. La siguiente imagen ilustra una tokenización por caracteres latinos.

Ejemplos de tokenización por caracteres

Fuente: HuggingFace Transformers course

Tokenización basada en subpalabras¶

En este tipo de tokenizadores se toma lo mejor de los dos mundos anteriores. La tokenización basada en subpalabras descanasa en el principio de que *palabras frecuentemente usadas no deben subdivisirse más, pero palabras menos frecuentes pueden eventualmente ser subdivididas en subpalabras cons siginficado. Dos ejemplos de tokenización basados en subpalabras son los siguientes.

  1. Las palabras perro y perros son diferentes. Pero es claro que se refieren a lo mismo. Si se codifican separadamente con ID's distintos, esta similaridad natural se pierde. Una solución que puede adoptrase es por ejemplo codificar las palabras 'perro' y 's'. por separado. Un tokenizador entrenado de esta forma haría la tokenización d elas dos palabras de la siguiente forma:
    • 'perro' -> {'perro'} -> {{35}}
    • 'perros' -> {'perro', 's'} -> {{35}, {60}}
    • 'casa' -> {'casa'} -> {{85}}
    • 'casas' -> {'casa', 's'} -> {{85}, {60}}

Observe que 'perros' y 'casas' comparten el hecho de ser palabras plurales.

  1. Las palabras bailar, bailamos, bailaríamos, bailaremos se tokenizarían como
    • 'bailar* -> {'baila', 'r'} -> {{110},{59}}
    • 'bailamos* -> {'baila', 'mos'} -> {{110},{90}}
    • 'bailaríamos* -> {'baila', 'ríamos'} -> {{110},{95}}
    • 'bailaremos* -> {'baila', 'remos'} -> {{110},{98}}

Asi, sucesivamente.

Tokenización basada en otros enfoques¶

Existen muchas más técnicas. Por ejemplo:

  1. Byte-level, usado en GPT-2
  2. WordPiece, usado en BERT
  3. SentencePiece o Unigram, usado en varios modelos multilingua.

BERT-word-piece tokenizer