AI Core cho lập trình viên/Multi-head attention — mỗi head một góc nhìn riêng
31/54
Bài 31 / 54~11 phútTransformer & attentionMiễn phí lượt xem

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

Một head attention chỉ bắt được một kiểu quan hệ. Chạy nhiều head song song, mỗi head học một góc nhìn — ngữ pháp, đồng tham chiếu, vị trí — rồi ghép lại.

TL;DR: Một attention head chỉ học được một kiểu "khớp" giữa query và key — nghĩa là chỉ bắt được một loại quan hệ giữa các token. Transformer giải quyết giới hạn đó bằng cách chạy nhiều head song song: mỗi head có bộ trọng số chiếu Q/K/V riêng nên tự phân hoá để bắt một kiểu quan hệ khác nhau — ngữ pháp, đồng tham chiếu, vị trí lân cận. Không ai lập trình sẵn vai trò này; giống trọng số của một neuron, vai trò của mỗi head là thứ được học qua quá trình train. Kết quả các head được ghép (concat) rồi chiếu lại thành một representation giàu thông tin hơn một head đơn lẻ.

Bài đó đã chốt: một neuron chỉ tính một tổng có trọng số rồi qua hàm kích hoạt; thứ duy nhất huấn luyện thay đổi là các con số trọng số, không phải cấu trúc hàm. Bài này áp đúng nguyên lý đó lên một tầng cao hơn: bộ trọng số chiếu Q/K/V của mỗi attention head cũng chỉ là những con số được học — và chính vì được học từ dữ liệu chứ không lập trình tay, các head mới có thể tự phân hoá vai trò khác nhau.

1. Analogy — ba chuyên gia cùng nghe một cuộc họp

Hình dung ba chuyên gia — luật sư, kế toán, quản lý dự án — cùng ngồi nghe một cuộc họp. Cả ba nghe đúng một nội dung, nhưng mỗi người tự động lọc theo tiêu chí chuyên môn riêng: luật sư chú ý rủi ro pháp lý, kế toán chú ý con số tài chính, quản lý dự án chú ý deadline. Không ai bảo họ phải nghe như vậy — đó là phản xạ nghề nghiệp đã hình thành qua kinh nghiệm. Cuối buổi, ba bản ghi chú được ghép lại thành một biên bản đầy đủ hơn bất kỳ ghi chú đơn lẻ nào.

Đời thườngMulti-head attention
Ba chuyên gia cùng nghe một cuộc họpH head cùng nhận một token embedding đầu vào
Mỗi người lọc theo tiêu chí riêng — pháp lý, tài chính, deadlineMỗi head có bộ trọng số chiếu Q/K/V riêng, tự phân hoá theo một kiểu quan hệ
Ghép các ghi chú riêng thành một biên bản đầy đủGhép (concat) output các head, chiếu qua Wo thành representation cuối

2. Đoán trước — một câu, ba head giả định

Xét câu sau:

"Lan nuôi một con mèo; nó đã trốn khỏi nhà hôm qua."

Khi model xử lý token "nó", giả sử có 3 attention head chạy song song — gọi là Head A, Head B, Head C.

Thử đoán trước khi đọc tiếp

Đừng đọc mục 3 vội. Với token "nó" trong câu trên, viết ra dự đoán của bạn:

  • Bạn đoán mỗi head trong ba head A, B, C sẽ dồn trọng số attention cao nhất vào những token nào?
  • Ba head có chú ý giống nhau không — hay mỗi head nghiêng về một (hoặc vài) token khác nhau? Vì sao bạn nghĩ vậy?

Không có đáp án đúng/sai tuyệt đối ở bước đoán — mục tiêu là bạn tự hình dung được việc các head CÓ THỂ khác nhau, trước khi đọc giải thích ở mục 3.

3. Vì sao một head chỉ bắt được một kiểu khớp?

Bài 02 đã giải thích cơ chế của một head: mỗi token tính ra một query, đem so khớp với key của mọi token khác, rồi lấy trung bình có trọng số các value theo mức khớp đó. Recap đúng một câu vì bài này không dạy lại: "khớp" theo tiêu chí gì phụ thuộc vào ma trận chiếu WqWk của CHÍNH head đó — đổi ma trận chiếu là đổi luôn tiêu chí, token nào khớp mạnh với token nào cũng đổi theo.

Quay lại ví dụ ở mục 2. Với bộ ba head giả định, cách phân vai hợp lý nhất là:

  • Head A (đồng tham chiếu): khớp "nó" với "con mèo" mạnh nhất — học kiểu quan hệ đại từ trỏ về danh từ nào.
  • Head B (ngữ pháp — chủ vị): khớp theo liên kết "Lan"-"nuôi", bất kể khoảng cách trong câu — học kiểu quan hệ chủ ngữ-động từ.
  • Head C (vị trí lân cận): khớp mạnh với 1-2 token liền kề — học kiểu quan hệ định vị cục bộ, không quan tâm ý nghĩa.

Nếu dự đoán của bạn ở mục 2 gần với ba vai trò trên, đó không phải vì có luật gán trước. Ba kiểu quan hệ này — đồng tham chiếu, cú pháp, vị trí — đơn giản là những pattern rất hữu ích để dự đoán từ tiếp theo trong văn bản tự nhiên. Khi train trên khối lượng lớn văn bản, các head có xu hướng tự phân hoá về hướng khai thác những pattern đó để giảm loss — không ai viết code "Head A hãy học đồng tham chiếu".

4. Cơ chế bên dưới — chiếu riêng, chạy song song, ghép lại

Với H head chạy song song, mỗi head h có bộ trọng số chiếu riêng Wq_h, Wk_h, Wv_h — những ma trận này KHÔNG chia sẻ giữa các head. Cùng một token embedding đầu vào, mỗi head chiếu nó vào một không gian riêng, tính attention độc lập, rồi tất cả kết quả được ghép lại:

function multiHeadAttention(x, H):
    heads <- []
    for h in 1..H:
        Wq_h, Wk_h, Wv_h <- trong so rieng cua head h    -- khong chia se giua cac head
        Q_h <- x * Wq_h
        K_h <- x * Wk_h
        V_h <- x * Wv_h
        heads[h] <- attention(Q_h, K_h, V_h)              -- mot head don, xem Bai 02
    concatenated <- concat(heads[1], ..., heads[H])
    output <- concatenated * Wo                            -- chieu lai ve mot khong gian chung
    return output
// H head chay DOC LAP va SONG SONG - khong head nao cho head khac xong truoc

Cùng một vector token đi vào nhiều head song song, mỗi head có bộ chiếu Wq/Wk/Wv riêng và ngả về một kiểu quan hệ khác nhau; output các head được ghép rồi chiếu qua Wo

Số lượng head H là một hyperparameter — do người thiết kế kiến trúc chọn trước khi train, cố định trong suốt quá trình train. Đây là điểm khác biệt quan trọng với Wq_h/Wk_h/Wv_h: những ma trận đó MỚI là thứ được học và thay đổi liên tục qua từng bước train, giống hệt cách wb của một neuron thay đổi còn kiến trúc mạng thì cố định (Bài 01, Module 2).

5. Không ai gán vai trò — head tự phân hoá khi train

Đây là điểm nhiều người mới học AI hiểu nhầm: tưởng rằng ai đó thiết kế "head 3 để học ngữ pháp, head 5 để học đồng tham chiếu". Thực tế ngược lại. Giống hệt cách một neuron học wb — không ai gán tay giá trị trọng số, quá trình train tự tìm ra chúng để giảm loss — bộ trọng số Wq_h/Wk_h/Wv_h của MỖI head cũng chỉ là những con số được cập nhật qua gradient descent.

Không có cơ chế nào ép head thứ ba phải học ngữ pháp. Nhưng vì các kiểu quan hệ như cú pháp, đồng tham chiếu, vị trí là những tín hiệu rất hữu ích để dự đoán từ tiếp theo, quá trình train có xu hướng tự đẩy các head phân hoá theo hướng khai thác những tín hiệu đó — mỗi head "chuyên môn hoá" vào một góc nhìn khác nhau để cả nhóm cùng giảm loss hiệu quả hơn là H head giống hệt nhau.

Đây cũng là lý do không nên coi vai trò của một head là cố định tuyệt đối: model khác nhau, dữ liệu train khác nhau, thậm chí hai lần train cùng kiến trúc (do khởi tạo trọng số ngẫu nhiên khác nhau) có thể cho ra cách phân vai khác nhau giữa các head. Nhưng KIỂU quan hệ hữu ích — ngữ pháp, đồng tham chiếu, vị trí — vẫn có xu hướng lặp lại, vì đó là tín hiệu tốt cho cùng một bài toán dự đoán từ tiếp theo.

6. Pitfall thường gặp

Nhầm 1 — tưởng multi-head là chạy lại cùng một phép tính nhiều lần "cho chắc":

✅ Multi-head KHÔNG phải chạy lại cùng một phép tính. Mỗi head có bộ trọng số chiếu RIÊNG (Wq_h/Wk_h/Wv_h khác nhau), nên tính ra kết quả khác nhau theo thiết kế. Mục tiêu là đa dạng góc nhìn, không phải lặp lại để giảm nhiễu như ensemble voting.

Nhầm 2 — tưởng tăng số head càng nhiều thì model càng "hiểu" nhiều quan hệ hơn, luôn luôn tốt hơn:

✅ Tăng số head H trong khi giữ nguyên d_model nghĩa là mỗi head có ít chiều hơn (d_k = d_model / H). Đây là đánh đổi giữa SỐ LƯỢNG góc nhìn và ĐỘ CHI TIẾT của mỗi góc nhìn, không phải cứ tăng H là luôn tốt hơn.

Nhầm 3 — nghĩ phải biết rõ head nào học quan hệ gì mới dùng được model:

✅ Phần lớn ứng dụng thực tế không cần biết head cụ thể học quan hệ gì — thông tin đó chỉ quan trọng khi làm nghiên cứu diễn giải (interpretability). Điều cần nắm ở tầng ứng dụng là: multi-head giúp representation giàu hơn một head đơn, đó là đủ để hiểu vì sao kiến trúc này hiệu quả.

7. Đào sâu — nguồn gốc ý tưởng

📚 Đào sâu — nguồn gốc multi-head attention

Nguồn gốc: Vaswani et al., Attention Is All You Need, arXiv:1706.03762 (2017) — bài báo giới thiệu kiến trúc Transformer và cơ chế multi-head attention. Trong kiến trúc gốc, nhóm tác giả dùng H = 8 head song song, mỗi head có d_k = d_v = d_model / H = 64 (với d_model = 512) — chia không gian biểu diễn 512 chiều thành 8 phần, mỗi phần 64 chiều, để mỗi head chiếu vào một không gian nhỏ hơn nhưng chạy độc lập.

Ghi chú: Con số 8 không phải hằng số bắt buộc — các model transformer sau này (BERT, GPT, và nhiều biến thể) chọn số head khác nhau tuỳ kích thước model. Điểm cốt lõi không đổi: nhiều head chạy song song, mỗi head có bộ chiếu riêng.

8. Liên hệ các bài khác

9. Tóm tắt

  • Một attention head chỉ học được một kiểu "khớp" query-key — tức một kiểu quan hệ giữa token, không phải mọi kiểu cùng lúc.
  • Nhiều head chạy song song, mỗi head có bộ trọng số chiếu Q/K/V riêng nên có thể tự phân hoá theo góc nhìn khác nhau: ngữ pháp, đồng tham chiếu, vị trí.
  • Không ai gán vai trò cho head trước khi train — vai trò đó tự hình thành qua gradient descent, y hệt cách trọng số của một neuron được học chứ không lập trình tay.
  • Kết quả các head được ghép (concat) rồi chiếu một lần nữa qua Wo thành representation cuối cùng, giàu thông tin hơn bất kỳ head đơn lẻ nào.
  • Số lượng head H là một hyperparameter cố định trước khi train (kiến trúc gốc dùng H = 8), khác với Wq_h/Wk_h/Wv_h — đó mới là thứ được học.
  • Multi-head KHÔNG phải chạy lại cùng phép tính nhiều lần để "cho chắc" — mục tiêu là đa dạng góc nhìn, không phải giảm nhiễu bằng lặp lại.

10. Tự kiểm tra

Tự kiểm tra
Q1
Vì sao một attention head đơn lẻ không thể vừa bắt quan hệ ngữ pháp vừa bắt quan hệ đồng tham chiếu tốt như nhau? Giải thích bằng cơ chế Wq/Wk.
Một head chỉ có MỘT bộ ma trận chiếu Wq/Wk, tức chỉ có một tiêu chí duy nhất để tính mức 'khớp' giữa query và key. Muốn bắt cả quan hệ ngữ pháp lẫn đồng tham chiếu trong cùng một head, ma trận đó phải thoả hiệp giữa hai tiêu chí khác nhau, làm loãng cả hai. Nhiều head giải quyết vấn đề này bằng cách cho mỗi head một bộ Wq/Wk riêng, mỗi bộ tối ưu cho một tiêu chí khớp khác nhau.
Q2
Nếu tăng số head H từ 8 lên 16 nhưng giữ nguyên d_model = 512, chuyện gì xảy ra với d_k của mỗi head? Đây có phải lúc nào cũng tốt hơn không?
d_k = d_model / H sẽ giảm từ 64 xuống 32 — mỗi head có ít chiều hơn để biểu diễn query/key. Đây không phải lúc nào cũng tốt hơn: tăng H cho nhiều góc nhìn hơn nhưng mỗi góc nhìn chi tiết kém đi, vì không gian chiếu hẹp hơn. Đây là đánh đổi giữa số lượng head và độ chi tiết mỗi head, không phải một chiều luôn cải thiện.
Q3
Một đồng nghiệp nói: 'multi-head giống chạy cùng một model 8 lần rồi lấy trung bình, cho chắc ăn.' Nhận định này sai ở đâu?
Sai vì mỗi head KHÔNG chạy cùng một phép tính — mỗi head có bộ trọng số chiếu Wq_h/Wk_h/Wv_h riêng, nên tính ra kết quả khác nhau theo thiết kế, không phải lặp lại y hệt rồi trung bình hoá như ensemble voting. Mục tiêu của multi-head là đa dạng góc nhìn (mỗi head bắt một kiểu quan hệ khác nhau), không phải giảm nhiễu bằng cách lặp lại cùng một phép đo nhiều lần.
Q4
Vai trò 'head nào học quan hệ gì' có được lập trình sẵn trong kiến trúc transformer không? Nếu không, nó đến từ đâu?
Không. Kiến trúc chỉ định nghĩa CÓ bao nhiêu head và mỗi head tính attention như thế nào — không định nghĩa head nào phải học quan hệ gì. Vai trò của từng head là một thuộc tính EMERGENT: nó tự hình thành trong quá trình train, khi gradient descent điều chỉnh Wq_h/Wk_h/Wv_h của từng head để giảm loss. Vì một số kiểu quan hệ (ngữ pháp, đồng tham chiếu, vị trí) là tín hiệu hữu ích để dự đoán từ tiếp theo, các head có xu hướng tự phân hoá về hướng khai thác chúng.
Q5
Sau khi các head tính xong attention riêng, bước tiếp theo model làm gì với H kết quả đó? Vì sao không dùng luôn kết quả của head 'tốt nhất'?
Model ghép (concat) toàn bộ H kết quả lại thành một vector dài hơn, rồi chiếu qua một ma trận Wo để đưa về lại đúng chiều mong muốn. Không chọn head 'tốt nhất' vì mỗi head bắt một kiểu quan hệ khác nhau — chúng bổ sung thông tin cho nhau chứ không cạnh tranh nhau. Chỉ giữ một head sẽ vứt bỏ toàn bộ thông tin mà các head còn lại đóng góp, đi ngược lại chính lý do multi-head tồn tại.
Q6
Giải thích tại sao nói bộ trọng số Wq_h/Wk_h/Wv_h của một head 'giống' trọng số w của một neuron ở Bài 01 Module 2, dù công thức tính khác nhau.
Công thức tính khác nhau (một bên là tổng có trọng số qua hàm kích hoạt, một bên là phép chiếu rồi so khớp query-key), nhưng nguyên lý huấn luyện giống hệt nhau: cả w của neuron lẫn Wq_h/Wk_h/Wv_h của head đều chỉ là những con số. Cấu trúc phép tính (công thức z = wx + b, hay cách tính attention) cố định trước khi train; chỉ các con số trong đó được gradient descent cập nhật để giảm loss. Tri thức nằm trong con số học được, không nằm trong code hay công thức.

Bài tiếp theo: Transformer block — ghép các mảnh

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

Transformer block: ghép attention, FFN, residual thành khối