Training Progress

🇻🇳 Vietnamese EmbeddingGemma-300M

Dự án học tập cá nhân — thử nghiệm fine-tune mô hình embedding văn bản tiếng Việt từ nền tảng EmbeddingGemma-300M của Google qua 5 vòng huấn luyện liên tiếp.


📦 Quick Start

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("LeNgocTu/vietnamese-embeddinggemma-300m")

# Dim mặc định 768
embeddings = model.encode(["Xin chào Việt Nam", "Hà Nội là thủ đô"])

# Matryoshka — linh hoạt kích thước
embeddings_512 = model.encode(["Xin chào"], truncate_dim=512)
embeddings_256 = model.encode(["Xin chào"], truncate_dim=256)
embeddings_128 = model.encode(["Xin chào"], truncate_dim=128)

Qua Ollama (GGUF):

ollama pull hf.co/LeNgocTu/vietnamese-embeddinggemma-300m-GGUF

🗂️ Quá trình Training

Toàn bộ thực hiện trên Google Colab Free (GPU Tesla T4) với Unsloth + SentenceTransformers framework. Mỗi vòng load lại LoRA từ vòng trước rồi train tiếp.

Vòng 1 — Nền tảng cơ bản

  • Data: anti-ai/ViNLI-SimCSE-supervised (~15K pairs)
  • Mục đích: Kiểm tra xem mô hình có thể học tiếng Việt từ NLI pairs không
  • Stage 1: MatryoshkaLoss(MNRL) — 1 epoch
  • Stage 2: MatryoshkaLoss(CoSENTLoss) — 10 epochs, LR=5e-6
  • Kết quả: STS test 0.8070 — tăng mạnh từ baseline 0.4945

Vòng 2 — Mở rộng dữ liệu

  • Data: ViNLI (65K thêm) + xnli/vi (32K) = tổng ~112K pairs
  • Mục đích: Kiểm tra xem nhiều data hơn có cải thiện không
  • Kết quả: STS test 0.8174 (+0.0104 so vòng 1)

Vòng 3 — Cải thiện Retrieval

  • Data: xnli/vi (48K phần mới) + taidng/UIT-ViQuAD2.0 (19K QA pairs)
  • Mục đích: ViQuAD là dữ liệu hỏi đáp thực tế — kỳ vọng cải thiện khả năng tìm tài liệu
  • Kết quả: STS test 0.8192, MRR@10 tăng lên 0.8452 — retrieval cải thiện rõ

Vòng 4 — Thử nghiệm Synthetic Data

  • Data: xnli/vi (25K phần mới) + 20K QA tổng hợp + Hard Neg mined (11K)
  • Synthetic data: Sinh từ wikimedia/wikipedia tiếng Việt bởi gemma4:31b-cloud qua Ollama — mỗi đoạn văn tạo 3 câu hỏi, 6,667 passages × 3 = 20,000 pairs, tỉ lệ thất bại 0%
  • Mục đích: Xem data tổng hợp chất lượng cao có bổ sung được gì không
  • Kết quả: STS test 0.8186 (giảm nhẹ 0.0006), Hard Neg Gap tăng lên 0.3264

Vòng 5 — Tinh chỉnh cuối (Final)

  • Data: Không thêm data mới — chỉ dùng Vi-STS (doanhieung/vi-stsbenchmark)
  • Mục đích: Calibrate lại sau vòng 4, tìm điểm tốt nhất qua nhiều epoch nhỏ
  • Config: CoSENTLoss, 20 epochs, LR=5e-7, batch=64, load_best_model_at_end=True
  • Kết quả: STS test 0.8203 — cao nhất toàn bộ quá trình

📊 Kết quả Đánh giá

Kết quả đo trên tập test nhỏ (doanhieung/vi-stsbenchmark), chỉ mang tính tham khảo, chưa qua đánh giá chuẩn hóa.

Metric Vòng 1 Vòng 2 Vòng 3 Vòng 4 Final
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

🏗️ Kiến trúc Training

Pipeline 2 stage mỗi vòng:

Stage 1: MatryoshkaLoss(MultipleNegativesRankingLoss)
         → Học phân biệt positive/negative pairs
         → Effective batch = 128 (batch 16 × accum 8)

Stage 2: MatryoshkaLoss(CoSENTLoss)  
         → Calibrate theo STS similarity scores
         → Batch = 32-64, load_best_model_at_end=True

Matryoshka dims: [768, 512, 256, 128]

  • Cho phép dùng embedding nhỏ hơn mà không cần train lại
  • MRL drop 768→128 chỉ 0.0012 ở bản final

LoRA config:

r = 16, lora_alpha = 32
Trainable params: 8,896,512 / 311,759,616 (2.85%)

🗄️ Dữ liệu Tổng hợp (Vòng 4)

Script sinh data: generate_vi_synthetic.py

Model sinh:  gemma4:31b-cloud (qua Ollama local)
Nguồn:       wikimedia/wikipedia (tiếng Việt)
Số passages: 6,667
Pairs/pass:  3 câu hỏi × 6,667 = 20,000 pairs
Thời gian:   9.4 giờ | Tốc độ: 2,135 pairs/giờ
Failed:      0 (0%)
Delay:       3 giây/request (tránh rate limit)
Format:      anchor (câu hỏi) / positive (passage) / negative (passage khác)

📁 Files trong Repo

File Mô tả
adapter_model.safetensors LoRA weights (16.8 MB) — phần đã được fine-tune
adapter_config.json Cấu hình LoRA (r=16, alpha=32)
tokenizer.json Tokenizer của Gemma3
config_sentence_transformers.json Cấu hình SentenceTransformers
1_Pooling/ Pooling layer config
2_Dense/ Dense projection layer
3_Dense/ Dense projection layer

Base model (~300MB) không lưu trong repo — được tải tự động từ unsloth/embeddinggemma-300m khi khởi tạo.


💾 GGUF Version

Phiên bản quantized để dùng offline qua Ollama:

# Pull từ HuggingFace
ollama pull hf.co/LeNgocTu/vietnamese-embeddinggemma-300m-GGUF

# Hoặc Ollama Hub
ollama pull denva099/vi_gemma_embedding
Quantization Size Ghi chú
Q8_0 ~313 MB Chất lượng cao nhất
Q4_K_M ~170 MB Nhỏ gọn hơn

📝 Ghi chú

Đây là dự án học tập — thực hiện trong thời gian rảnh trên Colab Free. Một số điều rút ra trong quá trình:

  • Data quality quan trọng hơn quantity (vòng 4 thêm 20K synthetic nhưng STS không tăng nhiều, Hard Neg Gap lại cải thiện rõ)
  • Vòng 5 chỉ tinh chỉnh nhẹ nhưng lại cho kết quả STS tốt nhất
  • Hard Neg Gap tăng từ 0.2172 → 0.3473 qua 5 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

🙏 Cảm ơn (Acknowledgments)

Dự án này được xây dựng dựa trên công sức của nhiều cá nhân và tổ chức trong cộng đồng mã nguồn mở:

Cảm ơn cộng đồng AI/NLP tiếng Việt đã chia sẻ dữ liệu và kiến thức để các dự án cá nhân như thế này trở nên khả thi.


👤 Tác giả

Fine-tune và biên soạn bởi Lê Ngọc Tú.

Nếu bạn dùng mô hình này cho nghiên cứu hoặc sản phẩm, một dòng ghi nhận (credit) là rất được trân trọng. Mọi góp ý, báo lỗi hay thảo luận đều hoan nghênh.

Downloads last month
17
Safetensors
Model size
0.3B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for LeNgocTu/vietnamese-embeddinggemma-300m

Finetuned
(23)
this model