Chuyên đề bổ sung
Giải phẫu BERT
Kiến trúc Encoder-only (như BERT, RoBERTa, ELECTRA, DeBERTa) đi theo một triết lý hoàn toàn ngược với các model dịch máy (Enc-Dec) hay LLM (Decoder-only) mà bạn đang dùng: không sinh từ, chỉ hiểu sâu. Chuyên đề này giải phẫu thuật toán Masked Language Modeling (MLM), sự tiến hóa hậu BERT và sức mạnh của ngữ cảnh hai chiều thực sự.
1 Nghịch lý của việc sinh từ (Autoregressive)
Mục tiêu
- Hiểu điểm mù của LLM (Decoder-only) khi làm tác vụ đọc hiểu phân tích.
- Tại sao "đọc từ trái sang phải" lại làm mất một nửa ngữ cảnh.
Khi bạn dùng LLM (như Llama, GPT) để phân loại văn bản hay trích xuất thực thể, mô hình buộc phải đọc từ trái sang phải qua cơ chế Causal Masking. Tức là, khi nó xử lý đến từ thứ i, nó tuyệt đối không được phép nhìn thấy từ thứ i+1. Điều này hoàn toàn hợp lý nếu mục tiêu của nó là dự đoán từ tiếp theo (sinh văn bản). Nhưng nếu mục tiêu là hiểu trọn vẹn cả câu, đó lại là một sự kìm hãm nhân tạo.
2 Thuật toán Masked Language Modeling (MLM)
Làm sao để dạy một model hiểu cả 2 chiều? Nếu ta bắt nó đoán từ tiếp theo như LLM, bài toán sụp đổ (vì nó đã được phép nhìn xuyên thấu từ tiếp theo rồi — đó là gian lận!). Thuật toán MLM (học ngôn ngữ qua việc che giấu) là lời giải thiên tài của Google năm 2018:
- Lấy một câu bình thường:
Chàng vung thanh [kiếm] chém đứt gốc cây. - Chọn ngẫu nhiên 15% số token để giấu đi, thay bằng token đặc biệt
[MASK]. - Bắt model dựa vào toàn bộ ngữ cảnh xung quanh để đoán lại chính xác từ đã bị che.
Bẫy của MLM (Mismatch)
Vì token [MASK] chỉ xuất hiện lúc train, còn lúc inference (đưa vào thực tế) câu văn hoàn toàn bình thường, không hề có [MASK]. Điều này tạo ra sự lệch pha (mismatch). Để chữa cháy, trong 15% token được chọn để test, BERT không che toàn bộ bằng chữ MASK:
- 80% biến thành
[MASK]thực sự. - 10% đổi thành một từ ngẫu nhiên (ép model không được lười biếng mà phải luôn kiểm tra lỗi sai ngữ cảnh).
- 10% giữ nguyên từ gốc (để model học cách tự tin khẳng định từ này đã đúng và giữ nguyên ý nghĩa của nó).
3 Token [CLS] và Cơ chế Classification
Bạn không thể dùng BERT để dịch văn bản (vì nó không có Decoder để nhả từng từ). Vậy đầu ra của nó dùng để làm gì? Nó dùng để phân loại (Classification), trích xuất (NER), hoặc làm Term Verifier / Embedding Database như trong dự án của bạn.
Bí quyết để BERT tóm tắt được nghĩa của cả một câu nằm ở một token đặc biệt luôn được chèn tự động vào đầu mỗi sequence: [CLS] (Classification).
[CLS] nhìn thấy mọi chữ trong câu và "hút" toàn bộ ý nghĩa của câu vào vector embedding của chính nó. Cuối cùng, ta chỉ việc cắm một lớp Linear Layer (phân loại) đơn giản duy nhất lên trên vector đầu ra của [CLS] để phân loại (Sentiment, Spam, Topic...).4 Khi nào nên dùng BERT?
Trong thời đại LLM thống trị, nhiều người tưởng kiến trúc Encoder-only đã chết. Sự thật là BERT (và các bản nâng cấp như RoBERTa, DeBERTa, BGE-M3) vẫn sống cực khỏe vì nó là vua của tốc độ và độ chính xác phân tích chuyên biệt.
| Tác vụ | Dùng LLM (Llama, GPT) | Dùng BERT / Encoder-only |
|---|---|---|
| Dịch thuật, Tóm tắt | Tuyệt vời (Generative) | Không làm được (Không có thẻ Decoder) |
| RAG (Vector Database) | Chậm, tốn kém, vector lỏng lẻo | Tiêu chuẩn vàng (BGE-M3, MiniLM) |
| Phân loại Cảm xúc / Toxic | Chậm, phải parse JSON | Chính xác tuyệt đối, cắm Linear layer |
| Term Verifier (Tìm thực thể) | Dễ bị ảo giác (hallucination) | Gắn tag NER cực nhanh và chuẩn xác |
| Chi phí & Tốc độ | Cần GPU lớn (GBs), chậm (từng token) | Chạy tốt trên CPU (vài trăm MB), 1 pass tức thì |
Case Study: Ý tưởng Term Detector của bạn
Bạn từng đặt câu hỏi về việc dùng embedding làm term detector/verifier (memo 13/08). Nếu bạn bắt một LLM đọc câu để "kiểm tra xem có từ Tuấn Dao không", nó rất chậm vì phải lặp lại cơ chế sinh AR. Nhưng nếu bạn dùng một mô hình Encoder-only mỏng (như DeBERTaV3-small):
- Bạn chỉ cần chạy 1 lượt forward duy nhất.
- Lấy embedding đầu ra của từng token (hoặc span) đem so cosine similarity với vector chuẩn của thuật ngữ "Tuấn Dao".
- Bạn có ngay một chiếc Radar siêu tốc, chính xác cao, chi phí tính toán cực rẻ để chèn thẳng vào giữa pipeline dữ liệu mà không làm nghẽn cổ chai (bottleneck) hệ thống.
5 Tiến Hóa Hậu BERT: RoBERTa, ELECTRA & DeBERTaV3
BERT (2018) mở đường nhưng mang theo 3 điểm nghẽn lớn: (1) Loss chỉ tính trên 15% token bị che (85% phép tính mỗi bước không sinh tín hiệu học trực tiếp), (2) bài toán Next Sentence Prediction (NSP) quá dễ nên phản tác dụng, và (3) cộng trực tiếp vector vị trí vào vector từ làm nhiễu nội dung. Ba hậu duệ quan trọng nhất đã giải quyết triệt để từng điểm nghẽn này:
| Kiến trúc | Đột phá toán học & huấn luyện | Hiệu quả thực chiến (NER / Verifier) |
|---|---|---|
| BERT (2018) | Static MLM (che 15% cố định lúc tiền xử lý) + Next Sentence Prediction (NSP). | Nền tảng chuẩn, nhưng lãng phí 85% ngân sách gradient mỗi batch. |
| RoBERTa (2019) | Bỏ NSP; chuyển sang Dynamic Masking (mỗi epoch che vị trí khác nhau) + batch lớn. | Tăng mạnh F1 trên GLUE/NER mà không đổi một dòng kiến trúc suy luận. |
| ELECTRA (2020) | Thay MLM bằng Replaced Token Detection (RTD): một Generator nhỏ điền từ giả vào chỗ trống, còn Discriminator (mô hình chính) phân loại nhị phân trên 100% token xem token nào là thật/giả. Kèm Factorized Embedding ($E=128 \to H=256$). | Học nhanh gấp ~4× ở quy mô nhỏ! Trong Lò Luyện Giải Phẫu, electra-small chỉ tốn 13.7M tham số nhờ tách chiều từ vựng $E=128$ khỏi chiều ẩn $H=256$. |
| DeBERTaV3 (2021) | Kết hợp Disentangled Attention (tách riêng vector nội dung $C$ và vị trí tương đối $P$: tính 3 cặp $C\to C, C\to P, P\to C$) với mục tiêu RTD của ELECTRA + Gradient-Disentangled Embedding Sharing. | Vua của các bài toán đọc hiểu tinh vi, phân biệt ranh giới thực thể (Span NER) và kiểm chứng thuật ngữ (Term Verifier). |
Liên kết trực tiếp với Lò Luyện Giải Phẫu
Nếu bạn mở Module 03 của Lò Luyện Giải Phẫu, bạn sẽ thấy bảng kiểm toán tham số thực tế giữa bert-base-multilingual-cased (177.9M params, riêng bảng embedding ngốn 91.8M) và google/electra-small-discriminator (13.7M params, bảng embedding chỉ 3.9M nhờ chiếu $V\times 128 \to 256$).
6 Phòng Thí Nghiệm: Mô Phỏng MLM & Cosine Term Radar
Trực tiếp thử nghiệm sự khác biệt giữa Causal Attention (1 chiều) và Bidirectional Attention (2 chiều) trên các câu nhập nhằng ngữ cảnh (đa nghĩa / tên riêng thực thể) cùng quy tắc biến đổi 80-10-10 của MLM:
Nhấn vào các token bên dưới hoặc đổi vế sau của câu để xem vector biểu diễn của thuật ngữ thay đổi tức thời:
Radar Cosine Similarity tại vị trí thuật ngữ mục tiêu:
Tự kiểm tra
1 · Tại sao BERT không thể dùng để dịch máy như HachimiMT?
Vì nó không có khối Decoder (như mô hình Enc-Dec) và cũng không được huấn luyện kiểu sinh từ tuần tự (như Llama). BERT xử lý và xuất ra mọi vector cùng một lúc, nó không biết độ dài output là bao nhiêu và không biết cách nhả ra từng từ nối tiếp nhau.
2 · Để so sánh độ tương đồng ý nghĩa của 2 câu bằng BERT, ta làm gì?
Đưa độc lập cả 2 câu chạy qua BERT. Lấy vector embedding tương ứng của token [CLS] ở mỗi câu. Dùng Cosine Similarity (đã học ở Module 05) để đo khoảng cách góc giữa 2 vector này. (Cách tốt hơn là dùng mô hình Bi-Encoder như SBERT/BGE được fine-tune chuyên cho việc này).
3 · Nếu 15% token luôn biến thành chữ MASK lúc train, model có học được từ vựng thật không?
Có, vì 85% token còn lại vẫn là chữ thật và đóng vai trò làm ngữ cảnh. Hơn nữa, với kho dữ liệu khổng lồ, một từ bị che ở câu này sẽ xuất hiện làm ngữ cảnh ở hàng nghìn câu khác. Đó cũng là lý do vì sao người ta cần 10% trong số bị che được giữ nguyên gốc để model không "quên" mặt chữ.
4 · Tại sao ELECTRA nhỏ (13.7M params) lại hội tụ nhanh hơn BERT truyền thống rất nhiều?
Vì BERT chỉ tính hàm mất mát (loss) trên 15% vị trí bị che trong câu, còn ELECTRA dùng bộ phân biệt (Discriminator) dự đoán nhãn thật/giả trên 100% số token của câu, đồng thời nén bảng từ vựng bằng Factorized Embedding ($E=128 \to H=256$).