RNN算法

机器学习算法完整版见fenghaootong-github

循环神经网络原理(RNN)

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

这里写图片描述

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

展开后:

这里写图片描述

o t = g ( V s t ) o_t = g(Vs_t) ot=g(Vst)
s t = f ( U x t + W s t − 1 ) s_t = f(Ux_t + Ws_{t-1}) st=f(Uxt+Wst1)

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

o t = g ( V s t ) = g ( V f ( U x t + W s t − 1 ) ) = g ( V f ( U x t + W f ( U x t − 1 + W s t − 2 ) ) ) = g ( V f ( U x t + W f ( U x t − 1 + W f ( U x t − 2 + W s t − 3 ) ) ) ) = g ( V f ( U x t + W f ( U x t − 1 + W f ( U x t − 2 + W f ( U x t − 3 + . . . ) ) ) ) ) o_t = g(Vs_t) \\ = g(Vf(Ux_t + Ws_{t-1})) \\ = g(Vf(Ux_t + Wf(Ux_{t-1} + Ws_{t-2})))\\ = g(Vf(Ux_t + Wf(Ux_{t-1} + Wf(Ux_{t-2} + Ws_{t-3})))) \\ = g(Vf(Ux_t + Wf(Ux_{t-1} + Wf(Ux_{t-2} + Wf(Ux_{t-3} + ...))))) ot=g(Vst)=g(Vf(Uxt+Wst1))=g(Vf(Uxt+Wf(Uxt1+Wst2)))=g(Vf(Uxt+Wf(Uxt1+Wf(Uxt2+Wst3))))=g(Vf(Uxt+Wf(Uxt1+Wf(Uxt2+Wf(Uxt3+...)))))

循环神经网络的训练

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

长短时记忆网络(LSTM)

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

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

这里写图片描述

LSTM的输入有三个:

  • x t x_t xt:当前时刻网络的输入值
  • h t − 1 h_{t-1} ht1:上一时刻LSTM的输出值
  • c t − 1 c_{t-1} ct1:上一时刻的单元状态

LSTM的输出有两个:

  • h t h_t ht:当前时刻LSTM输出值
  • c t c_t ct: 当前时刻的单元状态

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

**前向计算 **

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

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

LSTM用两个门控制单元状态c的内容:

  • 遗忘门:决定了上一时刻的单元状态 c t − 1 c_{t-1} ct1有多少保留到当前时刻 c t c_t ct
  • 输入门:决定了当前时刻网络的输入 x t x_t xt有多少保存到单元状态 c t c_t ct

输出门控制单元状态 c t c_t ct有多少输出到当先输出值 h t h_t ht

遗忘门:

f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f\cdot[h_{t-1},x_t] + b_f) ft=σ(Wf[ht1,xt]+bf)

这里写图片描述

输入门:

i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i\cdot[h_{t-1},x_t] + b_i) it=σ(Wi[ht1,xt]+bi)

这里写图片描述

当前输入状态 c t ~ \tilde{c_t} ct~:

c t ~ = t a n h ( W c [ h t − 1 , x t ] + b c ) \tilde{c_t} = tanh(W_c[h_{t-1},x_t] + b_c) ct~=tanh(Wc[ht1,xt]+bc)

这里写图片描述

当前时刻的单元状态 c t c_t ct:

c t = f t ∘ c t − 1 + i t ∘ c t ~ c_t = f_t\circ c_{t-1} + i_t\circ\tilde{c_t} ct=ftct1+itct~

∘ \circ 表示按元素乘

这里写图片描述

输出门:

o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o\cdot[h_{t-1},x_t] + b_o) ot=σ(Wo[ht1,xt]+bo)

这里写图片描述

最终输出:

h t = o t ∘ t a n h ( c t ) h_t = o_t\circ tanh(c_t) ht=ottanh(ct)

这里写图片描述

**实例 **

RNN实例


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值