1. 语言模型
2. Attention Is All You Need(Transformer)算法原理解析
3. ELMo算法原理解析
4. OpenAI GPT算法原理解析
5. BERT算法原理解析
6. 从Encoder-Decoder(Seq2Seq)理解Attention的本质
7. Transformer-XL原理介绍
1. 前言
在机器学习领域,语言识别和图像识别都不太需要预处理就能喂给计算机,语音识别的输入数据可以是音频频谱序列向量所构成的矩阵,图像识别的输入数据是像素点向量构成的矩阵。但是文本是一种抽象的东西,显然不能直接把文本数据喂给机器当做输入,因此这里就需要对文本数据进行处理。
2. 语言模型
语言模型是对一段文本的概率进行估计即针对文本\(X\),计算\(P(X)\)的概率,对信息检索,机器翻译,语音识别等任务有着重要的作用。语言模型分为统计语言模型和神经网络语言模型。
3. 统计语言模型
要判断一段文字是不是一句自然语言,可以通过确定这段文字的概率分布来表示其存在的可能性。语言模型中的词是有顺序的,给定m个词看这句话是不是一句合理的自然语言,关键是看这些词的排列顺序是不是正确的。所以统计语言模型的基本思想是计算条件概率。
输入:\(X=(x_1,x_2,...,x_m)\)
输出:\(P(X)\)的概率
\[P(X)=P(x_1,x_2,x_3...,x_m)=P(x_2|x_1)P(x_3|x_1,x_2)...P(x_m|x_1,x_2,...x_{m-1}) \]
以上公式就是语言模型的基本定义。这个公式有2个问题。
假设有句子\((x_1,x_2,x_3,x_4,x_5,x_6)\)
\[P(x_6|x_1,x_2,x_3,x_4,x_5)=\frac{count(x_1,x_2,x_3,x_4,x_5,x_6)}{count(x_1,x_2,x_3,x_4,x_5)} \]
- 自由参数数目
假定字符串中字符全部来自与大小为\(V\)的词典,上述例子中我们需要计算所有的条件概率,对于所有的条件概率,这里的\(x\)都有\(V\)种取值,那么实际上这个模型的自由参数数目量级是\(V^6\),6为字符串的长度。
从上面可以看出,模型的自由参数是随着字符串长度的增加而指数级暴增的,这使我们几乎不可能正确的估计出这些参数。
- 数据稀疏性
从上面可以看到,每一个\(x\)都具有\(V\)种取值,这样构造出了非常多的词对,但实际中训练语料是不会出现这么多种组合的,那么依据最大似然估计,最终得到的概率实际是很可能是0。
3.1 N-gram模型
大家已经知道了语言模型的定义,那首先会遇到一个问题,上面这个公式遇到长句子时计算最后一个词的概率\(P(x_m|x_1,x_2,...x_{m-1})\)会变得非常的麻烦,那我们是不是可以进行一定的简化呢?设想一下这句话“今天天气真是不错,现在感觉有点饿,我们去吃饭吧!”当我们预测P("吃饭")的概率时,感觉和最前面描述天气的关系不是很大,而是和比较近的“有点饿”联系比较紧密。所以我们根据一个词会和它附近的词联系比较紧密,那我们就可以简化语言模型的概率公式了。
假设我们定义一个词的概率和它前面的k个词相关,公式改写如下:
\[P(x_i|x_1,x_2,...x_{i-1})=P(x_i|x_{i-(k-1)},...,x_{i-1}) \]
\[P(X)=\prod_{i=1}^mP(x_i|x_{i-(k-1)},...,x_{i-1}) \]
从模型的效果来看,理论上\(n\)的取值越大,效果越好。但随着\(n\)取值的增加,效果提升的幅度是在下降的。同时还涉及到一个可靠性和可区别性的问题,参数越多,可区别性越好,但同时单个参数的实例变少从而降低了可靠性。
N-gram比较好解决了自由参数多的问题,但是数据稀疏的问题还是没有呗解决。
3.2 平滑化
假设有一个词组在训练语料中没有出现过,那么它的频次就为0,但实际上能不能认为它出现的概率为0呢?显然不可以,我们无法保证训练语料的完备性。那么,解决的方法是什么?如果我们默认每一个词组都出现1次呢,无论词组出现的频次是多少,都往上加1,这就能够解决概率为0的问题了。
\[P(x_6|x_1,x_2,x_3,x_4,x_5)=\frac{count(x_1,x_2,x_3,x_4,x_5,x_6) + 1}{count(x_1,x_2,x_3,x_4,x_5) + 1} \]
4. 神经网络语言模型
神经网络语言模型的提出解决了N-gram模型当\(n\)较大时会发生数据稀疏的问题。与N-gram语言模型相同,神经网络语言模型(NNLM)也是对\(n\)元语言模型进行建模,估计\(P(x_i|x_{i-n+1},x_{i-n+2},...x_{i-1})\)的概率,与统计语言模型不同的是,神经网络语言模型不通过计数的方法对\(n\)元条件概率进行估计,而是直接通过一个神经网络对其建模求解。
神经网络语言模型的结构入上图所示,可以分为输入层、投影层、隐藏层和输出层
- 输入层:这里就是词\(x\)的上下文,如果用N-gram的方法就是词\(x\)的前\(n-1\)个词了。每一个词都作为一个长度为\(V\)的one-hot向量传入神经网络中.
- 投影层:投影层也叫embedding层,在投影层中,存在一个look-up表\(C\),\(C\)被表示成一个\(V*m\)的自由参数矩阵,其中\(V\)是词典的大小,而\(m\)代表每个词投影后的维度。表\(C\)中每一行都作为一个词向量存在,这个词向量可以理解为每一个词的另一种分布式表示。每一个one-hot向量都经过表\(C\)的转化变成一个词向量。\(n-1\)个词向量首尾相接的拼起来,转化为\((n-1)m\)的列向量输入到下一层。
- 隐藏层:隐藏层的作用是进行非线性变换。\(z=tanh(WX+b)\)
- 输出层:用softmax进行概率计算,计算词表\(V\)的每个词的概率。\(P(x_i)=softmax(z)\)
5. 总结
即使使用了神经网络语言模型,本质上仍然是N元语言模型,就是你要预测的当前词只和他前面的N-1个词有关,与更前面的词无关。尽管神经网络这种方法一定程度上解决了数据稀疏的问题,但还是损失了一些信息。如果想要学习前面所有的的词就要涉及s到自然语言处理中的循环神经网络(RNN),我们都知道,循环神经网络的定义是当前的输出不仅和当前的输入有关,还和上一时刻的隐藏层的输出有关,这样讲神经网络展开后就会发现他把序列从开头到结尾全连起来了,十分方便处理序列数据,而这个性质正是我们做语言模型所需要的。