Skip to content

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 .」會被轉換為:

\[ [1, 2, 3, 4, 5] \]

模型接收的就是這個數字序列,再經過嵌入(embedding)層轉換為向量,進一步進行語言理解或生成。

2-4、兼顧效率與準確性的平衡

Tokenization 不只是切詞這麼簡單,還要在「切得太細」與「切得太粗」之間取得平衡。
切得太細(例如以字為單位)會造成序列太長,模型處理效率低;切得太粗(例如整句當一個 token)又會導致語意難以學習。
因此,好的 tokenization 策略能在保持語意的同時,控制序列長度與模型複雜度,為後續的語言建模奠定良好基礎。

3、將文字轉換為數字(Embedding 前的準備)

3-1、Tokenization 的輸入與輸出

假設我們有一句話:「我 愛 AI」。
經過 Tokenization 之後,模型會把句子切成三個 token:

\[ \text{tokens} = ["我", "愛", "AI"] \]

接著,每個 token 被對應到詞彙表中的索引(vocabulary ID):

Token ID
1
2
AI 3

因此,整句話可以被轉換成一個索引序列:

\[ \text{input IDs} = [1, 2, 3] \]

痛點:電腦無法直接理解文字,必須先轉換為數字索引,才能進入模型運算。


4、將 Token ID 轉成向量(Embedding)

4-1、建立詞嵌入矩陣

每個 token ID 都會對應到一個向量,我們透過一個嵌入矩陣(Embedding Matrix)來表示。
假設詞彙表大小為 \(3\),每個詞的向量維度為 \(4\),則嵌入矩陣如下:

\[ E\ (shape=3\times4)= \begin{bmatrix} 0.2 & 0.1 & 0.4 & 0.3\\ 0.5 & 0.7 & 0.1 & 0.2\\ 0.9 & 0.6 & 0.3 & 0.8 \end{bmatrix} \]

痛點:讓文字能以數值形式被模型理解,同時保留語意的連續性。


4-2、從索引取出對應的向量

根據 input IDs = [1, 2, 3],我們取出對應的三個詞向量:

\[ X\ (shape=3\times4)= \begin{bmatrix} 0.2 & 0.1 & 0.4 & 0.3\\ 0.5 & 0.7 & 0.1 & 0.2\\ 0.9 & 0.6 & 0.3 & 0.8 \end{bmatrix} \]

痛點:將離散的 token 轉化為可計算的連續向量,為後續神經網路運算做準備。


5、前向傳播示範(單層線性變換)

5-1、設置線性層的權重與偏置

我們設置線性層的權重矩陣 \(W\)(將 4 維輸入轉為 2 維輸出)以及偏置向量 \(b\)

\[ W\ (shape=4\times2)= \begin{bmatrix} 0.1 & 0.3\\ 0.2 & 0.4\\ 0.5 & 0.6\\ 0.7 & 0.8 \end{bmatrix} \]
\[ b\ (shape=1\times2)= \begin{bmatrix} 0.05 & 0.1 \end{bmatrix} \]

痛點:建立線性層可讓模型學習不同維度之間的加權關係,模擬語意的組合。


5-2、進行矩陣運算(前向傳播)

我們將嵌入向量矩陣 \(X\) 經過線性轉換:

\[ 矩陣A = X\ (shape=3\times4) \]
\[ 矩陣B = W\ (shape=4\times2) \]

矩陣相乘:

\[ 矩陣A \cdot 矩陣B = 矩陣C\ (shape=3\times2) \]

再加上偏置向量 \(b\)

\[ Z = 矩陣C + b = \begin{bmatrix} 0.93 & 1.19\\ 0.72 & 1.08\\ 1.05 & 1.31 \end{bmatrix} \]

痛點:將詞向量透過線性變換映射到新特徵空間,提取更高層次語意特徵。


5-3、套用非線性激活函數(ReLU)

接下來通過 ReLU 函數:

\[ \text{ReLU}(Z) = \max(0, Z) \]

由於 \(Z\) 中的值皆為正數,輸出不變:

\[ H\ (shape=3\times2)= \begin{bmatrix} 0.93 & 1.19\\ 0.72 & 1.08\\ 1.05 & 1.31 \end{bmatrix} \]

痛點:非線性激活讓模型能捕捉更複雜的語言關係,而非僅僅是線性組合。