這是我在墨大上 COMP90042 NLP 時的筆記,這一篇主要涵蓋文字前處理、BPE、N-gram 與平滑、文字分類,以及 POS、HMM 和 Viterbi。
術語
定義
Word 詞
具有意義和/或文法功能的一串字元(a sequence of characters with a meaning and/or function)
Sentence 句子
由詞按文法規則組織、表達一個完整意思的單位,以標點或結構邊界結束
Document 文件
一個連續的文字單元(如一篇新聞、一封郵件),由若干句子組成
Corpus 語料庫
用於訓練/評估的、成規模蒐集的文字集合(單數 corpus,複數 corpora)
Word token 詞元(詞例)
文字中每一次出現的詞例;"to be or not to be" 有 6 個 token
Word type 詞型
去重後的不同詞;"to be or not to be" 有 4 個 type
Lexicon 詞典
一個語言/領域中所有詞型(及詞條資訊)的集合
“記憶點:token 數 ≥ type 數;語料規模常用 \vert V\vert(詞表大小)和 token 總數描述。
記憶點:token 數 ≥ type 數;語料規模常用 \vert V\vert(詞表大小)和 token 總數描述。
\vert V\vert
“Language is compositional. 人類可以把文件拆成一個個組成成分來理解;要讓電腦理解語言,就必須讓它做同樣的拆解。
Language is compositional. 人類可以把文件拆成一個個組成成分來理解;要讓電腦理解語言,就必須讓它做同樣的拆解。
前處理把原始字串逐步變成適合任務的表示。下面是一條用於傳統文字處理的示意流程:
"<p> Hi there. I'm TARS. </p>" → 去格式 "Hi there. I'm TARS." → 分句 ["Hi there.", "I'm TARS."] → 分詞 [["Hi","there","."], ["I","'m","TARS","."]] → 正規化 [["hi","there","."], ["i","be","tars","."]] → 去停用詞 [["hi","tars","."]] (範例)
這些步驟依任務取捨,並非所有模型都要全部執行。語言模型通常需要保留標點、詞形和功能詞;現代預訓練模型也應使用與訓練時一致的 tokenizer。
“圖 1-1 文字前處理五步流水線,以及同一句話在各步之後的形態。
圖 1-1 文字前處理五步流水線,以及同一句話在各步之後的形態。
步驟
英文
目標
1
Remove unwanted formatting
去掉 HTML/XML 標籤、Markdown 符號、多餘空白、跳脫字元
2
Sentence segmentation 分句
把文件切成句子
3
Word tokenisation 分詞
把句子切成 token;含子詞(BPE)方案
4
Word normalisation 詞正規化
統一大小寫、拼寫、詞形(lemmatisation / stemming)
5
Stopword removal 去停用詞
去掉高頻、低資訊量的功能詞
四種做法,由簡到難:
中文 MaxMatch(最大匹配)
思路:給定詞典,從左(或右)貪心地取詞典中最長的可匹配串作為詞。
範例:
詞典:{去买新, 西兰花, 西兰花新} 句子:去买新西兰花 正向最大匹配(FMM,從左往右,最長優先): 位置 0:嘗試 "去买新"(長度 3,詞典中)→ 切出「去买新」 位置 3:嘗試 "西兰花"(長度 3,詞典中)→ 切出「西兰花」 結果:去买新 / 西兰花
要點與缺陷:
目的:
怎麼做:
Removing Morphology:兩種詞形變化的區別
類型
Inflectional Morphology(屈折變化)
Derivational Morphology(派生變化)
含義
同一個詞、不同文法形態
由舊詞造出新詞
例子
名詞複數 +s;動詞三單 +s、時態 +ed/+ing;形容詞比較級 +er、最高級 +est
後綴改詞性:person → personally;前綴改詞義:write → rewrite
是否改詞性/詞義
不改
改變
Lemmatisation vs Stemming 對比
維度
Lemmatisation(詞形還原)
Stemming(詞幹擷取)
處理對象
去掉屈折變化,回到 lemma(詞典原形)
去掉後綴,保留詞幹
方式
Lexicon-based(依賴詞典 + 詞性)
Rule-based(一般是一套刪綴規則)
輸出
有意義、實際存在的詞
可能是無意義的詞幹(studies → studi)
速度
較慢(需查詞典/詞性)
較快
合適的任務
需要真實詞形、語意敏感的任務(如生成、可讀性要求高)
大規模統計、檢索、分類(只要詞形一致即可)
Porter Stemmer
m
k
訓練(學習合併規則)
編碼(對新文字分詞)
依學習到的合併順序依次套用合併規則;沒被任何規則覆蓋的部分保留為單字元。因此編碼是確定性的,不需要重新統計。
語料(詞尾以 _ 標記):
Corpus
Frequency
o l d _
7
o l d e r _
f i n e s t _
9
l o w e s t _
初始相鄰對頻次
Pair
Count
說明
(e, s)
13
finest_ 9 + lowest_ 4
(s, t)
(t, _)
(o, l)
10
old_ 7 + older_ 3
(l, d)
(f, i)
finest_ 9
(i, n)
(n, e)
(d, _)
old_ 7
(l, o)
lowest_ 4
(o, w)
(w, e)
(d, e)
older_ 3
(e, r)
(r, _)
合併過程(頻次相同時依實作約定取其一,常見做法是取最先出現/字典序最小者)
輪次
合併
頻次
結果語料
e + s → es
o l d _(7) o l d e r _(3) f i n es t _(9) l o w es t _(4)
es + t → est
f i n est _(9) l o w est _(4)
est + _ → est_
f i n est_(9) l o w est_(4)
o + l → ol
ol d _(7) ol d e r _(3)
ol + d → old
old _(7) old e r _(3)
6
f + i → fi
fi n est_(9)
fi + n → fin
fin est_(9)
8
fin + est_ → finest_
finest_(9)
old + _ → old_
old_(7)
表中每輪只列出受本輪合併影響的詞,其他詞保持不變。
最終詞表(部分):o, l, d, e, r, f, i, n, s, t, w, _, es, est, est_, ol, old, fi, fin, finest_, old_, …
“圖 2-1 BPE 從語料中學到的合併操作(r · → r·、l o → lo、lo w → low、e r· → er·)。這裡使用論文中的原始範例。來源:Sennrich et al., Neural Machine Translation of Rare Words with Subword Units, ACL 2016, Figure 1。
圖 2-1 BPE 從語料中學到的合併操作(r · → r·、l o → lo、lo w → low、e r· → er·)。這裡使用論文中的原始範例。來源:Sennrich et al., Neural Machine Translation of Rare Words with Subword Units, ACL 2016, Figure 1。
語言模型(Language Model, LM)給一個詞序列賦予機率 P(w_1, w_2, \dots, w_m)。
P(w_1, w_2, \dots, w_m)
P(w_t \mid w_{<t})
N-gram:連續的 n 個 token 組成的片段。
n
名稱
例子(the dog barks)
unigram
the / dog / barks
bigram
the dog / dog barks
trigram
the dog barks
N-gram 語言模型假設:第 t 個詞只依賴前面 n-1 個詞。
t
n-1
(a) 從聯合機率到條件機率(Chain Rule)
以 I like apple 為例:
P(\text{I like apple}) = P(\text{I}) \cdot P(\text{like} \mid \text{I}) \cdot P(\text{apple} \mid \text{I like})
P(w_1, w_2, \dots, w_m) = \prod_{i=1}^{m} P(w_i \mid w_1, \dots, w_{i-1})
P(A\mid B) = \dfrac{P(A,B)}{P(B)}
(b) 馬可夫假設(Markov Assumption)
只依賴前 n-1 個詞,而不是全部歷史:
P(w_1, \dots, w_m) \approx \prod_{i=1}^{m} P(w_i \mid w_{i-n+1}, \dots, w_{i-1})
模型
公式
P(w_1,\dots,w_m) = \prod_{i=1}^{m} P(w_i)
P(w_1,\dots,w_m) = \prod_{i=1}^{m} P(w_i \mid w_{i-1})
P(w_1,\dots,w_m) = \prod_{i=1}^{m} P(w_i \mid w_{i-2}, w_{i-1})
(c) 最大概似估計(Maximum Likelihood Estimation, MLE)
用相對頻次估計條件機率:
P(w_i \mid w_{i-1}) = \frac{C(w_{i-1}, w_i)}{C(w_{i-1})}, \qquad P(w_i) = \frac{C(w_i)}{M}
其中 C(\cdot) 是計數,M 是總 token 數。
C(\cdot)
M
手算範例
語料(兩句,句首句尾用 <s> <eos> 標記):
<s> yes no no no no yes <eos> <s> no no no yes yes no <eos>
機率
計算
結果
P(\text{yes} \mid \text{<s>})
1 / 2
0.5
P(\text{no} \mid \text{yes})
2 / 4
P(\text{no} \mid \text{no})
5 / 8
0.625
P(\text{yes} \mid \text{no})
2 / 8
0.25
P(\text{<eos>} \mid \text{yes})
1 / 4
P(\text{<eos>} \mid \text{no})
1 / 8
0.125
語料中 yes 出現 4 次、no 出現 8 次。對同一個前詞,後繼詞還應包含句尾標記:例如 no 的後繼機率為 5/8+2/8+1/8=1。
5/8+2/8+1/8=1
問題
現象
對策
a) 語言具有長距離影響
只看前 n-1 個詞,忽略遠處上下文("The trophy would not fit in the suitcase because it was too big" 中 it 指代要靠遠距離資訊)
增大 n(但資料稀疏)、快取模型、RNN/Transformer
b) 機率通常很小
連乘幾十個 <1 的數會下溢為 0
<1
用對數機率相加:\log P = \sum \log P(w_i\mid\cdot);計算困惑度時也先求平均負對數機率
\log P = \sum \log P(w_i\mid\cdot)
c) 未出現過(零機率)
訓練集沒有的 n-gram 計數為 0 → 整句機率歸零
平滑(Smoothing),見第 4 節
目標:給未出現的 n-gram 分配非零機率,同時保證所有機率之和仍為 1(機率質量守恆)。
基本想法:假裝每個 n-gram 都至少出現過一次,即給所有計數 +1。
+1
P_{\text{add1}}(w_i) = \frac{C(w_i) + 1}{M + \vert V\vert } \qquad\text{(unigram)}
P_{\text{add1}}(w_i \mid w_{i-1}) = \frac{C(w_{i-1} w_i) + 1}{C(w_{i-1}) + \vert V\vert } \qquad\text{(bigram)}
分母加 \vert V\vert 正是為了讓機率之和仍為 1(\vert V\vert 個候選各多算了 1 次)。
問題:+1 對低頻詞/稀疏語料來說"太多了",把大量機率質量分給未見事件,明顯壓低已見 n-gram 的機率,效果偏差大。
P_{\text{add-}k}(w_i \mid w_{i-2}, w_{i-1}) = \frac{C(w_{i-2}, w_{i-1}, w_i) + k}{C(w_{i-2}, w_{i-1}) + k\,\vert V\vert }
0<k<1
k=1
想法:從每個見過的詞那裡"借"走固定的 d(如 d=0.1),把這些機率質量分給沒見過的詞。
d
d=0.1
P_{\text{abs}}(w_i \mid w_{i-1}) = \frac{C(w_{i-1}, w_i) - d}{C(w_{i-1})}, \quad \text{若 } C(w_{i-1},w_i) > 0
範例(context = alleged,5 個已見 bigram、2 個未見 bigram)
詞
counts
未平滑機率
Add-α (α=0.1) 有效計數
Add-α 平滑機率
Discounting (d=0.1) 有效計數
Discounting 平滑機率
impropriety
0.4
7.826
0.391
7.9
0.395
offense
4.928
0.246
4.9
0.245
damage
0.2
3.961
0.198
3.9
0.195
deficiencies
0.1
2.029
0.101
1.9
0.095
outbreak
0.05
1.063
0.053
0.9
0.045
infirmity
0
0.097
0.005
0.013
alleged
合計
20
1.0
8-0.1=7.9
5-0.1=4.9
5\times0.1=0.5
0.5/20=0.025
0.5/2 = 0.25
0.25/20=0.0125\approx0.013
想法:已見就用折扣後的機率;未見就按 lower-order model(低階模型)重新分配搶來的機率質量。
P_{\text{katz}}(w \mid h) = \begin{cases} \dfrac{C^*(h,w)}{C(h)}, & \text{if } C(h,w) > 0 \\[2mm] \alpha(h)\,P_{\text{lower}}(w), & \text{otherwise} \end{cases}
這裡 h=w_{i-1} 是上下文,C^*(h,w) 是折扣後的計數。Katz 通常使用基於 Good–Turing 的計數折扣,並非把所有已見計數統一減去同一個常數。回退權重為:
h=w_{i-1}
C^*(h,w)
\alpha(h)=\frac{1-\sum_{w:C(h,w)>0}C^*(h,w)/C(h)}{\sum_{w:C(h,w)=0}P_{\text{lower}}(w)}
分子是高階模型留下的機率質量,分母是在當前上下文中未見詞的低階機率之和;兩者一起保證最終分布正規化。
Katz 的問題
P(\text{Kong})
P(\text{glasses})
想法:不再按原始計數分配折扣質量,而按多樣性(versatility)——這個詞能跟在多少個不同的詞後面——來分配。
公式:插值形式
下面使用常見的插值 Kneser–Ney:低階分布不只在高階計數為零時參與,而是與折扣後的高階機率相加。
P_{KN}(w_i \mid w_{i-1}) = \frac{\max(C(w_{i-1},w_i)-D,0)}{C(w_{i-1})} +\lambda(w_{i-1})\,P_{\text{cont}}(w_i)
P_{\text{cont}}(w_i)= \frac{\vert\{u:C(u,w_i)>0\}\vert}{\vert\{(u,v):C(u,v)>0\}\vert},\qquad \lambda(h)=\frac{D\,\vert\{v:C(h,v)>0\}\vert}{C(h)}
w_i
\lambda(h)
h
0<D<1
D/C(h)
想法:不"二選一"地回退,而是把不同階的 n-gram 模型加權混合,權重透過調參(在 held-out 資料上學習)得到。
P_{IN}(w_i \mid w_{i-1}, w_{i-2}) = \lambda_3 P_3(w_i \mid w_{i-2}, w_{i-1}) + \lambda_2 P_2(w_i \mid w_{i-1}) + \lambda_1 P_1(w_i)
\sum_k \lambda_k = 1, \qquad \lambda_k \ge 0
\lambda
方法
核心思想
優點
缺點
Add-1
所有計數 +1
最簡單,保證非零且已正規化
對稀疏資料加得太多,嚴重壓低已見機率
Add-k
所有計數 +k
比 add-1 溫和
需調 k;未見詞機率全相同;破壞原比例
Absolute Discounting
已見詞統一減 d,餘額給未見詞
簡單、效果好於 add-k
不區分低階上下文的資訊量
Katz Backoff
未見時回退到低階
保留高階精確性
回退依據是原始機率,忽略上下文多樣性(reading Kong 問題)
Kneser-Ney
用延續機率分配折扣質量
經典 n-gram 模型中的強基線
公式較複雜,需兩套計數
Interpolation
各階模型加權混合
穩定、常優於 backoff
需在 held-out 上調 \lambda
C=\{c_1, c_2, \dots, c_k\}
\hat{c} \in C
偏差 Bias
模型的限制或簡化假設造成的系統性誤差;假設與真實資料不符時,可能帶來較大的偏差
變異數 Variance
模型對訓練集的敏感程度。越敏感,換一批資料結果波動越大(易過擬合)
潛在假設
模型依賴的條件(如特徵獨立、線性邊界、距離有意義),偏離時可能影響效果
複雜度
訓練/推論的時間與空間成本,是否可擴展到大量資料
訓練與預測延遲是否滿足線上要求
“偏差–變異數取捨:高偏差常對應欠擬合,高變異數常對應過擬合。在平方損失下,期望預測誤差可以分解為偏差²、變異數與不可約雜訊;分類任務中也可借這個框架理解模型取捨。
偏差–變異數取捨:高偏差常對應欠擬合,高變異數常對應過擬合。在平方損失下,期望預測誤差可以分解為偏差²、變異數與不可約雜訊;分類任務中也可借這個框架理解模型取捨。
P(C\mid F) \propto P(F\mid C)\,P(C)
即"類先驗 × 該類下出現這些特徵的機率"。
P(F \mid C) = \prod_{f \in F} P(f \mid C)
P(y=c \mid x) = \frac{\exp(w_c^\top x + b_c)}{\sum_{c'} \exp(w_{c'}^\top x + b_{c'})}
\min_{w,b}\ \tfrac{1}{2}\Vert w\Vert ^2 \quad \text{s.t.}\quad y_i(w^\top x_i + b) \ge 1
Hold-out(留出法):把資料分成 train / dev(validation)/ test。用 dev 選超參數,test 只用於最終報告一次。
Classified As A
Classified As B
True A
79 (TP)
13 (FN)
True B
8 (FP)
10 (TN)
Accuracy 準確率
\text{Accuracy} = \frac{TP + TN}{N} = \frac{79+10}{110} = 0.809
Precision 精確率(查準):預測為正的裡面有多少真的為正
P = \frac{TP}{TP + FP} = \frac{79}{79+8} = 0.908
Recall 召回率(查全):真正為正的裡面有多少被找出來
R = \frac{TP}{TP + FN} = \frac{79}{79+13} = 0.859
F1-Score:精確率與召回率的調和平均
F_1 = \frac{2PR}{P+R} = \frac{2 \times 0.908 \times 0.859}{0.908 + 0.859} = 0.883
“為什麼用調和平均而不是算術平均? 因為調和平均會被較小的一方"拉低"——只有當 P 和 R 都高時 F1 才高,避免"只召回不精確"或"只精確不召回"拿高分。
為什麼用調和平均而不是算術平均? 因為調和平均會被較小的一方"拉低"——只有當 P 和 R 都高時 F1 才高,避免"只召回不精確"或"只精確不召回"拿高分。
多分類指標
指標
做法
特點
Macro-average
先對每個類別分別算 P/R/F1,再對類別取算術平均
每個類別同等權重,少數類影響被放大,能暴露長尾表現差
Micro-average
把所有類別的 TP/FP/FN 彙總後再算一次 P/R/F1
每個樣本同等權重,大類主導;單標籤多分類時 micro-F1 = accuracy
定義:給句子中每個詞標註其文法類別(詞性)。
例子:Janet/NNP will/MD back/VB the/DT bill/NN
“注意 back 在這裡是動詞(支持),不是名詞/副詞——取決於上下文。
注意 back 在這裡是動詞(支持),不是名詞/副詞——取決於上下文。
應用:
開放類(Open class):可隨時添加新詞/淘汰舊詞
大類
細分
Nouns 名詞
Proper 專有(Melbourne)/Common 普通;Common 再分 Mass 不可數(water)/Count 可數(chair)
Lexical verbs 實義動詞
可有豐富的屈折變化(sing/sang/sung);依用法區分及物/不及物
Adjectives 形容詞
Gradable 可分級(very tall)/Non-gradable 不可分級(dead)
Adverbs 副詞
Locative 處所(here, there)/Degree 程度(very, extremely)
封閉類(Closed class):相對固定,不易增減
同一個詞形可以是多個詞性,且分布極不均衡:
“一個簡單基線是:為每個詞選擇訓練集中最常見的詞性。它能利用詞性分布的不均衡,但無法根據當前上下文消歧;準確率取決於語料和未登錄詞的處理方式。
一個簡單基線是:為每個詞選擇訓練集中最常見的詞性。它能利用詞性分布的不均衡,但無法根據當前上下文消歧;準確率取決於語料和未登錄詞的處理方式。
標籤集
標籤數
Brown
87
最早的語料庫標籤集之一,粒度細
Penn Treebank (PTB)
45
NLP 中最常用,含 NN, NNS, NNP, VB, VBD, VBG, JJ, RB, IN, DT, MD, CC, PRP…
CLAWS5 / BNC
61
CLAWS 的一個版本;不同版本的標籤數不同
早期 Universal Tagset
12
NOUN, VERB, ADJ, ADV, PRON, DET, ADP, NUM, CONJ, PRT, ., X;不要與 Universal Dependencies 的 17 類 UPOS 混淆
經典歧義範例(Penn Treebank 標註)
Time flies like an arrow Time/NN flies/VBZ like/IN an/DT arrow/NN Fruit flies like a banana Fruit/NN flies/NNS like/VBP a/DT banana/NN
同一個 flies:第一句是動詞(時間飛逝),第二句是名詞(果蠅)。只能靠上下文判斷。
任務:POS tagging——給整個詞序列 W = w_1 \dots w_n 找最佳標籤序列 T = t_1 \dots t_n。
W = w_1 \dots w_n
T = t_1 \dots t_n
已有方法的問題:逐詞獨立預測無法利用標籤之間的依賴;如果改成依賴前面預測標籤的貪心分類器,又可能出現錯誤傳播(error propagation),前一個標籤的錯誤會影響後面。
新想法:把整個句子丟給模型,讓它生成整條 tag 序列。
新問題:句子長度不固定;所有 tag 組合數是 \vert T\vert ^n,指數級,無法枚舉。
\vert T\vert ^n
解決辦法:找一個模型,以詞為單位建模,但在學習與預測時把整句當作一個整體——這叫 sequence labelling,也叫 structured prediction。
HMM 的運作方式:給定句子(詞序列),在所有可能的 tag 序列中找機率最大的那一條。
優勢:
\hat{T} = \arg\max_{T} P(T \mid W) = \arg\max_{T} \frac{P(W \mid T)\,P(T)}{P(W)} = \arg\max_{T} P(W \mid T)\,P(T)
(P(W) 與 T 無關,可忽略——這就是 Bayes 法則去掉分母)
P(W)
T
“圖 7-1 HMM 的機率圖模型:實線為狀態轉移 P(t_i\mid t_{i-1})(矩陣 A),虛線為發射 P(w_i\mid t_i)(矩陣 O)。
圖 7-1 HMM 的機率圖模型:實線為狀態轉移 P(t_i\mid t_{i-1})(矩陣 A),虛線為發射 P(w_i\mid t_i)(矩陣 O)。
P(t_i\mid t_{i-1})
P(w_i\mid t_i)
假設
內容
作用
Output independence(輸出獨立)
第 i 個詞只依賴第 i 個 tag,與其他詞、其他 tag 無關:P(W\mid T)=\prod_i P(w_i\mid t_i)
i
P(W\mid T)=\prod_i P(w_i\mid t_i)
把"整句給定標籤"分解為逐詞乘積
Markov assumption(馬可夫)
當前 tag 只與前一個 tag 有關:P(T)=\prod_i P(t_i \mid t_{i-1})
P(T)=\prod_i P(t_i \mid t_{i-1})
把標籤序列的機率分解為一階轉移乘積
於是:
\hat{T} = \arg\max_{T} \prod_{i=1}^{n} \underbrace{P(w_i \mid t_i)}_{\text{emission}} \cdot \underbrace{P(t_i \mid t_{i-1})}_{\text{transition}}
“這也解釋了 HMM 是一個**生成式(generative)**模型:它建模聯合機率 P(W,T) = P(T)P(W\mid T)。
這也解釋了 HMM 是一個**生成式(generative)**模型:它建模聯合機率 P(W,T) = P(T)P(W\mid T)。
P(W,T) = P(T)P(W\mid T)
參數
P(w_i \mid t_i)
Emission(發射/觀測)機率 O
某個 tag 生成某個詞的機率
P(t_i \mid t_{i-1})
Transition(轉移)機率 A
前一個 tag 後面接某個 tag 的機率
怎麼算:仍是最大概似估計(MLE),即數數:
P(w_i \mid t_i) = \frac{\text{Count}(w_i, t_i)}{\text{Count}(t_i)}, \qquad P(t_i \mid t_{i-1}) = \frac{\text{Count}(t_{i-1}, t_i)}{\text{Count}(t_{i-1})}
第一個 tag 的機率怎麼辦? 在每句之前加一個特殊起始符號 <s>,於是第一項就是 P(t_1 \mid \text{<s>}):
P(t_1 \mid \text{<s>})
P(t_1 \mid \text{<s>}) = \frac{\text{Count}(\text{<s>}, t_1)}{\text{Count}(\text{<s>})}
句尾同理加 </s>,讓 P(\text{</s>} \mid t_n) 也成為一個可學的轉移。前面的乘積為簡潔省略了這個句尾因子;完整路徑機率應再乘上它。
P(\text{</s>} \mid t_n)
沒見過的詞怎麼辦? 仍用平滑(第 4 節):對 emission 表加 k / 加 1;或用 <UNK> 把低頻詞折疊,讓 <UNK> 的發射機率由所有低頻詞共享。
給定訓練好的 HMM(兩張表:轉移矩陣 A、發射矩陣 O),預測輸入句子的 tag 序列。
核心思路:取所有 tag 組合中聯合機率最高的那一條:
\hat{t} = \arg\max_{t} P(W \mid t)\,P(t) = \arg\max_{t} \prod_{i=1}^{n} P(w_i \mid t_i)\,P(t_i \mid t_{i-1})
為什麼不能一個詞一個詞地預測?(貪心解碼的缺陷)
Generative(HMM)
Discriminative(CRF / 分類器)
建模對象
聯合機率 P(X, Y)
P(X, Y)
條件機率 P(Y \mid X)(或 P(T\mid W))
P(Y \mid X)
P(T\mid W)
典型用途
可用於生成語言;HMM 也能做無監督學習
分類、預測、序列標註
訓練方式
通常(半)監督,也可 EM 無監督
通常是監督學習
特徵
只能使用觀測本身的發射機率,特徵受限
可用任意豐富特徵(前後綴、詞形、上下文詞、外部詞典…)
資料量
簡單的結構假設可能有利於少量資料學習
資料和特徵充分時通常能取得更好的預測效果,仍取決於任務與模型
代表
Naïve Bayes、HMM;神經語言模型也可作生成式建模
邏輯迴歸、CRF、SVM、用於分類的神經網路
“判別式模型直接優化"給定輸入判斷輸出",不需要顯式建模輸入分布 P(W),可以把重點放在預測任務上;是否更好仍由任務、資料和模型共同決定。
判別式模型直接優化"給定輸入判斷輸出",不需要顯式建模輸入分布 P(W),可以把重點放在預測任務上;是否更好仍由任務、資料和模型共同決定。
“不要只保留"當前詞的最佳標籤",而是保留"每個可能標籤下的最佳路徑得分",並在處理下一個詞時考慮所有組合。
不要只保留"當前詞的最佳標籤",而是保留"每個可能標籤下的最佳路徑得分",並在處理下一個詞時考慮所有組合。
即:對每個位置 t 和每個標籤 j,記錄以 j 結尾的最佳路徑的累計得分 \delta_t(j) 及其回溯指標 \psi_t(j)。
j
\delta_t(j)
\psi_t(j)
\delta_1(j) = P(t_1 = j \mid \text{<s>}) \cdot P(w_1 \mid j)
\delta_t(j) = \max_{i \in T}\Big[\delta_{t-1}(i)\cdot P(j \mid i)\Big]\cdot P(w_t \mid j)
\psi_t(j) = \arg\max_{i \in T}\Big[\delta_{t-1}(i)\cdot P(j\mid i)\Big]
終止:
\hat{t}_n = \arg\max_{j}\big[\delta_n(j)\,P(\text{</s>}\mid j)\big], \qquad \hat{t}_{t} = \psi_{t+1}(\hat{t}_{t+1}) \ \text{(回溯)}
如果模型沒有顯式句尾狀態,終止時直接比較 \delta_n(j) 即可;下面兩個範例均採用這一簡化。
\delta_n(j)
直覺範例:Can Play
轉移矩陣(Transition Matrix,節選,列為條件事件 P(\cdot\mid \text{row}))
P(\cdot\mid \text{row})
NNP
MD
VB
JJ
NN
RB
DT
<s>
0.2767
0.0006
0.0031
0.0453
0.0449
0.0510
0.2026
0.3777
0.0110
0.0009
0.0084
0.0584
0.0090
0.0025
0.0008
0.0002
0.7968
0.0005
0.1698
0.0041
0.0322
0.0050
0.0837
0.0615
0.0514
0.2231
0.0366
0.0004
0.0001
0.0733
0.4509
0.0036
0.0096
0.0176
0.0014
0.0086
0.1216
0.0177
0.0068
0.0102
0.1011
0.1012
0.0120
0.0728
0.0479
0.1147
0.0021
0.2157
0.4744
0.0017
(資料來自 Jurafsky 與 Martin 的 Speech and Language Processing 第 18 章 Figure 18.12,基於 WSJ 語料、未平滑。這裡只列出部分標籤,所以表中每列之和不必等於 1;完整轉移分布才會正規化。)
發射矩陣(Emission Matrix,Speech and Language Processing,Figure 18.13)
Janet
will
back
the
bill
0.000032
0.000048
0.308431
0.000028
0.000672
0.000340
0.000200
0.000223
0.002337
0.010446
0.506099
演算法流程:建一個 \vert T\vert \times n 的格子(trellis),逐欄填 \delta,每格記下「從上一欄哪個標籤來」,最後從最末欄的最大值回溯。
\vert T\vert \times n
\delta
這是僅用於演示動態規劃的兩狀態玩具模型,數值人為設定;N、V 是狀態標籤,不應據此判斷真實英語中的 they 可以作動詞。
發射機率
they
fish
N
0.7
0.3
V
0.6
轉移機率
0.8
“圖 8-1 they fish 的 Viterbi 網格:每格只保留「以該標籤結尾的最佳前綴得分」\delta,紅色為回溯出的最佳路徑 they/N → fish/N。
圖 8-1 they fish 的 Viterbi 網格:每格只保留「以該標籤結尾的最佳前綴得分」\delta,紅色為回溯出的最佳路徑 they/N → fish/N。
枚舉全部 4 條路徑
路徑
N N
0.6\times0.7 \times 0.8\times0.3
0.1008 ✅ 最佳
N V
0.6\times0.7 \times 0.2\times0.6
0.0504
V N
0.4\times0.4 \times 0.7\times0.3
0.0336
V V
0.4\times0.4 \times 0.3\times0.6
0.0288
結論:they/N fish/N。只比較 fish 的發射機率,會看到 P(\text{fish}\mid V)=0.6 大於 P(\text{fish}\mid N)=0.3;加入轉移機率後,最佳路徑卻以 N 結尾。發射機率不是標籤後驗,不能直接據此選標籤。這個例子展示了轉移資訊的作用,但不構成「逐步考慮轉移的貪心解碼一定失敗」的反例。
P(\text{fish}\mid V)=0.6
P(\text{fish}\mid N)=0.3
特性
時間複雜度
O(T^2 N):T = 標籤集大小,N = 序列長度。每個位置 N,每個標籤 T,每個標籤要與前一位置所有 T 個標籤比較
O(T^2 N)
空間複雜度
只求最佳得分時可輪替保留兩欄,空間為 O(T);要恢復整條路徑,則需保存 O(TN) 個回溯指標
O(T)
O(TN)
為什麼正確(why it works)
最佳子結構:到位置 t 標籤 j 的最佳路徑,其前綴必然是到位置 t-1 某標籤的最佳路徑(否則替換前綴可得更佳解);無後效性:給定當前標籤,未來與更早的歷史無關(馬可夫性)。因此可以只保留每格的"最佳前綴得分",安全地丟棄次佳路徑
t-1
數值下溢
機率連乘很快變成 0,實際實作全部用 log 機率(乘法變加法,O(T^2N) 不變)
O(T^2N)
更高階變體
用 tag trigram(二階 HMM):P(t_i \mid t_{i-2}, t_{i-1}),配合 interpolation 平滑;複雜度升為 O(T^3 N)
P(t_i \mid t_{i-2}, t_{i-1})
O(T^3 N)
這是我在墨大上 COMP90042 NLP 時的筆記,這一篇主要涵蓋文字前處理、BPE、N-gram 與平滑、文字分類,以及 POS、HMM 和 Viterbi。
1. 文字前處理
1.1 基本定義
術語
定義
Word 詞
具有意義和/或文法功能的一串字元(a sequence of characters with a meaning and/or function)
Sentence 句子
由詞按文法規則組織、表達一個完整意思的單位,以標點或結構邊界結束
Document 文件
一個連續的文字單元(如一篇新聞、一封郵件),由若干句子組成
Corpus 語料庫
用於訓練/評估的、成規模蒐集的文字集合(單數 corpus,複數 corpora)
Word token 詞元(詞例)
文字中每一次出現的詞例;"to be or not to be" 有 6 個 token
Word type 詞型
去重後的不同詞;"to be or not to be" 有 4 個 type
Lexicon 詞典
一個語言/領域中所有詞型(及詞條資訊)的集合
1.2 為什麼需要前處理
前處理把原始字串逐步變成適合任務的表示。下面是一條用於傳統文字處理的示意流程:
1.3 前處理五步法
這些步驟依任務取捨,並非所有模型都要全部執行。語言模型通常需要保留標點、詞形和功能詞;現代預訓練模型也應使用與訓練時一致的 tokenizer。
步驟
英文
目標
1
Remove unwanted formatting
去掉 HTML/XML 標籤、Markdown 符號、多餘空白、跳脫字元
2
Sentence segmentation 分句
把文件切成句子
3
Word tokenisation 分詞
把句子切成 token;含子詞(BPE)方案
4
Word normalisation 詞正規化
統一大小寫、拼寫、詞形(lemmatisation / stemming)
5
Stopword removal 去停用詞
去掉高頻、低資訊量的功能詞
步驟 2:分句(Sentence Segmentation)
四種做法,由簡到難:
步驟 3:分詞(Word Tokenisation)
中文 MaxMatch(最大匹配)
思路:給定詞典,從左(或右)貪心地取詞典中最長的可匹配串作為詞。
範例:
要點與缺陷:
步驟 4:詞正規化(Word Normalisation)
目的:
怎麼做:
Removing Morphology:兩種詞形變化的區別
類型
Inflectional Morphology(屈折變化)
Derivational Morphology(派生變化)
含義
同一個詞、不同文法形態
由舊詞造出新詞
例子
名詞複數 +s;動詞三單 +s、時態 +ed/+ing;形容詞比較級 +er、最高級 +est
後綴改詞性:person → personally;前綴改詞義:write → rewrite
是否改詞性/詞義
不改
改變
Lemmatisation vs Stemming 對比
維度
Lemmatisation(詞形還原)
Stemming(詞幹擷取)
處理對象
去掉屈折變化,回到 lemma(詞典原形)
去掉後綴,保留詞幹
方式
Lexicon-based(依賴詞典 + 詞性)
Rule-based(一般是一套刪綴規則)
輸出
有意義、實際存在的詞
可能是無意義的詞幹(studies → studi)
速度
較慢(需查詞典/詞性)
較快
合適的任務
需要真實詞形、語意敏感的任務(如生成、可讀性要求高)
大規模統計、檢索、分類(只要詞形一致即可)
Porter Stemmer
m)驅動。步驟 5:停用詞去除(Stopword Removal)
k(需人工檢查,避免誤刪 not, no 等否定詞)。2. 子詞切分 BPE
2.1 動機
2.2 演算法(Byte-Pair Encoding)
訓練(學習合併規則)
k(或詞表大小)。編碼(對新文字分詞)
依學習到的合併順序依次套用合併規則;沒被任何規則覆蓋的部分保留為單字元。因此編碼是確定性的,不需要重新統計。
2.3 完整範例
語料(詞尾以 _ 標記):
Corpus
Frequency
o l d _
7
o l d e r _
3
f i n e s t _
9
l o w e s t _
4
初始相鄰對頻次
Pair
Count
說明
(e, s)
13
finest_ 9 + lowest_ 4
(s, t)
13
finest_ 9 + lowest_ 4
(t, _)
13
finest_ 9 + lowest_ 4
(o, l)
10
old_ 7 + older_ 3
(l, d)
10
old_ 7 + older_ 3
(f, i)
9
finest_ 9
(i, n)
9
finest_ 9
(n, e)
9
finest_ 9
(d, _)
7
old_ 7
(l, o)
4
lowest_ 4
(o, w)
4
lowest_ 4
(w, e)
4
lowest_ 4
(d, e)
3
older_ 3
(e, r)
3
older_ 3
(r, _)
3
older_ 3
合併過程(頻次相同時依實作約定取其一,常見做法是取最先出現/字典序最小者)
輪次
合併
頻次
結果語料
1
e + s → es
13
o l d _(7) o l d e r _(3) f i n es t _(9) l o w es t _(4)
2
es + t → est
13
f i n est _(9) l o w est _(4)
3
est + _ → est_
13
f i n est_(9) l o w est_(4)
4
o + l → ol
10
ol d _(7) ol d e r _(3)
5
ol + d → old
10
old _(7) old e r _(3)
6
f + i → fi
9
fi n est_(9)
7
fi + n → fin
9
fin est_(9)
8
fin + est_ → finest_
9
finest_(9)
9
old + _ → old_
7
old_(7)
表中每輪只列出受本輪合併影響的詞,其他詞保持不變。
最終詞表(部分):o, l, d, e, r, f, i, n, s, t, w, _, es, est, est_, ol, old, fi, fin, finest_, old_, …
2.4 要點與延伸
3. N-gram 語言模型
3.1 任務
語言模型(Language Model, LM)給一個詞序列賦予機率
P(w_1, w_2, \dots, w_m)。P(w_t \mid w_{<t})逐步取樣/取 argmax,一次生成一個詞,直到 <eos>。3.2 應用
3.3 N-gram 是什麼
N-gram:連續的
n個 token 組成的片段。n名稱
例子(the dog barks)
1
unigram
the / dog / barks
2
bigram
the dog / dog barks
3
trigram
the dog barks
N-gram 語言模型假設:第
t個詞只依賴前面n-1個詞。3.4 三個推動 N-gram 的概念/假設
(a) 從聯合機率到條件機率(Chain Rule)
以 I like apple 為例:
P(\text{I like apple}) = P(\text{I}) \cdot P(\text{like} \mid \text{I}) \cdot P(\text{apple} \mid \text{I like})P(w_1, w_2, \dots, w_m) = \prod_{i=1}^{m} P(w_i \mid w_1, \dots, w_{i-1})P(A\mid B) = \dfrac{P(A,B)}{P(B)}。(b) 馬可夫假設(Markov Assumption)
只依賴前
n-1個詞,而不是全部歷史:P(w_1, \dots, w_m) \approx \prod_{i=1}^{m} P(w_i \mid w_{i-n+1}, \dots, w_{i-1})n模型
公式
1
unigram
P(w_1,\dots,w_m) = \prod_{i=1}^{m} P(w_i)2
bigram
P(w_1,\dots,w_m) = \prod_{i=1}^{m} P(w_i \mid w_{i-1})3
trigram
P(w_1,\dots,w_m) = \prod_{i=1}^{m} P(w_i \mid w_{i-2}, w_{i-1})(c) 最大概似估計(Maximum Likelihood Estimation, MLE)
用相對頻次估計條件機率:
P(w_i \mid w_{i-1}) = \frac{C(w_{i-1}, w_i)}{C(w_{i-1})}, \qquad P(w_i) = \frac{C(w_i)}{M}其中
C(\cdot)是計數,M是總 token 數。手算範例
語料(兩句,句首句尾用 <s> <eos> 標記):
機率
計算
結果
P(\text{yes} \mid \text{<s>})1 / 20.5
P(\text{no} \mid \text{yes})2 / 40.5
P(\text{no} \mid \text{no})5 / 80.625
P(\text{yes} \mid \text{no})2 / 80.25
P(\text{<eos>} \mid \text{yes})1 / 40.25
P(\text{<eos>} \mid \text{no})1 / 80.125
語料中 yes 出現 4 次、no 出現 8 次。對同一個前詞,後繼詞還應包含句尾標記:例如 no 的後繼機率為
5/8+2/8+1/8=1。3.5 N-gram 的三個問題
問題
現象
對策
a) 語言具有長距離影響
只看前
n-1個詞,忽略遠處上下文("The trophy would not fit in the suitcase because it was too big" 中 it 指代要靠遠距離資訊)增大
n(但資料稀疏)、快取模型、RNN/Transformerb) 機率通常很小
連乘幾十個
<1的數會下溢為 0用對數機率相加:
\log P = \sum \log P(w_i\mid\cdot);計算困惑度時也先求平均負對數機率c) 未出現過(零機率)
訓練集沒有的 n-gram 計數為 0 → 整句機率歸零
平滑(Smoothing),見第 4 節
4. 平滑 Smoothing
目標:給未出現的 n-gram 分配非零機率,同時保證所有機率之和仍為 1(機率質量守恆)。
4.1 Add-one(Laplace)平滑
基本想法:假裝每個 n-gram 都至少出現過一次,即給所有計數
+1。P_{\text{add1}}(w_i) = \frac{C(w_i) + 1}{M + \vert V\vert } \qquad\text{(unigram)}P_{\text{add1}}(w_i \mid w_{i-1}) = \frac{C(w_{i-1} w_i) + 1}{C(w_{i-1}) + \vert V\vert } \qquad\text{(bigram)}分母加
\vert V\vert正是為了讓機率之和仍為 1(\vert V\vert個候選各多算了 1 次)。問題:
+1對低頻詞/稀疏語料來說"太多了",把大量機率質量分給未見事件,明顯壓低已見 n-gram 的機率,效果偏差大。4.2 Add-k(Lidstone)平滑
P_{\text{add-}k}(w_i \mid w_{i-2}, w_{i-1}) = \frac{C(w_{i-2}, w_{i-1}, w_i) + k}{C(w_{i-2}, w_{i-1}) + k\,\vert V\vert }k是需要人為選擇的超參數,0<k<1通常優於k=1;最佳k需要透過實驗(驗證集)確定。k,不同k平滑效果差異明顯;4.3 Absolute Discounting(絕對折扣)
想法:從每個見過的詞那裡"借"走固定的
d(如d=0.1),把這些機率質量分給沒見過的詞。P_{\text{abs}}(w_i \mid w_{i-1}) = \frac{C(w_{i-1}, w_i) - d}{C(w_{i-1})}, \quad \text{若 } C(w_{i-1},w_i) > 0範例(context = alleged,5 個已見 bigram、2 個未見 bigram)
詞
counts
未平滑機率
Add-α (α=0.1) 有效計數
Add-α 平滑機率
Discounting (d=0.1) 有效計數
Discounting 平滑機率
impropriety
8
0.4
7.826
0.391
7.9
0.395
offense
5
0.25
4.928
0.246
4.9
0.245
damage
4
0.2
3.961
0.198
3.9
0.195
deficiencies
2
0.1
2.029
0.101
1.9
0.095
outbreak
1
0.05
1.063
0.053
0.9
0.045
infirmity
0
0
0.097
0.005
0.25
0.013
alleged
0
0
0.097
0.005
0.25
0.013
合計
20
1.0
20
1.0
20
1.0
8-0.1=7.9、5-0.1=4.9…,共"借出"5\times0.1=0.5的有效計數,對應0.5/20=0.025的機率質量;0.5個有效計數平均分給 2 個未見詞:0.5/2 = 0.25(有效計數),正規化後為0.25/20=0.0125\approx0.013。4.4 Katz Backoff(回退)
想法:已見就用折扣後的機率;未見就按 lower-order model(低階模型)重新分配搶來的機率質量。
P_{\text{katz}}(w \mid h) = \begin{cases} \dfrac{C^*(h,w)}{C(h)}, & \text{if } C(h,w) > 0 \\[2mm] \alpha(h)\,P_{\text{lower}}(w), & \text{otherwise} \end{cases}這裡
h=w_{i-1}是上下文,C^*(h,w)是折扣後的計數。Katz 通常使用基於 Good–Turing 的計數折扣,並非把所有已見計數統一減去同一個常數。回退權重為:\alpha(h)=\frac{1-\sum_{w:C(h,w)>0}C^*(h,w)/C(h)}{\sum_{w:C(h,w)=0}P_{\text{lower}}(w)}分子是高階模型留下的機率質量,分母是在當前上下文中未見詞的低階機率之和;兩者一起保證最終分布正規化。
Katz 的問題
P(\text{Kong})可能高於P(\text{glasses}),即使 Kong 幾乎總跟在 King 後面,也可能被錯誤地選中。4.5 Kneser-Ney 平滑
想法:不再按原始計數分配折扣質量,而按多樣性(versatility)——這個詞能跟在多少個不同的詞後面——來分配。
公式:插值形式
下面使用常見的插值 Kneser–Ney:低階分布不只在高階計數為零時參與,而是與折扣後的高階機率相加。
P_{KN}(w_i \mid w_{i-1}) = \frac{\max(C(w_{i-1},w_i)-D,0)}{C(w_{i-1})} +\lambda(w_{i-1})\,P_{\text{cont}}(w_i)P_{\text{cont}}(w_i)= \frac{\vert\{u:C(u,w_i)>0\}\vert}{\vert\{(u,v):C(u,v)>0\}\vert},\qquad \lambda(h)=\frac{D\,\vert\{v:C(h,v)>0\}\vert}{C(h)}w_i(即w_i的"上下文類型數");\lambda(h):在上下文h下被折扣掉的總機率質量;0<D<1時,每個已見後繼都貢獻D/C(h)。高階分布與低階分布相加後,機率和仍為 1。4.6 Interpolation(插值)
想法:不"二選一"地回退,而是把不同階的 n-gram 模型加權混合,權重透過調參(在 held-out 資料上學習)得到。
P_{IN}(w_i \mid w_{i-1}, w_{i-2}) = \lambda_3 P_3(w_i \mid w_{i-2}, w_{i-1}) + \lambda_2 P_2(w_i \mid w_{i-1}) + \lambda_1 P_1(w_i)\sum_k \lambda_k = 1, \qquad \lambda_k \ge 0\lambda在 held-out data 上學習(EM 或網格搜尋),不是憑直覺任意指定;4.7 平滑方法比較小結
方法
核心思想
優點
缺點
Add-1
所有計數 +1
最簡單,保證非零且已正規化
對稀疏資料加得太多,嚴重壓低已見機率
Add-k
所有計數 +k
比 add-1 溫和
需調
k;未見詞機率全相同;破壞原比例Absolute Discounting
已見詞統一減
d,餘額給未見詞簡單、效果好於 add-k
不區分低階上下文的資訊量
Katz Backoff
未見時回退到低階
保留高階精確性
回退依據是原始機率,忽略上下文多樣性(reading Kong 問題)
Kneser-Ney
用延續機率分配折扣質量
經典 n-gram 模型中的強基線
公式較複雜,需兩套計數
Interpolation
各階模型加權混合
穩定、常優於 backoff
需在 held-out 上調
\lambda5. 文字分類
5.1 任務定義
d(通常表示為特徵向量 vector of features)+ 一個固定的類別集合C=\{c_1, c_2, \dots, c_k\}(categorical,不是連續值也不是有序值)。\hat{c} \in C。5.2 應用
5.3 標準流程
5.4 選擇方法時要注意的維度
維度
含義
偏差 Bias
模型的限制或簡化假設造成的系統性誤差;假設與真實資料不符時,可能帶來較大的偏差
變異數 Variance
模型對訓練集的敏感程度。越敏感,換一批資料結果波動越大(易過擬合)
潛在假設
模型依賴的條件(如特徵獨立、線性邊界、距離有意義),偏離時可能影響效果
複雜度
訓練/推論的時間與空間成本,是否可擴展到大量資料
速度
訓練與預測延遲是否滿足線上要求
5.5 常用演算法逐個比較
(1) Naïve Bayes
P(C\mid F) \propto P(F\mid C)\,P(C)即"類先驗 × 該類下出現這些特徵的機率"。
P(F \mid C) = \prod_{f \in F} P(f \mid C)(2) Logistic Regression(邏輯迴歸 / 最大熵)
P(y=c \mid x) = \frac{\exp(w_c^\top x + b_c)}{\sum_{c'} \exp(w_{c'}^\top x + b_{c'})}(3) Support Vector Machine (SVM)
\min_{w,b}\ \tfrac{1}{2}\Vert w\Vert ^2 \quad \text{s.t.}\quad y_i(w^\top x_i + b) \ge 1(4) K-Nearest Neighbour (KNN)
k個訓練樣本,按它們的多數類分類。(5) Decision Tree
(6) Random Forest
(7) Neural Network
5.6 超參數調優與評估
Hold-out(留出法):把資料分成 train / dev(validation)/ test。用 dev 選超參數,test 只用於最終報告一次。
混淆矩陣(二分類範例)
Classified As A
Classified As B
True A
79 (TP)
13 (FN)
True B
8 (FP)
10 (TN)
指標計算
Accuracy 準確率
\text{Accuracy} = \frac{TP + TN}{N} = \frac{79+10}{110} = 0.809Precision 精確率(查準):預測為正的裡面有多少真的為正
P = \frac{TP}{TP + FP} = \frac{79}{79+8} = 0.908Recall 召回率(查全):真正為正的裡面有多少被找出來
R = \frac{TP}{TP + FN} = \frac{79}{79+13} = 0.859F1-Score:精確率與召回率的調和平均
F_1 = \frac{2PR}{P+R} = \frac{2 \times 0.908 \times 0.859}{0.908 + 0.859} = 0.883多分類指標
指標
做法
特點
Macro-average
先對每個類別分別算 P/R/F1,再對類別取算術平均
每個類別同等權重,少數類影響被放大,能暴露長尾表現差
Micro-average
把所有類別的 TP/FP/FN 彙總後再算一次 P/R/F1
每個樣本同等權重,大類主導;單標籤多分類時 micro-F1 = accuracy
6. 詞性標註 POS Tagging
6.1 什麼是 POS
定義:給句子中每個詞標註其文法類別(詞性)。
例子:Janet/NNP will/MD back/VB the/DT bill/NN
應用:
6.2 詞性分類
開放類(Open class):可隨時添加新詞/淘汰舊詞
大類
細分
Nouns 名詞
Proper 專有(Melbourne)/Common 普通;Common 再分 Mass 不可數(water)/Count 可數(chair)
Lexical verbs 實義動詞
可有豐富的屈折變化(sing/sang/sung);依用法區分及物/不及物
Adjectives 形容詞
Gradable 可分級(very tall)/Non-gradable 不可分級(dead)
Adverbs 副詞
Locative 處所(here, there)/Degree 程度(very, extremely)
封閉類(Closed class):相對固定,不易增減
6.3 挑戰:歧義(Ambiguity)
同一個詞形可以是多個詞性,且分布極不均衡:
6.4 POS Tagsets 標籤集
標籤集
標籤數
特點
Brown
87
最早的語料庫標籤集之一,粒度細
Penn Treebank (PTB)
45
NLP 中最常用,含 NN, NNS, NNP, VB, VBD, VBG, JJ, RB, IN, DT, MD, CC, PRP…
CLAWS5 / BNC
61
CLAWS 的一個版本;不同版本的標籤數不同
早期 Universal Tagset
12
NOUN, VERB, ADJ, ADV, PRON, DET, ADP, NUM, CONJ, PRT, ., X;不要與 Universal Dependencies 的 17 類 UPOS 混淆
經典歧義範例(Penn Treebank 標註)
同一個 flies:第一句是動詞(時間飛逝),第二句是名詞(果蠅)。只能靠上下文判斷。
7. 隱藏式馬可夫模型 HMM
7.1 引入:為什麼需要 HMM
任務:POS tagging——給整個詞序列
W = w_1 \dots w_n找最佳標籤序列T = t_1 \dots t_n。已有方法的問題:逐詞獨立預測無法利用標籤之間的依賴;如果改成依賴前面預測標籤的貪心分類器,又可能出現錯誤傳播(error propagation),前一個標籤的錯誤會影響後面。
新想法:把整個句子丟給模型,讓它生成整條 tag 序列。
新問題:句子長度不固定;所有 tag 組合數是
\vert T\vert ^n,指數級,無法枚舉。解決辦法:找一個模型,以詞為單位建模,但在學習與預測時把整句當作一個整體——這叫 sequence labelling,也叫 structured prediction。
HMM 的運作方式:給定句子(詞序列),在所有可能的 tag 序列中找機率最大的那一條。
優勢:
7.2 公式
\hat{T} = \arg\max_{T} P(T \mid W) = \arg\max_{T} \frac{P(W \mid T)\,P(T)}{P(W)} = \arg\max_{T} P(W \mid T)\,P(T)(
P(W)與T無關,可忽略——這就是 Bayes 法則去掉分母)7.3 兩個假設
假設
內容
作用
Output independence(輸出獨立)
第
i個詞只依賴第i個 tag,與其他詞、其他 tag 無關:P(W\mid T)=\prod_i P(w_i\mid t_i)把"整句給定標籤"分解為逐詞乘積
Markov assumption(馬可夫)
當前 tag 只與前一個 tag 有關:
P(T)=\prod_i P(t_i \mid t_{i-1})把標籤序列的機率分解為一階轉移乘積
於是:
\hat{T} = \arg\max_{T} \prod_{i=1}^{n} \underbrace{P(w_i \mid t_i)}_{\text{emission}} \cdot \underbrace{P(t_i \mid t_{i-1})}_{\text{transition}}7.4 訓練:算兩個機率表
參數
名稱
含義
P(w_i \mid t_i)Emission(發射/觀測)機率 O
某個 tag 生成某個詞的機率
P(t_i \mid t_{i-1})Transition(轉移)機率 A
前一個 tag 後面接某個 tag 的機率
怎麼算:仍是最大概似估計(MLE),即數數:
P(w_i \mid t_i) = \frac{\text{Count}(w_i, t_i)}{\text{Count}(t_i)}, \qquad P(t_i \mid t_{i-1}) = \frac{\text{Count}(t_{i-1}, t_i)}{\text{Count}(t_{i-1})}第一個 tag 的機率怎麼辦? 在每句之前加一個特殊起始符號 <s>,於是第一項就是
P(t_1 \mid \text{<s>}):P(t_1 \mid \text{<s>}) = \frac{\text{Count}(\text{<s>}, t_1)}{\text{Count}(\text{<s>})}句尾同理加 </s>,讓
P(\text{</s>} \mid t_n)也成為一個可學的轉移。前面的乘積為簡潔省略了這個句尾因子;完整路徑機率應再乘上它。沒見過的詞怎麼辦? 仍用平滑(第 4 節):對 emission 表加 k / 加 1;或用 <UNK> 把低頻詞折疊,讓 <UNK> 的發射機率由所有低頻詞共享。
7.5 預測
給定訓練好的 HMM(兩張表:轉移矩陣 A、發射矩陣 O),預測輸入句子的 tag 序列。
核心思路:取所有 tag 組合中聯合機率最高的那一條:
\hat{t} = \arg\max_{t} P(W \mid t)\,P(t) = \arg\max_{t} \prod_{i=1}^{n} P(w_i \mid t_i)\,P(t_i \mid t_{i-1})為什麼不能一個詞一個詞地預測?(貪心解碼的缺陷)
\vert T\vert ^n不可行 → 用 Viterbi 動態規劃求全域最佳;標籤集大小固定時,執行時間隨句長線性增長。7.6 生成式 vs 判別式
維度
Generative(HMM)
Discriminative(CRF / 分類器)
建模對象
聯合機率
P(X, Y)條件機率
P(Y \mid X)(或P(T\mid W))典型用途
可用於生成語言;HMM 也能做無監督學習
分類、預測、序列標註
訓練方式
通常(半)監督,也可 EM 無監督
通常是監督學習
特徵
只能使用觀測本身的發射機率,特徵受限
可用任意豐富特徵(前後綴、詞形、上下文詞、外部詞典…)
資料量
簡單的結構假設可能有利於少量資料學習
資料和特徵充分時通常能取得更好的預測效果,仍取決於任務與模型
代表
Naïve Bayes、HMM;神經語言模型也可作生成式建模
邏輯迴歸、CRF、SVM、用於分類的神經網路
8. Viterbi 演算法
8.1 核心思想
即:對每個位置
t和每個標籤j,記錄以j結尾的最佳路徑的累計得分\delta_t(j)及其回溯指標\psi_t(j)。8.2 遞推公式
\delta_1(j) = P(t_1 = j \mid \text{<s>}) \cdot P(w_1 \mid j)\delta_t(j) = \max_{i \in T}\Big[\delta_{t-1}(i)\cdot P(j \mid i)\Big]\cdot P(w_t \mid j)\psi_t(j) = \arg\max_{i \in T}\Big[\delta_{t-1}(i)\cdot P(j\mid i)\Big]終止:
\hat{t}_n = \arg\max_{j}\big[\delta_n(j)\,P(\text{</s>}\mid j)\big], \qquad \hat{t}_{t} = \psi_{t+1}(\hat{t}_{t+1}) \ \text{(回溯)}如果模型沒有顯式句尾狀態,終止時直接比較
\delta_n(j)即可;下面兩個範例均採用這一簡化。直覺範例:Can Play
8.3 例子 1:Janet will back the bill
轉移矩陣(Transition Matrix,節選,列為條件事件
P(\cdot\mid \text{row}))NNP
MD
VB
JJ
NN
RB
DT
<s>
0.2767
0.0006
0.0031
0.0453
0.0449
0.0510
0.2026
NNP
0.3777
0.0110
0.0009
0.0084
0.0584
0.0090
0.0025
MD
0.0008
0.0002
0.7968
0.0005
0.0008
0.1698
0.0041
VB
0.0322
0.0005
0.0050
0.0837
0.0615
0.0514
0.2231
JJ
0.0366
0.0004
0.0001
0.0733
0.4509
0.0036
0.0036
NN
0.0096
0.0176
0.0014
0.0086
0.1216
0.0177
0.0068
RB
0.0068
0.0102
0.1011
0.1012
0.0120
0.0728
0.0479
DT
0.1147
0.0021
0.0002
0.2157
0.4744
0.0102
0.0017
(資料來自 Jurafsky 與 Martin 的 Speech and Language Processing 第 18 章 Figure 18.12,基於 WSJ 語料、未平滑。這裡只列出部分標籤,所以表中每列之和不必等於 1;完整轉移分布才會正規化。)
發射矩陣(Emission Matrix,Speech and Language Processing,Figure 18.13)
Janet
will
back
the
bill
NNP
0.000032
0
0
0.000048
0
MD
0
0.308431
0
0
0
VB
0
0.000028
0.000672
0
0.000028
JJ
0
0
0.000340
0
0
NN
0
0.000200
0.000223
0
0.002337
RB
0
0
0.010446
0
0
DT
0
0
0
0.506099
0
演算法流程:建一個
\vert T\vert \times n的格子(trellis),逐欄填\delta,每格記下「從上一欄哪個標籤來」,最後從最末欄的最大值回溯。8.4 例子 2:they fish(可手算驗證)
這是僅用於演示動態規劃的兩狀態玩具模型,數值人為設定;N、V 是狀態標籤,不應據此判斷真實英語中的 they 可以作動詞。
發射機率
they
fish
N
0.7
0.3
V
0.4
0.6
轉移機率
N
V
<s>
0.6
0.4
N
0.8
0.2
V
0.7
0.3
枚舉全部 4 條路徑
路徑
計算
機率
N N
0.6\times0.7 \times 0.8\times0.30.1008 ✅ 最佳
N V
0.6\times0.7 \times 0.2\times0.60.0504
V N
0.4\times0.4 \times 0.7\times0.30.0336
V V
0.4\times0.4 \times 0.3\times0.60.0288
結論:they/N fish/N。只比較 fish 的發射機率,會看到
P(\text{fish}\mid V)=0.6大於P(\text{fish}\mid N)=0.3;加入轉移機率後,最佳路徑卻以 N 結尾。發射機率不是標籤後驗,不能直接據此選標籤。這個例子展示了轉移資訊的作用,但不構成「逐步考慮轉移的貪心解碼一定失敗」的反例。8.5 演算法特性
特性
說明
時間複雜度
O(T^2 N):T= 標籤集大小,N= 序列長度。每個位置N,每個標籤T,每個標籤要與前一位置所有T個標籤比較空間複雜度
只求最佳得分時可輪替保留兩欄,空間為
O(T);要恢復整條路徑,則需保存O(TN)個回溯指標為什麼正確(why it works)
最佳子結構:到位置
t標籤j的最佳路徑,其前綴必然是到位置t-1某標籤的最佳路徑(否則替換前綴可得更佳解);無後效性:給定當前標籤,未來與更早的歷史無關(馬可夫性)。因此可以只保留每格的"最佳前綴得分",安全地丟棄次佳路徑數值下溢
機率連乘很快變成 0,實際實作全部用 log 機率(乘法變加法,
O(T^2N)不變)更高階變體
用 tag trigram(二階 HMM):
P(t_i \mid t_{i-2}, t_{i-1}),配合 interpolation 平滑;複雜度升為O(T^3 N)