Loss Function trong Sentence Transformers

Các hàm Loss phổ biến trong Sentence Transformers

Loss Function trong Sentence Transformers

Khi Finetune một mô hình Embedding, giả sử ta có record theo dạng

plaintext
{
	"anchor": "Fine tune Embedding Model", 
	"postive": "How to finetung Sentence Transformer", 
	"negative": "Fine tune LLM with LoRA" 
}

Từ tập dữ liệu dạng này, model cần học cách để hiểu và tổng quát hoá mục tiêu similarity(anchor, positive) >> similarity(anchor, negative). Loss Function chính là thứ biến yêu cầu này thành mục tiêu tối ưu. Vì vậy trong bài viết này mình sẽ trình bày một số hàm mất mát theo vài dạng format dataset phổ biến.

I. Không có Loss Function tốt nhất

Sentence Transformers cung cấp khá nhiều Loss Function và không có một lựa chọn tốt nhất cho mọi trường hợp. Việc chọn Loss phụ thuộc chủ yếu vào format của dữ liệu và mục tiêu mà mình muốn model học.

Một số format thường gặp gồm: (anchor, positive), (anchor, positive, negative), (sentence_a, sentence_b, similarity_score), (sentence_a, sentence_b, class. Trong thực tế chúng ta cũng có thể chuyển đổi giữa một số format. Ví dụ dữ liệu (sentence_a, sentence_b, class) có thể được sampling thành các triplet (anchor, positive, negative).

II. Multiple Negatives Ranking Loss

Đối với bài toán Retrieval, đây có lẽ là Loss Function đáng quan tâm nhất. MultipleNegativesRankingLoss, hay MNRL, được Sentence Transformers khuyến nghị cho dữ liệu dạng:(anchor, positive) hoặc:(anchor, positive, negative)

Điểm hay của MNRL là với dữ liệu (anchor, positive), mình không nhất thiết phải chuẩn bị Negative cho từng record. Giả sử một batch có (q1, p1), (q2, p2), (q3, p3). Khi xét q1, p1 là Positive, còn p2p3 sẽ được sử dụng như Negative. Tương tự với các record còn lại. Cách làm này thường được gọi là In-batch Negatives. Sentence Transformers cũng cung cấp CachedMultipleNegativesRankingLoss, cho phép sử dụng batch lớn hơn khi GPU bị giới hạn VRAM. Đây cũng là một trong những Loss được documentation khuyến nghị mặc định cho việc train Embedding Model.

III. False Negative

In-batch Negatives rất tiện, nhưng có một vấn đề.

Giả sử trong batch có: (q1: "Học phí HCMUS năm 2026" p1: "Thông tin học phí HCMUS năm học 2026") và (q2: "Học phí Đại học Khoa học Tự nhiên",p2: "Mức học phí dự kiến của HCMUS")

Đối với q1, MNRL sẽ coi p2 là Negative mặc dù nội dung của nó thực tế vẫn liên quan khá mạnh tới truy vấn. Đây được gọi là False Negative. Vì vậy batch lớn không phải lúc nào cũng tốt tuyệt đối. Batch càng lớn thì số lượng Negative càng nhiều, nhưng khả năng xuất hiện False Negative cũng tăng theo. Với Retrieval Dataset, chất lượng dữ liệu và cách sampling vẫn là yếu tố phải kiểm soát rất kỹ.

IV. Triplet Loss

Nếu dataset đã được chuẩn bị theo dạng: (anchor, positive, negative)thì TripletLoss là một lựa chọn khá trực quan. Mục tiêu của nó là đảm bảo khoảng cách giữa Anchor và Positive nhỏ hơn khoảng cách giữa Anchor và Negative ít nhất một khoảng margin: L = max(d(a,p) - d(a,n) + margin, 0). Model sẽ bị phạt nếu Negative nằm quá gần Anchor hoặc Positive nằm quá xa Anchor.

Điểm cần chú ý ở đây là chất lượng của Negative. Nếu Negative quá dễ, chẳng hạn "Cách nấu phở bò", model gần như không học thêm được nhiều. Một Negative gần về Semantic nhưng sai về Intent thường mang lại tín hiệu training tốt hơn. Đây chính là lý do Hard Negative Mining rất quan trọng đối với Retrieval Dataset.

V. Matryoshka Loss

MatryoshkaLoss hơi khác những Loss phía trên. Nó hoạt động như một Loss Modifier, tức là được bọc bên ngoài một Loss Function khác.

python
loss = MatryoshkaLoss(
    model,
    MultipleNegativesRankingLoss(model),
    matryoshka_dims=[768, 512, 256, 128]
)

Model được train để embedding vẫn hoạt động tốt khi chỉ sử dụng một phần số chiều: 768 dimensions, 512 dimensions, 256 dimensions, 128 dimensions

Điều này khá hữu ích khi muốn cùng một model nhưng có thể lựa chọn kích thước embedding khác nhau để đánh đổi giữa performance, storage và tốc độ Retrieval. Sentence Transformers xếp MatryoshkaLoss, AdaptiveLayerLossMatryoshka2dLoss vào nhóm Loss Modifiers.

VI. Lời kết

Ở bài viết trên mình đã giới thiệu một số Loss Function, hữu ích cho quá trình FineTune các model. Nếu đang xây một Embedding Model cho Semantic Search hoặc Retrieval, mình sẽ ưu tiên bắt đầu với MultipleNegativesRankingLoss. Đây là Loss phổ biến, dataset (anchor, positive) tương đối dễ xây dựng và Sentence Transformers cũng xem nó là một trong những lựa chọn mặc định được khuyến nghị. Tuy nhiên Loss Function chỉ là một phần của quá trình Fine-tune. Chất lượng của Positive, Hard Negative, False Negative, Batch Size và cách Sampling Dataset có thể ảnh hưởng rất lớn đến kết quả cuối cùng. Một Loss tốt cũng khó có thể cứu được một Dataset được chuẩn bị không tốt.

Ngoài ra các bạn có thể tham khảo thêm tại trang Loss Overview - Sentences Transformers SBERT. Mình cũng đã có một bài viết về Finetune Embedding model, nếu cần các bạn có thể tham khảo: Fine-tune Embedding Model với Sentence Transformers

Được chọn theo chủ đề và các khái niệm xuất hiện trong bài này.

Xem tất cả bài viết

Thảo luận bài viết

Câu hỏi, ghi chú và góc nhìn của bạn về nội dung này.

0 bình luận