Cómo se calcula la autoatención
Desliza para mostrar el menú
Para comprender cómo se calcula la auto-atención en los transformers, es necesario seguir una secuencia precisa de operaciones matemáticas. El mecanismo de auto-atención permite que cada palabra en una oración se enfoque en otras palabras al producir una representación de salida. Esto se logra calculando una suma ponderada de todos los vectores de entrada, donde los pesos reflejan la importancia de cada palabra para la palabra actual que se está procesando.
Supón que tienes una oración corta representada como una matriz, donde cada fila es una incrustación de palabra. Primero, proyectas estas incrustaciones en consultas, claves y valores utilizando matrices de pesos aprendidas. El núcleo de la auto-atención es entonces el cálculo de las puntuaciones de atención y la agregación de los vectores de valor en función de estas puntuaciones.
Consultas, claves y valores son diferentes representaciones de la entrada, cada una utilizada para un propósito específico en el cálculo de la atención.
Cálculo de la auto-atención
La auto-atención se puede descomponer en una serie de pasos matemáticos claros para cada palabra en la secuencia:
Proyección de entradas a consultas, claves y valores: proyectar la matriz de entrada utilizando matrices de pesos aprendidas para obtener consultas, claves y valores.
123456789101112131415161718192021222324252627282930313233import numpy as np # Example input: 3 words, embedding size 4 X = np.array([ [1.0, 0.0, 1.0, 0.0], # word 1 [0.0, 2.0, 0.0, 2.0], # word 2 [1.0, 1.0, 1.0, 1.0] # word 3 ]) # Weight matrices for queries, keys, values (embedding size 4 -> 4) W_q = np.array([ [0.1, 0.2, 0.0, 0.0], [0.0, 0.1, 0.3, 0.0], [0.1, 0.0, 0.0, 0.2], [0.0, 0.0, 0.2, 0.3] ]) W_k = np.array([ [0.2, 0.0, 0.1, 0.0], [0.0, 0.1, 0.0, 0.3], [0.1, 0.0, 0.2, 0.0], [0.0, 0.2, 0.0, 0.1] ]) W_v = np.array([ [0.0, 0.1, 0.0, 0.2], [0.2, 0.0, 0.2, 0.0], [0.0, 0.3, 0.1, 0.0], [0.1, 0.0, 0.0, 0.3] ]) # Compute queries, keys, values Q = X @ W_q K = X @ W_k V = X @ W_v
Cálculo de las puntuaciones de atención:
- Calcular la similitud entre cada consulta y todas las claves;
- Estas puntuaciones indican cuánta atención debe prestar cada palabra a las demás.
1scores = Q @ K.T
Escalar las puntuaciones: dividir las puntuaciones de atención por la raíz cuadrada de la dimensión de la clave. Este escalado ayuda a estabilizar los gradientes durante el entrenamiento.
12d_k = Q.shape[1] scaled_scores = scores / np.sqrt(d_k)
Aplicar la función softmax: convertir los puntajes escalados en pesos de atención utilizando la función softmax. Esto garantiza que los pesos sean positivos y sumen 1 para cada palabra.
123456# Softmax to get attention weights def softmax(x): e_x = np.exp(x - np.max(x, axis=-1, keepdims=True)) return e_x / np.sum(e_x, axis=-1, keepdims=True) attention_weights = softmax(scaled_scores)
Calcular la suma ponderada de los valores: utilizar los pesos de atención para calcular una suma ponderada de los vectores de valor. Esto produce la salida final de self-attention para cada palabra.
12345# Weighted sum of values output = attention_weights @ V print("Attention weights:\n", attention_weights) print("Self-attention output:\n", output)
Estos pasos capturan los cálculos esenciales detrás de la auto-atención en los modelos transformadores.
1. ¿Cuál es el orden correcto de operaciones en la auto-atención para una palabra de entrada?
2. ¿Por qué escalamos las puntuaciones de atención por la raíz cuadrada de la dimensión de las claves?
3. ¿Qué vectores se utilizan para calcular las puntuaciones de atención?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla