3.9 Tokenization và word embedding
Trước khi văn bản trở thành đầu vào của mô hình, nó đi qua hai phép biến đổi: Tokenization và Embedding
Transformer không nhận văn bản thô. Nó nhận vector. Trước khi một đoạn chữ trở thành đầu vào mô hình, nó đi qua hai phép biến đổi: Tokenization (tách token) và Embedding (word embedding / nhúng từ). Hai bước trông đơn giản, nhưng quyết định mô hình “nhìn thấy” gì và “hiểu” gì — điểm khởi đầu của cả pipeline Transformer, và cũng là nhận thức nền tảng về mô hình hóa ngôn ngữ.
📑 Mục lục
- 1. Vì sao phải biến chữ thành vector
- 2. Tokenization: tách văn bản thành đơn vị cơ bản
- 3. One-hot encoding: lần thử đầu tiên thất bại
- 4. Word Embedding: bản đồ ngữ nghĩa trong không gian hình học
- 5. Thiếu thông tin vị trí: vì sao vẫn cần Positional Encoding
- 6. Từ Token ID đến ma trận đầu vào: lớp input của Transformer
- Checklist tự kiểm
- Tài liệu tham khảo
1. Vì sao phải biến chữ thành vector
Máy tính chỉ biết số, không biết chữ. “猫”, “cat”, “Katze” — với máy đều là chuỗi ký hiệu vô nghĩa. Nó không biết “猫” và “狗” đều là động vật, cũng không biết “happy” và “joyful” gần nghĩa.
Đầu vào mạng neural phải là ma trận số. Vậy trước khi chữ vào Transformer, cần giải hai bài toán:
- Tách đoạn: làm sao cắt một chuỗi chữ liên tục thành từng “đơn vị” có thể xử lý (Tokenization)?
- Mã hóa: làm sao biểu diễn mỗi “đơn vị” thành một vector số bắt được quan hệ ngữ nghĩa (Embedding)?
Cách giải hai bài toán này ảnh hưởng sâu đến khả năng hiểu và hiệu năng suy luận của mô hình.
2. Tokenization: tách văn bản thành đơn vị cơ bản
2.1 Token là gì
Token là đơn vị nhỏ nhất Transformer dùng để xử lý ngôn ngữ — không phải chữ cái, cũng không phải từ, mà là “mảnh từ” nằm giữa hai thứ đó.
Tùy chiến lược tách, cùng một chuỗi chữ cho ra các chuỗi token khác nhau:
Input: "Tokenization"
Character-level: T / o / k / e / n / i / z / a / t / i / o / n (12 tokens)
Word-level: Tokenization (1 token)
Subword: Token / ization (2 tokens) ← LLM phổ biến dùng
2.2 Tách subword: lựa chọn thực tế của LLM
LLM hiện đại hầu hết dùng chiến lược tách subword. Phương pháp phổ biến nhất là BPE (Byte Pair Encoding).
📌 Điểm then chốt: BPE bắt đầu từ ký tự, dần gộp các cặp ký tự tần suất cao thành token lớn hơn, cuối cùng được một từ vựng phủ từ thường dùng và ghép từ hiếm bằng subword.
Trực giác: BPE gộp tổ hợp tần suất cao thành một token, giữ tổ hợp thấp tần dưới dạng ghép subword. Từ quen (“play”, “run”) thường là token đầy đủ; từ hiếm hoặc từ mới (như “tokenization”) có thể thành “token” + “ization”, tránh bài toán unknown token (OOV). Lưu ý: cách tách của BPE là kết quả thống kê thuần data-driven, không nhất thiết theo gốc/tiếp tố ngôn ngữ học; kết quả phụ thuộc từ vựng huấn luyện.
Quy mô từ vựng ở các LLM thực tế:
| Mô hình | Kích thước vocab | Chiến lược tách |
|---|---|---|
| GPT-2 / GPT-3 | 50,257 | BPE |
| LLaMA-2 | 32,000 | SentencePiece BPE |
| LLaMA-3 | 128,256 | Tiktoken BPE |
| GPT-4 | ~100,000 | Tiktoken cl100k |
⚠️ Lưu ý: Vocab càng lớn phủ càng tốt, nhưng ma trận Embedding (phần dưới) cũng lớn hơn. LLaMA-3 nâng vocab từ 32K lên 128K, làm số tham số lớp Embedding tăng gấp 4.
2.3 Xử lý tiếng Trung trong Tokenization
Tiếng Trung không có khoảng trắng tự nhiên, nên cách xử lý khác tiếng Anh:
- Hầu hết LLM làm Tokenization cấp ký tự với tiếng Trung (mỗi chữ Hán một token), hoặc tách theo chuỗi byte UTF-8 của chữ Hán
- Mô hình tối ưu riêng cho tiếng Trung (như Qwen, dòng ChatGLM) thường có vocab lớn hơn, chứa nhiều cụm từ Trung như token riêng, nên sinh hiệu quả hơn
3. One-hot encoding: lần thử đầu tiên thất bại
Có Token ID rồi, cách vector hóa đơn giản nhất là One-Hot Encoding: giả sử vocab có token, mỗi token là vector dài , vị trí tương ứng bằng 1, còn lại bằng 0.
Ví dụ: vocab = [“猫”, “狗”, “鱼”, “河”, “银行”], kích thước :
Trông dùng được, nhưng có hai vấn đề chết người:
Vấn đề 1: bùng nổ chiều
Vocab thật có hàng chục nghìn token, mỗi vector cũng hàng chục nghìn chiều — lưu trữ và tính toán rất nặng. Nghiêm trọng hơn, đưa vector thưa này vào mạng neural buộc các lớp sau dùng ma trận trọng số khổng lồ. Hiệu năng rất kém.
Vấn đề 2: mất ngữ nghĩa
Các vector one-hot trực giao hoàn toàn — tích trong của “猫” và “狗” bằng 0, “猫” và “鱼” cũng bằng 0. Về toán, mọi token cách nhau như nhau, không liên hệ gì. Mô hình không học được quan hệ ngữ nghĩa nào từ mã hóa: “猫” và “狗” đều là thú cưng, đều là động vật — thông tin đó không tồn tại trong one-hot.
4. Word Embedding: bản đồ ngữ nghĩa trong không gian hình học
4.1 Ý tưởng cốt lõi: từ gần nghĩa thì gần nhau
Ý tưởng cốt lõi của Word Embedding: ánh xạ mỗi token vào một không gian vector liên tục chiều thấp, sao cho các từ gần ngữ nghĩa nằm gần nhau trong không gian đó.
Từ vector thưa chiều của one-hot, nén xuống vector đặc chiều (thường ):
| Mô hình | Kích thước vocab | Chiều vector | Tỷ lệ nén |
|---|---|---|---|
| BERT-base | 30,522 | 768 | ~40:1 |
| LLaMA-2-7B | 32,000 | 4,096 | ~8:1 |
| GPT-3 | 50,257 | 12,288 | ~4:1 |
Phác thảo 2D để hình dung (không gian Embedding thật cao chiều hơn nhiều):
Animals
狗 ● ● 猫
● 兔
● 鸟
Finance
● 银行 ● 钱
● 贷款
● 河流 Geography
● 湖泊
Có thể thấy “猫” và “狗” nằm rất gần (đều là thú cưng phổ biến). Lưu ý: trong Word Embedding tĩnh (như Word2Vec), token “银行” chỉ có một vector cố định, vị trí do mẫu đồng xuất hiện trung bình trên toàn corpus quyết định — ngữ cảnh tài chính và ngữ cảnh bờ sông mỗi bên kéo một phần, vector rơi vào giữa. Việc giải nghĩa thật sự thuộc về Self-Attention: nó điều chỉnh biểu diễn mỗi token theo các từ khác trong ngữ cảnh (“money” hoặc “river”), tạo vector ngữ cảnh khác nhau cho “银行”. Lớp Embedding là điểm xuất phát; Self-Attention làm giải nghĩa động.
4.2 Thuộc tính hình học bất ngờ của không gian Embedding
Word Embedding huấn luyện trên corpus lớn lộ ra cấu trúc hình học đáng ngạc nhiên:
Quan hệ loại suy từ:
Nghĩa là trong không gian Embedding, hướng từ “vua” → “nữ hoàng” gần như song song với hướng “đàn ông” → “đàn bà”. Quan hệ ngữ nghĩa được mã hóa thành quan hệ hình học.
Tính song song của biến đổi ngữ pháp:
Vector dịch chuyển từ nguyên dạng sang thì tiếp diễn gần như giống nhau với mọi động từ này — quy luật đổi thì trở thành một hướng dịch chuyển thống nhất.
💡 Gợi ý: Không ai thiết kế tay các thuộc tính này. Mô hình tự học từ khối lượng văn bản khổng lồ. Trong hàng trăm năm ghi chép chữ của loài người, đồng xuất hiện kiểu “狗追猫”, “猫抓鱼” nhiều hơn hẳn “猫追猫”, nên vị trí các từ dần thành bố cục như ngày nay.
4.3 Ma trận Embedding: bảng tra cứu có thể học
Trong Transformer, Word Embedding được hiện thực hóa thành ma trận tra cứu có thể học :
Đưa vào một Token ID, lấy đúng hàng tương ứng, được vector chiều:
Token ID = 1234 → W_emb[1234, :] → [0.12, -0.34, 0.07, ..., 0.91] (d_model dims)
Tương đương một lớp tuyến tính với đầu vào one-hot, nhưng hiện thực bằng index lookup, rẻ hơn nhiều so với nhân ma trận thật.
Số tham số lớp Embedding:
Với LLaMA-2-7B: tham số. Nghe nhiều, nhưng trong tổng 6.7B chỉ khoảng 2% — phần còn lại nằm trong 32 Decoder Block.
5. Thiếu thông tin vị trí: vì sao vẫn cần Positional Encoding
Word Embedding giải bài “mã hóa ngữ nghĩa”, nhưng để lại một lỗ hổng quan trọng: nó không chứa thông tin vị trí nào.
Xáo ba token của “猫追狗” thành “狗猫追”, các vector Embedding không đổi — mô hình không phân biệt được thứ tự. Nghĩa của ngôn ngữ phụ thuộc mạnh vào trật từ: “猫追狗” và “狗追猫” nghĩa ngược nhau.
Đó là lý do lớp input Transformer còn cộng thêm Positional Encoding (mã hóa vị trí):
Word Embedding cung cấp ngữ nghĩa, Positional Encoding cung cấp vị trí; cộng lại mới thành đầu vào đầy đủ của Transformer. Thiết kế chi tiết (Sinusoidal và RoPE) được giảng trong 3.6 Hiểu sâu positional encoding.
6. Từ Token ID đến ma trận đầu vào: lớp input của Transformer
Ghép pipeline lại với một ví dụ đầy đủ:
User input: "猫在桌子上"
Step 1: Tokenization
────────────────────────────────────────────────────
"猫在桌子上" → Tokenizer → [3421, 528, 11082, 319] (4 Token IDs)
猫 在 桌子 上
Step 2: Embedding Lookup
────────────────────────────────────────────────────
Token 3421 (猫) → W_emb[3421] → e_1: (d_model,)
Token 528 (在) → W_emb[528] → e_2: (d_model,)
Token 11082(桌子)→ W_emb[11082] → e_3: (d_model,)
Token 319 (上) → W_emb[319] → e_4: (d_model,)
Stack into input matrix X: (4, d_model)
Step 3: Add Positional Encoding
────────────────────────────────────────────────────
X[0] = e_1 + PE(0) ← "猫" at position 0
X[1] = e_2 + PE(1) ← "在" at position 1
X[2] = e_3 + PE(2) ← "桌子" at position 2
X[3] = e_4 + PE(3) ← "上" at position 3
Final input matrix X: (4, d_model) ← into Decoder Block layer 1
Cuối cùng, 4 token thành ma trận . Mỗi hàng là vector của một token (ngữ nghĩa + vị trí). Ma trận đó là đầu vào của Transformer Block.
Góc nhìn AI Infra: Ma trận Embedding đôi khi chia sẻ trọng số với LM Head đầu ra (Weight Tying), tiết kiệm bộ nhớ. GPT-2 dùng Weight Tying (, , chỉ lưu một ma trận ~38.6M); LLaMA-2 không chia sẻ (tie_word_embeddings: false trong config HuggingFace), Embedding và LM Head là hai bộ trọng số độc lập, tổng . Khi quantize, lớp Embedding thường không bị quantize (vì là lookup; lợi ích quantize ít mà mất độ chính xác lớn).
🎯 Checklist tự kiểm
- Nói rõ ba độ hạt Tokenization (ký tự, từ, subword) và vì sao LLM hiện đại chọn subword
- Giải thích hai khuyết điểm lớn của one-hot: bùng nổ chiều và mất ngữ nghĩa
- Nói rõ trực giác hình học của Word Embedding: từ gần nghĩa nằm gần trong không gian Embedding
- Nói được ý nghĩa hình học đằng sau loại suy kiểu king − man + woman ≈ queen
- Viết được công thức số tham số lớp Embedding () và kiểm bằng LLaMA-2-7B
- Giải thích vì sao trên Word Embedding vẫn cần Positional Encoding (thiếu thông tin vị trí)
- Mô tả trọn luồng: chữ → Token ID → Embedding → cộng mã hóa vị trí → ma trận đầu vào
📚 Tài liệu tham khảo
- Attention Is All You Need — paper gốc Transformer; thiết kế lớp input ở §3.4
- Neural Machine Translation of Rare Words with Subword Units — paper gốc thuật toán BPE (Sennrich et al., 2016)
- Efficient Estimation of Word Representations in Vector Space — paper gốc Word2Vec (Mikolov et al., 2013), công trình nền tảng của Word Embedding
- LLaMA 2: Open Foundation and Fine-Tuned Chat Models — chi tiết LLaMA-2, gồm thiết kế Tokenizer và Embedding
- tiktoken — thư viện BPE mã nguồn mở của OpenAI, công cụ thực tế của dòng GPT