Nâng cao
7 phút đọc6 tháng 7, 2026

Tokenizer Surgery: Cách build embedding model tiếng Thổ Nhĩ Kỳ mà không cần trai

Một cách tiếp cận cực kỳ thực dụng để adapt multilingual model sang ngôn ngữ ít tài nguyên không cần pretraining tốn kém, chỉ cần surgery tokenizer và offline distillation.

N

Nguyễn Nhật Long

@nguyennhatlong1303

Tokenizer Surgery: Cách build embedding model tiếng Thổ Nhĩ Kỳ mà không cần trai

Mình để ý một paper khá thú vị trên HuggingFace gần đây: embeddingmagibu-200m một sentence embedding model cho tiếng Thổ Nhĩ Kỳ, được build theo cách mà mình nghĩ anh em làm NLP cho tiếng Việt hay bất kỳ ngôn ngữ low-resource nào cũng nên đọc qua.

Vấn đề cốt lõi là thế này: bạn muốn có một embedding model tốt cho một ngôn ngữ cụ thể, nhưng không có đủ compute để pretrain từ đầu. Full pretraining một model 200M parameters tốn hàng chục nghìn GPU-hour không phải ai cũng có budget đó. Vậy thì làm sao?

Vấn đề với multilingual model khi xử lý ngôn ngữ agglutinative

Tiếng Thổ Nhĩ Kỳ thuộc nhóm ngôn ngữ agglutinative tức là một từ gốc có thể gắn thêm rất nhiều suffix để tạo ra hàng chục biến thể có nghĩa khác nhau. Ví dụ từ "ev" (nhà) có thể thành "evlerinizden" (từ những ngôi nhà của các bạn). Một multilingual tokenizer như của multilingual-e5 hay mBERT được train trên hàng trăm ngôn ngữ, nên vocabulary của nó không tối ưu cho tiếng Thổ một từ tiếng Thổ thường bị tokenize thành rất nhiều subword token, làm tăng sequence length và giảm chất lượng embedding.

Theo kinh nghiệm của mình khi làm với tiếng Việt, vấn đề tương tự cũng xảy ra nhiều multilingual model tokenize tiếng Việt theo kiểu character-level hoặc byte-pair encoding không phù hợp với cấu trúc âm tiết, dẫn đến context window bị "lãng phí" vào những token vô nghĩa.

Đây chính là lý do nhóm tác giả quyết định làm tokenizer surgery thay vì chỉ fine-tune thông thường.

Tokenizer Surgery là gì và tại sao nó hoạt động được?

Ở đây "surgery" không phải là ẩn dụ họ thực sự mổ xẻ tokenizer của model gốc và thay thế nó. Quy trình cụ thể:

Bước 1: Build tokenizer mới tối ưu cho tiếng Thổ

Họ train một BPE tokenizer với vocabulary size 131k token, hoàn toàn từ corpus tiếng Thổ. Con số 131k này lớn hơn nhiều so với vocabulary thông thường (thường 30-50k), nhưng với ngôn ngữ agglutinative thì cần nhiều hơn để cover các biến thể từ một cách hiệu quả. Kết quả là một từ tiếng Thổ trung bình cần ít token hơn đáng kể tức là cùng một câu, bạn dùng ít token hơn, context window 8192 token của model trở nên "thực sự" là 8192 token tiếng Thổ thay vì bị ăn mất một nửa.

Bước 2: Clone architecture và khởi tạo embedding table mới

Họ lấy teacher model (multilingual model gốc), clone toàn bộ transformer architecture, nhưng thay embedding table cũ bằng một embedding table mới tương thích với vocabulary 131k token. Phần khó nhất ở đây là khởi tạo embedding cho những token mới này như thế nào không thể random init vì sẽ mất quá nhiều thời gian để converge. Họ dùng kỹ thuật cross-lingual token alignment: với mỗi token mới trong vocabulary tiếng Thổ, tìm các token tương đương trong vocabulary cũ và dùng embedding trung bình của chúng làm điểm khởi đầu. Những token nào overlap hoàn toàn (như ký tự Latin, số) thì giữ nguyên embedding.

Bước 3: Offline Embedding Distillation

Đây là phần mình thấy elegant nhất. Thay vì distillation online (tức là teacher và student chạy song song trong lúc train rất tốn VRAM), họ làm offline: chạy teacher model trước trên toàn bộ dataset, lưu output embedding vectors xuống disk, rồi train student model để reproduce các vectors đó.

Lợi ích rõ ràng: bạn chỉ cần chạy teacher model một lần, sau đó training loop của student chỉ cần load precomputed vectors từ disk nhẹ hơn rất nhiều, có thể train trên hardware khiêm tốn hơn.

Loss function về cơ bản là cosine similarity loss giữa embedding của student và precomputed embedding của teacher:

Python
1# Simplified distillation loss
2def distillation_loss(student_emb, teacher_emb):
3 # Normalize cả hai về unit sphere
4 student_norm = F.normalize(student_emb, dim=-1)
5 teacher_norm = F.normalize(teacher_emb, dim=-1)
6
7 # Cosine similarity loss
8 cos_sim = (student_norm * teacher_norm).sum(dim=-1)
9 return (1 - cos_sim).mean()

Mục tiêu là student học cách map text tiếng Thổ (qua tokenizer mới) sang cùng embedding space với teacher tức là semantic meaning được preserve.

Kết quả thực tế

Mình thấy con số benchmark khá ấn tượng, đặc biệt khi so sánh cost:

Student 200M outperform teacher 300M trên cả hai benchmark tiếng Thổ. Điều này không quá surprising khi bạn có tokenizer tốt hơn cho một ngôn ngữ cụ thể, model nhỏ hơn có thể học hiệu quả hơn vì mỗi token mang nhiều thông tin ngữ nghĩa hơn.

ModelParametersSTSbTR PearsonTR-MTEBContext Window
Teacher (multilingual)300M~75%~61%8,192
embeddingmagibu-200m200M77.55%63.9%8,192

Trên TR-MTEB (Turkish Massive Text Embedding Benchmark), model đứng thứ 7 trong số 26 model trong khi đó là model nhỏ thứ 2 trong danh sách. Cost-quality trade-off ở đây thực sự tốt.

Tại sao cách này có thể áp dụng cho tiếng Việt?

Mình nghĩ đây là phần đáng để anh em suy nghĩ. Tiếng Việt không phải agglutinative như tiếng Thổ, nhưng vẫn có những vấn đề tokenization riêng:

  • Dấu thanh điệu làm cho character set lớn hơn nhiều so với tiếng Anh
  • Word segmentation phức tạp ("học sinh" là 1 entity hay 2 token?)
  • Nhiều multilingual model tokenize tiếng Việt theo byte-level, cực kỳ kém hiệu quả

Theo mình, approach này hoàn toàn applicable:

  1. Train BPE tokenizer trên corpus tiếng Việt lớn (CC-100 Vietnamese, OSCAR, v.v.)
  2. Clone một multilingual model tốt (e.g., multilingual-e5-large hay mE5-mistral)
  3. Cross-lingual init cho embedding table
  4. Offline distillation với Vietnamese text pairs

Chi phí compute sẽ thấp hơn rất nhiều so với pretraining, và kết quả có thể tốt hơn các multilingual model hiện tại trên Vietnamese benchmark.

Một vài điểm kỹ thuật đáng lưu ý

Anh em lưu ý một số trade-off khi áp dụng approach này:

Vocabulary size vs. inference speed: 131k vocabulary lớn hơn nhiều so với 30-50k thông thường. Embedding lookup layer sẽ nặng hơn, đặc biệt khi batch size lớn. Nhưng bù lại, sequence length ngắn hơn nên overall throughput vẫn tốt hơn.

Offline distillation dataset: Bạn cần precompute embeddings cho toàn bộ training corpus. Với dataset lớn (hàng triệu câu), storage có thể là vấn đề mỗi embedding vector 768 chiều, float32, tốn khoảng 3KB per sample. 10M samples là ~30GB. Không quá lớn nhưng cần tính trước.

Catastrophic forgetting của cross-lingual capability: Sau khi surgery và distillation, model sẽ giỏi ngôn ngữ target nhưng có thể mất khả năng cross-lingual của teacher. Nếu bạn cần cross-lingual retrieval (query tiếng Việt, document tiếng Anh), cần include parallel data trong training.

Chất lượng của teacher: Garbage in, garbage out. Nếu teacher model không tốt với ngôn ngữ target ngay từ đầu, offline distillation cũng chỉ học được những embedding kém. Nhóm tác giả chọn teacher cẩn thận một multilingual model đã có decent Turkish coverage.

Tooling được open-source

Điểm cộng lớn là nhóm tác giả release toàn bộ: model weights, tokenizer files, precomputed embedding datasets, và quan trọng nhất là cloning và distillation tooling. Tức là bạn không phải tự implement lại từ đầu có thể fork và adapt cho ngôn ngữ khác.

Mình chưa có thời gian dig vào code của họ, nhưng nếu anh em quan tâm đến hướng này cho tiếng Việt, đây là một starting point cực kỳ solid. Cái pipeline tokenizer surgery + offline distillation này về cơ bản là reusable cho bất kỳ ngôn ngữ nào chỉ cần có corpus đủ lớn và một multilingual teacher model decent.

Với tình trạng hiện tại của Vietnamese NLP nơi hầu hết embedding model tốt đều là multilingual và không được optimize cho tiếng Việt mình nghĩ approach này đáng để một team nào đó thử nghiêm túc. Compute cost thấp, methodology rõ ràng, và có precedent thực tế với kết quả tốt. Không cần H100 cluster, một vài A100 hoặc thậm chí RTX 4090 consumer card là có thể chạy được.

NN

Nguyễn Nhật Long

@nguyennhatlong1303

Nguyễn Nhật Long is a Senior Frontend Engineer and Frontend Team Leader with 7 years of experience building real-time fintech platforms. Specializing in React, Next.js, TypeScript, and React Native, shipping 10+ products across Web, Mobile, Telegram Mini-Apps, and Web3.

Thấy hay? Chia sẻ cho bạn bè!

Tokenizer Surgery: Cách build embedding model tiếng Thổ Nhĩ Kỳ mà không cần trai — Stacklog