Trả lời nhanh: Transformer là kiến trúc mạng nơ-ron dùng cơ chế tự chú ý (self-attention) để mỗi từ “nhìn” mọi từ khác trong câu cùng lúc, thay vì đọc lần lượt như RNN. Kiến trúc này ra mắt trong bài báo “Attention Is All You Need” năm 2017 và là nền móng của BERT, GPT và hầu hết LLM hiện nay.
Điểm chính
- Bài báo gốc của 8 tác giả (phần lớn làm việc tại Google) được đăng lên arXiv ngày 12/06/2017 và trình bày tại hội nghị NIPS 2017. Mô hình bỏ hẳn phần hồi quy (recurrence), chỉ dùng attention.
- Lõi của Transformer là công thức attention: so khớp truy vấn (Query) với khoá (Key), chuẩn hoá bằng softmax, rồi cộng các giá trị (Value) theo trọng số. Bài này có ví dụ tính tay từng bước.
- Multi-head attention cho phép mô hình theo dõi nhiều kiểu quan hệ cùng lúc; mã hoá vị trí (positional encoding) bù lại việc attention không tự biết thứ tự từ.
- Ba họ mô hình: chỉ encoder (BERT), chỉ decoder (GPT và đa số LLM), encoder–decoder (T5, mô hình dịch). Chọn họ nào phụ thuộc bài toán.
- Điểm yếu lớn nhất: chi phí attention tăng theo bình phương độ dài chuỗi. FlashAttention, RoPE, Mamba là những hướng xử lý bạn sẽ hay nghe tới.
Mục lục
- Transformer là gì?
- Bài báo “Attention Is All You Need” năm 2017 nói gì?
- Vì sao Transformer thay thế RNN và LSTM?
- Self-attention hoạt động như thế nào?
- Multi-head attention là gì?
- Positional encoding: Transformer biết thứ tự từ bằng cách nào?
- Kiến trúc encoder–decoder của Transformer gồm những gì?
- Encoder-only, decoder-only và encoder–decoder khác nhau thế nào?
- Transformer được huấn luyện ra sao?
- Khi chạy, Transformer sinh văn bản như thế nào?
- Transformer chỉ dùng cho ngôn ngữ thôi sao?
- Transformer có những hạn chế gì?
- Doanh nghiệp Việt Nam cần hiểu Transformer để làm gì?
- Những hiểu lầm thường gặp về Transformer
- Câu hỏi thường gặp
Transformer là gì?
Transformer là một kiến trúc mạng nơ-ron nhân tạo (neural network architecture) dùng để xử lý dữ liệu dạng chuỗi, như câu chữ, âm thanh hay chuỗi mảnh ảnh. Điểm đặc trưng của nó là cơ chế chú ý (attention): khi xử lý một từ, mô hình tự quyết định nên dựa vào những từ nào khác trong chuỗi, và dựa nhiều hay ít.
Tên gọi “Transformer” xuất phát từ việc mô hình “biến đổi” (transform) một chuỗi đầu vào thành một chuỗi đầu ra, ví dụ biến câu tiếng Việt thành câu tiếng Anh. Trong bối cảnh AI, Transformer không liên quan tới máy biến áp trong ngành điện hay robot biến hình trong phim.
Transformer thuộc nhóm học sâu (deep learning). Nó không phải một sản phẩm hay một phần mềm cụ thể. Nó là một “bản thiết kế” mà nhiều mô hình nổi tiếng cùng dựa vào, giống như nhiều toà nhà khác nhau có thể dùng chung một kiểu kết cấu khung.
Hình dung đơn giản về Transformer
Hãy tưởng tượng bạn đọc câu: “Con mèo không ăn cá vì nó đã no.” Để hiểu “nó” là ai, bạn không đọc lại từng chữ từ đầu. Bạn liếc nhanh cả câu và thấy “nó” gắn với “con mèo”, không phải “cá”.
Transformer làm việc theo cách tương tự. Mỗi từ được phép nhìn toàn bộ câu trong một bước, rồi tự tính xem từ nào quan trọng với mình. Các mô hình đời trước như RNN phải đọc lần lượt từ trái sang phải, nên thông tin ở đầu câu dễ bị “phai” khi câu dài.
Vì sao Transformer quan trọng?
Hầu hết công cụ AI tạo sinh bạn dùng hằng ngày đều chạy trên nền Transformer hoặc biến thể của nó. Các mô hình ngôn ngữ lớn (LLM) như dòng GPT, các mô hình dịch máy, mô hình tóm tắt văn bản, nhiều mô hình nhận dạng ảnh và giọng nói đều dùng attention làm lõi. Hiểu Transformer giúp bạn hiểu vì sao các mô hình này mạnh, vì sao chúng tốn tài nguyên và vì sao chúng có giới hạn về độ dài văn bản.
Bài báo “Attention Is All You Need” năm 2017 nói gì?
Transformer được giới thiệu trong bài báo “Attention Is All You Need”. Bản đầu tiên được đăng lên kho tiền ấn phẩm arXiv ngày 12/06/2017. Bài được trình bày tại Hội nghị lần thứ 31 về Hệ thống xử lý thông tin thần kinh (NIPS 2017) tại Long Beach, bang California, Mỹ. Tám tác giả gồm Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser và Illia Polosukhin. Ghi chú trong bài cho biết thứ tự tên được xếp ngẫu nhiên và mọi người đóng góp ngang nhau.
Thông điệp chính nằm ngay ở tiêu đề: chỉ cần attention. Trước đó, các mô hình dịch máy mạnh nhất kết hợp mạng hồi quy (RNN) hoặc mạng tích chập (CNN) với attention. Nhóm tác giả bỏ hẳn hồi quy và tích chập, chỉ giữ lại attention cùng vài lớp mạng đơn giản.
Kết quả công bố trong bài báo
- Dịch Anh–Đức (WMT 2014): mô hình lớn đạt 28,4 điểm BLEU, cao hơn các kết quả tốt nhất trước đó.
- Dịch Anh–Pháp (WMT 2014): phần tóm tắt và bảng kết quả ghi 41,8 điểm BLEU cho một mô hình đơn lẻ, sau 3,5 ngày huấn luyện trên 8 GPU, tức chỉ bằng một phần nhỏ chi phí huấn luyện của các mô hình tốt nhất khi đó. Lưu ý: một đoạn khác trong thân bài ghi 41,0, nên khi trích dẫn bạn nên nói rõ lấy số ở phần nào.
- Chi phí huấn luyện: mô hình cơ sở (base) chạy 100.000 bước, khoảng 12 giờ trên một máy có 8 GPU NVIDIA P100.
- Tổng quát hoá: mô hình cũng cho kết quả tốt ở bài toán phân tích cú pháp tiếng Anh, cho thấy kiến trúc không chỉ dùng được cho dịch máy.
Ngày 31/08/2017, blog Google Research đăng bài giới thiệu Transformer cho công chúng. Bài blog nhấn mạnh rằng Transformer chỉ cần một số bước tính cố định, nhỏ, để liên kết hai từ ở bất kỳ khoảng cách nào trong câu. RNN thì cần càng nhiều bước khi hai từ càng xa nhau.
Vì sao Transformer thay thế RNN và LSTM?
Để thấy giá trị của Transformer, cần biết các mô hình trước nó gặp khó ở đâu. Trong xử lý ngôn ngữ, RNN (mạng nơ-ron hồi quy) và biến thể LSTM từng là lựa chọn mặc định. Chúng đọc câu từng từ một, mang theo một “trạng thái ẩn” như cuốn sổ ghi nhớ, cập nhật sau mỗi từ.
Ba điểm nghẽn của RNN
- Không song song hoá được: muốn xử lý từ thứ 100, mô hình phải xử lý xong 99 từ trước. GPU có hàng nghìn lõi tính toán nhưng phải chờ nhau, nên huấn luyện trên dữ liệu lớn rất chậm.
- Quên thông tin xa: thông tin ở đầu câu phải đi qua rất nhiều bước mới tới cuối câu. Mỗi bước làm nó mờ đi một chút. LSTM cải thiện được phần nào nhưng không triệt để.
- Nút thắt vectơ cố định: trong mô hình dịch kiểu encoder–decoder đời đầu, cả câu nguồn bị nén vào một vectơ có độ dài cố định. Câu càng dài, càng mất thông tin.
Năm 2014, bài báo của Bahdanau, Cho và Bengio (đăng arXiv ngày 01/09/2014) chỉ ra chính nút thắt vectơ cố định này. Họ đề xuất cho mô hình tự “tìm kiếm mềm” những phần liên quan trong câu nguồn khi sinh từng từ đích. Đó là tiền thân của attention. Tuy vậy, attention lúc đó vẫn gắn vào RNN, nên vẫn phải xử lý tuần tự.
Transformer đi bước tiếp theo: bỏ RNN, để attention làm toàn bộ việc liên kết các từ. Nhờ vậy, mọi vị trí trong câu được tính song song.
So sánh theo số liệu trong bài báo gốc
Bảng 1 của bài báo so sánh ba loại lớp mạng theo độ phức tạp, số bước phải làm tuần tự và độ dài đường đi tối đa giữa hai vị trí. Trong đó n là độ dài chuỗi, d là số chiều biểu diễn, k là kích thước bộ lọc tích chập.
| Loại lớp | Độ phức tạp mỗi lớp | Số bước tuần tự | Đường đi tối đa giữa 2 từ |
|---|---|---|---|
| Self-attention | O(n²·d) | O(1) | O(1) |
| Hồi quy (RNN) | O(n·d²) | O(n) | O(n) |
| Tích chập (CNN) | O(k·n·d²) | O(1) | O(logk(n)) |
Cách đọc bảng: self-attention nối hai từ bất kỳ chỉ trong một bước và không phải chờ tuần tự. Đổi lại, chi phí tăng theo n², tức bình phương độ dài chuỗi. Với câu ngắn, n nhỏ hơn d nên self-attention rẻ hơn RNN. Với văn bản rất dài, n² trở thành gánh nặng. Đây là gốc rễ của giới hạn “cửa sổ ngữ cảnh” mà bạn sẽ gặp ở phần hạn chế.
Một số bài viết nói “Transformer có độ phức tạp O(1), RNN là O(n)”. Câu này chỉ đúng với số bước tuần tự. Tổng khối lượng tính toán của self-attention vẫn là O(n²·d). Nhầm hai khái niệm này dễ dẫn tới kỳ vọng sai về chi phí chạy mô hình với tài liệu dài.
Self-attention hoạt động như thế nào?
Self-attention (tự chú ý) là cơ chế cho mỗi từ trong một câu “hỏi” mọi từ còn lại: “Bạn liên quan tới tôi đến mức nào?”. Câu trả lời là một bộ trọng số. Từ nào liên quan nhiều thì góp phần lớn vào cách hiểu từ đang xét.
Truy vấn, khoá và giá trị (Q, K, V)
Trước khi vào attention, mỗi từ đã được đổi thành một vectơ số, gọi là embedding. Từ vectơ đó, mô hình nhân với ba ma trận trọng số học được để tạo ra ba vectơ mới:
- Query (Q, truy vấn): “tôi đang tìm thông tin gì?”
- Key (K, khoá): “tôi có thể cung cấp loại thông tin gì?”
- Value (V, giá trị): “nội dung thực sự tôi mang theo là gì?”
Một cách so sánh dễ nhớ là tra cứu trong thư viện. Bạn mang theo một câu hỏi (Q). Mỗi cuốn sách có nhãn trên gáy (K). Bạn so câu hỏi với từng nhãn, chọn ra những cuốn khớp nhất, rồi đọc nội dung bên trong (V). Khác ở chỗ attention không chọn “có hoặc không”. Nó đọc tất cả, nhưng đọc kỹ cuốn khớp nhiều và lướt qua cuốn khớp ít.
Công thức scaled dot-product attention
Bài báo gốc gọi cơ chế này là scaled dot-product attention. Viết gọn:
Attention(Q, K, V) = softmax( Q·KT / √dk ) · V
Đọc công thức theo bốn bước:
- Nhân vô hướng Q với từng K để ra điểm “độ khớp”. Hai vectơ cùng hướng thì điểm cao.
- Chia cho √dk, trong đó dk là số chiều của vectơ khoá.
- Đưa qua hàm softmax để biến các điểm thành trọng số dương, cộng lại bằng 1.
- Cộng các vectơ V theo trọng số vừa tính. Kết quả là biểu diễn mới của từ đang xét, đã “thấm” ngữ cảnh.
Vì sao phải chia cho √dk? Bài báo giải thích: nếu các thành phần của Q và K 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 dk. Khi dk lớn (mô hình gốc dùng 64), điểm số trở nên rất lớn, softmax gần như dồn hết trọng số vào một từ. Khi đó gradient (tín hiệu để mô hình học) gần bằng 0 và việc học bị tắc. Chia cho √dk kéo các điểm về mức vừa phải.
Ví dụ tính attention bằng tay
Ví dụ minh hoạ. Lấy câu ngắn “mèo ăn cá”. Để dễ tính, giả sử vectơ chỉ có 2 chiều (dk = 2) và các vectơ Q, K, V đã được tính sẵn như sau. Mô hình thật có hàng trăm đến hàng nghìn chiều và các con số do quá trình huấn luyện tạo ra.
| Từ | Khoá K | Giá trị V |
|---|---|---|
| mèo | [2, 0] | [1, 0] |
| ăn | [0, 1] | [0, 1] |
| cá | [1, 2] | [1, 1] |
Ta tính attention cho từ “ăn”, với truy vấn Q = [1, 1].
Bước 1, điểm khớp Q·K:
- mèo: 1×2 + 1×0 = 2
- ăn: 1×0 + 1×1 = 1
- cá: 1×1 + 1×2 = 3
Bước 2, chia cho √2 ≈ 1,414: được 1,414; 0,707 và 2,121.
Bước 3, softmax: lấy e mũ từng số: e1,414 ≈ 4,113; e0,707 ≈ 2,028; e2,121 ≈ 8,342. Tổng là 14,484. Chia từng số cho tổng, ta có trọng số: mèo 0,284; ăn 0,140; cá 0,576. Ba số cộng lại bằng 1.
Bước 4, cộng V theo trọng số: 0,284×[1, 0] + 0,140×[0, 1] + 0,576×[1, 1] = [0,860; 0,716].
Vectơ [0,860; 0,716] là biểu diễn mới của “ăn”. Nó mang nhiều thông tin của “cá” (đối tượng bị ăn), một phần của “mèo” (chủ thể), và chỉ một ít của chính nó. Trong mô hình thật, đây là cách động từ “học” được ai làm và làm gì từ ngữ cảnh.
Thử bỏ bước chia √2 để thấy tác dụng của nó: trọng số thành 0,245; 0,090; 0,665. Từ “cá” chiếm phần lớn hơn hẳn. Với chỉ 2 chiều, chênh lệch còn nhỏ. Với 64 chiều, nếu không chia, softmax gần như chỉ chọn một từ duy nhất, đúng như bài báo cảnh báo.
Điều quan trọng: các phép tính trên được làm cho mọi từ trong câu cùng một lúc bằng phép nhân ma trận. Đó là lý do Transformer tận dụng GPU tốt hơn hẳn RNN.
Multi-head attention là gì?
Multi-head attention (attention nhiều đầu) là chạy nhiều phép attention song song, mỗi phép gọi là một “đầu” (head), rồi ghép kết quả lại. Mỗi đầu có bộ ma trận Q, K, V riêng, nên học cách “nhìn” câu theo một góc riêng.
Lý do cần nhiều đầu: một từ có nhiều kiểu quan hệ cùng lúc. Với từ “ăn” trong câu “Con mèo nhà tôi ăn cá rất nhanh”, một đầu có thể tập trung vào chủ thể (“mèo”), đầu khác vào đối tượng (“cá”), đầu khác vào trạng từ (“nhanh”). Một phép attention đơn lẻ phải “trung bình hoá” tất cả, dễ làm mờ thông tin.
Trong mô hình gốc, vectơ biểu diễn có 512 chiều (dmodel = 512), chia thành 8 đầu, mỗi đầu 64 chiều. Kết quả của 8 đầu được nối lại thành 512 chiều rồi nhân thêm một ma trận chiếu. Tổng chi phí tính toán tương đương một đầu với đủ 512 chiều, nhưng mô hình được nhiều góc nhìn hơn.
Đừng hiểu “mỗi đầu học đúng một quy tắc ngữ pháp”. Việc mỗi đầu chuyên về gì do quá trình huấn luyện quyết định, không ai gán sẵn. Một số đầu có vai trò dễ nhận ra khi trực quan hoá, nhiều đầu khác khó diễn giải.
Positional encoding: Transformer biết thứ tự từ bằng cách nào?
Attention có một điểm “mù”: nó không quan tâm thứ tự. Nếu chỉ dùng attention, “mèo ăn cá” và “cá ăn mèo” cho ra cùng một tập trọng số, chỉ bị hoán vị. Với ngôn ngữ, thứ tự quyết định nghĩa, nên mô hình cần được báo vị trí của từng từ.
Giải pháp trong bài báo gốc là mã hoá vị trí (positional encoding): cộng thêm vào embedding của mỗi từ một vectơ “dấu vân tay vị trí”. Vectơ này được tạo bằng các hàm sin và cos có tần số khác nhau:
- PE(pos, 2i) = sin( pos / 100002i/dmodel )
- PE(pos, 2i+1) = cos( pos / 100002i/dmodel )
Trong đó pos là vị trí của từ, i là chỉ số chiều. Có thể hình dung như một chiếc đồng hồ có rất nhiều kim quay ở tốc độ khác nhau. Kim quay nhanh phân biệt hai vị trí sát nhau, kim quay chậm phân biệt hai vị trí xa nhau. Tổ hợp góc của mọi kim cho mỗi vị trí một “chữ ký” riêng.
Nhóm tác giả chọn hàm sin/cos vì hai lý do. Thứ nhất, mã vị trí pos+k có thể biểu diễn bằng một hàm tuyến tính của mã vị trí pos, nên mô hình dễ học khái niệm “cách nhau k từ”. Thứ hai, họ kỳ vọng cách này giúp mô hình xử lý được chuỗi dài hơn chuỗi đã gặp khi huấn luyện. Họ cũng thử cho mô hình tự học vectơ vị trí và thấy kết quả gần như bằng nhau (BLEU 25,7 so với 25,8 trên tập phát triển).
Các cách mã hoá vị trí mới hơn
Sau năm 2017, nhiều cách mã hoá vị trí khác ra đời. Đáng chú ý là RoPE (Rotary Position Embedding), giới thiệu trong bài báo RoFormer đăng arXiv ngày 20/04/2021. RoPE “xoay” vectơ Q và K theo vị trí bằng ma trận quay, nhờ vậy phép tính attention tự mang thông tin khoảng cách tương đối giữa hai từ. Bạn sẽ gặp RoPE trong cấu hình của nhiều mô hình ngôn ngữ mã nguồn mở hiện nay.
Kiến trúc encoder–decoder của Transformer gồm những gì?
Transformer gốc được thiết kế cho dịch máy, nên có hai nửa: bộ mã hoá (encoder) đọc câu nguồn, bộ giải mã (decoder) viết câu đích. Mỗi nửa là một chồng 6 lớp giống hệt nhau.
Bên trong một lớp encoder
- Multi-head self-attention: mỗi từ trong câu nguồn nhìn mọi từ khác, kể cả từ đứng sau.
- Mạng truyền thẳng (feed-forward network, FFN): hai lớp tuyến tính với hàm kích hoạt ReLU ở giữa, áp dụng riêng cho từng vị trí. Lớp trong của mô hình gốc rộng 2.048 chiều. Nếu attention là bước “thu thập ngữ cảnh” thì FFN là bước “xử lý” thông tin vừa gom được.
- Kết nối tắt và chuẩn hoá (Add & Norm): sau mỗi khối, đầu vào được cộng thẳng vào đầu ra (residual connection) rồi chuẩn hoá theo lớp (layer normalization). Kết nối tắt giúp tín hiệu học đi xuyên qua nhiều lớp mà không bị suy yếu, nhờ vậy xếp chồng được nhiều lớp.
Bên trong một lớp decoder
- Masked self-attention: giống self-attention nhưng mỗi vị trí chỉ được nhìn các vị trí phía trước nó.
- Cross-attention (encoder–decoder attention): Q lấy từ decoder, còn K và V lấy từ đầu ra của encoder. Đây là lúc decoder “tra” câu nguồn để quyết định viết gì tiếp.
- Mạng truyền thẳng và các bước Add & Norm như encoder.
Trên cùng của decoder là một lớp tuyến tính (linear) và softmax, biến vectơ cuối thành phân bố xác suất trên toàn bộ từ vựng. Token có xác suất cao (hoặc được chọn theo một chiến lược lấy mẫu) sẽ là từ tiếp theo.
Masking: vì sao decoder phải “bịt mắt”?
Khi huấn luyện, mô hình được đưa cả câu đích đúng để học. Nếu không che, vị trí thứ 2 sẽ “nhìn trộm” từ thứ 3 và học cách chép đáp án thay vì dự đoán. Vì vậy, bài báo đặt điểm attention tới các vị trí phía sau bằng âm vô cùng trước khi qua softmax. Sau softmax, các trọng số đó bằng 0. Mô hình buộc phải dự đoán từ tiếp theo chỉ dựa trên những gì đã có, giống hệt lúc dùng thật.
Theo dõi một câu được dịch từng bước
Ví dụ minh hoạ cho câu “Tôi yêu Hà Nội” dịch sang tiếng Anh:
- Câu nguồn được tách thành các token, đổi thành embedding và cộng mã vị trí.
- Encoder chạy 6 lớp, cho ra một vectơ ngữ cảnh cho mỗi token nguồn. Bước này làm một lần cho cả câu.
- Decoder nhận token bắt đầu, dùng cross-attention nhìn sang encoder và dự đoán “I”.
- Decoder nhận “I”, dự đoán “love”. Nhận “I love”, dự đoán “Hanoi”. Mỗi vòng thêm một token.
- Khi mô hình sinh ra token kết thúc, quá trình dừng.
Cách sinh lần lượt từng token, mỗi token dựa trên các token trước, gọi là tự hồi quy (autoregressive). ChatGPT và các chatbot khác cũng trả lời theo đúng cơ chế này, nên chữ hiện ra dần trên màn hình.
Thông số của mô hình gốc
| Thông số | Giá trị trong bài báo 2017 | Ý nghĩa |
|---|---|---|
| Số lớp encoder / decoder | 6 / 6 | Độ sâu của mỗi chồng |
| dmodel | 512 | Số chiều vectơ biểu diễn mỗi token |
| Số đầu attention | 8 | Mỗi đầu 64 chiều (dk = dv = 64) |
| Lớp trong của FFN | 2.048 | Độ rộng của mạng truyền thẳng |
| Từ vựng Anh–Đức | Khoảng 37.000 token dùng chung | Tách từ theo byte-pair encoding |
| Dropout, label smoothing | 0,1 và 0,1 | Kỹ thuật chống học vẹt |
| Bộ tối ưu | Adam, tăng dần tốc độ học trong 4.000 bước đầu | Giúp huấn luyện ổn định lúc khởi đầu |
Encoder-only, decoder-only và encoder–decoder khác nhau thế nào?
Sau năm 2017, các nhóm nghiên cứu nhận ra không phải bài toán nào cũng cần cả hai nửa. Từ đó hình thành ba họ mô hình.
| Họ mô hình | Dùng phần nào | Cách học chính | Ví dụ có nguồn | Hợp với việc gì |
|---|---|---|---|---|
| Chỉ encoder (encoder-only) | Chồng encoder, nhìn hai chiều | Đoán từ bị che trong câu | BERT (Google, arXiv 11/10/2018); PhoBERT cho tiếng Việt (2020) | Phân loại văn bản, trích xuất thực thể, tìm kiếm ngữ nghĩa, tạo embedding |
| Chỉ decoder (decoder-only) | Chồng decoder có mask, nhìn một chiều | Đoán token tiếp theo | GPT đầu tiên (OpenAI, 06/2018), GPT-3 (2020) | Sinh văn bản, trò chuyện, viết mã, tóm tắt, phần lớn LLM hiện nay |
| Encoder–decoder | Cả hai nửa | Biến chuỗi vào thành chuỗi ra | Transformer gốc (2017), T5 (Google, arXiv 23/10/2019) | Dịch máy, tóm tắt có cấu trúc, chuyển đổi định dạng |
BERT (Bidirectional Encoder Representations from Transformers) chỉ dùng encoder. Nó được huấn luyện bằng cách che bớt từ và đoán lại, dựa trên ngữ cảnh cả bên trái lẫn bên phải. Bài báo BERT báo cáo kết quả tốt nhất thời điểm đó trên 11 bài toán xử lý ngôn ngữ.
GPT chỉ dùng decoder. Bài đăng của OpenAI ngày 11/06/2018 mô tả cách làm hai giai đoạn: huấn luyện một mô hình Transformer trên lượng lớn dữ liệu không gán nhãn, sau đó tinh chỉnh trên tập nhỏ có nhãn cho từng bài toán. GPT-3, công bố tháng 5/2020, là mô hình tự hồi quy 175 tỷ tham số, theo nhóm tác giả lớn gấp 10 lần mọi mô hình ngôn ngữ không thưa (non-sparse) trước đó.
T5 dùng cả encoder và decoder, với ý tưởng đưa mọi bài toán ngôn ngữ về dạng “văn bản vào, văn bản ra”.
Ngày nay, phần lớn mô hình ngôn ngữ lớn phục vụ trò chuyện, bao gồm mô hình đứng sau ChatGPT, đi theo hướng decoder-only. Cách LLM được huấn luyện, căn chỉnh và đánh giá được trình bày riêng trong bài về LLM; ở đây bạn chỉ cần nhớ: LLM là “toà nhà”, Transformer là “kết cấu khung”.
Transformer được huấn luyện ra sao?
Quy trình huấn luyện một mô hình dựa trên Transformer thường có các bước sau:
- Tách token (tokenization): văn bản được cắt thành các đơn vị nhỏ (token), có thể là từ, một phần của từ hoặc ký tự. Với cặp Anh–Đức, mô hình gốc dùng byte-pair encoding, một cách ghép dần các cặp ký tự hay đi cùng nhau thành token.
- Tiền huấn luyện (pre-training): mô hình học trên lượng văn bản rất lớn với một nhiệm vụ tự giám sát, như đoán từ bị che (kiểu BERT) hoặc đoán token tiếp theo (kiểu GPT). Không cần người gán nhãn từng câu.
- Tinh chỉnh (fine-tuning): mô hình nền được học tiếp trên dữ liệu nhỏ hơn, đúng bài toán cần giải. Bạn có thể đọc thêm về fine-tuning và khi nào nên dùng.
Về kỹ thuật, mô hình học bằng lan truyền ngược (backpropagation): so dự đoán với đáp án, tính sai số, rồi điều chỉnh mọi ma trận trọng số (gồm cả các ma trận tạo Q, K, V) để lần sau dự đoán tốt hơn. Các trọng số attention trong ví dụ tính tay ở trên không ai đặt bằng tay. Chúng là kết quả của hàng tỷ lần điều chỉnh nhỏ như vậy.
Khi chạy, Transformer sinh văn bản như thế nào?
Giai đoạn dùng mô hình để trả lời gọi là suy luận (inference). Với mô hình decoder-only, mỗi token mới đòi hỏi một lượt tính qua toàn bộ các lớp. Câu trả lời 500 token nghĩa là khoảng 500 lượt như vậy. Đây là lý do thời gian phản hồi và chi phí API thường tính theo số token.
KV cache là gì?
Ở mỗi lượt sinh token, các vectơ K và V của những token cũ không thay đổi. Thay vì tính lại từ đầu, hệ thống lưu chúng vào bộ nhớ đệm, gọi là KV cache, và chỉ tính thêm cho token mới. Cách này tăng tốc rất nhiều nhưng tốn bộ nhớ GPU, và bộ nhớ đệm phình to theo độ dài hội thoại. Khi bạn thấy nhà cung cấp tính giá khác nhau cho token đầu vào được “cache” hay không, hoặc giới hạn độ dài ngữ cảnh, phần lớn là do cơ chế này.
Cửa sổ ngữ cảnh
Cửa sổ ngữ cảnh (context window) là số token tối đa mô hình xử lý được trong một lần, gồm cả câu hỏi, tài liệu đính kèm và câu trả lời. Giới hạn này đến từ chi phí n² của attention, bộ nhớ KV cache và cách mô hình được huấn luyện. Văn bản vượt quá cửa sổ sẽ bị cắt hoặc phải chia nhỏ.
Transformer chỉ dùng cho ngôn ngữ thôi sao?
Không. Bất kỳ dữ liệu nào cắt được thành chuỗi “mảnh” đều có thể đưa vào Transformer.
- Hình ảnh: bài báo “An Image is Worth 16×16 Words” (arXiv 22/10/2020) đề xuất Vision Transformer (ViT): chia ảnh thành các ô vuông nhỏ, coi mỗi ô như một “từ”. Nhóm tác giả cho thấy một Transformer thuần, khi được huấn luyện trước trên dữ liệu lớn, đạt kết quả rất tốt so với mạng tích chập tốt nhất, với tài nguyên huấn luyện ít hơn đáng kể. Đây là một nhánh quan trọng của thị giác máy tính hiện nay.
- Giọng nói: tín hiệu âm thanh được cắt thành các khung ngắn, đổi thành vectơ, rồi xử lý như chuỗi. Nhiều hệ thống chuyển giọng nói thành văn bản thế hệ mới dùng kiến trúc này.
- Đa phương thức: văn bản, ảnh, âm thanh được đổi về cùng dạng token để một mô hình đọc chung, cho phép hỏi đáp về ảnh hay mô tả video.
Transformer có những hạn chế gì?
Chi phí tăng theo bình phương độ dài
Mỗi token phải tính điểm với mọi token khác, nên chuỗi dài gấp đôi thì ma trận attention lớn gấp bốn. Bài báo FlashAttention (arXiv 27/05/2022) mô tả đúng vấn đề: Transformer chậm và tốn bộ nhớ với chuỗi dài vì độ phức tạp thời gian và bộ nhớ của self-attention là bậc hai theo độ dài chuỗi. FlashAttention không đổi kết quả tính mà sắp xếp lại cách đọc ghi giữa các tầng bộ nhớ của GPU để giảm số lần truy cập bộ nhớ, nhờ đó nhanh và tiết kiệm hơn.
Cần nhiều dữ liệu và phần cứng
Transformer ít “giả định sẵn” về cấu trúc dữ liệu hơn CNN hay RNN. Đổi lại, nó cần nhiều dữ liệu để tự học các quy luật đó. Tiền huấn luyện mô hình lớn đòi hỏi cụm GPU và ngân sách mà phần lớn doanh nghiệp không có, nên thực tế doanh nghiệp thường dùng lại mô hình nền có sẵn.
Trọng số attention không phải lời giải thích
Biểu đồ attention trông rất trực quan, nhưng trọng số cao chưa chắc là lý do mô hình đưa ra quyết định. Mô hình có nhiều lớp, nhiều đầu, cộng với FFN và kết nối tắt. Đừng dùng một bản đồ attention làm bằng chứng duy nhất khi cần giải thích kết quả AI cho khách hàng hay cơ quan quản lý.
Vẫn có thể “bịa”
Transformer học xác suất của chuỗi token, không có cơ chế tự kiểm chứng sự thật. Mô hình sinh văn bản có thể tạo câu trôi chảy nhưng sai, hiện tượng gọi là ảo giác (hallucination). Giải pháp nằm ở cách xây dựng hệ thống (truy xuất tài liệu, kiểm duyệt của con người), không nằm ở riêng kiến trúc.
Các hướng thay thế và cải tiến
Các nhà nghiên cứu đang thử nhiều kiến trúc để giảm chi phí n². Một ví dụ là Mamba (arXiv 01/12/2023), dựa trên mô hình không gian trạng thái có chọn lọc. Nhóm tác giả báo cáo Mamba mở rộng tuyến tính theo độ dài chuỗi và có thông lượng suy luận cao hơn khoảng 5 lần so với Transformer cùng cỡ. Tuy vậy, Transformer và các biến thể của nó vẫn là nền tảng của phần lớn mô hình ngôn ngữ lớn được công bố. Khi đọc tin “kiến trúc X sẽ thay Transformer”, bạn nên xem nó được thử ở quy mô nào và trên bài toán gì.
Doanh nghiệp Việt Nam cần hiểu Transformer để làm gì?
Bạn không cần tự viết Transformer. Nhưng hiểu nguyên lý giúp ra quyết định tốt hơn khi đưa AI vào công việc.
- Chọn đúng họ mô hình: phân loại email, gắn nhãn phản hồi khách hàng, trích thông tin từ hợp đồng thường chỉ cần mô hình encoder nhỏ, rẻ và nhanh. Viết nội dung, trợ lý hỏi đáp mới cần mô hình decoder lớn. Dùng LLM lớn cho việc phân loại đơn giản có thể tốn chi phí không cần thiết.
- Ước lượng chi phí theo token: chi phí và độ trễ tăng theo độ dài đầu vào và đầu ra. Tài liệu dài nên được chia nhỏ, tóm tắt hoặc truy xuất đoạn liên quan thay vì đưa nguyên khối.
- Kiểm tra với tiếng Việt: cùng một nội dung, số token phụ thuộc bộ tách token của từng mô hình. Hãy đo thử trên dữ liệu thật của bạn trước khi dự trù ngân sách. Với bài toán hiểu tiếng Việt, đã có mô hình huấn luyện riêng như PhoBERT: theo bài báo đăng arXiv ngày 02/03/2020, đây là các mô hình ngôn ngữ đơn ngữ quy mô lớn công khai đầu tiên cho tiếng Việt, đạt kết quả tốt nhất thời điểm công bố ở các bài toán như gán nhãn từ loại, nhận dạng thực thể có tên.
- Đặt kỳ vọng đúng: mô hình mạnh về ngôn ngữ, không mạnh tự nhiên về tính toán chính xác hay kiến thức mới sau thời điểm huấn luyện. Thiết kế quy trình có bước kiểm tra của con người với việc quan trọng.
- Hỏi đúng câu khi chọn nhà cung cấp: cửa sổ ngữ cảnh bao nhiêu, mô hình thuộc họ nào, dữ liệu gửi lên được xử lý và lưu ở đâu, có tinh chỉnh được không.
Nếu bạn đang làm các bài toán xử lý ngôn ngữ tự nhiên như phân loại văn bản hay trích xuất thông tin, Transformer gần như chắc chắn là nền tảng của công cụ bạn đang dùng.
Những hiểu lầm thường gặp về Transformer
- “Transformer là ChatGPT”: sai. ChatGPT là một sản phẩm. Transformer là kiến trúc. Một sản phẩm chatbot còn gồm dữ liệu huấn luyện, quá trình căn chỉnh, hệ thống an toàn và giao diện.
- “Transformer hiểu ngôn ngữ như người”: mô hình học quan hệ thống kê giữa các token ở quy mô rất lớn. Kết quả có thể rất ấn tượng, nhưng không nên mặc định nó suy nghĩ như con người.
- “Attention là bộ nhớ dài hạn”: attention chỉ hoạt động trong cửa sổ ngữ cảnh hiện tại. Thông tin ngoài cửa sổ, mô hình không “nhớ” trừ khi hệ thống đưa lại vào.
- “Càng nhiều đầu attention càng tốt”: bài báo gốc thử nhiều cấu hình: dùng 1 đầu kém cấu hình tốt nhất 0,9 điểm BLEU, nhưng dùng quá nhiều đầu thì chất lượng cũng giảm. Số đầu là thông số cần cân bằng.
Câu hỏi thường gặp
“Attention Is All You Need” là gì?
Đó là tên bài báo giới thiệu Transformer, đăng arXiv ngày 12/06/2017 và trình bày tại hội nghị NIPS 2017. Bài báo cho thấy có thể bỏ hẳn RNN và CNN trong dịch máy, chỉ dùng attention, mà vẫn đạt kết quả tốt hơn với chi phí huấn luyện thấp hơn.
Self-attention khác attention thông thường thế nào?
Attention nói chung là cơ chế để một chuỗi “nhìn” vào một chuỗi khác, như decoder nhìn vào câu nguồn. Self-attention là khi Q, K, V đều lấy từ cùng một chuỗi, nghĩa là các từ trong một câu nhìn lẫn nhau.
Encoder và decoder trong Transformer làm nhiệm vụ gì?
Encoder đọc toàn bộ đầu vào và tạo ra biểu diễn giàu ngữ cảnh cho từng token. Decoder dùng biểu diễn đó cùng các token đã sinh để tạo đầu ra lần lượt từng token. Nhiều mô hình hiện nay chỉ dùng một trong hai nửa.
Học Transformer cần kiến thức gì trước?
Bạn nên nắm đại số tuyến tính cơ bản (vectơ, nhân ma trận), xác suất (softmax), và khái niệm mạng nơ-ron, lan truyền ngược. Sau đó, tự tính tay một ví dụ attention nhỏ như trong bài này, rồi đọc thẳng bài báo gốc. Bài báo không dài và khá dễ theo dõi nếu bạn đã nắm các khái niệm trên.
Transformer có bị thay thế trong vài năm tới không?
Không ai dự đoán chắc được. Các kiến trúc như Mamba hay mô hình lai đang được nghiên cứu để giảm chi phí với chuỗi dài. Đến thời điểm 10/2026, Transformer và biến thể của nó vẫn là lựa chọn chủ đạo cho mô hình ngôn ngữ lớn.