码农戏码

新生代农民工的自我修养

0%

Agent开发-N-gram到LLM的发展路径(一)-统计语言模型

《从零开始构建智能体》第三章 大语言模型基础-读书笔记

语言模型 (Language Model, LM) 是自然语言处理的核心,其根本任务是计算一个词序列(即一个句子)出现的概率。一个好的语言模型能够告诉我们什么样的句子是通顺的、自然的。

在多智能体系统中,语言模型是智能体理解人类指令、生成回应的基础。

在深度学习兴起之前,统计方法是语言模型的主流

其核心思想是,一个句子出现的概率,等于该句子中每个词出现的条件概率的连乘。

对于一个由词 w1,w2,⋯,wm 构成的句子 S,其概率 P(S) 可以表示为:

P(S)=P(w1,w2,…,wm)=P(w1)⋅P(w2∣w1)⋅P(w3∣w1,w2)⋯P(wm∣w1,…,wm−1)

这个公式被称为概率的链式法则

然而,直接计算这个公式几乎是不可能的,

因为像 P(wm∣w1,⋯,wm−1) 这样的条件概率太难从语料库中估计了,

词序列 w1,⋯,wm−1 可能从未在训练数据中出现过

这个公式的意义在于,它将一个极其复杂的问题(一个句子有无数种可能),变成了一个简单、可计算的重复问题(下一个词是什么?)。

公式说明

P(w_2|w_1) 是概率论和自然语言处理中一个非常核心的符号。它表示条件概率

你可以把它读作:“在给定第一个词是 w_1 的条件下,第二个词是 w_2 的概率”

用最直白的方式来解释:

想象你在和朋友玩一个“猜下一个词”的游戏。朋友已经说了第一个词“喜欢”,现在要你来猜下一个词是什么。

  • P(吃 | 喜欢) 的意思是:在朋友说了“喜欢”之后,你猜下一个词是“吃”的概率有多大?

    • 如果平时大家常说“喜欢 吃苹果”、“喜欢 吃披萨”,那你猜“吃”的概率就会很高,比如 0.4。
  • P(游泳 | 喜欢) 的意思是:在“喜欢”之后,你猜下一个词是“游泳”的概率有多大?

    • 大家也常说“喜欢 游泳”、“喜欢 跑步”,那这个概率可能也不错,比如 0.3。
  • P(桌子 | 喜欢) 的意思是:在“喜欢”之后,你猜下一个词是“桌子”的概率有多大?

    • 我们几乎不说“喜欢 桌子”,那你猜“桌子”的概率就会非常非常低,比如 0.0001。

这个概率值,完全取决于我们从大量的文本(语料库)中统计出来的“习惯”。



句子:“今天 天气 真好”

根据链式法则,它的概率可以拆解为:

  1. P(今天): “今天”这个词作为句子开头的概率。

  2. P(天气 | 今天): 在已经看到“今天”的情况下,下一个词是“天气”的概率。

  3. P(真好 | 今天, 天气): 在已经看到“今天 天气”的情况下,下一个词是“真好”的概率。

最后,把这个概率乘起来:
P(今天 天气 真好) = P(今天) × P(天气|今天) × P(真好|今天, 天气)

数据稀疏:这是最致命的问题。

由于语言组合无穷,任何合理的词序列(如“吃 耳机”)都可能从未在语料库中出现过,导致其概率为0。

虽然可用平滑技术打个“补丁”,但无法根治。

理论上,要准确计算 P(学习 | 我, 喜欢, 在, 图书馆),我们需要在语料库中看到无数次“我 喜欢 在 图书馆 学习”这个5词序列。
但现实是,即便语料库有百亿词,绝大多数长序列也一次都不会出现。
那么 Count(我, 喜欢, 在, 图书馆, 学习) 就等于0,导致整个句子的概率被判为0。
这显然不合理。

理论上公式很完美,但现实中,词序列 (w₁, ..., wₘ₋₁) 的组合是天文数字,几乎不可能出现完全一样的。所以,直接计算这个概率是不可能的。

马尔可夫假设

为了解决这个问题,研究者们提出了马尔可夫假设,简化成 N-gram 模型

“一个词出现的概率,只取决于它前面的 N-1 个词,而不是整个历史。”

  • Unigram (1-gram): P(wₘ),忽略所有历史,词与词之间独立。这几乎不能称为一个“句子”。

  • Bigram (2-gram): P(wₘ | wₘ₋₁),只考虑前一个词。例如,P(真好 | 天气)

  • Trigram (3-gram): P(wₘ | wₘ₋₂, wₘ₋₁),只考虑前两个词。

现代的大语言模型(如GPT系列)可以看作是一个超级复杂、规模巨大的N-gram模型,它能高效地估算出非常长距离的上下文条件概率,从而生成流畅、连贯的文本。

基于这个原理,N-gram 模型的优缺点都非常鲜明。

优点:简单、快速、可解释

  1. 原理简单,计算高效:模型的核心就是统计和查表,训练时只需遍历语料库统计词频,运行时通过查表和简单乘法就能算出概率,计算量很小。

  2. 结果完全可解释:模型为什么算出某个概率是透明的。例如,P(吃|喜欢) 的概率高,可以直接追溯到语料库中“喜欢 吃”这对词出现了很多次。这种可解释性在金融、医疗等严谨领域很有价值。

  3. 在小规模、领域明确的场景下效果不错:对于语法规范、词汇有限的特定领域(如客服查询、日志分析),N-gram 模型依然能提供稳定、快速的基础服务,常被用作基线模型。

缺点:无法处理语言的复杂性和创造性

  1. 数据稀疏性:这是最核心的缺陷。即使语料库很大,也总会有合理的 N-gram 序列没出现过。比如,在 Bigram 模型中,没见过的“吃 耳机”概率会直接变成 0,这显然不合理。虽然可以用平滑技术打个“补丁”,给零概率词分一点值,但无法从根本上解决问题。

  2. 泛化能力差:模型完全是“死记硬背”,无法理解语义的相似性。比如,它见过“猫 吃 鱼”,但看到“猫 吃 三文鱼”时,如果没出现过“吃 三文鱼”,就会判断其概率为零。它无法将“鱼”和“三文鱼”联系起来,因为模型不知道这两个词在语义上是相似的。

  3. 捕捉长距离依赖的能力弱:受限于固定的上下文窗口 N,当 N=2 或 3 时,模型无法处理依赖关系更远的句子。

    例子:“我昨天晚上在 Datawhale 的会议上认识了王老师,他**…**”
    句末的代词“他”显然指的是“王老师”,但二者之间隔了很多词。在 Bigram 或 Trigram 模型中,预测“他”后面的动词时,根本看不到“王老师”这个信息,很容易预测错误。

  4. 模型大小随 N 指数增长:N 越大,模型能捕捉的信息越多,但词序列的组合数也会指数级增加。例如,一个含 10万词的词表,Trigram 模型理论上最多需要存储 10^15 个参数,这在实际中是无法接受的。

总的来说,可以把 N-gram 模型的优缺点梳理成下面这张表:

维度 优点 缺点
计算效率 训练与预测速度快,资源消耗低 N 增大时模型参数呈指数级增长
可解释性 决策过程完全透明,易于追溯 -
语义理解 - 泛化能力差,无法理解语义相似性
上下文处理 - 无法捕捉超过 N 的长距离依赖
数据依赖 在小规模、规范领域效果尚可 数据稀疏问题严重,大量合理序列概率为零

正是为了克服这些缺点,后来的研究者才发展出了神经网络语言模型(如RNN、LSTM),直到现在能处理长距离依赖的Transformer(通过自注意力机制,让一个词可以直接和序列中的任何其他词交互),它们通过引入词嵌入来理解语义,极大地提升了模型的泛化能力。