Self-Attention — Mỗi token tự hỏi 'ai quan trọng với tôi?'
Hiểu bản chất Self-Attention: mỗi token trong câu tự động 'nhìn' tất cả các token khác để tìm ngữ cảnh, thay vì chỉ xử lý tuần tự như RNN.
Self-Attention là lý do tại sao ChatGPT có thể xử lý cả đoạn văn dài trong một lượt, thay vì đọc từng chữ một như con người. Đây là cơ chế cho phép mỗi từ trong câu "nhìn thẳng" vào tất cả các từ khác ngay lập tức, tự quyết định đâu là thông tin quan trọng với mình. Không còn phải chờ đợi tuần tự, không còn quên lãng sau 20 câu — đây là bước ngoặt khiến Transformer thay thế hoàn toàn kiến trúc RNN cũ.
Vấn đề
Trước Transformer, các mô hình ngôn ngữ dùng RNN (Recurrent Neural Network) hoặc LSTM — đọc câu từ trái sang phải, mang theo một "trạng thái ẩn" (hidden state) như cách con người đọc sách. Vấn đề là:
- Chậm: Không thể tính song song. Muốn biết từ thứ 10, bắt buộc phải tính xong 9 từ trước đó.
- Hay quên: Trạng thái ẩn giống như trí nhớ ngắn hạn bị nén liên tục. Sau 50 từ, thông tin từ đầu câu bị pha loãng gần như mất hẳn (vanishing gradient).
- Khó học xa: Để từ cuối câu "nhớ" tới từ đầu câu, gradient phải truyền ngược qua hàng chục bước, khiến việc huấn luyện cực kỳ khó khăn.
Cần một cách để tất cả từ trong câu "nhìn nhau" trực tiếp, bất kể khoảng cách, và làm điều đó song song.
Ý tưởng cốt lõi
Mỗi token đóng vai một người trong phòng họp đang tìm kiếm thông tin.
Hãy tưởng tượng bạn đang đọc câu: "Con mèo ngồi trên thảm vì nó mệt." Khi đến từ "nó", bạn không tự dưng biết "nó" là ai — bạn phải nhìn lại các từ trước để tìm danh từ phù hợp. Self-Attention chính là cơ chế cho phép mỗi token làm điều này một cách toán học: tự hỏi "ai trong câu này liên quan đến tôi?"
Cơ chế hoạt động gồm ba vai trò:
Query (Q) — Câu hỏi: Mỗi token tạo ra một vector câu hỏi đặc trưng: "Tôi cần tìm loại từ gì?" Với "nó", query có thể là "tìm danh từ số ít, động vật."
Key (K) — Nhãn hiệu: Mỗi token cũng tạo ra vector "nhãn hiệu" mô tả bản thân: "mèo" có key là "danh từ, động vật, số ít"; "thảm" có key là "danh từ, vật vô tri."
Value (V) — Giá trị thực: Đây là nội dung thực tế mà token mang lại. Dù "mèo" và "thảm" đều là danh từ, nhưng value của chúng khác nhau — một mang nghĩa con vật, một mang nghĩa vật dụng.
Thuật toán đơn giản như sau: Token "nó" lấy Query của mình, chấm vô hướng (dot product) với Key của tất cả token khác. Kết quả cho biết độ "tương thích": "mèo" sẽ có điểm cao, "thảm" điểm thấp, "vì" điểm gần zero. Softmax biến các điểm này thành xác suất (tổng bằng 1), rồi lấy trung bình có trọng số của các Value — chủ yếu là Value của "mèo". Kết quả: "nó" giờ đây mang thông tin của "mèo" trong representation của nó.
Đây chính là điểm "Aha": Không có ma thuật gì cả. Chỉ là ba ma trận (Q, K, V) và một phép nhân ma trận cơ bản. Mỗi token tự quyết định mình nên "copy" thông tin từ đâu, thay vì chờ kiến trúc cố định truyền thông tin cho nó.
Phá vỡ hiểu lầm: Nhiều người nghĩ Self-Attention biết vị trí từ (ví dụ từ đầu hay cuối câu). Thực ra, bản thân Self-Attention không biết gì về thứ tự — nó chỉ nhìn nội dung (content-based). Chính Positional Encoding (được thêm vào trước khi vào Attention) mới cung cấp thông tin vị trí. Nếu không có Positional Encoding, Self-Attention sẽ nhìn câu "mèo con chó" và "chó con mèo" như nhau hoàn toàn.
Tại sao nó hoạt động
Mặc dù ý tưởng trực quan, Self-Attention cần một vài điều chỉnh toán học tinh tế để hoạt động với mô hình lớn:
1. Scaling bằng √d (căn bậc hai của chiều) Khi bạn nhân Q và K (cả hai vector chiều d), kết quả có variance tăng theo d. Nếu d=64, giá trị dot product có thể rất lớn, khiến Softmax rơi vào vùng "bão hòa" — gradient gần như bằng zero, mô hình ngừng học. Chia cho √d giữ các giá trị ở mức ổn định, tương tự cách chuẩn hóa dữ liệu.
2. Công thức tổng quát
- : Tính độ tương đồng giữa mọi cặp token, tạo ra ma trận "attention score" kích thước (với là độ dài câu).
- Softmax: Biến score thành xác suất, đảm bảo mỗi token phân bổ tổng cộng 100% "sự chú ý" của mình cho các token khác.
- Nhân V: Trích xuất thông tin thực tế từ các token được chọn.
3. Tính song song hoàn toàn Khác RNN, tất cả các phép tính Q, K, V cho mọi token có thể thực hiện đồng thời. Dù câu dài 10 từ hay 1000 từ, thời gian tính Q, K, V chỉ phụ thuộc kích thước ma trận, không phụ thuộc tuần tự.
# PyTorch pseudo-code minh họa
import torch
import torch.nn as nn
d_model = 512 # Chiều của embedding
d_k = 64 # Chiều của Q, K, V
# Giả sử đã có embedding x (batch_size, seq_len, d_model)
x = torch.randn(1, 10, d_model) # Câu 10 từ
# Tạo Q, K, V bằng linear projection
W_q = nn.Linear(d_model, d_k)
W_k = nn.Linear(d_model, d_k)
W_v = nn.Linear(d_model, d_k)
Q = W_q(x) # (1, 10, 64)
K = W_k(x) # (1, 10, 64)
V = W_v(x) # (1, 10, 64)
# Attention scores: Q nhân K chuyển vị
scores = torch.matmul(Q, K.transpose(-2, -1)) / (d_k ** 0.5) # (1, 10, 10)
# Softmax theo chiều cuối (mỗi từ nhìn các từ khác)
attn_weights = torch.softmax(scores, dim=-1)
# Output là weighted sum của V
output = torch.matmul(attn_weights, V) # (1, 10, 64)Ý nghĩa thực tế
Self-Attention không chỉ là một lớp neural network — nó là sự thay đổi paradigms từ "xử lý tuần tự" sang "toàn cục song song".
| Đặc điểm | RNN/LSTM | Self-Attention |
|---|---|---|
| Khoảng cách | Khó nhớ xa (>50 tokens) | Nhìn trực tiếp mọi khoảng cách |
| Tốc độ training | Tuần tự, chậm | Song song, nhanh (GPU tối ưu) |
| Độ phức tạp | O(n) thời gian, O(1) bộ nhớ mỗi bước | O(n²) tính toán, O(n²) bộ nhớ |
| Nắm bắt ngữ cảnh | Yếu dần theo khoảng cách | Đồng đều mọi vị trí |
Impact thực tế:
- GPT, BERT, T5: Tất cả đều dựa trên Self-Attention. Không có nó, không có ChatGPT hay Claude.
- Dịch máy: Cụm từ "bank" trong "river bank" vs "bank account" được phân biệt nhờ Self-Attention nhìn ngữ cảnh xung quanh.
- Vision Transformer (ViT): Self-Attention được áp dụng lên ảnh, cho phép mô hình nhìn "từng mảnh" ảnh như từng token.
Giới hạn: Complexity O(n²) là vấn đề với context dài. Với câu 100K tokens, ma trận attention có 10 tỷ phần tử — không vừa GPU. Đây là lý do các kỹ thuật như Flash Attention và KV Cache ra đời để tối ưu (xem Level 1).
Đào sâu hơn
Paper gốc: "Attention Is All You Need" (Vaswani et al., 2017) — Giới thiệu Transformer và Self-Attention, vẫn là paper đọc nhiều nhất trong lịch sử NLP.
Bài viết liên quan TroiSinh:
Cùng cụm (sequence-modeling):
- Word2Vec & GloVe — Làm sao từ ngữ trở thành vector trước khi vào Attention
- Multi-Head Attention — Chạy nhiều Self-Attention song song để bắt nhiều loại mối quan hệ khác nhau
- Transformer Architecture — Xem Self-Attention ngồi trong kiến trúc tổng thể như thế nào
- Positional Encoding — Bổ sung "địa chỉ" cho Self-Attention vì bản thân nó không biết vị trí
Đọc tiếp (Level 1 — Efficiency):
- Flash Attention — Giải quyết vấn đề O(n²) memory của Self-Attention bằng cách tính toán trên SRAM thay vì HBM
- KV Cache — Tối ưu inference bằng cách không tính lại K, V của các token cũ
Transformer — Bỏ hết recurrence, chỉ giữ Attention
Từ RNN tuần tự chậm chạp đến kiến trúc song song nhờ Attention mechanism. Hiểu vì sao GPT, Claude và mọi LLM hiện đại đều dựa trên Transformer.
Multi-Head Attention — Nhìn cùng lúc nhiều góc khác nhau
Thay vì một góc nhìn, Multi-Head Attention chia không gian embedding thành nhiều subspace song song, giúp model bắt pattern từ ngữ nghĩa đến cú pháp chỉ trong một lớp duy nhất.