Tokenizer Comparison
So sánh Tokenizer
Từ "Phở" sẽ bị tokenizer của GPT chia thành "Ph" + "ở" (2 token). Nhưng tokenizer của PhoBERT giữ nguyên "Phở" (1 token). Tại sao?
Chọn câu tiếng Việt và so sánh cách 3 tokenizer khác nhau chia token. Chú ý cách đánh dấu khoảng trắng khác nhau!
Hình minh họa
Văn bản gốc
Việt Nam là đất nước tôi
BPE
GPT-4, LLaMA, Claude
Số token: 6
| Đặc điểm | BPE | WordPiece | SentencePiece |
|---|---|---|---|
| Khoảng trắng | Đầu token ( Nam) | ## nối (##Nam) | ▁ đánh dấu (▁Nam) |
| OOV | Chia sub-token | Chia ##sub | Chia ở mức byte |
| Pre-tokenize | Cần (tách từ trước) | Cần | Không cần! |
| Mô hình | GPT, LLaMA, Claude | BERT, PhoBERT | T5, mBERT |
Ba tokenizer đều là subword — chia từ hiếm thành mảnh nhỏ. Nhưng khác nhau ở cách đánh dấu khoảng trắng: BPE giữ dấu cách, WordPiece dùng ##, SentencePiece dùng ▁.
Quan trọng nhất: tokenizer phải được huấn luyện trên ngôn ngữ đúng! GPT tokenizer (tiếng Anh) chia "Phở" thành 2 token, PhoBERT tokenizer (tiếng Việt) giữ nguyên 1 token.
Token "##Nam" trong WordPiece có ý nghĩa gì?
Tiếng Việt có thách thức riêng cho tokenizer: dấu thanh, từ ghép, và ranh giới từ phức tạp.
GPT Tokenizer (tiếng Anh)
"Phở" → "Ph" + "ở" (2 token)
"Nguyễn" → "Ng" + "uy" + "ễn" (3 token)
"Việt Nam" → "Vi" + "ệt" + " Nam" (3 token)
Từ tiếng Việt bị chia nhỏ quá mức → tốn token → đắt tiền!
PhoBERT Tokenizer (tiếng Việt)
"Phở" → "Phở" (1 token)
"Nguyễn" → "Nguyễn" (1 token)
"Việt Nam" → "Việt_Nam" (1 token)
Từ tiếng Việt giữ nguyên → ít token → hiệu quả!
Giải thích
Ba phương pháp tokenization subword phổ biến nhất, mỗi cái có cách xử lý khoảng trắng và từ mới khác nhau. BPE được dùng bởi GPT trong khi WordPiece là lựa chọn của BERT — chọn sai tokenizer cho ngôn ngữ sẽ khiến số token tăng vọt và chi phí inference đắt hơn.
Thuật toán nén dữ liệu áp dụng cho NLP (Sennrich et al., 2016):
Bắt đầu từ byte đơn, lặp lại ghép cặp phổ biến nhất. GPT-4 dùng ~100K token BPE. "Tokenization" → "Token" + "ization" vì cặp này phổ biến.
WordPiece: Tương tự BPE nhưng dùng likelihood (ML) thay vì tần suất để chọn cặp ghép. Dùng ## đánh dấu subword. BERT dùng 30K WordPiece tokens.
SentencePiece: Xử lý ở mức byte, KHÔNG cần pre-tokenize (tách từ trước). Dùng ▁ đánh dấu đầu từ. Tốt cho đa ngôn ngữ vì xử lý mọi Unicode script.
from transformers import AutoTokenizer
text = "Phở Hà Nội rất ngon"
# 1. BPE (GPT-2)
gpt2_tok = AutoTokenizer.from_pretrained("gpt2")
print("BPE:", gpt2_tok.tokenize(text))
# ['Ph', 'ở', ' H', 'à', ' N', 'ội', ' r', 'ất', ' ngon']
# → 9 token! Tiếng Việt bị chia nhỏ
# 2. WordPiece (BERT multilingual)
bert_tok = AutoTokenizer.from_pretrained(
"bert-base-multilingual-cased")
print("WordPiece:", bert_tok.tokenize(text))
# ['Ph', '##ở', 'Hà', 'Nội', 'rất', 'ngon']
# → 6 token, tốt hơn
# 3. SentencePiece (PhoBERT - tiếng Việt)
phobert_tok = AutoTokenizer.from_pretrained("vinai/phobert-base")
print("SentencePiece:", phobert_tok.tokenize(text))
# ['Phở', 'Hà_Nội', 'rất', 'ngon']
# → 4 token! Tối ưu cho tiếng Việt
# Bài học: tokenizer phù hợp ngôn ngữ = ít token = hiệu quả!NLU (hiểu): PhoBERT tokenizer (SentencePiece + RDRSegmenter). NLG (sinh): Nếu dùng GPT/Claude, chấp nhận BPE chia nhỏ. Hoặc dùng mô hình đa ngôn ngữ với SentencePiece (mBERT, XLM-R) cho hiệu quả tốt hơn.
- BPE: dấu cách đầu token, dùng tần suất ghép cặp. GPT, LLaMA, Claude.
- WordPiece: ## đánh dấu subword, dùng likelihood. BERT, PhoBERT.
- SentencePiece: ▁ đánh dấu đầu từ, xử lý mức byte, không cần pre-tokenize. T5, mBERT.
- Tiếng Việt: GPT tokenizer chia 'Phở' thành 2 token, PhoBERT giữ nguyên 1 token.
- Chọn tokenizer phù hợp ngôn ngữ = ít token = tiết kiệm chi phí + hiệu quả cao.
Kiểm tra hiểu biết
BPE đánh dấu khoảng trắng bằng cách nào?