TL;DR

Prof. Tom Yeh (byhand.ai) vừa tung workbook so sánh self-attentioncross-attention cạnh nhau, cho phép bạn tự kéo từng matrix. Phát hiện cốt lõi: hai cơ chế này dùng cùng một công thức — chỉ khác duy nhất nguồn của K và V. Self-attention rút Q, K, V hết từ X. Cross-attention lấy Q từ X nhưng K và V từ một sequence E khác. Score matrix của self là vuông 128 × 128, của cross là chữ nhật 64 × 128. Hết chuyện.

Điểm mới: side-by-side workbook

Trước giờ self-attention và cross-attention thường được dạy như hai sơ đồ tách biệt — một sơ đồ trong encoder block, một sơ đồ trong decoder cross block. Workbook mới của Tom Yeh đặt cả hai trong cùng một grid Excel: cùng input X (36 × 128), cùng dimension chia sẻ (16) cho Q và K, cùng V dim (12). Bạn thấy tận mắt: code path giống hệt — projections → Kᵀ × Q → scale → softmax → V × A. Chỉ ô "K and V come from..." là khác.

Tom còn dùng vài thủ thuật toán tay để workbook chạy được không cần máy tính: thay /√3 bằng floor(/2), thay e^x bằng 3^x. Vẫn giữ đúng cơ chế — variance bóp lại, exp đơn điệu — nên softmax vẫn cộng = 1 mỗi cột.

Vì sao đáng quan tâm

"Self vs cross" là một trong những điểm dễ nhầm nhất khi đọc code transformer. Nhiều dev nhìn attn = softmax(Q @ K.T / sqrt(d)) @ V rồi đoán mò xem K thực sự đến từ đâu. Bằng cách thấy cả hai cơ chế song song, bạn đụng vào trực giác cốt lõi: cross-attention chỉ là self-attention với input source khác cho K và V. Đó cũng là lý do Stable Diffusion có thể condition image generation trên text dài bao nhiêu cũng được — cross-attention không yêu cầu số token query bằng số token key.

Những con số trong workbook

PropertySelf-AttentionCross-Attention
Q sourceX (36 × 128)X (36 × 128)
K, V sourceXE (sequence khác)
Q & K shared dim (dk)1616
Score matrix S = Kᵀ × Qvuông 128 × 128chữ nhật 64 × 128
V dim (dv)1212
Output formulaF = V × AF = V × A

Ba điều quan trọng: (1) dk phải bằng nhau giữa Q và K thì dot product Kᵀ × Q mới valid — đây là constraint duy nhất giữa hai mechanism. (2) dv hoàn toàn tự do, không phụ thuộc dk, không phụ thuộc self hay cross — chọn theo dimension mà layer kế tiếp cần. (3) số token của E không cần bằng X; chỉ embedding dim phải khớp ở 16 sau khi project.

Công thức tổng quát: Attention(Q, K, V) = softmax(QKᵀ / √dk) · V với Q ∈ ℝ^(m×dk), K ∈ ℝ^(n×dk), V ∈ ℝ^(n×dv). Self-attention buộc m = n. Cross-attention cho phép m ≠ n. Toàn bộ khác biệt nằm ở một dấu "=" bị gỡ bỏ.

Đặt cạnh nhau: 7 bước, khác đúng bước 1

Pipeline cả hai mechanism:

  1. Project input thành Q, K, V qua W_Q, W_K, W_V
  2. Tính S = Kᵀ × Q (matching scores)
  3. Scale S bằng cách chia √dk
  4. Lấy e^x cho từng cell (Tom xấp xỉ bằng 3^x)
  5. Sum theo cột
  6. Chia mỗi cell cho column sum → A (probability distribution)
  7. F = V × A

Self và cross khác nhau duy nhất ở bước 1: nguồn của K và V. Mọi bước còn lại bit-by-bit giống nhau. Đó là lý do Sebastian Raschka tóm gọn: "set x1 = x2 và cross-attention biến thành self-attention."

Cross-attention sống ở đâu trong các model thực tế

  • Translation seq2seq: decoder Q × encoder K, V — pattern gốc trong "Attention Is All You Need".
  • Stable Diffusion / Latent Diffusion: image latents trong U-Net làm Q, text embeddings làm K, V. Vì cross cho phép m ≠ n nên prompt 5 từ hay 50 từ đều cắm thẳng vào được — không cần pad text về fixed length của image.
  • Vision-language models: cross-attention là cây cầu giữa image patches và text tokens.
  • AlphaFold, Whisper, Perceiver IO: cross-attention dùng làm modality bridge khi hai dòng dữ liệu cần fuse mà chiều dài khác nhau.

Self-attention trong khi đó là backbone của GPT, BERT, T5, ViT — bất cứ chỗ nào cần intra-sequence dependency. Encoder dùng all-to-all self-attention; decoder dùng causally-masked self-attention (set w_ij = 0 khi i < j) để không nhìn lén tương lai trong autoregressive generation.

Hạn chế & chi phí

Workbook interactive ở byhand.ai/aMisxP là gated content — Tom có 62,000+ subscriber trên Substack, một phần workbook nâng cao thuộc tier trả phí. Bài blog free Self Attention by HandFull-Stack Transformer đã đủ để nắm cơ chế.

Pedagogical caveats cần lưu ý:

  • Xấp xỉ floor(/2) thay /√33^x thay e^x sai số khá lớn — tốt cho intuition, không dùng để verify output của model thật.
  • Workbook là single-head, 4-token, dk nhỏ — production (BERT 12 head × 64 dim/head × 12 layer) lớn hơn vài bậc magnitude.
  • Không cover multi-head, KV cache, FlashAttention, RoPE — từng cơ chế cần exercise riêng.

Tiếp theo nên học gì

Khi đã ngấm self vs cross, ba topic kế tiếp đáng chui vào:

  1. Multi-head attention: chạy nhiều bản (Q, K, V) song song với projection nhỏ hơn rồi concat output. Cùng một workbook, lặp 8 lần với weight matrix khác.
  2. Causal masking: trick zero-out tam giác trên của score matrix — biến self-attention thành autoregressive-friendly trong decoder.
  3. Cross-attention trong Stable Diffusion: đọc U-Net code và thấy chính xác chỗ q = image_proj(x), k = text_proj(prompt_emb), v = text_proj(prompt_emb). Một dòng code, cả ngành text-to-image dựa vào.

Một mechanism, hai mặt đồng xu. Nắm được khác biệt duy nhất giữa self và cross, transformer architecture đột nhiên dễ đọc hơn rất nhiều.

Nguồn: Prof. Tom Yeh trên X, Self Attention by Hand, Sebastian Raschka — Self-Attention from Scratch, Wikipedia — Attention.