Cómo Implementar la Atención Multi-Cabeza
Desliza para mostrar el menú
12345678910111213141516171819202122232425262728293031323334353637383940import numpy as np # Toy input: 3 tokens, embedding size 6 x = np.array([ [0.1, 0.2, 0.3, 0.4, 0.5, 0.6], [0.6, 0.5, 0.4, 0.3, 0.2, 0.1], [0.2, 0.1, 0.4, 0.3, 0.6, 0.5], ]) # Multi-head attention parameters num_heads = 2 embed_size = x.shape[1] head_dim = embed_size // num_heads # Random weights for queries, keys, and values for each head np.random.seed(42) W_q = np.random.randn(num_heads, embed_size, head_dim) W_k = np.random.randn(num_heads, embed_size, head_dim) W_v = np.random.randn(num_heads, embed_size, head_dim) attention_outputs = [] for head in range(num_heads): # Linear projections Q = x @ W_q[head] K = x @ W_k[head] V = x @ W_v[head] # Scaled dot-product attention scores = Q @ K.T / np.sqrt(head_dim) attention_weights = np.exp(scores) / np.sum(np.exp(scores), axis=-1, keepdims=True) head_output = attention_weights @ V attention_outputs.append(head_output) # Concatenate outputs from all heads multi_head_output = np.concatenate(attention_outputs, axis=-1) print("Output from head 0:\n", attention_outputs[0]) print("Output from head 1:\n", attention_outputs[1]) print("Concatenated multi-head output:\n", multi_head_output)
La atención multi-cabeza funciona aplicando el mismo mecanismo de auto-atención de forma independiente y en paralelo en varias cabezas. Cada cabeza utiliza su propio conjunto de matrices de pesos para consultas, claves y valores (W_q, W_k y W_v), proyectando la entrada en subespacios de menor dimensión. La entrada x en este ejemplo contiene tres tokens, cada uno con un tamaño de embedding de 6, y se divide en dos cabezas.
Para cada cabeza, el código repite los pasos estándar de auto-atención: calcula las matrices de consulta (Q), clave (K) y valor (V), calcula las puntuaciones de atención tomando el producto punto de Q y K.T (escalado apropiadamente), y utiliza una función softmax para obtener los pesos de atención. Estos pesos se usan para combinar los vectores de valor, produciendo la salida de cada cabeza.
No existe un mecanismo nuevo aquí, la atención multi-cabeza es simplemente el proceso de auto-atención realizado en paralelo para cada cabeza. Después de procesar todas las cabezas, sus salidas se concatenan a lo largo de la última dimensión. Este enfoque permite que el modelo capture relaciones diversas en los datos, ya que cada cabeza puede enfocarse en diferentes aspectos de la entrada. Los resultados impresos ilustran cómo ejecutar el mismo mecanismo de auto-atención varias veces y combinar los resultados proporciona una representación más rica para cada token.
¡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