前言
语言本身就具有时间的属性,不管是说话还是写文章,都是一个字一个字的吐。当我们在说一句话的时候,这些单词在我们脑子里的处理过程几乎是一次性或者一瞬间的。如果用machine learning的方法来处理文本,在多数情况下是很难捕捉到文本的时间信息,FFN也更擅长处理定长的数据,而对于变长的文本也是无可奈何。
如图所示,我们用“the ground there”三个单词来预测“lived”。
具体步骤:
(1)分别获得三个单词的embedding,d是词向量维度
(2) 将三个向量concat在一起,输入维度是1*3d
(3)接入一个两层的全连接神经网络,第一层是h*3d,第二层是h*V,h是隐藏层维度,V是词表维度即输出层维度。
(4)从输出层中选择概率最大的作为预测单词
缺点:
(1)用滑窗内的单词预测输出,上下文信息无法学到
(2)滑窗会将短语或者固定搭配割裂开来,造成语义分割
那么RNN的诞生比较好的解决了上述问题,RNN(循环神经网络)其实是一类神经网络模型,那么我们下面讲的RNN是最简单的网络结构。
RNN网络结构
就像之前滑窗的网络结构一样,(抛开虚线不看)RNN是由两层的神经网络构成,输入层、隐藏层和输出层都惊人的相似,但不同的是滑窗结构的输入是多个单词,而这里是一个单词。RNN之所以能捕捉时间信息并且能处理变长结构,关键就在于蓝色的虚线,这也是和滑窗结构及其他网络结构的重大区别。
首先这个蓝色虚线到底是什么,有什么用?蓝色虚线是建立上一个单词与当前单词的桥梁,将上一个单词的信息传递给下一个单词,具体是用一个U矩阵实现的。正因为U矩阵的存在,使得文本的序列信息能够联系起来,并且在时间上是一个单词一个单词往下传递,这使得RNN在神经网络结构中脱颖而出。
RNN如何推理
所谓推理,就是前向传播的过程。过程图解如下:推理的步骤如下:
(1)接受一个单词的词向量作为输入xt
(2)关键在于隐层的计算:接收当前单词xt的输入与W相乘,同时接收上一个单词的隐层与U相乘,将二者加和并经过激活函数,得到ht
(3)用ht和V相乘,并经过激活函数,得到输出层。
上述是一个时间步的推理过程,那么在整个序列上就是遍历一个序列长度,上图中的xt就是下图中x的其中一个元素:
RNN如何训练
所谓训练,就是反向传播的过程。过程图解如下:
在讲解反向传播之前,我们先来做一些符号规定,便于公式理解:
:误差项;
L:损失函数;
g:激活函数;
:第i层激活后的值;
:第i层激活前的值;
我们来看一个时间步的输出yt,yt的值受两个方向的影响:xt和上一个时间步的隐层ht-1,那么根据影响的方向以及链式法则,我们分别计算一个时间步的误差项分别对V\W\U的梯度。
对V求导:
对W和U求导:
前向过程中,RNN中隐层的计算很特殊,那么梯度回传的时候自然也特殊。前向的时候隐层会接收当前时间步的输入和上一个隐层状态,那么后向的时候就反过来,误差是来自当前时间步的输出和下一个隐层传递过来的误差。
那么很容易得到:
到这里,最简单的RNN便讲完了。接下来讲,RNN如何运用?