1. 前言

上一篇我们已经学习了文本预处理代码,知道了如何把原始文本一步步变成模型可以处理的数字序列:

  • 读取文本

  • 清洗文本

  • 分词

  • 建立词表

  • 把 token 转成索引

但是,文本变成数字之后,新的问题马上就来了:

模型到底要学什么?

在自然语言处理中,一个最基础、最核心的任务就是:

语言模型(Language Model)

语言模型研究的核心问题非常简单,却非常重要:

给定前面的词,预测下一个词。

别看这个任务表达很朴素,它其实是后面很多 NLP 任务的基础,比如:

  • 文本生成

  • 机器翻译

  • 自动补全

  • 对话系统

  • 大语言模型

所以“语言模型”这一节,是整个序列建模模块中的关键起点。


2. 什么是语言模型

语言模型可以简单理解为:

用来描述一个词序列出现概率的模型。

例如一句话:

我 喜欢 深度 学习

语言模型想回答的是:

这个序列出现的可能性大不大?

或者换一种更直接的说法:

如果前面已经出现了“我 喜欢 深度”,那么下一个词是“学习”的概率有多大?

所以语言模型本质上是在建模:

自然语言中的顺序规律和共现规律


3. 为什么语言模型重要

语言模型之所以重要,是因为自然语言并不是随机排列的词集合。
一句话中的后一个词,通常和前面的上下文密切相关。

例如:

  • “我今天去图书馆看了很多……”
    后面更可能接“书”,而不是“香蕉”

  • “天气预报说明天可能会……”
    后面更可能接“下雨”或“降温”

所以语言模型的任务,就是学会这种“接下来最可能出现什么”的规律。

这件事一旦学会了,模型就具备了最基础的语言能力。


4. 语言模型最基本的形式

假设一个词序列是:

x1, x2, x3, ..., xT

那么语言模型要建模的就是这个整个序列的概率:

P(x1, x2, x3, ..., xT)

但直接建模整个序列非常困难,
所以通常会利用概率论中的链式法则,把它拆开:

P(x1, x2, ..., xT)
= P(x1) P(x2|x1) P(x3|x1,x2) ... P(xT|x1,...,xT-1)

这条公式非常重要。

它告诉我们:

一个句子的概率,可以拆成“每一步在前文条件下预测当前词”的连乘。

这也正是为什么语言模型通常会转化成:

根据前文预测下一个词


5. 为什么“预测下一个词”就等价于语言建模

因为根据刚才那条链式法则:

  • 只要我们能预测 P(x2|x1)

  • 能预测 P(x3|x1,x2)

  • 能预测 P(x4|x1,x2,x3)

  • 就能把整个句子的概率拼出来

所以语言模型虽然表面看起来像“下一个词预测”,
但本质上是在学习:

语言序列的条件概率结构

这就是它的理论基础。


6. 一个简单例子理解语言模型

假设我们有一句话:

time traveller for so it will be convenient

如果模型已经看到:

time traveller for so it will be

那么它应该更倾向于预测下一个词是:

convenient

而不是一个完全无关的词。

这说明什么?

说明自然语言是有规律的,
语言模型要做的,就是从大量文本中学会这些规律。


7. 语言模型和序列模型的关系

上一篇我们刚讲了“序列模型”。
而语言模型,其实就是序列模型在文本上的一个最典型应用。

序列模型关注的是:

  • 当前依赖过去

  • 利用历史预测未来

语言模型关注的是:

  • 当前词依赖前面的词

  • 用前文预测下一个词

所以可以把它们的关系简单理解为:

语言模型 = 序列模型在文本序列上的具体实例

这也是为什么李沐这里会在“文本预处理”之后立刻讲“语言模型”。


8. 最简单的语言模型:n 元语法模型

在深度学习方法出现之前,语言模型中一个非常经典的思路是:

n-gram(n 元语法)模型

它的核心假设是:

当前词只和前面有限个词有关,而不是和全部历史有关。

例如:

8.1 一元语法(unigram)

假设每个词独立出现:

P(x1, x2, ..., xT) = P(x1) P(x2) ... P(xT)

显然这太弱了,因为完全忽略了顺序关系。


8.2 二元语法(bigram)

假设每个词只依赖前一个词:

P(xT | x1, ..., xT-1) ≈ P(xT | xT-1)

例如:

  • “深度” 后面更容易接 “学习”

  • “天气” 后面更容易接 “预报”


8.3 三元语法(trigram)

假设每个词只依赖前两个词:

P(xT | x1, ..., xT-1) ≈ P(xT | xT-2, xT-1)

这样比 bigram 更强一点,因为上下文更多。


9. n-gram 模型为什么有用

因为它提供了一个非常直接的统计建模思路:

通过统计训练语料中词或短语的共现频率,来估计概率

例如 bigram 中:

P(学习 | 深度)

就可以通过统计:

  • “深度 学习” 出现了多少次

  • “深度” 出现了多少次

来估计。

这种方法:

  • 简单

  • 直观

  • 容易实现

所以它在早期语言建模中非常经典。


10. n-gram 模型的问题是什么

虽然 n-gram 简单直观,但也有明显局限。

10.1 上下文窗口固定

如果是 bigram,就只能看前一个词;
如果是 trigram,就只能看前两个词。

这意味着:

它很难捕捉更长距离的依赖关系。


10.2 数据稀疏问题严重

语言组合特别多。
即使语料很大,很多短语组合仍然可能几乎没出现过。

比如:

  • 某个三词组合在训练集中没见过

  • 那模型就很难给出合理概率

这就是经典的数据稀疏问题。


10.3 泛化能力弱

n-gram 更像是在记统计表,
而不是学到了更抽象的表示能力。

所以只要遇到没见过的上下文组合,就容易失效。

这也是为什么后来需要更强的神经网络语言模型。


11. 为什么李沐这里先讲 n-gram

因为它能帮助我们先建立一个非常重要的认知:

语言模型的核心就是根据上下文预测当前词。

即使后面换成 RNN、LSTM、Transformer,
这个核心目标其实都没有变。

n-gram 的价值就在于:

  • 思想非常直白

  • 容易看懂语言建模到底在干什么

  • 能自然引出后面更强大的模型

所以它是一个很好的过渡。


12. 语言模型中的“词频”和“共现”有什么意义

语言模型不是凭空预测词,而是依赖大规模语料中的统计规律。

例如:

  • 高频词出现概率本来就更大

  • 某些词和某些词经常一起出现

  • 某些上下文会明显约束下一个词

例如:

  • “机器” 后面更容易接 “学习”

  • “自然” 后面更容易接 “语言”

  • “下一个” 后面更容易接 “词”

所以语言模型学习的,本质上是:

语言中的统计规律


13. 语言模型训练数据是怎么构造的

这点和上一篇“文本预处理”是直接连上的。

假设我们已经把文本转成索引序列:

[3, 8, 10, 25, 6, 12, ...]

那么语言模型训练时,常见做法就是构造:

  • 输入:前面的若干 token

  • 输出:当前或下一个 token

例如:

若按固定窗口

  • 输入:[x1, x2, x3, x4],预测 x5

  • 输入:[x2, x3, x4, x5],预测 x6

这其实就是上一篇讲过的滑动窗口思想,在文本上的具体应用。


14. 为什么语言模型和“文本生成”直接相关

如果一个模型能很好地做:

给定前文,预测下一个词

那么我们就可以这样生成文本:

第一步

给一个起始词,比如:

深度

第二步

模型预测最可能的下一个词,比如:

学习

第三步

再把“深度 学习”作为新上下文,继续预测下一个词。

这样一步步往后推,模型就能生成整段文本。

所以:

语言模型 = 文本生成能力的基础


15. 语言模型为什么是大语言模型的基础

今天的大语言模型看起来很复杂,
但如果往最根本处看,它依然建立在一个核心任务上:

给定上下文,预测下一个 token

也就是说,哪怕模型从 n-gram 发展到了:

  • RNN

  • LSTM

  • GRU

  • Transformer

  • GPT

最核心的训练目标其实并没有本质改变。

所以这节“语言模型”虽然看起来基础,但它地位非常高。


16. 李沐这一节最想让你理解什么

这一节的重点,通常不是复杂网络结构,
而是让你先把“语言模型这件事”想清楚:

第一,语言模型在建模序列概率

本质上是在估计一个文本序列出现的可能性。

第二,链式法则把问题化成了“预测下一个词”

这是语言模型最核心的形式。

第三,n-gram 是最基础的统计语言模型

它简单但有局限。

第四,后面的 RNN 正是为了解决这些局限而来的

所以这一节其实是在为 RNN 做准备。


17. 语言模型和困惑度的前置直觉

虽然这一节可能还不会重点展开评价指标,但可以先有个概念:

一个好的语言模型,应该在预测下一个词时“不那么困惑”

也就是说,如果模型对下一个词分布判断得更准,
说明它更懂语言规律。

后面通常会用“困惑度(Perplexity)”来衡量语言模型好坏。
你现在先记住一句话就行:

困惑度越低,语言模型通常越好。


18. 这一节和后面 RNN 的衔接关系

这一节最大作用就是把问题提出来:

  • 我们想预测下一个词

  • n-gram 可以做,但窗口固定

  • 长依赖处理不好

  • 数据稀疏问题严重

那么自然就会问:

有没有一种模型,能更灵活地记住前面的信息,而不是只看固定几个词?

这就正好引出后面的 RNN(循环神经网络)

所以这一节本质上是:

先把语言模型问题立住,再引出更强的神经网络方法。


19. 本节总结

这一节我们学习了语言模型,核心内容可以总结为以下几点。

19.1 语言模型用于建模文本序列概率

它描述一串词出现的可能性。

19.2 链式法则把语言建模转化为“预测下一个词”

这是语言模型的最核心表达形式。

19.3 n-gram 是经典的统计语言模型

它通过有限上下文来预测当前词。

19.4 n-gram 有明显局限

包括:

  • 上下文窗口固定

  • 数据稀疏

  • 泛化能力弱

19.5 这一节是在为后面的 RNN 铺路

RNN 将提供更强的序列建模能力。


20. 学习感悟

语言模型这一节非常重要,因为它让人第一次真正意识到:

自然语言处理里,很多复杂任务的底层核心,其实就是“预测接下来会出现什么”。

从这个角度看,语言理解和文本生成并不是完全分开的两件事。
因为只要模型真的学会了“下一个词应该是什么”,它就已经在某种程度上掌握了语言规律。

也正因为如此,语言模型才会成为后面整个 NLP 模块的基础。


21. 下一节预告

按照你的目录,下一篇就是:

动手学深度学习——语言模型代码

也就是把这一节里的概念真正落到实现上,包括:

  • unigram、bigram、trigram 怎么统计

  • 词频分布怎么看

  • 如何构造语言模型训练样本

你继续发“继续”,我就接着给你写 《动手学深度学习——语言模型代码》

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐