Reeed

Reeed's Blog

github

重新理解n-gram:從統計到深度學習的橋樑

最近在梳理早期 NLP 技術時,重新歸納了 n-gram 模型。雖然現在更關注 Transformer 等架構,但回頭看這些 "古老" 的方法,其實能學到很多東西。

n-gram 的基本思想#

n-gram 的核心想法其實很直觀:一個詞出現的概率只取決於它前面的幾個詞(具體來說是前 n-1 個詞)。這聽起來像是對語言的簡化,但人類說話時確實經常基於前面的詞來選擇後面的詞。

幾種常用的 n-gram 模型:

  • Unigram:每個詞獨立出現,不考慮上下文
  • Bigram:每個詞只看前面 1 個詞
  • Trigram:每個詞看前面 2 個詞

剛開始接觸時會覺得這種假設太粗糙了,但實際上這種簡化在很多場景下是有效的。

馬爾可夫假設#

n-gram 背後的理論基礎是馬爾可夫假設。數學表達為:

P(xi+1xi,xi1,xi2...)=P(xi+1xi)P(x_{i+1}|x_{i},x_{i-1},x_{i-2}...) = P(x_{i+1}|x_{i})

這個假設的關鍵是 "無記憶性"—— 下一個狀態只依賴當前狀態,不依賴歷史路徑。

舉例計算 "I love deep learning" 的概率:

Bigram 計算
P("Ilovedeeplearning")=P("I")×P("love""I")×P("deep""love")×P("learning""deep")P("I love deep learning") = P("I") \times P("love"|"I") \times P("deep"|"love") \times P("learning"|"deep")

Trigram 計算
P("Ilovedeeplearning")=P("I")×P("love""I")×P("deep""Ilove")×P("learning""lovedeep")P("I love deep learning") = P("I") \times P("love"|"I") \times P("deep"|"I love") \times P("learning"|"love deep")

複雜的句子概率被分解成了簡單的條件概率乘積,這種分解方式既優雅又實用。

數據稀疏性問題#

n-gram 有個很現實的問題:數據稀疏性。如果某個詞組合在訓練數據中沒出現過,它的概率就是 0,這會讓整個句子概率變成 0。

為了解決這個問題,前人想出了幾種平滑策略

加一平滑#

給所有詞的計數都加 1,這樣就不會有 0 概率了。

加 K 平滑#

是加一平滑的推廣版本,通過調整 K 值來控制平滑程度,效果上比加一平滑要好一些。

  • 加一平滑是加 K 平滑的特例,使用加 K 平滑,K 的取值具體關注於訓練數據,需要在驗證集上進行調優。
  • 當訓練數據數量較小時,可能會出現一些極端的分布,這時 K 值一般取較大,以平衡每個詞的出現概率。
  • 當訓練數據量較大時,使用較小的 K 值以保持原始的統計分布。

Kneser-Ney 平滑#

更複雜但效果更好的方法,考慮了詞在不同上下文中的分布。

這些平滑方法體現了早期 NLP 研究者的實用精神 —— 遇到問題就想辦法解決,不糾結於理論的完美性。

n-gram 的特點#

簡單有效:雖然假設簡單,但在很多任務上效果不錯。現在的輸入法、拼寫檢查還在用類似的技術。

計算友好:訓練和推理都很快,這在計算資源有限的年代很重要。

局限明顯:無法處理長距離依賴是個根本問題。比如 "昨天下雨... 今天很累",這種跨越多個詞的語義關係 n-gram 就捕捉不到。

從 n-gram 到現代模型#

現在回頭看,n-gram 其實為後來的模型奠定了重要基礎:

  1. 概率建模思路:把語言看作概率分布,這個思想一直延續到現在
  2. 序列預測框架:基於歷史預測未來的基本框架
  3. 統計學習方法:從數據中學習規律的方法論

即使是最新的大語言模型,本質上還是在做類似的事情 —— 基於前面的 token 預測下一個 token。只是現在的模型能夠考慮更長的上下文,捕捉更複雜的依賴關係。

技術演進的思考#

理解技術發展的歷史脈絡很重要。現在的很多 "創新" 其實都能在早期技術中找到影子。n-gram 雖然簡單,但它體現的核心思想 —— 通過統計規律來理解和預測語言 —— 至今仍然有效。

就像學數學一樣,掌握基礎概念比追求最新最複雜的技術更重要。n-gram 不是最強的模型,但它提供了一個很好的思考框架,幫助理解語言建模的本質。

技術的進步是漸進的,每一代技術都在前一代的基礎上改進。n-gram 教會我們如何用概率的眼光看待語言,這個視角在今天仍然很有價值。而且簡單的方法往往能夠揭示深層的規律,理解問題的本質比追求複雜的解決方案更加重要。

動手實現#

參考 Github 倉庫

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。