Đăng ngày 06/11/2026
Fine-tune mô hình embedding tiếng Việt qua 5 vòng trên Colab miễn phí: điều mình học được
Ghi lại 5 vòng fine-tune EmbeddingGemma-300M cho tiếng Việt trên Google Colab miễn phí: dữ liệu từng vòng, số liệu thật và những bài học rút ra.
- Embedding
- Fine-tuning
- Tiếng Việt
- RAG

Đây là một dự án học tập cá nhân, làm trong thời gian rảnh. Mình muốn biết một mô hình embedding nhỏ của Google có thể học tiếng Việt tốt đến đâu nếu chỉ dùng GPU miễn phí và dữ liệu công khai. Bài này ghi lại những gì mình đã làm, số liệu thật của từng vòng và những điều rút ra, kể cả phần chưa chắc chắn.
Thiết lập
Mình bắt đầu từ EmbeddingGemma-300M (bản của Unsloth) và fine-tune bằng LoRA với rank 16, alpha 32. Chỉ khoảng 2,85% tham số được huấn luyện (8.896.512 trên 311.759.616). Toàn bộ chạy trên Google Colab miễn phí với GPU Tesla T4, dùng Unsloth cùng Sentence Transformers. Mô hình dùng MatryoshkaLoss với các kích thước vector 768, 512, 256 và 128, nên sau này có thể cắt vector nhỏ hơn mà không cần huấn luyện lại.
Mỗi vòng gồm hai giai đoạn. Giai đoạn một dùng MatryoshkaLoss bọc MultipleNegativesRankingLoss để mô hình học phân biệt cặp đúng và cặp sai. Giai đoạn hai dùng MatryoshkaLoss bọc CoSENTLoss để căn chỉnh theo điểm tương đồng ngữ nghĩa. Mỗi vòng nạp lại LoRA của vòng trước rồi huấn luyện tiếp.
Năm vòng, mỗi vòng thử một giả thuyết
Vòng 1: kiểm tra xem mô hình có học được không. Dữ liệu là ViNLI-SimCSE supervised, khoảng 15 nghìn cặp. Điểm STS test tăng mạnh từ mức gốc 0.4945 lên 0.8070.
Vòng 2: thêm dữ liệu. Thêm ViNLI và xnli/vi, tổng khoảng 112 nghìn cặp. STS test lên 0.8174.
Vòng 3: cải thiện khả năng tìm tài liệu. Thêm phần mới của xnli/vi và UIT-ViQuAD2.0, khoảng 19 nghìn cặp hỏi đáp thật. STS test lên 0.8192 và MRR@10 lên 0.8452, tìm kiếm cải thiện rõ.
Vòng 4: thử dữ liệu tổng hợp. Mình dùng mô hình gemma4:31b-cloud qua Ollama để sinh câu hỏi từ Wikipedia tiếng Việt: 6.667 đoạn văn, mỗi đoạn ba câu hỏi, tổng 20.000 cặp, mất 9,4 giờ với độ trễ 3 giây mỗi yêu cầu và không có yêu cầu nào thất bại. Thêm khoảng 11 nghìn hard negative. STS test giảm nhẹ xuống 0.8186, nhưng Hard Neg Gap tăng lên 0.3264.
Vòng 5: tinh chỉnh cuối. Không thêm dữ liệu mới, chỉ dùng Vi-STS với CoSENTLoss, 20 epoch, learning rate 5e-7, batch 64 và giữ lại checkpoint tốt nhất. STS test đạt 0.8203, cao nhất toàn bộ quá trình.
Kết quả theo từng vòng
| Chỉ số | Vòng 1 | Vòng 2 | Vòng 3 | Vòng 4 | Bản cuối |
|---|---|---|---|---|---|
| STS test | 0.8070 | 0.8174 | 0.8192 | 0.8186 | 0.8203 |
| STS dev | 0.8492 | 0.8502 | 0.8505 | 0.8515 | 0.8523 |
| MRR@10 | 0.8361 | 0.8361 | 0.8452 | 0.8426 | 0.8441 |
| Hard Neg Gap | 0.2172 | 0.2688 | 0.3125 | 0.3264 | 0.3473 |
| MRL drop 128 | 0.0070 | 0.0035 | 0.0022 | 0.0008 | 0.0012 |
Cột cuối cho thấy cắt vector từ 768 xuống 128 chiều chỉ làm giảm điểm 0.0012, nên có thể tiết kiệm bộ nhớ khá nhiều khi lưu vector.
Những gì mình rút ra
Chất lượng dữ liệu quan trọng hơn số lượng. Vòng 4 thêm 20 nghìn cặp tổng hợp nhưng STS gần như không tăng, trong khi Hard Neg Gap cải thiện rõ. Nghĩa là dữ liệu tổng hợp không làm mô hình giỏi hơn trên thước đo chung, nhưng giúp nó phân biệt tốt hơn các đoạn gần giống nhau.
Vòng cuối chỉ tinh chỉnh nhẹ mà cho kết quả STS tốt nhất. Sau một vòng thêm dữ liệu khá ồn như vòng 4, việc căn chỉnh lại với learning rate rất nhỏ trên một tập chuẩn có ích hơn mình tưởng.
Hard Neg Gap tăng đều từ 0.2172 lên 0.3473 qua năm vòng, cho thấy mô hình học phân biệt ngữ nghĩa ngày càng tốt hơn.
Hạn chế cần nói rõ
Mình chưa so sánh với các mô hình embedding tiếng Việt khác trên cùng một bộ đánh giá chuẩn, nên chưa thể nói mô hình này tốt hơn hay kém hơn chúng.
Dùng thử
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("LeNgocTu/vietnamese-embeddinggemma-300m")
# Kích thước mặc định 768
embeddings = model.encode(["Xin chào Việt Nam", "Hà Nội là thủ đô"])
# Matryoshka: chọn kích thước nhỏ hơn
embeddings_256 = model.encode(["Xin chào"], truncate_dim=256)
Mô hình và model card đầy đủ có trên Hugging Face. Nếu bạn dùng thử và gặp vấn đề, hoặc có góp ý về cách đánh giá, mình rất muốn nghe.