Реалізація трансформеру
Розглядаємо найпопулярнішу та найпотужнішу архітектуру, на якій побудовані усі сучасні Large Language Models. Розберемо їх перевагу перед RNN та недоліки. Напишемо трансформер з нуля на чистому PyTorch.
Код і результати
Опублікована версія після Merge. Результати збережені автором; код на цій сторінці не запускається.
implementation.py · v2
import numpy as np
class MultiHeadAttention:
def __init__(self, d_model, num_heads):
if d_model <= 0 or num_heads <= 0 or d_model % num_heads:
raise ValueError("d_model must be divisible by num_heads")
self.d_model = d_model
self.num_heads = num_heads
self.W_q = np.eye(d_model)
self.W_k = np.eye(d_model)
self.W_v = np.eye(d_model)
self.W_o = np.eye(d_model)
def forward(self, q, k, v, mask=None):
"""q: [B,N,D], k/v: [B,M,D] -> [B,N,D].
mask: [N,M], True allows attention; None allows all positions.
W_q, W_k, W_v, W_o: [D,D], used as x @ W.
"""
# Project Q/K/V, split heads, apply scaled attention,
# concatenate heads and apply W_o.
return q @ k.T + v
Рев’ю спільноти
Окремі рев’ю для цієї версії не збережено.
