《深度学习》课程资料
第7讲 循环神经网络I
–网络记忆能力
–循环神经网络(RNN)
–随时间反向传播(BPTT)
–双向循环神经网络
第8讲 循环神经网络II
–长程依赖问题
–长短期记忆网络(LSTM)
–门控循环神经网络(GRU)
–深层循环神经网络
–实验④(循环神经网络实验)布置
1 引言
全连接神经网络和卷积神经网络都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。这时,就需要用到深度学习领域中另一类非常重要神经网络:循环神经网络(Recurrent Neural Network)。
语言模型
RNN是在自然语言处理领域中最先被用起来的,比如,RNN可以为语言模型来建模,机器翻译等。当然也用于时间序列分类预测等问题。
那么,什么是语言模型呢?
我们可以和电脑玩一个游戏,我们写出一个句子前面的一些词,然后,让电脑帮我们写下接下来的一个词。比如下面这句:
我昨天上学迟到了,老师批评了____。
我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。在这个例子中,接下来的这个词最有可能是『我』,而不太可能是『小明』,甚至是『吃饭』。
语言模型就是这样的东西:给定一个一句话前面的部分,预测接下来最有可能的一个词是什么。
语言模型是对一种语言的特征进行建模,它有很多很多用处。比如在语音转文本(STT)的应用中,声学模型输出的结果,往往是若干个可能的候选词,这时候就需要语言模型来从这些候选词中选择一个最可能的。当然,它同样也可以用在图像到文本的识别中(OCR)。
使用RNN之前,语言模型主要是采用N-Gram。N可以是一个自然数,比如2或者3。它的含义是,假设一个词出现的概率只与前面N个词相关。我们以2-Gram为例。首先,对前面的一句话进行切词:
我 昨天 上学 迟到 了 ,老师 批评 了 ____。
如果用2-Gram进行建模,那么电脑在预测的时候,只会看到前面的『了』,然后,电脑会在语料库中,搜索『了』后面最可能的一个词。不管最后电脑选的是不是『我』,我们都知道这个模型是不靠谱的,因为『了』前面说了那么一大堆实际上是没有用到的。如果是3-Gram模型呢,会搜索『批评了』后面最可能的词,感觉上比2-Gram靠谱了不少,但还是远远不够的。因为这句话最关键的信息『我』,远在9个词之前!
现在读者可能会想,可以提升继续提升N的值呀,比如4-Gram、5-Gram…。实际上,这个想法是没有实用性的。因为我们想处理任意长度的句子,N设为多少都不合适;另外,模型的大小和N的关系是指数级的,4-Gram模型就会占用海量的存储空间。
所以,该轮到RNN出场了,RNN理论上可以往前看(往后看)任意多个词。
李宏毅老师的一个例子
槽填充(Slot Filling)是现今比较常见的问题,例如在一个订票系统中,用户输入“我想本周六去北京”,需要填充槽(slot),目的地:北京,时间:2018.1.27
如何解决这个问题,考虑使用前馈神经网络(Feedforward network)。
比较常见的是使用1-of-N encoding方法将每一个单词表示成一个向量。
当然也有其他的改进版本。
但是问题是可能用户输入的是离开北京而不是去北京,这就要求北京是起点,而不是目的地。
显然解决此类问题要求网络是要有记忆(memory)的。
循环神经网络
下面开始正式介绍RNN的结构和原理及变种。
网络结构和原理
基本网络结构如下图:
“循环”体现在W上,在展开图中,当前时刻的输入不仅有输入数据还有上一时刻的变量。这个网络在t时刻接收到输入 [公式] 之后,隐藏层的值是,输出值是 。关键一点是, 的值不仅仅取决于 ,还取决于 。我们可以用下面的公式来表示循环神经网络的计算方法:
将第二个公式代入第一个
然后发现,t时刻的输出包含了对前面时刻输出的 依赖,理论上“往前看”任意时刻都是可以的,这也是所谓的网络记忆力。
训练方法:随时间反向传播(BPTT)
BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:
- 前向计算每个神经元的输出值;
- 反向计算每个神经元的误差项值,它是误差函数E对神经元 的加权输入的偏导数;
- 计算每个权重的梯度。
最后再用随机梯度下降算法更新权重。
前向计算
我们假设输入向量x的维度是m(输入特征维度),输出向量s的维度是n(隐藏层神经元个数),则矩阵U的维度是,矩阵W的维度是。下面是上式展开成矩阵的样子,看起来更直观一些:
用矩阵形式展开来看:
在这里我们用手写体字母表示向量的一个元素,它的下标表示它是这个向量的第几个元素,它的上标表示第几个时刻。例如,表示向量s的第j个元素在t时刻的值。表示输入层第i个神经元到隐藏层第j个神经元的权重。表示隐藏层第t-1时刻的第i个神经元到隐藏层第t个时刻的第j个神经元的权重。
误差项计算
BPTT算法将第l层t时刻的误差项值沿两个方向传播,一个方向是其传递到上一层网络,得到,这部分只和权重矩阵U有关;另一个是方向是将其沿时间线传递到初始时刻,得到,这部分只和权重矩阵W有关。
注意:U和W在每一层是权重共享的。
误差沿时间反向传播
我们用向量表示神经元在t时刻的加权输入,因为:
因此:
我们用表示列向量,用表示行向量。上式的第一项是向量函数对向量求导,其结果为Jacobian矩阵:
同理,上式第二项也是一个Jacobian矩阵:
其中,表示根据向量创建一个对角矩阵,即:
最后,将两项合在一起,可得:
上式描述了将沿时间往前传递一个时刻的规律,有了这个规律,我们就可以求得任意时刻k的误差项:
误差传递到上一层
循环层将误差项反向传递到上一层网络,与普通的全连接层是完全一样的。
计算权重W
现在,我们终于来到了BPTT算法的最后一步:计算权重的梯度。
首先,我们计算误差函数E对权重矩阵W的梯度。
上图展示了我们到目前为止,在前两步中已经计算得到的量,包括每个时刻t 循环层的输出值,以及误差项。
我们知道:
因为对W求导与U无关,我们不再考虑。现在,我们考虑对权重项求导。通过观察上式我们可以看到只与有关,所以:
我们已经求得了权重矩阵W在t时刻的梯度,最终的梯度是各个时刻的梯度之和: