Query/Key/Value: attention là phép tra cứu mềm có trọng số
Attention để mỗi token tự hỏi các token khác qua query, key, value — lấy thông tin liên quan nhất, không cần đi qua nút cổ chai hidden state tuần tự.
TL;DR: Attention là phép tra cứu MỀM có trọng số: mỗi token phát ra một câu hỏi (query), mọi token khác mang một nhãn chào hàng (key) và một nội dung thực (value). Độ khớp query–key, qua softmax, biến thành phần trăm chú ý cộng đúng 100%. Token nhận lại là tổng có trọng số của value mọi token khác — khớp nhiều đóng góp nhiều, không ai bị loại hẳn. Vì phép này chạy song song cho mọi token, nó thay được nút cổ chai hidden state tuần tự của mô hình đọc trước đó.
Ở bài trước, bạn đã thấy nỗi đau của mô hình đọc tuần tự: thông tin từ token đầu câu phải đi qua một hidden state duy nhất, bị pha loãng dần trước khi tới token cuối câu. Nhiều tài liệu chỉ tóm gọn "attention giúp model tập trung vào phần quan trọng" mà bỏ qua chính phép toán làm nên chuyện đó.
Bài này giải thích cơ chế của một head attention — vai trò của query, key, value và cách chúng biến độ khớp thành trọng số.
Neural network học cách nén dữ liệu thô thành vector số nội bộ mang "nghĩa" — lớp sau xây trên representation của lớp trước. Query, key, value trong bài này không phải ba nguồn dữ liệu tách biệt: cả ba đều được suy ra từ chính vector representation đó của một token, chỉ khác nhau ở phép biến đổi áp lên nó.
1. Analogy — hỏi cả phòng thay vì hỏi một người
Bạn cần một thông tin gấp. Thay vì đi hỏi từng người trong phòng và dừng lại ở người đầu tiên trả lời được (tra cứu cứng), bạn đứng giữa phòng và đặt câu hỏi cho tất cả mọi người cùng lúc. Mỗi người đeo một tấm bảng tên ghi chuyên môn của họ. Ai có chuyên môn khớp câu hỏi thì bạn nghe kỹ hơn; ai không liên quan thì bạn vẫn nghe loáng thoáng, chỉ là rất ít. Câu trả lời cuối cùng bạn ghi nhận là tổng hợp có trọng số của mọi ý kiến — nghiêng hẳn về người chuyên môn đúng, nhưng không ai bị bịt miệng hoàn toàn.
| Đời thường | Attention |
|---|---|
| Câu hỏi bạn đặt ra cho cả phòng | Query của token đang xét |
| Tấm bảng tên ghi chuyên môn mỗi người | Key của từng token trong câu |
| Độ khớp giữa câu hỏi và chuyên môn quyết định bạn nghe ai nhiều | Độ khớp query–key quyết định trọng số attention |
| Nội dung ý kiến người đó thực sự nói ra | Value của token đó |
| Bạn tổng hợp mọi ý kiến theo tỉ lệ đã nghe | Weighted sum của value theo trọng số attention |
Query là câu hỏi bạn phát ra. Key là nhãn để so khớp câu hỏi. Value là thứ thực sự được mang về. Ba vai trò khác nhau, nhưng đều là chính token đó "mặc" ba bộ trang phục khác nhau cho ba việc khác nhau.
2. Query, key, value là gì
Vaswani và cộng sự (Deep Dive bên dưới) mô tả attention như một hàm ánh xạ một query cùng một tập key-value thành output — tổng có trọng số của các value, trọng số tính từ độ tương thích query–key.
Mỗi token (đã ở dạng vector representation — xem lại recall trên) tạo ra ba vector riêng bằng ba phép biến đổi tuyến tính học được, cùng xuất phát từ một vector gốc:
- Query (q): "tôi đang cần thông tin kiểu gì?" — câu hỏi token này phát ra.
- Key (k): "tôi trả lời được cho câu hỏi kiểu gì?" — nhãn chào hàng với mọi query khác.
- Value (v): "nếu bạn chọn nghe tôi, đây là nội dung tôi mang theo".
Khác tra cứu từ điển (gõ đúng một khoá, nhận đúng một giá trị, khoá khác coi như không tồn tại), attention không loại ai cả — mọi key được so khớp, mọi value đóng góp, chỉ khác tỉ lệ. Đây là lý do gọi nó là tra cứu mềm.
3. Cơ chế bên dưới: từ độ khớp đến trọng số
Ba bước biến "độ khớp" thành "trọng số" diễn ra cho mỗi token trong câu, với mọi token khác làm ứng viên:
- Tính độ khớp (score): so
querycủa token đang xét vớikeycủa từng token khác bằng phép nhân vô hướng (dot product) — hai vector càng "cùng hướng" thì dot product càng lớn, nghĩa là câu hỏi và nhãn chào hàng càng ăn khớp. Bạn chưa cần biết công thức đại số đầy đủ của dot product để hiểu ý này: nó chỉ là một con số đo mức khớp, càng lớn càng khớp. - Chuẩn hoá thành phần trăm (softmax): một danh sách điểm khớp thô được đưa qua hàm softmax để biến thành các trọng số dương, cộng lại đúng 100%. Token có điểm khớp cao hơn nhận phần trăm chú ý lớn hơn, token khớp kém vẫn nhận một phần nhỏ khác 0 — không ai bị loại tuyệt đối.
- Lấy tổng có trọng số (weighted sum): nhân từng trọng số với
valuetương ứng rồi cộng lại. Kết quả là vector output mới cho token đang xét — pha trộn thông tin từ mọi token khác, theo đúng tỉ lệ đã tính ở bước 2.
Viết lại ba bước đó dưới dạng pseudocode (không chạy, chỉ để đọc-hiểu cơ chế):
for each token i:
q_i <- query cua token i
for each token j:
score[i][j] <- q_i . k_j -- do khop giua query cua i va key cua j
weight[i] <- softmax(score[i]) -- chia thanh %, tong cac weight[i][j] = 1
out_i <- sum_j weight[i][j] * v_j -- tong co trong so cua moi value trong cau
// Time: O(n^2 * d) Space: O(n^2)
n là số token trong câu, d là số chiều của mỗi vector. Vì mỗi token phải so khớp với mọi token khác, chi phí tăng theo bình phương độ dài câu — cái giá phải trả để đổi lấy việc không cần đọc tuần tự (bài mini-challenge cuối module sẽ chạm lại đánh đổi này ở quy mô lớn).

Sơ đồ trên chỉ minh hoạ 3 trong số nhiều token của câu (mục 4 dùng đúng ví dụ này). Output cuối cùng của "nó" không phải value gốc của chính nó, mà là một pha trộn nghiêng hẳn về token khớp nhất. Vì phép so khớp của mọi cặp token độc lập nhau, toàn bộ mục 1–3 tính song song được cho mọi token cùng lúc — token cuối câu "thấy" token đầu câu ngay trong một bước, không cần trạm trung chuyển hidden state nào ở giữa.
4. Vì sao đại từ "nó" đổi nghĩa chỉ vì một tính từ?
Xét hai câu tiếng Việt chỉ khác nhau một chữ:
- (a) "Chiếc cúp không vừa cái vali vì nó quá to." → "nó" chỉ chiếc cúp.
- (b) "Chiếc cúp không vừa cái vali vì nó quá nhỏ." → "nó" chỉ cái vali.
"Nó" đứng cùng một vị trí ở cả hai câu nhưng trỏ tới hai danh từ khác nhau — một quy tắc vị trí cố định (luôn trỏ danh từ gần nhất) sẽ sai ở một trong hai câu. Vì query/key của mỗi token được suy ra từ representation mang cả ngữ cảnh xung quanh (không chỉ bản thân từ đó), độ khớp giữa query của "nó" và key của "cúp"/"vali" đổi theo đúng tính từ "to" hay "nhỏ". Sau softmax, token đúng nhận phần trăm chú ý cao hơn — đúng sơ đồ ở mục 3, chỉ là ở câu (b) tỉ lệ 70%/25%/5% đảo sang nghiêng về "vali".
Trọng số attention không cố định theo vị trí, mà tính lại theo nội dung từng câu — hệ quả trực tiếp của việc query/key phụ thuộc representation đã có ngữ cảnh.
5. Pitfall tổng hợp
❌ Nhầm 1 — tưởng attention chọn cứng một token, giống lookup từ điển:
✅ Softmax luôn cho mọi token một trọng số khác 0. Không có bước if/else chọn một token, chỉ có phép nhân-cộng trên toàn bộ tập value.
❌ Nhầm 2 — tưởng query, key, value là ba nguồn dữ liệu độc lập:
✅ Cả ba suy ra từ cùng một vector representation của token đó, chỉ khác phép biến đổi tuyến tính áp lên nó (xem recall đầu bài).
❌ Nhầm 3 — tưởng trọng số attention cao nghĩa là model "hiểu nghĩa" như con người:
✅ Trọng số chỉ phản ánh tương quan thống kê model học được từ dữ liệu huấn luyện. Với câu hiếm gặp trong dữ liệu train, model vẫn có thể phân bổ sai dù logic con người thấy hiển nhiên.
6. 📚 Đào sâu
Nguồn gốc:
- Vaswani et al., "Attention Is All You Need", arXiv:1706.03762 (2017) — bài báo đặt nền cho kiến trúc Transformer, định nghĩa attention như một hàm ánh xạ query cùng tập key-value thành output là tổng có trọng số của value.
Ghi chú: Bài này chỉ dừng ở mức trực giác — dot product đo độ khớp, softmax chia phần trăm, weighted sum gộp value. Bài báo gốc trình bày phiên bản đầy đủ ("Scaled Dot-Product Attention") bằng ma trận và một hệ số chia tỉ lệ; bạn sẽ không cần công thức đó để hiểu cơ chế ở mức khái niệm, nhưng nó là điểm bắt đầu tốt nếu muốn đọc sâu hơn về sau.
7. Liên hệ các bài khác
- Bài 01 — Nỗi đau mô hình tuần tự — nút cổ chai hidden state mà attention ở bài này giải quyết.
- Bài 03 — Multi-head: nhiều góc nhìn — một head attention chỉ bắt được một kiểu quan hệ; chạy nhiều head song song bắt được nhiều kiểu quan hệ cùng lúc.
- Bài 04 — Transformer block — attention chỉ là một khối trong transformer block đầy đủ, đứng cạnh positional encoding và feed-forward network.
- Bài 06 module 2 — Representation học được — nguồn gốc của vector representation mà query/key/value được suy ra từ đó.
8. Tóm tắt
- Attention là phép tra cứu MỀM: lấy một phần thông tin từ mọi token, theo trọng số, không chọn cứng một token.
- Mỗi token sinh ra 3 vector vai trò — query, key, value — từ cùng một vector representation gốc.
- Độ khớp query–key qua dot product biến thành trọng số qua softmax, cộng đúng 100%, không token nào bị loại hẳn.
- Output của một token là tổng có trọng số của value mọi token khác, tính song song trong một bước.
- Vì không cần trạm trung chuyển tuần tự, attention giải quyết nút cổ chai hidden state của mô hình đọc trước đó.
- Trọng số attention tính lại theo đúng nội dung từng câu — không phải quy tắc vị trí cố định.
- Một head attention chỉ bắt được một kiểu quan hệ; bài tiếp theo mở rộng sang nhiều head song song.
9. Tự kiểm tra
Q1Vì sao attention được gọi là phép tra cứu MỀM, khác với tra cứu từ điển thông thường?▸
Q2Trong ví dụ 'chiếc cúp / cái vali', vì sao đổi tính từ 'to' thành 'nhỏ' lại đổi luôn đối tượng mà đại từ 'nó' trỏ tới?▸
Q3Query, key, value của một token đến từ đâu — chúng có phải ba nguồn dữ liệu tách biệt không?▸
Q4Vì sao attention giải quyết được nút cổ chai hidden state của mô hình đọc tuần tự ở bài trước?▸
Q5Softmax đảm bảo điều gì về tập trọng số attention của một token, và vì sao điều đó quan trọng?▸
Q6Nếu weight[i][j] gần bằng nhau cho mọi j trong pseudocode ở mục 3, điều đó nói gì về mức độ 'chú ý' của token i?▸
Bài tiếp theo: Multi-head — nhiều góc nhìn
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên