SimpleRNN
当一个人说他使用RNN时基本上就是指在使用LSTM,其实LSTM是RNN的一种,所以我先从最简单的RNN看起。
RNN 的用途
RNN主要用于处理序列数据,比如语音、文本等等。
RNN结构
传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。NNs之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。
RNN结构上图将循环神经网络进行展开成一个全神经网络。例如,对一个包含5个单词的语句,那么展开的网络便是一个五层的神经网络,每一层代表一个单词。对于该网络的计算过程如下:
- xt表示第t,t=1,2,3...步(step)的输入。比如,x1为第二个词的one-hot向量(根据上图,x0为第一个词)
- st为隐藏层的第t步的状态,它是网络的记忆单元。 st根据当前输入层的输出与上一步隐藏层的状态进行计算。st=f(Uxt+Wst−1)
,其中f一般是非线性的激活函数,如tanh或ReLU,在计算s0时,即第一个单词的隐藏层状态,需要用到s−1,但是其并不存在,在实现中一般置为0向量; - ot是第t步的输出,如下个单词的向量表示,ot=softmax(Vst).
在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数U,V,W。其反应者RNNs中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数。因为只是同一个network在不同的时间点使用了5次*
所以对于RNN来说,即使两次的input相同,output很有可能是不同的。改变input 的顺序,output也会不同。
RNN求解过程推导
正向计算
RNNunfold- 数学式子:ht=ϕ(Wxh⋅xt+Whh⋅ht−1+b)。ht同样也由xt经Wxh
的变化后的信息决定,但这里多另一份信息:Whh⋅ht−1,而该信息是从上一时刻的隐藏状态ht−1经过一个不同的Whh变换后得出的。 - 注:Wxh的形状是行为dim_input,列为dim_hidden_state,而Whh是一个行列都为dim_hidden_state的方阵。
误差传递
RNN节点内部连接 第t层的误差可以定义为 ,p是训练样本的index。整个网络的误差令 则
矩阵向量化表示
所以梯度为:
LSTM
实际的训练过程中RNN比较难训练,会出现梯度爆炸和梯度消失的问题。但是LSTM可以解决梯度消失的问题,这也是为什么讲RNN替换成LSTM。
LSTM结构
- 输入门it:控制有多少信息可以流入memory cell(第四个式子ct)
- 遗忘门ft:控制有多少上一时刻的memory cell中的信息可以累积到当前时刻的memory cell中。
- 输出门ot:控制有多少当前时刻的memory cell中的信息可以流入当前隐藏状态ht中。
网友评论