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}} $$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.
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.
Atención de producto escalado
Fuente: Tensorflow transformer
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.
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
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.
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
La capa codificadora corresponde al rectańgulo gris del encoder en la arquitectura del transformer arriba. Cada capa codificadora consta de subcapas:
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.
La capa decodificadora corresponde al rectańgulo gris del deencoder en la arquitectura del transformer arriba. Cada capa decodificadora consta de subcapas:
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.
El Encoder consta de:
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.
El Decoder consiste en:
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.
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.
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
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?
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 .
# 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 .
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.
sentence = "Eu li sobre triceratops na enciclopédia."
ground_truth = "I read about triceratops in the encyclopedia."
BERT-Transformer
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-Arquitectura
Fuente:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
BERT-predicción del token enmascarado/p>
Fuente:Finnish Language Modeling with Deep Transformer Models
BERT-Predicción de la siguiente sentencia/p>
Fuente:geeksforgeeks
BERT-Transferencia de conocimiento
Fuente:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
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.
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.
tokenized_text = " Daniel es un profesor de inteligencia artificial".split()
print(tokenized_text)
['Daniel', 'es', 'un', 'profesor', 'de', 'inteligencia', 'artificial']
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
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.
Observe que 'perros' y 'casas' comparten el hecho de ser palabras plurales.
Asi, sucesivamente.
BERT-word-piece tokenizer