1. 翻譯系統性能評價方法
在機器翻譯系統性能評估中,通常既有人工評價也有自動評價方法:
1.1 人工評價
人工評價主要關注以下幾點:
- 流利度(Fluency): 判斷翻譯結果是否符合目標語言的語法和習慣。
- 充分性(Adequacy): 判斷翻譯是否傳達了原文的全部信息。
- 評價方式: 可以通過打分(Rate)、排序(Rank)以及編輯比較(Edit & Compare)的方式進行人工評測。
1.2 自動評價指標
自動評價方法常用的包括基于字符 n-grams 的指標(如 chrF)和基于單詞 n-grams 的指標(如 BLEU)。
chrF 指標
- 基本思想:
將翻譯結果與參考譯文在字符級別進行 n-gram 匹配,適合于捕捉詞形變化(如“read”與“Reading”),適合處理小寫、標點、甚至拼寫錯誤等情況。 - 常用公式:
-
精確率(Precision):
precision = TP / (TP + FP) -
召回率(Recall):
recall = TP / (TP + FN) -
F-beita 分數(F_β-score):
F β = ( ( 1 + β 2 ) ? T P ) / ( ( 1 + β 2 ) ? T P + β 2 ? F N + F P ) F_β = ((1+β^2)·TP) / ((1+β^2)·TP + β^2·FN + FP) Fβ?=((1+β2)?TP)/((1+β2)?TP+β2?FN+FP)
其中,beita 參數控制精確率和召回率之間的權重。例如,F2-score中 β= 2(公式:F2 = 5TP/(5TP + 4FN + FP)),而 F0-score 則相當于Precision, 當β很大的時候,相當于Recall
-
當所評估句子數量較多時,chrF 能有效反映字符級匹配情況,但當匹配以單詞為單位時,可能出現“沒有4-gram匹配得分為0”的情況,因此常配合其他指標綜合評估。
BLEU 指標
- 基本思想:
BLEU 通過對比翻譯輸出與參考譯文的單詞 n-grams(通常計算一元、二元、三元和四元 n-grams)精確率,并取幾何平均后乘以一個懲罰因子(brevity penalty)來處理生成句子較短的問題。 - 局限性:
由于BLEU只計算精確率,不考慮單詞的形態變化(例如“read”和“Reading”在嚴格匹配時視為不同)以及上下文語序,且幾何平均在數據量不足時敏感,常常無法完全反映翻譯的流利性和充分性。
對比
BLEU vs. chrF
特征 | BLEU | chrF |
---|---|---|
全稱 | Bilingual Evaluation Understudy | Character n-gram F-score |
單位 | 基于詞級別(word-level) | 基于字符級別(character-level) |
匹配單位 | n-gram(如詞組) | 字符n-gram(如連續的字符組合) |
語言適用性 | 英語/法語等空格分詞語言效果較好 | 對形態復雜語言(如德語、芬蘭語、中文)效果更好 |
對詞形變化的魯棒性 | 差(如“run”和“runs”會被認為不同) | 好(字符n-gram可以捕捉到詞形變化) |
對詞序敏感 | 非常敏感 | 不那么敏感 |
評價精度 | 偏向于流暢性(fluency) | 更能捕捉語義和詞形匹配(adequacy) |
懲罰機制 | 有 Brevity Penalty 懲罰過短的句子 | 沒有專門懲罰機制 |
實現工具 | NLTK、SacreBLEU | 官方工具:chrF++ ,也在 SacreBLEU 中支持 |
2. Tokenisation 的基本概念與問題
Tokenisation(分詞或詞元化)指的是將一段文本切分為基本單元(token),如單詞、標點符號或子詞單元。傳統方法多采用基于空格分割,但存在以下問題:
2.1 基于空格分詞的局限性
- 簡單的空格分割:
通常將文本按照空格拆分出各個 token,此方法對于英文等基于空格分詞的語言基本適用。但在實際情況中會遇到:- 縮寫問題: 如 “won’t” 表示 “will not”,空格分詞時可能作為一個整體或拆分為 “won” 和 “'t”。
- 標點處理: 如 “great!” 中的感嘆號有可能被保留或刪除,不同工具處理方式不一致。
- 罕見詞或變體: 如 “taaaaaaasty” 可能有多種變體,直接按空格分割,無法解決拼寫變化或冗余重復問題。
- 拼寫錯誤或新詞: 如 “laern” (原意 learn)和 “transformerify” 這樣的新造詞也會被簡單拆分,而無法充分捕捉原有語義。
2.2 Tokenisation 幫助處理罕見詞等問題
通過更細粒度的分詞方法,可以減少由于拼寫錯誤、變形或新詞帶來的問題。例如,將長詞拆成子詞單元,可以使得詞形變化不至于使整個單詞無法識別。
- 實例:
- “laern” 拆分為 “la##”, “ern”。
這樣一來,即使遇到拼寫錯誤或不常見的詞,模型也能通過子詞組合部分捕捉到詞語的語義,從而提高整體泛化能力。
- “laern” 拆分為 “la##”, “ern”。
3. 子詞分割策略與方法
為了更好地處理詞形變化、罕見詞及新詞,現有許多基于子詞單位的分詞算法。主要包括以下三類:
3.1 Byte-Pair Encoding (BPE)
BPE 的基本算法步驟為:
- 初始化詞匯表:
將詞匯表設置為所有單獨的字符。 - 查找頻率最高的相鄰字符對:
遍歷語料,找出最常在一起出現的兩個字符或子詞。 - 合并:
將這一對合并,生成一個新的子詞單位,并更新整個語料中的分詞表示。 - 檢查詞匯表大小:
如果詞匯表大小未達到預設目標(例如 100,000),則返回步驟2繼續合并,直到達到要求。
這種方法簡單高效,常用于許多現代 NLP 框架中。
假設我們現在的訓練語料有以下 4 個詞:
1. low
2. lower
3. newest
4. widest
初始我們會把每個詞都拆成字符 + 特殊結束符號 </w>
來防止詞和詞連接在一起:
l o w </w>
l o w e r </w>
n e w e s t </w>
w i d e s t </w>
🔁 步驟 0:統計所有字符對頻率
從上面所有詞中,統計所有相鄰字符對的頻率(包括 </w>
):
Pair | Count |
---|---|
l o | 2 |
o w | 2 |
w | 1 |
w e | 1 |
e r | 1 |
r | 1 |
n e | 1 |
e w | 1 |
w e | 1 |
e s | 2 |
s t | 2 |
t | 2 |
w i | 1 |
i d | 1 |
d e | 1 |
注意:
w e
出現了兩次(一次是 “lower”,一次是 “newest”);e s
、s t
和t </w>
是在 “newest” 和 “widest” 中反復出現的。
🔨 步驟 1:合并頻率最高的字符對
我們假設 s t
是當前頻率最高的(2 次)。那我們合并 s t → st
。
現在變成:
l o w </w>
l o w e r </w>
n e w e st </w>
w i d e st </w>
🔁 步驟 2:重新統計字符對頻率
重新統計所有字符對(只列幾個):
Pair | Count |
---|---|
l o | 2 |
o w | 2 |
e st | 2 |
st | 2 |
… | … |
我們發現 e st
和 st </w>
又很頻繁 → 合并 e st → est
🔨 步驟 3:合并 e st → est
結果:
bashCopyEditl o w </w>
l o w e r </w>
n e w est </w>
w i d est </w>
你看,“newest” 和 “widest” 的后綴變成了統一的 est
,這就是 BPE 的威力!
🔁 再來幾輪(每次合并頻率最高的)
假設繼續合并:
Round | 合并操作 | 影響 |
---|---|---|
4 | l o → lo | 得到 lo w |
5 | lo w → low | 得到完整詞 low |
6 | e r → er | 合并 “lower” 的尾部 |
7 | w e → we | 合并 “newest” 的 “we” 部分 |
8 | we + r → wer | 可得 “lower” 更完整 |
每合并一次,詞匯表中就新增一個子詞(如 low
、est
、er
等),最終我們就有一個子詞詞表,用于之后的分詞。
? 最終效果(假設分詞完成后):
原始詞 | 分詞結果 |
---|---|
low | low |
lower | low + er |
newest | new + est |
widest | wid + est |
這樣,即使將來出現一個從沒見過的詞,比如 bravest
,我們也可以分成:
brav + est
🧠 總結亮點
- BPE 把頻繁出現的字符組合合并成更長的單元;
- 最終詞匯表里既有完整詞(如
low
),也有子詞(如est
,er
); - 能處理拼寫變化、形態變化、新詞;
- 是 GPT、BERT、RoBERTa、T5 等模型使用的標準方法。
3.2 WordPiece
WordPiece 最早由 Google 提出,其主要步驟與 BPE 類似,但在合并步驟中使用更復雜的決策標準:
- 訓練一個 n-gram 語言模型,
并考慮所有可能的詞匯對,選擇那個加入后能最大程度降低困惑度perplexity的組合; - HuggingFace 實現的 WordPiece 則有時選擇使得合并后 token 的概率比例滿足某個公式,例如選擇使得
“|combined| / (|first symbol| * |second symbol|)” 最大的詞對。
這種方法可在一定程度上更好地平衡子詞與完整詞的表達效果。
?? 分詞示例(WordPiece)
以 playing
為例,假設詞表中包含:
[ "play", "##ing", "##er", "##est", "##s" ]
那 playing
會被分為:
play + ##ing
再比如 unbelievable
:
如果詞表中有:
["un", "##believable", "##able", "##lievable", ...]
則可能被分為:
un + ##believable
(如果沒有 “believable”,那就會繼續拆成 ##believe + ##able
)
🎯 WordPiece 構建流程(簡要)
- 初始化詞表:包含所有單字符 token(如 a, b, c,…);
- 基于最大似然概率計算所有可能合并的對;
- 每輪合并一對,使得整體訓練語料的似然性最大;
- 直到詞表達到預設大小(如 30,000 個 token)為止;
這比 BPE 更慢,但能得到更“語言合理”的子詞。
🔍 分詞過程總結
WordPiece 是一種貪心最長匹配算法,遵循以下原則:
- 從詞首開始;
- 找到最長可匹配的 token(如 “unbelievable” → “un”);
- 然后從該點繼續向右,查找
##
前綴的匹配; - 直到整個詞完成或無法繼續拆分;
🧠 舉個例子(完整流程)
假設詞表里有:
["un", "##believe", "##able", "##believable"]
處理 unbelievable
:
unbelievable
→un
+##believable
再處理 unbelievably
:
如果 ##ly
也在詞表中,就可以是:
un
+##believable
+##ly
如果 ##believable
不在詞表中:
- 嘗試
un
+##believe
+##able
? 總結
BPE 看頻率,WordPiece 看語言模型概率。
WordPiece 更“聰明”,但 BPE 更“高效”。它們都用來解決“詞太多”和“未知詞”的問題。
WordPiece vs. BPE 的區別
特性 | BPE | WordPiece |
---|---|---|
合并策略 | 每次合并頻率最高的 pair | 每次合并帶來最大 語言模型概率提升 的 pair |
評分標準 | 純粹基于頻率 | 基于最大似然估計(MLE) |
分詞方式 | 貪心從左到右合并 | 也使用貪心,但遵循“最大匹配”原則 |
應用例子 | GPT、RoBERTa、OpenNMT | BERT、ALBERT、DistilBERT 等 |
詞邊標記 | 可無(GPT類) | 用 ## 表示詞中間部分(如 play ##ing ) |
3.3 Unigram / SentencePiece
Unigram 模型(或稱 SentencePiece)采取另一種策略,不是從最小單元不斷合并,而是:
- 初始化:
從所有字符以及語料中頻率較高的連續字符序列(甚至包括完整單詞)構建一個較大的初始詞匯表; - 精簡:
通過一種復雜的概率模型和迭代過程,逐步刪除貢獻較小的詞匯項,直到詞匯表達到預期大小。
這種方法的優勢在于能夠同時考慮大單元和小單元的信息,從而得到更優的子詞表示。
用 Unigram 分詞 internationalization
假設詞表中有:
["international", "##ization", "inter", "##national", "##ize", "##ation", "##al", "##i", "##zation"]
Unigram 會考慮所有可能組合:
- international + ization
- inter + national + ization
- inter + nation + al + ization
- …
對每個組合計算 概率乘積(P(a) × P(b) × P? …),然后選取概率 最大的組合方式。
比如:
international + ization → P1
inter + national + ization → P2
inter + nation + al + ization → P3
選取 max(P1, P2, P3)
那個組合。
3.4 各方法的比較
- BPE: 簡單、直接,廣泛應用,合并依據頻率;
- WordPiece: 考慮對語言模型困惑度的影響,通常效果更好,但實現較復雜;
- Unigram/SentencePiece: 允許初始詞匯同時包含較大和較小單元,通過概率模型精簡詞匯,具有更大的靈活性。
Unigram vs. BPE/WordPiece
特性 | Unigram(SentencePiece) | BPE | WordPiece |
---|---|---|---|
分詞方式 | 選擇概率最高的子詞組合(非貪心) | 左到右合并字符對(貪心) | 貪心最長匹配 |
詞表生成方式 | 預設大詞表 → EM算法刪掉低概率的子詞 | 每輪合并頻率最高的 pair | 每輪合并最大增益的 pair |
分詞結果是否唯一 | ? 可能多個組合概率差不多 | ? 唯一貪心路徑 | ? 貪心最長匹配 |
優點 | 更靈活,能找到最優子詞拆法 | 簡單快速 | 精確但復雜 |
模型代表 | ALBERT, XLNet, T5, mBART, SentencePiece | RoBERTa, GPT, MarianMT | BERT, DistilBERT |
特殊符號 | 不需要空格、可直接處理未空格文本 | 需提前空格/處理標記 | 通常需要空格 |
4. 特殊常見詞(例如“the”)的處理
在分詞和詞嵌入訓練中,常見詞(如 “the”、“is”、“and” 等)通常出現頻率極高,這會帶來兩個問題:
- 模型訓練時的影響:
高頻詞容易主導模型權重,導致訓練過程中對低頻實義詞的信息關注不足。為此,許多方法會在訓練時對這些高頻詞進行下采樣(sub-sampling),降低它們在訓練中的出現頻率。 - 評價指標的匹配:
在翻譯評價、自動摘要或其他生成任務中,通常不希望因為 “the” 這種功能詞的不同寫法(例如大小寫問題)產生低分。在實際 tokenisation 中,往往會將所有單詞統一小寫,或者對停用詞單獨處理,從而確保這些高頻但語義信息較弱的詞對整體模型影響較小。
例如,在 BLEU 計算中,盡管 “read” 和 “Reading” 在大小寫和形態上有所不同,但通常在預處理階段會進行小寫化;而在子詞分割中,“the” 可能不再被拆分,因為它本身已經十分常見而且具有固定形式。因此,“the” 通常被保留為一個完整的 token,同時在訓練和評價中通過下采樣等方式控制其權重。
5. 實際案例補充
假設我們有一段英文文本作為翻譯系統的輸入與參考譯文,并希望利用自動評價指標來評估翻譯質量,同時考慮分詞細節:
案例 1:翻譯評價中 chrF 指標計算
- 參考譯文: “I like to read too”
- 機器譯文: “Reading, I too like”
- 處理流程:
-
分詞:
利用子詞分割策略處理標點和縮寫,確保“Reading”可以與“read”在字符 n-gram 層面匹配。 -
計算字符 n-gram 匹配:
對機器譯文和參考譯文分別計算字符 n-grams,再計算精確率和召回率。 -
Fbeita 分數計算:
-
結果說明:
通過字符匹配,可以部分容忍由于詞形變化(例如 “read” 與 “Reading”)而帶來的微小差異。
-
案例 2:使用 BPE 處理新詞
假設文本中出現一個新詞 “transformerify”,傳統的詞匯表中可能未收錄。通過 BPE 分詞過程:
- 初始化:
將 “transformerify” 拆分為單個字符,即 [“t”, “r”, “a”, “n”, “s”, “f”, “o”, “r”, “m”, “e”, “r”, “i”, “f”, “y”]。 - 迭代合并:
統計在整個語料中最頻繁出現的相鄰字符對,如果 “er” 出現次數最多,則將“e”與“r”合并為 “er”。不斷進行,直到達到預定詞匯大小。 - 結果:
最終可能將 “transformerify” 分割為 “transforme” 和 “##ify”,使得即使新詞未見過,也能利用已有的子詞表示捕捉部分語義。