AI Core cho lập trình viên/Query/Key/Value: attention là phép tra cứu mềm có trọng số
30/54
Bài 30 / 54~13 phútTransformer & attentionMiễn phí lượt xem

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ườngAttention
Câu hỏi bạn đặt ra cho cả phòngQuery của token đang xét
Tấm bảng tên ghi chuyên môn mỗi ngườiKey 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 raValue của token đó
Bạn tổng hợp mọi ý kiến theo tỉ lệ đã ngheWeighted sum của value theo trọng số attention
💡 Cách nhớ

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:

  1. Tính độ khớp (score): so query của token đang xét với key củ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.
  2. 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.
  3. Lấy tổng có trọng số (weighted sum): nhân từng trọng số với value tươ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).

Token đang xét phát ra query, so khớp với key của ba token ứng viên được 70%, 25% và 5%; mỗi ứng viên mang sẵn một value, ba value cộng lại theo đúng tỉ lệ đó thành output mới

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

📚 Đào sâu (optional)

Nguồn gốc:

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

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

Tự kiểm tra
Q1
Vì 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?
Tra cứu từ điển thông thường chỉ trả về đúng một giá trị khớp với một khoá, mọi khoá khác coi như không tồn tại. Attention thì so khớp query với mọi key, rồi qua softmax gán cho mỗi key một trọng số dương — token khớp nhiều nhận trọng số cao, token khớp ít vẫn nhận một phần nhỏ khác 0. Output là tổng có trọng số của mọi value, không phải giá trị của một key duy nhất.
Q2
Trong 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?
Vì query và key của mỗi token được suy ra từ vector representation mang theo cả ngữ cảnh xung quanh, không chỉ bản thân từ đó. Khi tính từ đổi từ 'to' sang 'nhỏ', representation của các token xung quanh thay đổi, kéo theo độ khớp giữa query của 'nó' và key của 'cúp'/'vali' cũng đổi. Kết quả softmax nghiêng sang danh từ khác, dù vị trí của 'nó' trong câu không đổi — chứng minh trọng số attention không phải quy tắc vị trí cố định.
Q3
Query, 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?
Không. Cả ba đều được suy ra từ cùng một vector representation của token đó (kết quả các lớp neural net học được ở bài representation trước), chỉ khác nhau ở phép biến đổi tuyến tính riêng áp lên vector gốc. Một token không 'có sẵn' ba thứ tách biệt — nó tự sinh ra ba vai trò khác nhau để phục vụ ba việc: hỏi, chào hàng, mang thông tin.
Q4
Vì 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?
Mô hình tuần tự buộc thông tin phải đi qua một hidden state duy nhất, truyền tay từng bước — token càng xa nhau càng bị pha loãng, và các bước phải chạy nối tiếp vì bước sau phụ thuộc kết quả bước trước. Attention để mỗi token so khớp trực tiếp query của nó với key của mọi token khác trong cùng một bước, không qua trạm trung chuyển nào, nên không có chỗ để thông tin bị nén mất — và phép so khớp của mọi cặp token độc lập nhau nên tính song song được.
Q5
Softmax đả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?
Softmax biến các điểm khớp thô thành các trọng số đều dương và cộng lại đúng 100%. Điều này quan trọng vì nó đảm bảo attention luôn là một phép pha trộn hợp lệ — không có trọng số âm làm 'trừ' thông tin, và không token nào bị gán trọng số âm hoặc vượt 100%. Đây cũng là lý do gọi attention là 'mềm': mọi ứng viên đều được cân nhắc, chỉ khác tỉ lệ.
Q6
Nế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?
Trọng số gần như đồng đều nghĩa là query của token i không khớp rõ rệt với key của bất kỳ token nào — model chưa 'quyết' được nên nghiêng về ai. Output của token i khi đó gần như là trung bình cộng của mọi value trong câu, thay vì nghiêng hẳn về một vài token liên quan như ở ví dụ 'cúp/vali' (nơi một token nhận tới 70%).

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

Đặt 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

Bài tiếp theo

Multi-head attention — mỗi head một góc nhìn riêng