动手学深度学习——语言模型
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 怎么统计
-
词频分布怎么看
-
如何构造语言模型训练样本
你继续发“继续”,我就接着给你写 《动手学深度学习——语言模型代码》。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)