5.5 Cross-encoder được huấn luyện thế nào
Bạn không cần tự huấn luyện reranker để dùng nó. Nhưng bạn cần biết nó được huấn luyện thế nào, vì ba lý do rất thực dụng:
- Nó giải thích vì sao điểm không hiệu chuẩn (5.3).
- Nó giải thích vì sao model tốt trên leaderboard có thể tệ trên dữ liệu của bạn.
- Nó là điều kiện để bạn quyết định có nên fine-tune (5.14).
Bản gốc: monoBERT, 2019
Phần tiêu đề “Bản gốc: monoBERT, 2019”Kiến trúc reranker hiện đại được đóng khung trong một bài báo duy nhất, và nó đơn giản
đến mức đáng ngạc nhiên: ghép truy vấn và đoạn văn thành một chuỗi, đưa qua BERT, gắn
một lớp linear lên vector [CLS], huấn luyện bằng cross-entropy nhị phân thường:
Jpos là các đoạn liên quan, Jneg là các đoạn không liên quan. Không có gì hơn thế.
Con số mà bài báo đó báo cáo giải thích vì sao cả ngành đi theo — MS MARCO dev, MRR@10:
| Hệ thống | MRR@10 |
|---|---|
| BM25 (Lucene, chưa tinh chỉnh) | 16,7 |
| + BERT-base rerank | 34,7 |
| + BERT-large rerank | 36,5 |
Hơn gấp đôi, chỉ bằng cách xếp lại danh sách mà BM25 đã trả về. Và chú ý: nó rerank
top-1000 của BM25 — đó là nguồn gốc của thói quen chọn k lớn, dù production ngày
nay thường dùng k nhỏ hơn nhiều vì lý do latency (5.9).
Cùng một việc, ba cách xuất điểm
Phần tiêu đề “Cùng một việc, ba cách xuất điểm”Chi tiết này ít được nói tới nhưng ảnh hưởng trực tiếp lên việc bạn đọc điểm thế nào:
| Họ model | Điểm ra từ đâu | Hệ quả |
|---|---|---|
| monoBERT và hậu duệ | logit của một lớp phân loại trên [CLS] | một số thực không chặn |
| monoT5 | logit của token true so với token false | softmax trên hai từ trong từ vựng |
| Qwen3-Reranker | hiệu logit của token yes và token no | có thể sigmoid thành 0…1 |
Ba cơ chế khác nhau, ba phân phối điểm khác nhau. Đây là lý do kỹ thuật cụ thể cho quy tắc ở 5.3: ngưỡng không chuyển được giữa các model.
Hàm loss: pointwise → pairwise → listwise
Phần tiêu đề “Hàm loss: pointwise → pairwise → listwise”Ranking không phải phân loại. Bạn không cần biết “đoạn này liên quan hay không”, bạn cần biết “đoạn nào hơn đoạn nào”. Ba thế hệ hàm loss tương ứng ba cách nhìn:
| Loss | Model nhìn thấy gì mỗi bước | Học được gì |
|---|---|---|
| Pointwise (BCE) | một cặp (q, d) | “liên quan hay không” — không thấy đối thủ |
| Pairwise (RankNet, 2005) | (q, d⁺, d⁻) | “d⁺ nên trên d⁻” |
| Listwise (softmax cross-entropy) | (q, d⁺, d⁻₁…d⁻ₙ) cùng lúc | phân bố xác suất trên cả danh sách |
Dòng cuối là chỗ RankNet → LambdaRank → LambdaMART của learning-to-rank cổ điển gặp transformer. Và chênh lệch giữa các loss này đo được:
RankT5 so bốn loss trên cùng kiến trúc. Đổi từ pointwise cross-entropy sang listwise softmax, MS MARCO:
| Loss | MRR@10 | nDCG@5 | nDCG@10 |
|---|---|---|---|
| Pointwise (phân loại, kiểu monoT5) | 0,4156 | 0,4448 | 0,4843 |
| Listwise softmax | 0,4278 | 0,4573 | 0,4960 |
Và quan trọng hơn con số trong miền: trên 15 tập của BEIR (zero-shot, chưa từng huấn luyện lên), listwise softmax hơn pointwise hơn +2,1% nDCG@10 trung bình, và +4,6% trên các tập y sinh. Nghĩa là loss listwise không chỉ tốt hơn — nó tổng quát hoá tốt hơn.
Một biến thể đáng biết vì nó rất trực tiếp: LCE (localized contrastive estimation) lấy các negative từ chính top-k của retriever mà bạn sẽ dùng lúc chạy thật, thay vì từ một danh sách tĩnh:
trong đó là nhóm gồm và các negative lấy từ top-k của retriever thật.
MS MARCO, cùng retriever: MRR@100 40,84 (BCE thường) → 43,38 (LCE). Ý tưởng nền rất dễ nhớ: huấn luyện reranker trên đúng phân phối tài liệu mà nó sẽ gặp lúc chạy.
Hard negative: chỗ quyết định thành bại
Phần tiêu đề “Hard negative: chỗ quyết định thành bại”Negative ngẫu nhiên dạy được rất ít. Model chỉ cần học “hai văn bản này chả liên quan gì nhau”, việc đó dễ và nó đã biết. Cái phải học là phân biệt đoạn gần đúng với đoạn đúng — chính là loại lỗi mà 5.1 mô tả: trúng từ, sai việc.
Nên hard negative được lấy từ top-k của một retriever: những tài liệu xếp cao nhưng không phải đáp án. Hai bước tiến của ý tưởng này:
- ANCE lấy negative từ một ANN index của toàn corpus, làm mới định kỳ trong lúc huấn luyện, thay vì từ một danh sách BM25 tĩnh — negative khó lên theo model.
- RocketQA phát hiện vấn đề của cách làm đó, và con số của họ nên làm bạn dừng lại: khi họ kiểm tay các đoạn được xếp cao mà không có nhãn positive trong MS MARCO, khoảng 70% thực ra là positive.
Bảy mươi phần trăm. Nghĩa là “hard negative” lấy hồn nhiên từ top-k phần lớn là nhãn sai, và bạn đang dạy model rằng câu trả lời đúng là sai. Cách chữa của RocketQA — dùng một cross-encoder để lọc bớt hard negative trước khi huấn luyện — đưa MRR@10 lên 37,0 so với 33,0 của DPR/ANCE.
→ Bài học mang đi: nếu bạn tự sinh dữ liệu huấn luyện (5.14), phải có một bước kiểm lại các negative điểm cao nhất. Bỏ bước đó thì càng huấn luyện càng tệ, và metric huấn luyện sẽ không cho bạn biết.
Distillation: chuyển chất lượng từ model đắt sang model rẻ
Phần tiêu đề “Distillation: chuyển chất lượng từ model đắt sang model rẻ”Cross-encoder tốt nhưng đắt. Ý tưởng: dùng nó làm thầy để dạy một model rẻ hơn.
Điểm kỹ thuật hay nhất ở đây là dạy hiệu số, không dạy điểm:
Vì sao là hiệu số: các kiến trúc khác nhau “tự chọn dải điểm tự nhiên của riêng chúng” — bắt model học khớp giá trị tuyệt đối của thầy là bắt nó học một thứ vô nghĩa. Hiệu số thì bất biến với dịch chuyển thang, đúng như tính chất của bài toán ranking (5.3). Kết quả trên MSMARCO-DEV:
| Model học | nDCG@10 trước → sau |
|---|---|
| ColBERT | 0,417 → 0,431 |
| Dense bi-encoder (DistilBERT) | 0,354 → 0,381 |
Và chiều ngược lại là hướng đang đi hiện nay: distill từ LLM reranker xuống cross-encoder — lấy chất lượng của LLM ở mức chi phí của cross-encoder (5.7, 5.14).
Điều này nói gì về model bạn đang định tải về
Phần tiêu đề “Điều này nói gì về model bạn đang định tải về”Ba hệ quả trực tiếp cho việc chọn model:
| Sự thật về huấn luyện | Hệ quả cho bạn |
|---|---|
| Gần như mọi reranker công khai huấn luyện trên MS MARCO — hỏi–đáp web tiếng Anh | Model biết rất rõ dạng “câu hỏi tự nhiên → đoạn Wikipedia”. Nó không biết corpus hỗ trợ nội bộ tiếng Việt đầy mã lỗi của bạn |
| Loss là để xếp thứ tự, không phải để dự đoán xác suất | Điểm không đọc trực tiếp được. Ngưỡng cứng là bẫy (5.3) |
| Negative lấy từ top-k của một retriever cụ thể | Model được tối ưu cho phân phối ứng viên đó. Stage 1 của bạn khác → hành vi khác |
Đồng thời có một tin tốt, và nó đo được: cross-encoder tổng quát hoá ra ngoài miền tốt hơn bi-encoder. Trung bình nDCG@10 trên BEIR:
| Model | Loại | BEIR avg nDCG@10 |
|---|---|---|
| monoT5-3B | cross-encoder | 0,532 |
| SGPT-5,8B | bi-encoder | 0,490 |
| GTR-4,8B | bi-encoder | 0,458 |
Cross-encoder 3B thắng bi-encoder 5,8B — model nhỏ hơn mà tốt hơn ngoài miền. Lý do được nêu: tương tác sớm giữa query và doc, cộng với việc bi-encoder bị nút cổ chai ở vector 768 chiều cố định, đúng như 5.2 nói.
Và một câu từ cùng bài báo đó nên được dán lên tường: hiệu năng trong miền không phải một chỉ báo tốt cho hiệu năng zero-shot. Đó là lý do 5.12 khăng khăng bạn phải có golden set của riêng mình.