目标实验目标
亲手训练一个最朴素的语言模型,看清语言预测的「数数法」到底是怎么回事:看最近 N 个字 → 查历史频率表 → 挑概率最高的下一个字。
- 理解 N-gram 的「训练」不过是把连续 N 个字数一遍,没有任何理解
- 看清条件概率 P(下一个字 │ 前 N−1 个字) 是如何用频率估出来的
- 亲手撞上它的两个死穴:记性只有 N 个字 与 没见过的组合直接抓瞎
课堂问题手机键盘为什么能猜出你想打的下一个字?它真的「懂」你在说什么吗?
1喂给模型一段语料
N-gram 的「学习」只有一件事:把语料里每一段连续的字数一遍。先挑一段语料喂给它。
预设语料:
也可以自己改写语料,再点一次
2数一数:哪些词组老黏在一起
选定 N 之后,模型扫遍语料,统计每一段连续 N 个字的出现次数。这就是 N-gram 全部的「训练」。
选择 N(看最近几个字):
| N-gram | 出现次数 | 占比 |
|---|
观察次数最高的那几行,就是语言里最「固定」的搭配。把 N 调大,每一行的次数会迅速变小——大量组合压根一次都没出现过。
3查表:预测下一个词
预测时,模型只看当前前文(最近 N−1 个字),翻到对应的那一行区块,按概率挑下一个字。
输入前文
稀疏性陷阱换成一个语料里从没出现过的组合试试,比如把前文改成「香蕉」——看看模型能给出什么。
下一个词的概率分布
输入前文后显示…
4让它往下写一句
把「查表 → 挑词 → 接到句尾 → 再查」循环起来,模型就开始「说话」了。注意它只会重复语料里出现过的搭配。
…
挑战实验课挑战
挑战 1 · 记性的边界
用 N=2,前文填「小猫」看候选;再用 N=3,把「小猫」放到前文里。候选数量怎么变?为什么越来越少?
用 N=2,前文填「小猫」看候选;再用 N=3,把「小猫」放到前文里。候选数量怎么变?为什么越来越少?
挑战 2 · 制造稀疏
把前文设成一个语料里没出现过的组合。模型还能预测吗?这说明 N 调得越大就越好吗?
把前文设成一个语料里没出现过的组合。模型还能预测吗?这说明 N 调得越大就越好吗?
挑战 3 · 长距离失效
试着生成「那只从小在胡同里长大、非常怕生人的小猫,今天第一次___」。N-gram 接得对吗?它看到「小猫」了吗?
试着生成「那只从小在胡同里长大、非常怕生人的小猫,今天第一次___」。N-gram 接得对吗?它看到「小猫」了吗?
挑战 4 · 换语料重训
三段预设语料分别训练,同一前文的预测分布差多少?语言模型从语料里学到的究竟是什么?
三段预设语料分别训练,同一前文的预测分布差多少?语言模型从语料里学到的究竟是什么?