语言模型和循环神经网络
一、语言模型
1、简介
简单来讲,语言模型就是通过对预测接下来会出现什么词这个任务建模得到的一个模型。
下图就是一个简单的语言建模的示例:
同时还可以将语言模型视为将概率分配给一段文本的系统,例如如果我们有部分文本,...,,那么根据语言模型,下一段文本的概率为:
2、n-gram语言模型
在深度学习应用于NLP之前,n-gram语言模型是是使用的最为广泛的模型。n-gram是由多个连续的单词组成的块。
n-gram语言模型的核心思想在于:收集有关不同n-gram的频率的统计数据,并使用这些来预测下一个单词。
n-gram模型做了一个简单的假设:第n个词出现的概率只与前n-1个词相关。
为了方便计算n-gram和(n-1)-gram的概率,一般通过在大型的语料中得到它们近似统计数据来作为它们概率的近似值。
假设现在我们拥有一个4-gram语言模型,那么下面这个句子的概率计算公式为:
现在假设,stdudents opened their出现了1000次。
stdudents opened their books出现了400次,那么P(books|students opened their) = 0.4。
stdudents opened their exams出现了400次,那么P(exams|students opened their) = 0.1。
3、n-gram语言模型的稀疏性问题
若分子中的句子没有在语料中出现过,那么P(w|students opened their)就会为零,为了避免这个问题,一般用一个很小的值来代替值为0的P,这被称之为平滑。
若分母中的句子没有在语料中出现过,那么整个式子就变得无意义了,为了避免这个问题,一般会尽可能地用最高阶组合计算概率,当高阶组合不存在时,退而求其次找次低阶,直到找到非零组合为止。这被称之为回溯法。
一般来说,n-gram中n值的增加会使稀疏性问题变的更加严重,因此在实际使用的过程中n的值一般不超过5。除此之外,n-gram的另一个问题就是需要大量的存储空间,它需要存储您在语料库中看到的所有n-gram的计数。因此当增加n或者语料库的大小时,模型的大小也会随之增加。
二、循环神经网络
1、基于固定窗口的语言模型
在介绍循环神经网络之前,我们首先介绍基于固定窗口的语言模型。其结构图如下:
这种模型的优点如下:
1.解决了n-gram模型存在的稀疏性问题
2.无需存储所有被观察到的n-gram值
但是它还存在这一些问题:
1.固定窗口太小,扩大窗口将会使W增大,且对于该模型来说窗口永远不够大。
2.在W中,和乘以完全不同的权重。在输入的处理方式上没有对称性。
因此我们需要一个能够处理任意长度输入的模型,也就是我们所熟知的RNN。
2、RNN模型
RNN模型的结构示意图如下:
总的来说RNN模型有如下的优点:
1.能处理任意长度的输入
2.计算时间步t时,可以(理论上)利用来自许多先前时间步的信息
3.当模型输入比较长时,模型的大小也不会改变
4.每个时间步都应用相同的权重,因此输入的处理方式是对称的。
虽然RNN模型很优秀,但其依然存在一些不足,
1.循环计算速度太慢
2.在实际应用中,很难获取到许多先前时间步的信息
3、训练RNN语言模型
当我们自己需要训练一个RNN的语言模型时,其一般步骤如下:
1.获取一个比较大的文本语料
2.将语料输入到模型中,计算每个时间步的输出分布
3.计算时间步t的损失函数,其中为预测概率分布,为下一个真实单词
4.计算整个训练集总体损失的平均值
整个过程的计算流程如下图所示:
计算整个语料库每个词的损失和梯度代价太大!因此,在实践中,通常考虑计算句子(或文档)的损失和梯度。随机梯度下降在此处是一种比较合适的方法,它允许我们计算小块数据的损失和梯度,并进行更新。
4、RNN中的反向传播
RNN方向传播计算公式的证明草图如下:
三、评估语言模型
PPL(Perplexity)是用在自然语言处理领域(NLP)中,衡量语言模型好坏的指标。它主要是根据每个词来估计一句话出现的概率,并用句子长度作normalize,公式为:
Perplexity的值越低,代表语言模型的效果越好。
语言建模是一项基准任务,可帮助我们衡量我们理解语言的进度。因此做好这一步对于我们做好其他下游任务(如文本生成、语音识别等)至关重要。
四、总结
1.语言模型是预测下一个词的系统
2.RNN:1、能够接受任意长度的序列输入,2、每个时间步共享权重W,3、可以选择在每一步产生输出
3.循环神经网络 != 语言模型
4.RNN是一种构建语言模型的好方法