【個人上課筆記】2026 TAICA 自然語言處理 - 第七周
【個人上課筆記】2026 TAICA 自然語言處理 - 第七周
Hello Guys I’m LukeTseng. 本篇筆記主要紀錄跟統整上課內容,性質屬於個人學習用途,敬請斟酌參考,謝謝。
清大 MOOCS 2026 TAICA 自然語言處理課程網址:https://mooc.nthu.edu.tw/course/info/470
Tokenization 的作用
自然語言模型不能直接處理原始字串,必須先把文字切分成模型可辨識的基本單位,也就是 Token,再轉換成整數 ID。
基本流程:原始文字 → Token → Token ID → 向量表示 → 模型運算
傳統自然語言處理常使用斷詞(Word Segmentation),將句子切成有意義的詞;現代模型則使用更通用的 Tokenization,Token 不一定是完整詞,也可能是一個字、詞的一部分或特殊符號。
Vocabulary
詞彙庫(Vocabulary)是模型所有可辨識 Token 的集合,每個 Token 都有固定的 Token ID。
Vocabulary 與 Embedding 的功能不同:
- Vocabulary:決定模型認得哪些 Token。
- Embedding:決定每個 Token 如何表示成向量。
使用 Word2Vec、GloVe、fastText 或預訓練語言模型時,通常會直接使用該模型既有的 Vocabulary。若要處理特殊領域、不同語言或從頭訓練模型,才可能需要自行建立 Vocabulary。
下一個 Token 預測
語言模型不是直接「創造」下一個字,而是在 Vocabulary 中計算每個候選 Token 的機率。
例如輸入 I love an __,模型可能得到以下的機率表:
| Token | 機率 |
|---|---|
| apple | 0.600 |
| elephant | 0.300 |
| eraser | 0.050 |
模型會根據機率分布選擇下一個 Token。
以 RNN 為例,模型先根據前文產生隱藏狀態 ,再透過分類層將 轉換成 Vocabulary size 維的輸出:
接著經過 Softmax,得到 Vocabulary 中各 Token 的機率。
因此,下一個 Token 預測本質上是一個類別數非常多的多類別分類問題。
Vocabulary Size
| 模型 | Vocabulary Size |
|---|---|
| BERT | 30,522 |
| GPT-2/GPT-3 | 50,257 |
| T5 | 32,128 |
重點不是記住數字,而是理解現代模型通常使用數萬個 Token,Vocabulary 並不包含所有完整單字,而是透過統計式切分方法建立。
基本 NLP Pipeline
在本節,將自然語言處理流程整理為:
- 建立詞彙庫(Build the Vocabulary)
- 學習 Token 表示(Learn the Representations)
- 使用模型進行預測(Perform Predictions)
其中,本章接下來要處理的核心問題是第一步:應該如何把文字切成適合模型使用的 Token?
傳統斷詞主要尋找完整詞;次詞切分則允許把單字拆成較小且可重複使用的片段,以控制 Vocabulary 大小並減少罕見詞問題。
如何建立 Vocabulary
最直接的做法,是先根據分隔符號(Delimiter)切分訓練語料,再把出現過的詞收集起來、計算頻率,最後為每個詞配置唯一 ID。
例如訓練語料為 I love apples. I like apples and pineapples.
若以空白與標點符號切分,可以得到:I、love、apples、.、like、and、pineapples
接著建立對照表:
| Word | ID |
|---|---|
| and | 0 |
| apples | 1 |
| I | 2 |
| like | 3 |
| love | 4 |
| pineapples | 5 |
| . | 6 |
<UNK> | 7 |
實際建立 Vocabulary 時,還可能加入這些技巧:
- 詞幹化(Stemming):將詞轉回較基本的形式。
- 停用詞處理(Stop-word Processing):依任務決定是否移除常見但資訊量較低的詞。
- 詞頻統計(Frequency Counting):移除太少出現的詞,以控制 Vocabulary 大小。
這類流程與傳統搜尋引擎建立詞彙索引的方式相似:切詞、正規化、統計次數,再為詞彙編號。
特殊 Token:<UNK>
<UNK> 代表未知詞(Unknown Word),用來處理訓練語料中沒有出現過的詞。
假設 Vocabulary 只有 apple、like、love、pineapple,測試時若出現一個未收錄的詞,就會被轉換成 <UNK>。
這類特殊 Token 與先前課程中的起始符號概念相同,特殊符號本身沒有天然語意,而是必須在訓練過程中就出現,模型才能學會它所代表的功能。
問題在於,所有未知詞都會變成相同的 <UNK>,而模型因此無法區分:
- 人名
- 地名
- 新出現的專有名詞
- 醫學術語
- 拼錯但仍可辨認的單字
這會造成大量資訊流失。
以分隔符號切詞的問題
只適合部分西方語言
英文單字通常以空白隔開,因此可以直接使用空白作為分隔符號:I / love / apples
但中文、日文等語言的詞與詞之間是沒有空白的,例如這句「我喜歡自然語言處理」。
只靠空白無法判斷應切成 我 / 喜歡 / 自然語言處理 還是 我 / 喜歡 / 自然 / 語言 / 處理。
因此,Delimiter-based Segmentation 無法直接解決這些語言的斷詞問題。
無法有效處理未見詞
即使英文有空白,只要一個完整單字沒有出現在訓練資料中,就可能直接變成 <UNK>。
例如某個單字只是拼錯一個字母,雖然仍保留許多原本的構詞資訊,模型卻可能完全視為未知詞。
人名、醫學名詞與地名會持續產生,這些詞可能由既有字根、前綴或後綴組成,但完整形式未必出現在訓練語料中。
像醫學詞彙經常由 Prefix + Root + Suffix 組合而成,若只把完整單字視為一個 Token,就無法利用其中較小單位所帶有的構詞資訊(Morphological Information)。
複合詞造成的機器翻譯問題
機器翻譯中的來源語言與目標語言,不一定存在一對一的詞彙對應。
例子:sewage water treatment plant,翻譯成德文後,可以組成一個完整複合詞 Abwasserbehandlungsanlage,這個德文詞內部包含多個語意成分:
Abwasser:污水Behandlung:處理Anlage:設備、設施
英文使用多個以空白分隔的詞,德文則可以將多個成分合併成一個長詞,若只根據空白切分的話:
- 英文會得到多個 Token。
- 德文卻只會得到一個 Token。
這不但使來源語言與目標語言難以對齊,也容易讓少見的德文複合詞成為未知詞。
Sub-word units are favored.
也就是將完整單字進一步拆成較小的次詞單位,讓模型可以辨認其中重複出現的構詞成分。
Segmentation 與 Tokenization 的差別
兩者的操作有交集,但處理目的與細緻程度不同。
Segmentation
Segmentation 是較廣泛的「分段」概念,例如:
- 從文件中切出句子:Sentence Segmentation
- 從句子中切出詞:Word Segmentation
它傾向找出較高階、具有語言意義的單位。
Tokenization
Tokenization 則是把資料切成模型實際處理的 Token,Token 可以是:
- 完整詞
- 次詞
- 字元
- 字母
- 子字串(Substring)
- 指令序列中的一個符號
所有 Tokenization 都包含某種 Segmentation,但並非所有 Segmentation 都是在建立模型所需的 Token。
例如,把一篇文章切成多個句子屬於 Segmentation,但這些句子未必直接成為模型 Vocabulary 中的 Token。
相較之下,Sub-word Tokenization 可以從單字或句子中切出較細小的單位,這些單位會被收錄進 Vocabulary,並配置 Token ID。
次詞切分(Sub-word Tokenization)的目的
次詞切分(Sub-word Tokenization)是在「完整詞」與「單一字元」之間取得平衡,若以完整詞為 Token,結果會是:
- Vocabulary 容易變得很大。
- 罕見詞容易成為
<UNK>。 - 無法利用前綴、後綴與複合詞結構。
若全部切成單一字元則會:
- 幾乎不會出現未知詞。
- 但句子序列會變長。
- 單一字元可能承載的語意較少。
因此,Sub-word Tokenization 希望:
- 常見單字可以保留為完整 Token。
- 罕見單字可以拆成多個常見片段。
- 降低未知詞問題。
- 控制 Vocabulary 大小。
- 保留部分構詞資訊。
fastText 的字元級表示
以 fastText 為例,說明較細粒度切分對未知詞的幫助。
fastText 會利用單字內部的字元資訊,因此即使完整單字未曾出現,也可以根據其中的字元片段組合出表示。
其優點是對未見詞較有處理能力,但也有侷限:如果單字真正的語意無法由字母或片段直接推得,利用字元組合得到的表示也可能不準確。
切得更細並不會變得更好,而是需要在完整詞語意、未知詞處理與序列長度之間取得平衡。
常見的 Sub-word Tokenization 演算法
Byte Pair Encoding,BPE
BPE 透過統計語料中經常共同出現的相鄰單位,逐步合併成較大的次詞 Token。
其精神與資料探勘中的頻繁樣式(Frequent Pattern)相似:找出經常一起出現的組合。
WordPiece
此演算法的應用模型包含 BERT 與 T5。
WordPiece 與 BPE 的精神相近,但選擇與建立次詞單位的方式不完全相同。
Unigram Language Model
此方法同樣用於建立次詞 Vocabulary,但其出發方式與 BPE 類方法不同。
整理訓練語料
上課投影片使用的訓練語料包含四種單字:
| Word | Frequency |
|---|---|
| low | 5 |
| lower | 2 |
| newest | 6 |
| widest | 3 |
這裡並不需要把相同單字重複寫很多次,而是將每個不同單字及其出現次數整理成表格。例如 low 出現 5 次,表示在計算字元組合頻率時,low 內的所有相鄰組合都要乘上 5。
把每個單字拆成字元序列
BPE 一開始不假設任何完整詞或次詞,而是先把每個單字拆成單一字元:
low → l o w </w>lower → l o w e r </w>newest → n e w e s t </w>widest → w i d e s t </w>
其中 </w> 是特殊的單字結束符號(End-of-word Symbol),它的用途是標示一個單字在哪裡結束,使模型可以區分:
- 出現在單字內部的片段。
- 出現在單字結尾的片段。
例如 est 跟 與 est</w>,在這套表示中可以被視為不同 Token,前者只是某個單字中的片段,後者則代表 est 位於單字結尾。
特殊符號可以依任務設計;在一般語言模型中,通常會使用既定的特殊符號,而不需要自行設計太多。
建立初始 Vocabulary
由於一開始所有單字都被拆成單一字元,因此初始 Vocabulary 就是訓練語料中出現過的所有字元,再加上 </w>:</w>, d, e, i, l, n, o, r, s, t, w
此時 Vocabulary 中還沒有 es、est、lo 等多字元 Token,換句話說,BPE 的起點是最細的字元級表示,接下來再根據語料統計,逐步產生較大的次詞單位。
尋找最高頻的相鄰 Token Pair
接著,統計所有相鄰 Token Pair 的加權頻率。
以 es 為例:
newest → n e w e s t </w>widest → w i d e s t </w>
newest 出現 6 次,因此 e s 在這個單字中貢獻 6 次;widest 出現 3 次,因此再貢獻 3 次。
所以 ,在這一次統計中,e s 是出現頻率最高的相鄰組合,因此 BPE 選擇它進行合併。
這裡計算的不是「包含字母 e 和 s 的單字數量」,而是兩者必須在目前 Token 序列中相鄰。
更新整份語料中的 Token 序列
加入 es 後,必須將訓練語料中所有相鄰的 e s 都替換成 es:
newest → n e w es t </w>widest → w i d es t </w>
而 low 與 lower 中沒有相鄰的 e s,所以維持不變:
low → l o w </w>lower → l o w e r </w>
這個更新相當重要,因為下一輪不是再從原始字元序列重新統計,而是從目前已經合併過的 Token 序列繼續尋找最高頻 Pair。
反覆執行合併
BPE 接下來會重複以下流程:
- 統計目前語料中所有相鄰 Token Pair 的頻率。
- 找出頻率最高的 Pair。
- 將該 Pair 合併成新 Token。
- 把新 Token 加入 Vocabulary。
- 更新整份訓練語料。
在 es 合併後,目前有:
newest → n e w es t </w>widest → w i d es t </w>
下一個高頻組合可能是 es + t → est,因為它同樣出現在 6 次的 newest 以及 3 次的 widest,因此可形成新的 Token est,更新後:
newest → n e w est </w>widest → w i d est </w>
最後 Vocabulary 變成 </w>, d, e, i, l, n, o, r, s, t, w, es, est,接下來還可以繼續合併:est + </w> → est</w>,如此便得到一個包含單字結尾資訊的 Token。
另外,low 與 lower 共同包含 l o:
low出現 5 次lower出現 2 次
所以 ,後續也可能將 l + o → lo 加進去 Vocabulary。
num_merges 超參數
BPE 不會無限合併,而是由 num_merges 決定執行多少次合併。
假設 num_merges = 4,因此只執行四輪合併,最後學到的 Vocabulary 為:
1 | </w>, d, e, i, l, n, o, r, s, t, w, |
其中新增的四個 Token 是 es、est、est</w>、lo
num_merges 是 BPE 當中很重要的超參數:
- 每合併一次,Vocabulary 就增加一個新 Token。
- 合併次數越多,Vocabulary 通常越大。
- 合併次數越少,文字會被切得較細。
實際模型的 Vocabulary 可能有數萬個項目,原始相關研究甚至可能設定到約六萬個詞彙單位,其本質仍然是反覆統計語料中常見的字元組合。
BPE 學習完成後得到什麼
BPE 學習階段的結果包含一份可用於後續 Tokenization 的 Vocabulary。
在這個例子中,Vocabulary 中同時存在三種粒度:
1. 單一字元
1 | w |
2. 一般次詞
1 | es |
3. 帶有單字邊界的次詞
1 | est</w> |
BPE 並非把所有字都切成相同大小,而是依照訓練語料的頻率,保留不同粒度的 Token,高頻組合容易被合成較大的 Token;較少見的部分則維持為較小單位。
使用學到的 BPE 進行 Tokenization
BPE 學習完成後,才進入實際文字切分階段,而對新的單字進行 Tokenization 時,首先要:
- 拆成單一字元。
- 在結尾加上
</w>。 - 根據學習階段得到的 Token 與合併方式進行合併。
範例一:low
先拆成 l o w </w>,由於 Vocabulary 中包含 lo,因此可以切成 lo | w | </w>,對模型而言,low 不是單一 Token,而是三個 Token。
範例二:widest
先拆成 w i d e s t </w>,由於 Vocabulary 中包含 est</w>,因此可以切成 w | i | d | est</w>,雖然 widest 是一個完整英文單字,但對模型而言,它是由四個 Token 組成。
這些 Token 會分別對應到自己的 Token ID 與 Embedding,然後依序送入模型。
語言模型實際處理的序列長度,是 Token 數量,而不一定等於人類看到的單字數量。
學習 Vocabulary 與訓練模型是不同階段
第一階段:學習 Tokenizer
根據訓練語料執行 BPE,得到:
- Vocabulary
- 新增的次詞 Token
- 文字應如何拆分與合併
第二階段:學習模型參數
Vocabulary 確定後,才為每個 Token 建立 Embedding,並訓練後續的語言模型,流程:
- 訓練語料
- → 學習 BPE Vocabulary
- → 將文字轉成 Token ID
- → 學習 Token Embedding
- → 訓練語言模型
所以 BPE 學到的是切分規則與 Token 集合,而不是直接學到 Token 的語意向量。
英文與中文的處理差異
英文通常以字母作為較初始的單位,再由統計方法合併出常見片段,例如:
1 | e + s → es |
中文則較常以單一中文字作為 Character-level Token:自 | 然 | 語 | 言 | 處 | 理
也就是說,英文中的 Character 通常是字母;中文中的 Character 則通常是一個漢字。這種處理不一定需要先建立傳統中文斷詞器,也不一定需要事先判斷 自然語言處理 究竟應該切成 自然 | 語言 | 處理 還是其他什麼切法,模型可以先接收單字級 Token,再透過上下文學習它們組合後的表示。
多語模型的 Vocabulary
不同語言可以先各自建立相應的 Token 或 Vocabulary,接著合併成一份較大的多語 Vocabulary:英文 Vocabulary + 中文 Vocabulary + 其他語言 Vocabulary → Multilingual Vocabulary
所有 Token 最後都有不同的 Token ID,因此即使不同語言共用同一個模型,仍可透過 ID 區分不同 Token。
使用多語 BERT 或其他多語語言模型時,使用者通常不需要自行重做這個流程,因為模型已經附帶對應的 Tokenizer 與 Vocabulary。
在預訓練模型中的實際使用方式
使用 BERT、GPT 或其他預訓練語言模型時,前處理通常會包含一個 Tokenizer,Tokenizer 與預訓練模型必須互相對應,因為:
- Tokenizer 決定有哪些 Token。
- Vocabulary 決定每個 Token 的 ID。
- Embedding Table 根據 ID 取出向量。
所以若用現成模型進行微調(Fine-tuning)時,通常要先取得該模型原本的 Tokenizer、Vocabulary、Embedding 等,不能任意換成另一套不相容的切分方式,否則同一個 Token ID 可能會對應到不同內容。
實務上使用預訓練模型時,這些步驟通常已被函式庫包裝,因此使用者可能感受不到背後的 Tokenization 流程。
特殊領域是否需要重建 Vocabulary
假設原本使用的是一般對話模型,但現在要處理醫療對話,醫療語料中可能包含大量原模型較少見的術語。
至於處理方向有以下這些:
- 用新的領域語料重新訓練或擴充 Vocabulary。
- 為新增 Token 建立或調整 Embedding。
- 再用新的資料進行模型訓練或微調。
是否需要重新處理 Tokenizer、Vocabulary 與 Embedding,要視任務的專業程度而定,而一般任務通常直接使用現成 Tokenizer,特殊領域若有大量新術語,才需要考慮更複雜的調整。
為什麼需要 Sub-word Tokenization
次詞切分可以讓未見詞不必全部變成相同的 <UNK>,而是拆成 Vocabulary 中已存在的較小 Token。
例如完整單字不在 Vocabulary 中,仍可能被切成 已知次詞 | 已知次詞 | 單一字元,因此可以較好地處理:
- 未知詞
- 拼錯的單字
- 複合詞
- 不同語言間詞彙粒度不一致的情況
GPT-3、BERT 等預訓練語言模型會在預訓練以前,先完成次詞 Tokenizer 與 Vocabulary 的建立。換句話說,Tokenization 是預訓練模型的前置步驟,而不是模型訓練完成後才附加的功能。
Sub-word Tokenization 的限制
老師認為次詞切分的缺點並不多,但仍有幾個限制。
1. num_merges 需要調整
num_merges 決定建立多少新的次詞 Token,若合併次數太少會導致:
- Token 粒度較細。
- 一個單字可能被拆成很多 Token。
- 輸入序列會變長。
若合併次數較多,則:
- Vocabulary 會增加。
- 更多常見片段甚至完整詞會成為單一 Token。
- 需要更大的 Embedding Table。
因此,num_merges 不能完全隨意設定,而要依資料與模型需求調整。
2. Vocabulary 建立後通常固定
BPE 是根據某一批訓練語料統計而得,Vocabulary 建立完成後,通常會被固定下來。若之後加入大量新資料,特別是不同領域的資料,原本 Vocabulary 可能無法反映新語料中的常見組合。
此時若希望 Tokenizer 重新學習新模式,就需要重新執行 BPE,也就是新增資料不會自動讓既有 Vocabulary 長出新的 Token。
3. 中文通常採較細粒度表示
投影片最後以「How about Chinese?」銜接到 Character-level Encoding。
中文可以直接以單一漢字作為基礎 Token,再由後續模型學習字與字之間的上下文關係,這與英文從字母逐步組合成次詞的直觀方式有所不同。
總整理
Tokenization 核心概念
自然語言模型無法直接處理字串,必須透過 Tokenization 將文字轉換為模型可辨識的基本單位(Token),再轉為整數 ID。
- 基本處理流程:原始文字 → Token → Token ID → 向量表示 → 模型運算
- 語言模型預測:模型並非「創造」字詞,而是計算 Vocabulary 中每個候選 Token 的機率(例如 RNN 輸出 後經過 Softmax),本質上是多類別分類問題。
- Vocabulary Size:現代模型(如 BERT、GPT 系列)通常包含數萬個 Token,透過統計式切分建立,而非收錄所有完整單字。
Vocabulary 與 Embedding 的差異
| 項目 | 主要功能 |
|---|---|
| Vocabulary | 決定模型「認得」哪些 Token,每個 Token 對應固定 ID。 |
| Embedding | 決定每個 Token 如何表示成「向量」以供模型計算。 |
傳統斷詞的侷限與 <UNK> 問題
傳統做法通常依賴分隔符號(如空白)切分語料,並搭配詞幹化、停用詞處理與頻率統計來建立 Vocabulary,未收錄的詞會統一標記為 <UNK>(未知詞)。
<UNK>的資訊流失:所有人名、地名、醫學術語或拼錯的單字都會變成相同的<UNK>,模型無法區分。- 缺乏彈性:僅適用於有空白分隔的西方語言,無法直接處理中文、日文等連續書寫的語言。
- 構詞資訊浪費:即使單字帶有明顯的字根或前綴(如醫學詞彙),只要未在訓練集中完整出現,就會被視為未知詞。
- 機器翻譯對齊困難:如英文多個單字(
sewage water treatment plant)對應德文單一複合詞(Abwasserbehandlungsanlage),導致粒度不一。
Segmentation 與 Tokenization
| 概念 | 處理目的與特徵 | 產出單位範例 |
|---|---|---|
| Segmentation | 尋找較高階、具語言意義的單位。 | 完整句子、完整詞。 |
| Tokenization | 將資料切成「模型實際處理」的基本單位。 | 完整詞、次詞、單一字元。 |
次詞切分(Sub-word Tokenization)
Sub-word Tokenization 旨在於「完整詞」與「單一字元」之間取得平衡。
- 目標:保留常見單字為完整 Token,將罕見詞拆成常見的較小片段,藉此控制 Vocabulary 大小並大幅降低未知詞問題。
- 常見演算法:BPE (Byte Pair Encoding)、WordPiece (用於 BERT/T5)、Unigram Language Model。
BPE 演算法流程
BPE 透過統計語料中經常共同出現的相鄰單位,逐步合併成較大的次詞 Token。
- 字元拆解:將所有訓練單字拆成單一字元,並在結尾加上特殊符號
</w>(標示單字邊界)。 - 初始化 Vocabulary:此時 Vocabulary 僅包含所有出現過的單一字元與
</w>。 - 頻率統計:統計目前語料中所有相鄰 Token Pair 的加權頻率。
- 合併高頻詞:找出頻率最高的 Pair 並合併成新 Token 加入 Vocabulary。
- 更新語料:將訓練語料中的該 Token Pair 全數替換為合併後的新 Token。
- 反覆執行:重複步驟 3-5,直到達到超參數
num_merges設定的合併次數。
實際切分範例
BPE 學習完成後,對新單字進行 Tokenization 時會套用學到的合併規則:
- low:拆解為
l o w </w>→ 根據規則合併為lo、w、</w>三個 Token。 - widest:拆解為
w i d e s t </w>→ 合併為w、i、d、est</w>四個 Token。
實務應用與限制
- 第一階段(學習 Tokenizer):訓練 BPE 得到 Vocabulary 與切分規則。
- 第二階段(訓練模型):根據 Vocabulary 建立 Embedding,並訓練語言模型參數。
- 實務限制:使用預訓練模型(如 BERT)進行微調時,必須沿用原模型的 Tokenizer 與 Vocabulary,否則 Token ID 會對應錯誤。除非針對特殊領域(如醫療)遇到大量新術語,才需考慮擴充 Vocabulary 並重新訓練 Embedding。
中英文處理差異與多語模型
- 英文:以「字母」為基礎單位,透過統計合併出常見次詞片段。
- 中文:通常直接以「單一漢字」作為 Character-level Token,不需依賴傳統中文斷詞器,由模型自行學習上下文表示。
- 多語模型:將各語言的 Vocabulary 合併成單一 Multilingual Vocabulary,透過不同的 Token ID 來區分跨語言的 Token。
Sub-word Tokenization 的限制
- 需微調
num_merges:次數太少會讓序列過長且粒度太細;次數太多則會讓 Vocabulary 過大。 - Vocabulary 缺乏動態適應性:建立完成後即固定,若引入大量新領域語料,需重新執行 BPE 才能學到新模式。
