N-gram 語言模型為什麼生成的句子缺乏整體連貫性?
某企業嘗試以 N-gram 語言模型(N-gram Language Model)建立客服自動回覆系統,但發現模型生成的句子雖在片段上合理,卻缺乏整體語意連貫性。此問題最可能源自 N-gram 模型的哪一項限制?
一家企業用「N-gram 語言模型」來做客服自動回覆。這個模型會生成回覆句子。
但他們發現一個問題:模型生成的每一小段句子讀起來還算通順,但整句話連起來看,語意好像不太連貫,像拼湊出來的。
問你:這個問題最可能是因為 N-gram 模型的哪個限制造成的?
一句話總結
N-gram 模型的根本限制:它只看固定 N 個前面的詞來決定下一個詞,記憶窗口固定且短,所以無法捕捉到距離超過 N 的詞之間的依賴關係(Long-range Dependencies)。生成出來的句子每個「小片段」很合理,但整句意思前後不連貫。
先感受問題:N-gram 就像只能記住前三個字的健忘症患者
假設「快問快答」保險公司要用 N-gram 模型自動回覆顧客的理賠問題。顧客問:
一個 3-gram 模型(每次只看前 2 個詞)生成回覆的方式:
看「問您」→ 猜下一個字:「好」(「問您好」是常見組合)
看「您好」→ 猜下一個字:「我」(「您好我」…)
看「好我」→ 猜下一個字:「們」
…繼續拼下去,每一步局部都合理,但整句話根本答非所問。
問題的根源:模型在猜第 15 個字的時候,已經完全「忘了」一開始顧客問的是「診斷書」和「審核時間」,因為那些詞距離超過 N,它看不到。
N-gram 的「固定視窗」有哪五個本質限制
N-gram 模型的運作邏輯:「給定前面 N-1 個詞,預測下一個詞的機率」。N 越大,視窗越大,但相應問題也越多。
- 記憶上限固定:3-gram 只看前 2 個詞,5-gram 只看前 4 個詞。不管 N 多大,超過 N 的詞就完全看不到。句子裡第 1 個詞決定的語境,到第 20 個詞時早已遺失。
- N 大了資料稀疏問題爆發:5-gram 需要在語料庫裡出現過「A B C D E」這個特定 5 詞組合,才有估計機率的依據。語料庫不夠大,絕大多數組合都是 0,模型幾乎沒辦法正常運作。
- 語境記憶不延伸:「快問快答公司」和「本公司」說的是同一件事,但 N-gram 沒有任何機制把這兩個詞串連起來,後面用「本公司」開頭的段落和前面說「快問快答公司」的段落語意完全斷連。
- 無法捕捉主詞與動詞的長距離一致性:「您的理賠申請…(20 個詞)…已經核准了」,N-gram 在生成「核准」時,已經忘記主詞是「申請」,可能生成語法錯誤的句子。
- 話題轉換無感:長段客服回覆可能涉及多個問題(診斷書取得、審核時間),N-gram 不知道「現在在回答哪個問題」,可能把兩個問題的回答混在一起。
「固定視窗」限制如何直接導致「缺乏整體連貫性」
回到「快問快答」的客服場景。顧客問的問題包含:
- 主詞:「我」
- 事件:「提交了住院理賠申請」
- 問題 1:「診斷書要去哪裡取得」(距離問句開頭已有 20+ 字)
- 問題 2:「理賠審核要多久」(距離問句開頭已有 35+ 字)
一個 3-gram 模型在生成回覆的時候,每步只看前 2 個詞,到了回答問題 2「審核多久」的時機,它早已「忘記」問題 1 是「診斷書」。每一小片段局部通順(因為 3-gram 統計下,「審核時間約」是合理接法),但整個回覆對問題 1 的答覆和問題 2 的答覆缺乏邏輯串連。
這就是「片段合理,整體不連貫」的直接原因:固定 N 的視窗無法捕捉長距離依賴關係。
這就是選項 B 講的:N-gram 模型僅根據固定長度的前序詞建立機率估計,難以捕捉長距離依賴關係(Long-range Dependencies)。
技術版:N-gram 機率公式與 Markov 假設
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
N-gram 的核心公式:
P(wₙ | w₁, w₂, ..., wₙ₋₁)
≈ P(wₙ | wₙ₋(N-1), ..., wₙ₋₁) ← N-gram 的 Markov 假設
# 以 Bigram(2-gram)為例
P(w₃ | w₁ w₂) ≈ P(w₃ | w₂)
# 機率估計靠計數
P(wₙ | wₙ₋₁) = count(wₙ₋₁, wₙ) / count(wₙ₋₁)
- N-gram 模型把「預測下一個詞」簡化為「只看前 N-1 個詞」(Markov 假設)
- 從語料庫統計每個 N-gram 組合出現的次數,算出條件機率
- 生成時,每步根據當前詞選擇「機率最高的下一個詞」
- 因為只記得前 N-1 個詞,超過 N 個詞之外的語境全部遺忘
| 故事 | 公式符號 |
|---|---|
| 整句話的機率 | P(w₁, w₂, ..., wₙ) |
| 只看前 N-1 個詞的簡化假設 | ≈ ∏ P(wᵢ | wᵢ₋ₙ₊₁,...,wᵢ₋₁) |
| 「的」後面出現「貓」的次數 | count("的", "貓") |
| 「的」出現的總次數 | count("的") |
| 看到「的」後面是「貓」的機率 | count("的","貓") / count("的") |
- N(in N-gram)
- 視窗大小。Unigram = 1,Bigram = 2,Trigram = 3。N 決定模型能「記住」多少個前序詞。
- Markov 假設(Markov Assumption)
- N-gram 的核心假設:下一個詞只依賴前 N-1 個詞,與更早的詞無關。這個假設讓計算變得可行,但犧牲了長距離語境。
- count(wᵢ, wⱼ)
- 在訓練語料中,詞 wᵢ 緊接著 wⱼ 出現的次數。N-gram 的機率就是靠計算這些次數得到的。
- 資料稀疏(Sparsity)
- N 越大,特定 N-gram 組合在語料中出現的次數越少,甚至是 0。用「加法平滑」(Laplace Smoothing)等方法緩解,但根本問題仍在。
用 Python 的 NLTK 示範 N-gram 統計:
from nltk import ngrams
from collections import Counter
# 客服語料
corpus = "您好我是快問快答保險的客服很高興為您服務請問有什麼可以協助您的"
tokens = list(corpus)
# 計算 Bigram(2-gram)頻率
bigrams = Counter(ngrams(tokens, 2))
print(bigrams.most_common(5))
# [('您', '好'), ('好', '我'), ('我', '是'), ('是', '快'), ('快', '問')]
# 預測「您」後面最可能的字
target = "您"
candidates = {gram[1]: count for gram, count in bigrams.items() if gram[0] == target}
print(sorted(candidates.items(), key=lambda x: -x[1]))
# [('好', N次), ('的', M次), ...]
這個簡單計數完全看不到「顧客三十字前問的問題是什麼」,生成時只依賴最近 1-2 個字。
蓋住公式,說出 N-gram 的限制:
- N-gram 靠統計「前 N-1 個詞 → 下一個詞」的機率
- Markov 假設:只看前 N-1 個詞,忽略更早的所有詞
- 因此無法捕捉距離超過 N 的詞之間的依賴關係
- 生成長句時,句子開頭決定的語境到句子中段已完全遺忘
為什麼其他選項是錯的
AN-gram 模型在訓練過程中需要龐大計算量,導致長句無法收斂
說 N-gram 模型訓練太耗費計算資源,長句子訓練時無法收斂(也就是模型沒辦法學好)。
N-gram 模型的訓練其實非常輕量,只是統計語料庫裡各個 N-gram 的出現次數,再算條件機率,連梯度下降都不需要。它的問題不是計算量大,反而是太「輕量」,學的東西太少(只記得前 N 個詞)。「長句無法收斂」是深度神經網路可能遇到的問題,不是 N-gram 的問題。
對「語言模型訓練」的印象是「需要大量 GPU 和算力」的考生,自然聯想 N-gram 也是。但 N-gram 是統計模型,不是神經網路,訓練本質上是計數而非梯度優化,計算量相對極低。
CN-gram 模型缺乏語意嵌入(Semantic Embedding)層,因此無法表徵詞語間的語意相似度
說 N-gram 沒有語意嵌入(Semantic Embedding)層,所以不知道「貓」和「狗」意思相近。
這個說法正確,但它描述的是「詞語語意相似度」的問題,不是「整體語意連貫性」的問題。題目說的是「片段合理但整體不連貫」,這是因為視窗太短、捕捉不到長距離依賴,而不是因為不知道「貓」和「狗」相似。語意嵌入是另一個問題,解決方案是 Word2Vec,不是 N-gram 的主要限制。
讀過 Word2Vec 或 BERT,知道「N-gram 沒有語意向量」這個概念,就誤以為這是本題的主要問題。要區分:「詞與詞之間的語意距離」是語意嵌入的問題;「句子前後邏輯連貫」是長距離依賴的問題。題目問的是後者。
DN-gram 模型假設詞與詞之間相互獨立,導致無法建構上下文語意關聯
說 N-gram 假設每個詞和其他詞都沒有關係(相互獨立),所以完全建不了上下文。
這個描述誇大了 N-gram 的問題。N-gram 不是「完全假設詞與詞獨立」,而是「只看前 N-1 個詞的有限上下文」。Unigram(1-gram)才是假設每個詞完全獨立,Bigram、Trigram 確實有在看上下文,只是視窗有限。說「完全無法建構上下文語意關聯」是過度說法,正確說法是「只能建構固定長度的局部上下文」。
選項 D 和 B 非常像,都在描述 N-gram 的上下文限制。差別在精確程度:B 準確描述了「固定長度」和「長距離依賴」的問題,D 過度誇大成「完全獨立」。考試看到 B 和 D 同時出現,選更精確的描述(B)。
同個考點下次怎麼變形
N 設得很大(例如 10-gram),N-gram 模型就能解決長距離依賴問題嗎?
視窗變大,能記住更多前序詞,長距離問題應該改善了?
改善有限,而且會爆出新問題。N 越大,「特定 N 個詞精確連續出現」在語料庫的機率越低,資料稀疏問題嚴重。實務上 N 超過 5 就幾乎找不到訓練樣本,模型退化成「查不到就隨機猜」。而且即使 10-gram,超過 10 個詞的依賴還是捕捉不到。長距離依賴的根本解決方案是 RNN 或 Transformer,不是調大 N。
有沒有「N-gram 表現比深度模型好」的場景?
N-gram 看起來這麼原始,應該哪裡都輸?
有幾個場景 N-gram 仍然有優勢:語料極少時(幾百句),深度模型訓練不足反而不如 N-gram 的統計穩定;需要極快推理(毫秒級)、計算資源極限的嵌入式設備;拼字校正(Spell Correction)的候選詞重排,N-gram 計算快且足夠;作為對照基準線(Baseline),新方法要先打贏 N-gram 才有意義。
RNN 是怎麼改善 N-gram 的長距離依賴問題的?
RNN 也是一個字一個字看,跟 N-gram 很像,差在哪?
RNN 有一個「隱藏狀態」(Hidden State),每次看到新的詞,都會更新這個狀態。理論上,隱藏狀態能積累整個句子到目前為止的資訊,不限定視窗長度。但實際上 RNN 有「梯度消失」(Vanishing Gradient)問題,訓練時遠端的詞對當前的梯度影響趨近於 0,導致模型實際上還是很難學到長距離依賴。LSTM 和 GRU 用「門控機制」緩解,Transformer 則用 Self-Attention 根本解決。
N-gram 的概念有沒有用在圖像或 DNA 分析上?
N-gram 是文字概念,其他領域應該不適用?
廣泛應用。DNA 序列分析用「k-mer」(等同 N-gram),統計 DNA 片段的 N 個鹼基組合的出現頻率,用來辨識物種或偵測突變。圖像描述任務有人用「視覺 N-gram」(連續幀序列)。甚至音樂旋律分析用「音符 N-gram」預測下一個音符。N-gram 的統計思路跨越文字,適用於任何有序序列。
怎麼評估語言模型的「連貫性」好不好?
請真人讀讀看覺得通不通順?
標準量化指標是 Perplexity(困惑度):值越低,代表模型對測試語料越「有把握」,生成的語言越流暢。但 Perplexity 不直接等於「連貫性」,它更偏向流暢度。評估連貫性更準確的方法包括:人工評測(Human Evaluation,黃金標準)、BLEU/ROUGE(比對參考答案重疊率)、以及近年的 GPT-based 自動評估(讓 GPT-4 打分),但每種方法都有偏差,業界至今沒有完美指標。
想再往下看,這 5 個
- N元語法(N-gram)核心考點:以固定長度前序詞組估計下一個詞的機率,視窗外的歷史完全被忽略,是連貫性差的根本原因。
- 語言模型(Language Model)N-gram 所屬的技術類別,負責估計詞序列的出現機率,N-gram 是最古老的一種實作方式。
- 困惑度(Perplexity)衡量語言模型對測試語料不確定程度的標準指標,值越低越好,常用來比較 N-gram 和神經網路語言模型的差異。
- 循環神經網路(Recurrent Neural Network)N-gram 的改良方向之一,用隱藏狀態記憶更長的歷史,但仍有梯度消失問題,與 N-gram 形成易混淆的對比。
- 轉換器架構(Transformer)以 Self-Attention 捕捉全序列依賴關係,是真正解決 N-gram 長距離依賴限制的上位技術。