Transformer: Multi-Head Attention, LayerNorm, mã hóa vị trí

Bài 7/730 phút

Transformer (2017) là kiến trúc của GPT, BERT, LLaMA… Một khối Transformer (kiểu GPT, pre-norm) gồm hai bước, mỗi bước có đường tắt residual:

khoi_transformer.py
x = x + multi_head_attention(layer_norm(x))   # trộn thông tin giữa các token
x = x + feed_forward(layer_norm(x))           # xử lý từng token (MLP 2 lớp, GELU)

Xếp chồng vài chục khối như vậy, cuối cùng nhân với ma trận từ vựng để ra logits cho token tiếp theo.

Multi-head attention: chia d_model thành h "đầu", mỗi đầu chạy attention riêng trên d_model/h chiều — đầu này học quan hệ ngữ pháp, đầu kia học quan hệ ngữ nghĩa… rồi ghép lại và nhân Wo. Kỹ thuật chính là reshape + transpose: (T, d_model) → (T, h, d_h) → (h, T, d_h).

multi_head.py
def split_heads(M, h):                 # (T, d_model) → (h, T, d_h)
    T, dm = M.shape
    return M.reshape(T, h, dm // h).transpose(1, 0, 2)

Q, K, V = (split_heads(X @ W, h) for W in (Wq, Wk, Wv))
heads = softmax(Q @ K.transpose(0, 2, 1) / np.sqrt(dm // h)) @ V   # (h, T, d_h)
out = heads.transpose(1, 0, 2).reshape(T, dm) @ Wo                    # ghép đầu

Hai thành phần còn lại:

  • Residual (x + …): giữ đường đi thẳng cho gradient — giúp huấn luyện mạng rất sâu
  • LayerNorm: chuẩn hóa mỗi token theo chiều đặc trưng (khác BatchNorm chuẩn hóa theo lô)
  • Mã hóa vị trí: attention không biết thứ tự, nên cộng thêm vector vị trí (hình sin, hoặc học được) vào embedding

?d_model = 512, 8 đầu. Mỗi đầu làm việc với vector bao nhiêu chiều?