N-Gram 模型
N-Gram 模型
- 什么是N-Gram?
- 为什么叫 N-Gram?
- N-Gram怎么知道下一个词可能是什么?
- N-Gram 能做什么?
- N-Gram的问题
本文回答了四个问题:
- 一、N-Gram是什么?
- 二、N-Gram为什么叫N-Gram?
- 三、N-Gram具体是怎么算的?
- 四、N-Gram能用在什么地方?
什么是N-Gram?
N-gram,本质上就是一种“上下文预测”模型。我们可以简单地把它理解为
给你前面几个词,猜下一个词会是什么?
例如:
- 打出“我爱”,接下来有可能是“你”、“北京” or “吃饭”。
那下一个词可能是什么?
总不能随便猜吧,我们可以通过历史数据来总结规律,看看以往的数据中,“我爱“后边最常出现的是什么,例如最常出现的是“你”,那我们就可以大胆的猜,在现在这个场景下,“我爱”后边就是“你”!
N-Gram就是这样一种简单的,最基本,基于历史出现次数的,计算的下一个词出现的概率。
虽然N-Gram很基本,但是他是Transformer这类语言模型的开端。
【一些想法】我是找transformer的原理的时候,突发奇想想了解一下整个语言模型的发展脉络,试图通过跟ChatGPT对话了解ChatGPT(及其老祖),师夷长技以制夷了属于是。
为什么叫 N-Gram?
Gram指代Grammer,语句中可拆分的最基本单位,在中文可以简单的认为就是一个字,一个Gram就是一个字,N指的是以多少个为一组进行统计,N-Gram就是看前边N-1个词预测当前词。
例如:
模型名称 | 看几个词 | 例子(预测“苹果”之前的部分) |
---|---|---|
Unigram | 看前 0 个(只管当前词) | 苹果 |
Bigram | 看前 1 个 | 吃 苹果 |
Trigram | 看前 2 个 | 爱 吃 苹果 |
4-gram | 看前 3 个 | 我 爱 吃 苹果 |
【一些想法】自然而然就会想到为什么叫N-Gram,N的含义是什么,Gram的含义是什么,结果发现谜底就在谜面上,就是N-Gram实际上是通过N-1个Grammer来猜下一个Gram的,这个可能是因为N指代的是以N个Grammer为一组,那除去要猜的最后一个,自然就前提条件就是通过N-1个来猜咯。
N-Gram怎么知道下一个词可能是什么?
N-gram 模型本质上是一个 统计记忆模型。
它从你提供的数据中“计数”:
- “我 爱 你”出现了 50 次;
- “我 爱 北京”出现了 20 次;
- “我 爱 吃 苹 果 很”出现了 5 次;
然后当你输入“我 爱 ”,模型就在所有以“我 爱 ”开头的片段中,看接下来哪个词最常出现,就猜它是你要说的下一个词。
也就是说,N-Gram并没有没有理解语言,它只是看说这两个字之后,接下来最经常说哪个字。
如果提供的文本中通篇只有**“我爱你”,而没有“我爱xxx”,那就可以认为一旦出现“我爱”,下一个字就一定是“你”了,“你”**的概率是100%。
用数学描述就是:
w n − 2 w_{n-2} wn−2和 w n − 1 w_{n-1} wn−1接连出现的时候,接连出现 w n w_n wn的概率有多大
P ( w n ∣ w n − 2 , w n − 1 ) = Count ( w n − 2 , w n − 1 , w n ) Count ( w n − 2 , w n − 1 ) P(w_n \mid w_{n-2}, w_{n-1}) = \frac{\text{Count}(w_{n-2}, w_{n-1}, w_n)}{\text{Count}(w_{n-2}, w_{n-1})} P(wn∣wn−2,wn−1)=Count(wn−2,wn−1)Count(wn−2,wn−1,wn)
【一些想法】看起来很傻瓜是不是。。。这个就是最基本的通过历史数据简单的进行概率计算,,就像是破案一样,“你出现在现场的次数最多,所以我猜真凶一定是你!”,虽然看起来有点草率,但是在某些场景下还莫名的好用。当然因为语料有限,有可能会出现训练集没有出现 C o u n t ( w n − 2 , w n − 1 ) = 0 Count(w_{n-2}, w_{n-1}) = 0 Count(wn−2,wn−1)=0或 C o u n t ( w n − 2 , w n − 1 , w n ) = 0 Count(w_{n-2}, w_{n-1}, w_{n}) = 0 Count(wn−2,wn−1,wn)=0的情况,为了避免这种情况(这样就算不出下一个词可能是什么了),会用到一个称为“平滑”的技术,当然这是后话,最主要的还是概率计算的思路。
N-Gram 能做什么?
虽然简单,但 N-gram 很有用,尤其在早期的语言处理任务中。
举几个场景:
- 输入法联想:你打出“今天”,它给你补“星期几”、“下雨”、“放假”,都是基于 N-gram 的预测。
- 拼写纠错:你输错一个词,它看上下文哪个词组合最常见,来猜你原本想输入什么。
- 语音识别:一个音可能对应多个词,N-gram 用上下文判断哪个词组合更合理。
- 搜索建议:你输入“如何提高”,它自动补“工作效率”、“记忆力”,都是靠历史统计。
【一些联想】我们接触到的最多的应该就是输入法联想了,还记得有一段时间流行过通过键入前两个或三个词,接下来不停的按输入法推荐的第一个词,直到出现句号,这背后其实就可能是N-Gram算法在发力,毕竟从使用的经验来看,真的是根据你平时的输入习惯来进行下一个词的提示。而且N-Gram的思路是真的简单,实现起来很快,计算量也低,结果也很可控。
N-Gram的问题
- 只关注局部信息:它只能看到前 N 个词,如果重要信息在更前面就忽略了。
- 缺少联想:如果某些词组很少出现(比如“我 爱 苏7 Ultra”),它可能根本没见过,就不会预测出来。
【一些想法】毕竟很简单的算法啦,要什么自行车,在一些特定场景能用,好用就行。