循环神经网络原理(RNN)

  • RNN是在自然语言处理领域中最先被用起来的
  • 语言模型就是这样的东西:给定一个一句话前面的部分,预测接下来最有可能的一个词是什么。
  • 简单的循环神经网络由输入层、一个隐藏层和一个输出层组成:

如何选择RNN的隐藏单元数 rnn的隐藏层_权重

  • x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);
  • s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,这一层其实是多个节点,节点数与向量s的维度相同);
  • U是输入层到隐藏层的权重矩阵;
  • o也是一个向量,它表示输出层的值;
  • V是隐藏层到输出层的权重矩阵。
  • 循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。
  • 权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。

展开后:

如何选择RNN的隐藏单元数 rnn的隐藏层_循环神经网络_02

 

ot=g(Vst)ot=g(Vst)

 

st=f(Uxt+Wst−1)st=f(Uxt+Wst−1)

 

  • f,g都是激活函数
  • 第一个式子是全连接层,第二个式子是循环层
  • 循环层和全连接层的区别就是循环层多了一个权重矩阵 W。

ot=g(Vst) =g(Vf(Uxt+Wst−1)) =g(Vf(Uxt+Wf(Uxt−1+Wst−2))) =g(Vf(Uxt+Wf(Uxt−1+Wf(Uxt−2+Wst−3)))) =g(Vf(Uxt+Wf(Uxt−1+Wf(Uxt−2+Wf(Uxt−3+…)))))ot=g(Vst) =g(Vf(Uxt+Wst−1)) =g(Vf(Uxt+Wf(Uxt−1+Wst−2))) =g(Vf(Uxt+Wf(Uxt−1+Wf(Uxt−2+Wst−3)))) =g(Vf(Uxt+Wf(Uxt−1+Wf(Uxt−2+Wf(Uxt−3+…)))))

循环神经网络的训练

  1. 前向计算每个神经元的输出值ajaj( 表示网络的第j个神经元,以下同);
  2. 反向计算每个神经元的误差项σj,σjσj,σj在有的文献中也叫做敏感度(sensitivity)。它实际上是网络的损失函数EdEd对神经元加权输入的偏导数
  3. 计算每个神经元连接权重wi,jwi,j的梯度( wi,jwi,j表示从神经元i连接到神经元j的权重)
  • 最后,根据梯度下降法则更新每个权重即可。

长短时记忆网络(LSTM)

RNN有个缺点就是很难处理长距离依赖,就是记性差,LSTM成功解决了原始RNN的缺陷

原始的RNN隐藏层只有一个状态,现在再增加一个状态c,让它保存长期的状态

如何选择RNN的隐藏单元数 rnn的隐藏层_权重_03

LSTM的输入有三个:

  • xtxt:当前时刻网络的输入值
  • ht−1ht−1:上一时刻LSTM的输出值
  • ct−1ct−1:上一时刻的单元状态

LSTM的输出有两个:

  • htht:当前时刻LSTM输出值
  • ctct: 当前时刻的单元状态

LSTM的关键,就是怎样控制长期状态c。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。

前向计算

实现开关的算法,就是门,门实际上就是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。假设W是门的权重向量,b是偏置项,那么门可以表示为:

g(x)=σ(Wx+b)g(x)=σ(Wx+b)

 

σσ是激活函数,值域为(0,1)

LSTM用两个门控制单元状态c的内容:
- 遗忘门:决定了上一时刻的单元状态ct−1ct−1有多少保留到当前时刻ctct
- 输入门:决定了当前时刻网络的输入xtxt有多少保存到单元状态ctct

输出门控制单元状态ctct有多少输出到当先输出值htht

遗忘门:

 

ft=σ(Wf⋅[ht−1,xt]+bf)ft=σ(Wf⋅[ht−1,xt]+bf)

 

如何选择RNN的隐藏单元数 rnn的隐藏层_循环神经网络_04

输入门:

 

it=σ(Wi⋅[ht−1,xt]+bi)it=σ(Wi⋅[ht−1,xt]+bi)

 

如何选择RNN的隐藏单元数 rnn的隐藏层_如何选择RNN的隐藏单元数_05

当前输入状态ct~ct~:

 

ct~=tanh(Wc[ht−1,xt]+bc)ct~=tanh(Wc[ht−1,xt]+bc)

 

如何选择RNN的隐藏单元数 rnn的隐藏层_如何选择RNN的隐藏单元数_06

当前时刻的单元状态ctct:

 

ct=ft∘ct−1+it∘ct~ct=ft∘ct−1+it∘ct~

 

∘∘表示按元素乘

如何选择RNN的隐藏单元数 rnn的隐藏层_如何选择RNN的隐藏单元数_07

输出门:

 

ot=σ(Wo⋅[ht−1,xt]+bo)ot=σ(Wo⋅[ht−1,xt]+bo)

 

如何选择RNN的隐藏单元数 rnn的隐藏层_全连接_08

最终输出:

 

ht=ot∘tanh(ct)ht=ot∘tanh(ct)

 

如何选择RNN的隐藏单元数 rnn的隐藏层_权重_09

实例

RNN实例