Bỏ qua để đến nội dung
Search & RAG

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).

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:

L=jJposlogsj    jJneglog(1sj)L = -\sum_{j \in J_{\mathrm{pos}}} \log s_j \;-\; \sum_{j \in J_{\mathrm{neg}}} \log(1 - s_j)

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ốngMRR@10
BM25 (Lucene, chưa tinh chỉnh)16,7
+ BERT-base rerank34,7
+ BERT-large rerank36,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).

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ừ đâuHệ 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
monoT5logit của token true so với token falsesoftmax trên hai từ trong từ vựng
Qwen3-Rerankerhiệu logit của token yes và token nocó 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.

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:

LossModel nhìn thấy gì mỗi bướcHọ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úcphâ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:

LossMRR@10nDCG@5nDCG@10
Pointwise (phân loại, kiểu monoT5)0,41560,44480,4843
Listwise softmax0,42780,45730,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:

Lq=logexp(dist(q,d+))dGqexp(dist(q,d))L_q = -\log \frac{\exp\bigl(\mathrm{dist}(q, d^{+})\bigr)}{\sum_{d \in G_q} \exp\bigl(\mathrm{dist}(q, d)\bigr)}

trong đó GqG_q là nhóm gồm d+d^{+} 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.

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:

L=MSE(Mhọc(q,d+)Mhọc(q,d),    Mthaˆˋy(q,d+)Mthaˆˋy(q,d))L = \mathrm{MSE}\Bigl(\,M_{\text{học}}(q,d^{+}) - M_{\text{học}}(q,d^{-}), \;\; M_{\text{thầy}}(q,d^{+}) - M_{\text{thầy}}(q,d^{-})\,\Bigr)

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ọcnDCG@10 trước → sau
ColBERT0,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ệnHệ 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 AnhModel 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:

ModelLoạiBEIR avg nDCG@10
monoT5-3Bcross-encoder0,532
SGPT-5,8Bbi-encoder0,490
GTR-4,8Bbi-encoder0,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.

Phần 5 — Reranker