前言

本文是笔者学习自然语言处理课程CS224的笔记

语言模型的定义

语言模型是给一个句子分配概率的任务,例如:看到"The lazy dog barked loadly"的概率有多大呢?

语言模型对机器翻译有用,比如在单词顺序的选择问题上,语言模型得到句子"the cat is samll"的概率应该大于"small the is cat"的概率。

传统的语言模型

当前很难为所有可能的语序计算出精确概率,所以通常会尝试根据它前面的n个单词预测下一个单词。这属于一个相对简单的马尔可夫预测:在n个前序子组的基础上假设下一个单词。基于字组计数的方法可以计算出w1出现的情况下w2出现的概率,或者w1,w2均出现的情况下w3出现的概率,如下:

大语言模型的回复格式 语言模型有什么用_循环神经网络


可以看出当单词数量增加时,计算机内存需求也随之增加。

循环神经网络

现在很多模型用循环神经网络,该模型根据之前的单词预测下一个单词,前一个时间步和后一个时间步之前传递的是一个隐藏状态,模型图如下所示:

大语言模型的回复格式 语言模型有什么用_大语言模型的回复格式_02


其中x[t]是t时刻的输入,h(t-1)是t-1时刻输出的隐含层状态向量。假设隐含层状态维度是Dh,单词个数是R|V|,输入向量维度是d的话,上面3个矩阵的维度如下所示:

大语言模型的回复格式 语言模型有什么用_自然语言处理_03

梯度消失与梯度爆炸问题

顾名思义,梯度消失就是指反向传播时梯度传递到前面的层时梯度非常小,反之,梯度爆炸是指梯度传递到前面的层时梯度非常大。为了更加方便说明问题,这里将上面介绍的模型中的sigmod和softmax函数去掉,简化后的模型图如下:

大语言模型的回复格式 语言模型有什么用_自然语言处理_04


假设误差函数是E,则所有时刻的误差的导数之和是:

大语言模型的回复格式 语言模型有什么用_初始化_05


根据链式求导法则,上述公式可以转换为如下公式:

大语言模型的回复格式 语言模型有什么用_循环神经网络_06


上面的连乘公式的每一个乘子都是一个Jacobain雅可比矩阵,雅可比矩阵的公式如下:

大语言模型的回复格式 语言模型有什么用_语言模型_07


对于雅可比矩阵而言,我们可以得到它的范数的上界,其中β是对应的范数上界:

大语言模型的回复格式 语言模型有什么用_语言模型_08


因为梯度是一系列雅可比矩阵的连乘,所以我们可以得到对应的范数上界:

大语言模型的回复格式 语言模型有什么用_初始化_09


从上述公式可以看出,如果我们初始时设定的β是大于1的,那么最终得到的梯度会无穷大,也就是所谓的梯度爆炸;反之,当初始时设定的梯度小于1,最终梯度会变得无穷小,也就是所谓的梯度消失。下面给出一个梯度消失的例子,假如有2个RNN,其中一个的激活函数是Relu,另一个是sigmod。分别画出2层的梯度如下图所示:

大语言模型的回复格式 语言模型有什么用_大语言模型的回复格式_10


可以看出2个模型中第一层的梯度小于第二层,因此,很有可能会发生梯度消失问题。

梯度爆炸的技巧-clipping trick

方法比较简单,当梯度值大于某个最大的值时,就将梯度设置为一个固定的值。有人将这个裁剪的效果画了出来,他们建立了一个简单模型,只有一个隐含层,之后将每次更新的结果画了出来,如下所示:

大语言模型的回复格式 语言模型有什么用_循环神经网络_11


实线是应用算法之前的梯度更新,可以看出当撞到墙(遇到一个很大的梯度)时,参数跳到了一个很远的未知的位置。而当应用裁剪算法之后,即虚线画出的部分,当撞到墙(遇到一个很大的梯度)时,参数还在一个合理的范围内,所以说这个裁剪算法是有效的。

对于梯度消失:初始化+Relus

这个方法刚开始初始化权重矩阵为单位矩阵,并且用Relu做为激活函数。这个方法意味着在刚开始的时候,凭直觉你什么都不知道,我们不要在参数空间中做疯狂的随机预测,我们只做平均。也就是隐藏状态仅仅是词向量的移动平均值,然后我再开始做一些更新。