Tokenization
1、背景故事
想像你是一位老師,要幫學生批改作文。學生交上來的文章是一長串沒有標點、沒有空格的文字,例如:「我今天早上去學校吃早餐老師說要考試」。你看著這一串字,會覺得很難分辨哪裡是一個詞、哪裡是一個句子。
同樣地,當電腦接收到一段文字時,它並不像人類那樣能自然理解語意。電腦只看到一連串的字元(characters),例如英文字母或中文漢字。為了讓電腦能「理解」或「處理」這些文字,我們需要先幫它切分成有意義的單位,這個步驟就叫做 Tokenization(斷詞或分詞)。
2、解決的痛點
2-1、讓電腦能看懂文字的基本單位
電腦無法直接理解句子的語意,它只能處理數字。Tokenization 的第一個任務,就是把文字拆解成一個個「可管理的單位」——稱為 token。
例如英文句子:
I love machine learning.
可以被切成:["I", "love", "machine", "learning", "."]
而中文句子:
我愛機器學習
則可能被切成:["我", "愛", "機器學習"]
切分後,每個 token 可以對應一個數字索引,便於模型處理。
2-2、處理語言多樣性與詞彙爆炸
不同語言有不同的複雜性。英文中空格自然作為詞界定符,但中文沒有空格,需要依靠模型或演算法判斷詞邊界。
此外,詞彙量非常龐大,新詞不斷出現(例如「ChatGPT」這樣的詞),若每個詞都視為一個 token,字典會變得極大,模型難以訓練。
為了解決這個問題,現代的 Tokenization 常採用 子詞級(subword level) 的方法,例如 Byte Pair Encoding (BPE) 或 WordPiece。
這些方法能把新詞拆成已知的子詞,讓模型即使沒見過完整詞彙,也能理解其結構。
2-3、轉換為模型可理解的數字表示
Tokenization 的最終目標,是將文字轉換成數字序列。
假設我們有詞彙表(vocabulary)如下:
| Token | ID |
|---|---|
| I | 1 |
| love | 2 |
| machine | 3 |
| learning | 4 |
| . | 5 |
那麼句子「I love machine learning .」會被轉換為:
模型接收的就是這個數字序列,再經過嵌入(embedding)層轉換為向量,進一步進行語言理解或生成。
2-4、兼顧效率與準確性的平衡
Tokenization 不只是切詞這麼簡單,還要在「切得太細」與「切得太粗」之間取得平衡。
切得太細(例如以字為單位)會造成序列太長,模型處理效率低;切得太粗(例如整句當一個 token)又會導致語意難以學習。
因此,好的 tokenization 策略能在保持語意的同時,控制序列長度與模型複雜度,為後續的語言建模奠定良好基礎。
3、將文字轉換為數字(Embedding 前的準備)
3-1、Tokenization 的輸入與輸出
假設我們有一句話:「我 愛 AI」。
經過 Tokenization 之後,模型會把句子切成三個 token:
接著,每個 token 被對應到詞彙表中的索引(vocabulary ID):
| Token | ID |
|---|---|
| 我 | 1 |
| 愛 | 2 |
| AI | 3 |
因此,整句話可以被轉換成一個索引序列:
痛點:電腦無法直接理解文字,必須先轉換為數字索引,才能進入模型運算。
4、將 Token ID 轉成向量(Embedding)
4-1、建立詞嵌入矩陣
每個 token ID 都會對應到一個向量,我們透過一個嵌入矩陣(Embedding Matrix)來表示。
假設詞彙表大小為 \(3\),每個詞的向量維度為 \(4\),則嵌入矩陣如下:
痛點:讓文字能以數值形式被模型理解,同時保留語意的連續性。
4-2、從索引取出對應的向量
根據 input IDs = [1, 2, 3],我們取出對應的三個詞向量:
痛點:將離散的 token 轉化為可計算的連續向量,為後續神經網路運算做準備。
5、前向傳播示範(單層線性變換)
5-1、設置線性層的權重與偏置
我們設置線性層的權重矩陣 \(W\)(將 4 維輸入轉為 2 維輸出)以及偏置向量 \(b\):
痛點:建立線性層可讓模型學習不同維度之間的加權關係,模擬語意的組合。
5-2、進行矩陣運算(前向傳播)
我們將嵌入向量矩陣 \(X\) 經過線性轉換:
矩陣相乘:
再加上偏置向量 \(b\):
痛點:將詞向量透過線性變換映射到新特徵空間,提取更高層次語意特徵。
5-3、套用非線性激活函數(ReLU)
接下來通過 ReLU 函數:
由於 \(Z\) 中的值皆為正數,輸出不變:
痛點:非線性激活讓模型能捕捉更複雜的語言關係,而非僅僅是線性組合。