一,考虑问题:
l 当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;
l 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
类似上面任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。这时,就需要用到深度学习领域中一类非常重要神经网络:循环神经网络(Recurrent Neural Network)。
二,认识循环神经网络
下图是一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:
右边是左边的展开图。
这个网络在t时刻接收到输入Xt之后,隐藏层的值是St,输出值是Ot。关键一点是,St的值不仅仅取决于Xt,还取决于St-1。我们可以用下面的公式来表示循环神经网络的计算方法:
式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值St-1作为这一次的输入的权重矩阵,f是激活函数。
从上面的公式我们可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵 W。
从上面可以看出,循环神经网络的输出值Ot,是受前面历次输入值影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。
循环神经网络的训练:BPTT
上述RNN的局限:
l RNN的梯度爆炸和消失问题
l 不能很好的处理较长的序列
RNN在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。
处理解决:
通常来说,梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。
梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:
1. 合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
2. 使用relu代替sigmoid和tanh作为激活函数。
3. 使用其他结构的RNNs,比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU),这是最流行的做法。
三,LSTM
LSTM是一种 RNN 特殊的类型,可以学习长期依赖信息。
可以看到中间的 cell 里面有四个黄色小框,理解了那个代表的含义一切就明白了,每一个小黄框代表一个前馈网络层,就是经典的神经网络的结构,num_units就是这个层的隐藏神经元个数。其中1、2、4的激活函数是 sigmoid,第三个的激活函数是 tanh。
LSTM和传统循环神经网络最大的不同就是它使用了输入门、遗忘门和输出门来控制网络实现长时记忆的功能。
具体看一下三个门:
1,输入门、遗忘门和输出门
输入门控制着网络的输入 ,输出门控制着网络的输出。
2、遗忘门——记忆衰减系数
遗忘门的作用就是决定以前的哪些记忆将被保留,哪些记忆将被遗忘,正是由于遗忘门的作用,LSTM有了长期记忆的功能。对于给定的功能,遗忘门能够自己学习保留多少以前的记忆。
C_{t-1}作为上一步t-1时刻网络中的记忆单元,传入t时刻的网络之后,第一步就是决定他的遗忘程度,将t时刻前面的记忆状态乘上一个0~1的系数进行衰减,接着加上t时刻学到的记忆作为更新之后的记忆传出网络。
记忆衰减系数f_{t}计算过程如下:
首先将t-1时刻的网络输出h_{t-1}和这一步的网络输入x_{t}结合起来,然后作用线性变换,最后再经过sigmoid激活函数,将结果映射到0~1作为记忆衰减系数。
**f_{t}为遗忘门
3、t时刻学到记忆的计算过程
当前时刻学到的记忆C~_[t}是通过当前输入和上一时刻输出的线性变换和tanh激活函数得到的。过程如下:
其中,对于该时刻学到的记忆也有一个衰减系数i_{t},这个系数跟上面方式相同,使用线性变换再使用sigmoid激活函数,将结果映射到0~1之间。
**i_{t}为输入门
4、当前时刻的记忆状态C_{t}的计算过程
最后将t-1时刻的衰减系数乘t-1时刻的记忆,加上该时刻t学到的记忆乘以它对应的衰减系数,便得到了当前t时刻的记忆状态。计算过程如下:
5、计算当前时刻的输出h_{t}
当前时刻t的网络输出h_{t}取决于当前时刻t的记忆状态和t时刻的输入、t-1时刻的输出,具体计算过程如下:
采用类似于计算记忆衰减系数的方法计算得到输出门的系数o_{t},这个系数决定了输出的多少。
**o_{t}为输出门
cell 最上面的一条线的状态即 C(t) 代表了长时记忆,而下面的 h(t)则代表了工作记忆或短时记忆。
几点需要注意:
1)cell 的权重是共享的,这是什么意思呢?这是指这张图片上有三个绿色的大框,代表三个 cell ,但是实际上,它只是代表了一个 cell 在不同时序时候的状态,所有的数据只会通过一个 cell,然后不断更新它的权重。
具体如下:
2)为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数?即为什么用两种函数,即门(输入门,输出门,遗忘门)所使用的激活函数,与求值的激活函数不一样。
解答是,门是控制开闭的,全开时值为0,全闭值为0。有开有闭时,值在0到1之间。如果选择的激活函数得到的值不在0,1之间时,通常来说是没有意义的。对于求值时的激活函数,选取时与深层网络中激活函数选取是一样的,没有行与不行,只有好与不好。所以,总结来说,门的激活函数只能是值域为0到1的,对于求值的激活函数无特殊要求。