Revelando los entresijos Un análisis a fondo del mecanismo de atención de BERT

Revelando los secretos Un análisis en profundidad del mecanismo de atención de BERT

Introducción

BERT, abreviatura de Bidirectional Encoder Representations from Transformers, es un sistema que aprovecha el modelo de transformador y el entrenamiento previo no supervisado para el procesamiento del lenguaje natural. Al estar preentrenado, BERT aprende de antemano a través de dos tareas no supervisadas: modelado de lenguaje enmascarado y predicción de oraciones. Esto permite adaptar BERT a tareas específicas sin comenzar desde cero. Esencialmente, BERT es un sistema preentrenado que utiliza un modelo único para entender el lenguaje, simplificando su aplicación a diversas tareas. Entendamos el mecanismo de atención de BERT y su funcionamiento en este artículo.

También lee: ¿Qué es BERT? ¡Haz clic aquí!

Objetivos de aprendizaje

  • Entender el mecanismo de atención en BERT
  • ¿Cómo se realiza la tokenización en BERT?
  • ¿Cómo se calculan los pesos de atención en BERT?
  • Implementación en Python de un modelo BERT

Este artículo fue publicado como parte del Data Science Blogathon.

Mecanismo de atención en BERT

Comencemos por entender qué significa la atención en los términos más simples. La atención es una de las formas en que el modelo intenta otorgar más peso a aquellas características de entrada que son más importantes para una oración.

Consideremos los siguientes ejemplos para entender cómo funciona la atención fundamentalmente.

Ejemplo 1

Se presta más atención a algunas palabras que a otras

En la oración anterior, es posible que el modelo de BERT desee otorgar más peso a la palabra “gato” y al verbo “saltó” que a “bolsa”, ya que saber de ellos será más crítico para la predicción de la siguiente palabra “cayó” que saber desde dónde saltó el gato.

Ejemplo 2

Considera la siguiente oración:

Se presta más atención a algunas palabras que a otras

Para predecir la palabra “espagueti”, el mecanismo de atención permite dar más peso al verbo “comer” en lugar de la cualidad “insípida” del espagueti.

Ejemplo 3

Del mismo modo, para una tarea de traducción como la siguiente:

Oración de entrada: ¿Cómo estuvo tu día?

Oración objetivo: Comment se passe ta journée

Fuente: https://blog.floydhub.com/attention-mechanism/

Para cada palabra en la frase de salida, el mecanismo de atención asignará a las palabras significativas y pertinentes de la oración de entrada un mayor peso. En la imagen anterior, observa cómo la palabra francesa “Comment” asigna el mayor peso (representado por azul oscuro) a la palabra “How”, y para la palabra “journee”, la palabra de entrada “day” recibe el mayor peso. De esta manera, el mecanismo de atención ayuda a lograr una mayor precisión en la salida al otorgar más peso a las palabras que son más críticas para la predicción relevante.

La pregunta que surge es cómo el modelo asigna pesos diferentes a las diferentes palabras de entrada. Veamos en la siguiente sección cómo los pesos de atención permiten exactamente este mecanismo.

Pesos de atención para representaciones compuestas

BERT utiliza pesos de atención para procesar secuencias. Considera una secuencia X compuesta por tres vectores, cada uno con cuatro elementos. La función de atención transforma X en una nueva secuencia Y con la misma longitud. Cada vector Y es el promedio ponderado de los vectores X, con pesos denominados pesos de atención. Estos pesos aplicados a las incrustaciones de palabras de X producen incrustaciones compuestas en Y.

El cálculo de cada vector en Y se basa en pesos de atención variables asignados a x1, x2 y x3, según la atención requerida para cada característica de entrada en la generación del vector correspondiente en Y. Matemáticamente hablando, se vería algo como se muestra a continuación –

En las ecuaciones anteriores, los valores 0.4, 0.3 y 0.2 no son más que los distintos pesos de atención asignados a x1, x2 y x3 para calcular las incrustaciones compuestas y1, y2 y y3. Como se puede ver, los pesos de atención asignados a x1, x2 y x3 para calcular las incrustaciones compuestas son completamente diferentes para y1, y2 y y3.

La atención es fundamental para comprender el contexto de la oración, ya que permite al modelo entender cómo se relacionan entre sí las diferentes palabras, además de entender las palabras individuales. Por ejemplo, cuando un modelo de lenguaje trata de predecir la siguiente palabra en la siguiente oración

“El gato inquieto estaba ___”

El modelo debería comprender la noción compuesta de gato inquieto además de comprender los conceptos de inquieto o gato individualmente; por ejemplo, el gato inquieto a menudo salta, por lo que “saltar” podría ser una siguiente palabra adecuada en la oración.

Vectores Clave y de Consulta Para Obtener Pesos de Atención

Ahora sabemos que los pesos de atención ayudan a obtener representaciones compuestas de nuestras palabras de entrada calculando un promedio ponderado de las entradas con la ayuda de los pesos. Sin embargo, la siguiente pregunta que surge es de dónde vienen estos pesos de atención. Los pesos de atención provienen principalmente de dos vectores conocidos con el nombre de vectores clave y de consulta.

BERT mide la atención entre pares de palabras utilizando una función que asigna una puntuación a cada par de palabras en función de su relación. Utiliza vectores de consulta y clave como incrustaciones de palabras para evaluar la compatibilidad. La puntuación de compatibilidad se calcula tomando el producto punto del vector de consulta de una palabra y el vector clave de la otra. Por ejemplo, calcula la puntuación entre ‘saltar’ y ‘gato’ utilizando el producto punto del vector de consulta (q1) de ‘saltar’ y el vector clave (k2) de ‘gato’ – q1*k2.

Para convertir las puntuaciones de compatibilidad en pesos de atención válidos, es necesario normalizarlos. BERT lo hace aplicando la función softmax a estas puntuaciones, garantizando que sean positivas y sumen uno. Los valores resultantes son los pesos de atención finales para cada palabra. Es importante destacar que los vectores clave y de consulta se calculan dinámicamente a partir de la salida de la capa anterior, lo que permite que BERT ajuste su mecanismo de atención en función del contexto específico.

Cabezas de Atención en BERT

BERT aprende múltiples mecanismos de atención conocidos como cabezas. Estas cabezas trabajan juntas al mismo tiempo de manera concurrente. Tener múltiples cabezas ayuda a BERT a comprender mejor las relaciones entre las palabras que si solo tuviera una cabeza.

BERT divide sus parámetros de Consulta, Clave y Valor en N partes. Cada una de estas N parejas pasa de forma independiente a una Cabeza separada, realizando cálculos de atención. Los resultados de estas parejas se combinan luego para generar una puntuación final de atención. Es por eso que se denomina ‘atención multi-cabeza’, lo que proporciona a BERT una capacidad mejorada para capturar múltiples relaciones y matices para cada palabra.

Atención multi-cabeza

BERT también apila múltiples capas de atención. Cada capa toma la salida de la capa anterior y presta atención a ella. Al hacer esto muchas veces, BERT puede crear representaciones muy detalladas a medida que se adentra en el modelo.

Dependiendo del modelo de BERT específico, hay 12 o 24 capas de atención y cada capa tiene 12 o 16 cabezas de atención. Esto significa que un solo modelo de BERT puede tener hasta 384 mecanismos de atención diferentes porque los pesos no se comparten entre las capas.

Implementación en Python de un modelo BERT

Paso 1. Importar las bibliotecas necesarias

Necesitaríamos importar la biblioteca de Python ‘torch’ para poder usar PyTorch. También necesitaríamos importar BertTokenizer y BertForSequenceClassification de la biblioteca transformers. La biblioteca tokenizer ayuda a habilitar la tokenización del texto mientras que BertForSequenceClassification se utiliza para la clasificación de texto.

import torchfrom transformers import BertTokenizer, BertForSequenceClassification

Paso 2. Cargar el modelo BERT pre-entrenado y el tokenizador

En este paso, cargamos el modelo pre-entrenado “bert-base-uncased” y lo pasamos al método from_pretrained de BertForSequenceClassification. Dado que queremos realizar una clasificación de sentimiento simple aquí, establecemos num_labels como 2, lo que representa las clases “positiva” y “negativa”.

model_name = 'bert-base-uncased'tokenizer = BertTokenizer.from_pretrained(model_name)model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)

Paso 3. Establecer el dispositivo a GPU si está disponible

Este paso es solo para cambiar el dispositivo a GPU si está disponible o mantenerlo en CPU.

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model.to(device)#import csv

Paso 4. Definir el texto de entrada y tokenizarlo

En este paso, definimos el texto de entrada para el cual queremos realizar la clasificación. También definimos el objeto tokenizer que se encarga de convertir el texto en una secuencia de tokens, que son las unidades básicas de información que los modelos de aprendizaje automático pueden entender. El parámetro ‘max_length’ establece la longitud máxima de la secuencia tokenizada. Si la secuencia tokenizada excede esta longitud, el sistema la truncará. El parámetro ‘padding’ dicta que la secuencia tokenizada se rellenará con ceros hasta alcanzar la longitud máxima si es más corta. El parámetro “truncation” indica si se truncará la secuencia tokenizada si supera la longitud máxima.

Dado que este parámetro está configurado en True, la secuencia se truncará si es necesario. El parámetro “return_tensors” especifica el formato en el que se devolverá la secuencia tokenizada. En este caso, la función devuelve la secuencia como un tensor de PyTorch. Luego mueve los ‘input_ids’ y ‘attention_mask’ de los tokens generados al dispositivo especificado. La máscara de atención, discutida anteriormente, es un tensor binario que indica a qué partes de la secuencia de entrada prestar más atención para una tarea de predicción específica.

text = "No me gustó realmente esta película. ¡Fue fantástica!"#Tokenizar el texto de entrada tokens = tokenizer.encode_plus(    text,    max_length=128,    padding='max_length',    truncation=True,    return_tensors='pt')# Mover tensores de entrada al dispositivoid de entrada = tokens['input_ids'].to(device)máscara de atención = tokens['attention_mask'].to(device)#import csv

Paso 5. Realizar la predicción de sentimiento

En el siguiente paso, el modelo genera la predicción para los input_ids y la atención_mask dados.

with torch.no_grad():    outputs = model(input_ids, attention_mask)predicted_label = torch.argmax(outputs.logits, dim=1).item()sentimiento = 'positivo' if predicted_label == 1 else 'negativo'print(f"El sentimiento del texto de entrada es {sentimiento}.")#import csv

Salida

El sentimiento del texto de entrada es positivo.

Conclusión

Este artículo cubrió la atención en BERT, destacando su importancia en la comprensión del contexto de las oraciones y las relaciones entre las palabras. Exploramos los pesos de atención, que dan representaciones compuestas de las palabras de entrada a través de promedios ponderados. El cálculo de estos pesos involucra vectores clave y de consulta. BERT determina la puntuación de compatibilidad entre dos palabras tomando el producto punto de estos vectores. Este proceso, conocido como “heads”, es la forma de BERT de enfocarse en las palabras. Múltiples cabezas de atención mejoran la comprensión de BERT de las relaciones entre las palabras. Por último, examinamos la implementación en python de un modelo BERT pre-entrenado.

Conclusiones clave

  • BERT se basa en dos avances cruciales de NLP: la arquitectura transformadora y el pre-entrenamiento no supervisado.
  • Utiliza ‘atención’ para priorizar las características relevantes en las oraciones, lo que ayuda a comprender las relaciones y contextos de las palabras.
  • Los pesos de atención calculan un promedio ponderado de las entradas para representaciones compuestas. El uso de múltiples cabezas de atención y capas permite que BERT cree representaciones detalladas de palabras al centrarse en las salidas de capas anteriores.

Preguntas frecuentes

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Mejora Amazon Lex con LLMs y mejora la experiencia de las preguntas frecuentes utilizando la ingestión de URL

En el mundo digital de hoy, la mayoría de los consumidores prefieren encontrar respuestas a sus preguntas de servicio...

Inteligencia Artificial

Conoce Jupyter AI Desatando el poder de la inteligencia artificial en los cuadernos de Jupyter

En un avance innovador en inteligencia artificial y codificación, Project Jupyter presenta una adición revolucionaria...

Inteligencia Artificial

Este artículo AI propone 'MotionDirector' Un enfoque de inteligencia artificial para personalizar el movimiento y apariencia de vídeos.

Los modelos de difusión de texto a video han avanzado significativamente en los últimos tiempos. Ahora, solo con prop...

Inteligencia Artificial

El Enigma para ChatGPT PUMA es un Enfoque de IA que Propone una Forma Rápida y Segura para la Inferencia de LLM

Los Modelos de Lenguaje Grandes (LLMs, por sus siglas en inglés) han comenzado una revolución en el campo de la intel...

Inteligencia Artificial

Acelerando el tiempo para obtener conocimientos con las colecciones de series temporales de MongoDB y Amazon SageMaker Canvas

Este es un artículo de invitado escrito conjuntamente con Babu Srinivasan de MongoDB. A medida que las industrias evo...