Як реалізувати багатоголову увагу
Свайпніть щоб показати меню
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)
Мультиголовна увага працює шляхом незалежного застосування однакового механізму самоуваги паралельно для декількох голів. Кожна голова використовує власні матриці ваг для запитів, ключів і значень (W_q, W_k та W_v), проектуючи вхід у нижчі підпростори. Вхідний масив x у цьому прикладі містить три токени з розмірністю вектору ознак 6 і розбивається на дві голови.
Для кожної голови код повторює стандартні кроки самоуваги: обчислює матриці запитів (Q), ключів (K) і значень (V), розраховує оцінки уваги шляхом добутку Q на K.T (з відповідним масштабуванням) і використовує softmax-функцію для отримання ваг уваги. Ці ваги використовуються для комбінування векторів значень, формуючи вихід кожної голови.
Жодного нового механізму тут немає — мультиголовна увага є просто паралельним виконанням процесу самоуваги для кожної голови. Після обробки всіх голів їхні виходи конкатенуються по останньому виміру. Такий підхід дозволяє моделі захоплювати різноманітні взаємозв'язки у даних, оскільки кожна голова може фокусуватися на різних аспектах вхідної інформації. Надруковані результати ілюструють, як багаторазове виконання одного й того ж механізму самоуваги та об'єднання результатів забезпечує багатше представлення для кожного токена.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат