Cơ chế chú ý trong Transformer là một phép trung bình có trọng số: mỗi token tạo ra một vector truy vấn, so truy vấn đó với vector khoá của mọi token bằng tích vô hướng, đưa các điểm số qua softmax để thành trọng số có tổng bằng 1, rồi lấy tổng các vector giá trị theo những trọng số ấy. Công thức gói gọn là softmax(Q·Kᵀ chia căn d)·V, trong đó Q, K, V là ma trận truy vấn, khoá, giá trị và d là số chiều của khoá.
Kiến trúc Transformer được giới thiệu trong bài báo “Attention Is All You Need” của Vaswani và cộng sự năm 2017, và là nền của hầu hết mô hình ngôn ngữ lớn hiện nay. Bài này tính tay cơ chế chú ý với một truy vấn và ba token, giải thích vì sao phải chia căn d, vai trò của nhiều đầu chú ý và mặt nạ nhân quả, và vì sao chi phí tăng theo bình phương độ dài văn bản.
Cơ chế chú ý giải quyết vấn đề gì
Trước Transformer, mô hình ngôn ngữ phổ biến là mạng hồi quy, đọc văn bản lần lượt từng token và nén mọi thứ đã đọc vào một vector trạng thái. Hai hạn chế lớn: thông tin từ đầu câu dài phải đi qua rất nhiều bước mới tới cuối nên dễ phai, và việc đọc tuần tự khó tận dụng sức tính song song của phần cứng.
Cơ chế chú ý cho phép mỗi vị trí nhìn thẳng vào mọi vị trí khác trong một bước, tự quyết định nên lấy bao nhiêu thông tin từ mỗi nơi. Trong câu “Con mèo trèo lên bàn vì nó đói”, khi xử lý từ “nó”, mô hình có thể đặt trọng số lớn vào “con mèo” mà không cần thông tin đó đi qua từng từ ở giữa. Ý tưởng chú ý đã được dùng cho dịch máy từ năm 2014 trong công trình của Bahdanau và cộng sự, kèm theo mạng hồi quy; Transformer bỏ hẳn phần hồi quy, chỉ giữ chú ý và các lớp nối đầy đủ.
Vì mọi cặp vị trí được tính độc lập, toàn bộ phép tính quy về vài phép nhân ma trận lớn, chạy song song rất tốt. Đây là một lý do quan trọng giúp mô hình có thể huấn luyện trên lượng văn bản khổng lồ.
Truy vấn, khoá, giá trị: phép ẩn dụ tra cứu
Ba vector này mượn ý từ việc tra cứu trong cơ sở dữ liệu. Truy vấn là câu hỏi “mình đang tìm gì”. Khoá là nhãn dán trên mỗi mục “mình chứa gì”. Giá trị là nội dung thật của mục đó. Tra cứu thông thường tìm một khoá khớp chính xác rồi trả về giá trị của nó. Cơ chế chú ý làm phiên bản mềm: so truy vấn với mọi khoá, khoá nào khớp nhiều thì giá trị của nó được lấy nhiều.
Cả ba vector đều được tạo từ cùng một biểu diễn đầu vào. Nếu X là ma trận mà mỗi hàng là vector của một token, thì Q = X·Wq, K = X·Wk, V = X·Wv, với Wq, Wk, Wv là ba ma trận trọng số học được. Nhờ ba ma trận khác nhau, một token có thể “hỏi” một kiểu, “tự giới thiệu” một kiểu, và “đóng góp nội dung” một kiểu khác.
Độ khớp giữa truy vấn và khoá được đo bằng tích vô hướng, đúng phép toán dùng để đo độ giống nhau của vector nhúng. Hai vector cùng hướng cho tích vô hướng lớn, vuông góc cho 0, ngược hướng cho số âm. Đó là toàn bộ “sự chú ý”: không có gì giống sự chú ý của con người ngoài cái tên.
Tính tay với một truy vấn và ba token
Ví dụ giả định, mọi vector hai chiều nên d = 2. Truy vấn q = (1; 0). Ba token có khoá k1 = (1; 0), k2 = (0; 1), k3 = (1; 1) và giá trị v1 = (10; 0), v2 = (0; 10), v3 = (5; 5).
- Tích vô hướng q với từng khoá: q·k1 = 1, q·k2 = 0, q·k3 = 1.
- Chia cho căn d = căn 2, xấp xỉ 1,414: được khoảng 0,707; 0; 0,707.
- Tính e mũ: e mũ 0,707 xấp xỉ 2,028; e⁰ = 1; e mũ 0,707 xấp xỉ 2,028. Tổng xấp xỉ 5,056.
- Softmax: trọng số chú ý xấp xỉ 0,401 cho token 1, 0,198 cho token 2, 0,401 cho token 3. Tổng bằng 1.
- Lấy tổng có trọng số các giá trị: 0,401·(10; 0) + 0,198·(0; 10) + 0,401·(5; 5) = (4,01 + 2,005; 1,98 + 2,005), xấp xỉ (6,02; 3,98).
- Đầu ra cho vị trí này là vector xấp xỉ (6,02; 3,98). Nó nghiêng về phía v1 và v3 vì hai token đó có khoá khớp với truy vấn, nhưng vẫn mang một phần v2.
Trong mô hình thật, phép tính được làm cho mọi vị trí cùng lúc: Q·Kᵀ cho ra một ma trận điểm số kích thước n × n với n là số token, softmax áp lên từng hàng, rồi nhân với V. Mỗi hàng của kết quả là đầu ra chú ý của một token.
Vì sao phải chia cho căn của d
Nếu các thành phần của truy vấn và khoá là những số ngẫu nhiên độc lập có trung bình 0 và phương sai 1, thì tích vô hướng của chúng có phương sai bằng d. Với d = 64, độ lệch chuẩn của điểm số là căn 64 = 8. Điểm số chênh nhau vài chục đơn vị là chuyện thường.
Khi đưa những điểm số lớn như vậy qua softmax, phân phối trở nên cực nhọn: gần như toàn bộ trọng số dồn vào một token, các token khác nhận gần 0. Đây đúng là hiệu ứng nhiệt độ thấp đã gặp ở bài về softmax. Hệ quả là gradient qua softmax ở vùng bão hoà rất nhỏ, mô hình học chậm và khó học cách phân bổ chú ý mềm.
Chia cho căn d đưa phương sai của điểm số về khoảng 1, bất kể số chiều, giữ softmax ở vùng có gradient tốt. Đây là lý do cơ chế này được gọi đầy đủ là chú ý tích vô hướng có co giãn. Một chi tiết nhỏ trong công thức nhưng là ví dụ rất rõ về việc hiểu phương sai giúp thiết kế mô hình ổn định.
Nhiều đầu chú ý, mặt nạ nhân quả và vị trí
Nhiều đầu chú ý. Thay vì một bộ Q, K, V, mô hình dùng nhiều bộ song song với số chiều nhỏ hơn, mỗi bộ gọi là một đầu. Mỗi đầu có thể học một kiểu quan hệ khác nhau. Đầu ra của các đầu được nối lại và nhân với một ma trận nữa để trộn thông tin.
Mặt nạ nhân quả. Khi sinh văn bản, một token không được nhìn các token phía sau nó, vì lúc dùng thật chúng chưa tồn tại. Cách làm là gán điểm số âm vô cùng cho mọi vị trí phía sau trước khi qua softmax. Vì e mũ âm vô cùng bằng 0, các vị trí đó nhận trọng số đúng bằng 0.
Thông tin vị trí. Phép trung bình có trọng số không quan tâm thứ tự: xáo trộn các token thì mỗi token vẫn nhận cùng một đầu ra, chỉ đổi chỗ. Vì vậy mô hình phải được cho biết vị trí, bằng cách cộng vector vị trí vào đầu vào hoặc xoay các vector truy vấn và khoá theo vị trí. Thiếu bước này, với chú ý không dùng mặt nạ, “chó cắn mèo” và “mèo cắn chó” chỉ là cùng một tập token xếp khác chỗ, mô hình không phân biệt được ai cắn ai.
Chú ý chỉ là một nửa của mỗi khối. Mỗi khối Transformer còn có một mạng nối đầy đủ áp riêng cho từng vị trí, cùng kết nối tắt và chuẩn hoá lớp. Phần lớn tham số của mô hình thường nằm ở các lớp nối đầy đủ này, không phải ở phần chú ý.
Chi phí tăng theo bình phương độ dài
Ma trận điểm số có n × n phần tử, nên chi phí tính và bộ nhớ cho phần chú ý tăng theo bình phương số token. Bảng dưới đếm số điểm số cho một đầu chú ý trong một lớp:
| Số token n | Số điểm số n × n | So với n = 1.000 |
|---|---|---|
| 1.000 | 1 triệu | 1 lần |
| 10.000 | 100 triệu | 100 lần |
| 100.000 | 10 tỷ | 10.000 lần |
Độ dài tăng mười lần, số điểm số tăng một trăm lần. Đây là lý do việc kéo dài ngữ cảnh của mô hình ngôn ngữ là bài toán kỹ thuật khó, và có cả một dòng nghiên cứu về các biến thể chú ý tiết kiệm hơn: chú ý theo cửa sổ cục bộ, chú ý thưa, hoặc tổ chức lại phép tính để không phải lưu toàn bộ ma trận n × n trong bộ nhớ chậm.
Với người dùng, điều này giải thích vì sao dán một tài liệu rất dài vào chatbot thường chậm hơn và tốn hơn, và vì sao có giới hạn độ dài ngữ cảnh. Nó cũng nhắc rằng ngữ cảnh dài không đảm bảo mô hình sử dụng tốt mọi phần của ngữ cảnh; nên hỏi cụ thể và trích phần liên quan khi có thể. Với tài liệu nội bộ, che thông tin nhạy cảm trước khi dán, dù dài hay ngắn.
Đọc bản đồ chú ý cho đúng
Trọng số chú ý dễ vẽ thành hình. Ma trận trọng số có thể vẽ thành bản đồ nhiệt, ô đậm là cặp token chú ý nhiều vào nhau. Hình như vậy rất hấp dẫn để “giải thích” mô hình.
Nhưng chưa chắc là lời giải thích. Một số nghiên cứu, ví dụ của Jain và Wallace năm 2019, chỉ ra rằng có thể đổi phân bố chú ý khá nhiều mà dự đoán không đổi, nên trọng số chú ý không nhất thiết phản ánh lý do mô hình đưa ra kết quả. Tranh luận về điểm này vẫn tiếp diễn.
Thông tin còn đi qua nhiều đường khác. Mô hình có hàng chục lớp, mỗi lớp nhiều đầu, thêm kết nối tắt và lớp nối đầy đủ. Nhìn một đầu ở một lớp chỉ thấy một mảnh rất nhỏ.
Dùng như gợi ý, không như bằng chứng. Bản đồ chú ý hữu ích để đặt giả thuyết và gỡ lỗi. Muốn kết luận một phần đầu vào quan trọng, cần thí nghiệm can thiệp, ví dụ che phần đó đi rồi xem đầu ra thay đổi ra sao.
Câu hỏi thường gặp
Self-attention khác attention thường thế nào?
Trong tự chú ý, truy vấn, khoá và giá trị đều lấy từ cùng một chuỗi, nên các token trong một câu chú ý lẫn nhau. Trong chú ý chéo, truy vấn lấy từ chuỗi này còn khoá và giá trị lấy từ chuỗi khác, ví dụ phần sinh bản dịch chú ý vào câu gốc. Công thức tính toán giống hệt nhau.
Vì sao Transformer cần nhiều lớp chú ý chồng lên nhau?
Mỗi lớp chỉ trộn thông tin một bước. Xếp chồng nhiều lớp cho phép thông tin được kết hợp nhiều tầng: lớp đầu có thể ghép các mảnh của một từ, lớp sau ghép cụm từ, lớp sau nữa nối các ý xa nhau. Đây là mô tả trực giác; vai trò thật của từng lớp vẫn đang được nghiên cứu.
Số chiều d thường là bao nhiêu?
Trong bài báo gốc năm 2017, mô hình cơ bản có vector 512 chiều chia cho tám đầu, mỗi đầu 64 chiều. Các mô hình lớn hiện nay dùng vector lớn hơn nhiều và số đầu nhiều hơn, nhưng số chiều mỗi đầu thường vẫn ở khoảng vài chục đến hơn một trăm.
Mặt nạ nhân quả có dùng khi huấn luyện không?
Có, và chính nó cho phép huấn luyện song song hiệu quả. Với một câu, mô hình dự đoán đồng thời token tiếp theo ở mọi vị trí trong một lượt chạy, mặt nạ bảo đảm mỗi vị trí chỉ thấy phần phía trước, đúng như lúc sinh văn bản thật.
Cần học gì trước khi đọc bài báo về Transformer?
Cần chắc phép nhân ma trận và kích thước ma trận, tích vô hướng, softmax, chuẩn hoá, và lan truyền ngược ở mức khái niệm. Khi đọc, tự ghi kích thước của Q, K, V và mọi ma trận trung gian ra giấy là cách nhanh nhất để không bị lạc trong ký hiệu.