前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三步理解--门控循环单元(GRU),TensorFlow实现。

三步理解--门控循环单元(GRU),TensorFlow实现。

作者头像
mantch
发布2019-08-29 11:13:19
1.1K0
发布2019-08-29 11:13:19
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_41510260/article/details/99679481

1. 什么是GRU

在循环神经⽹络中的梯度计算⽅法中,我们发现,当时间步数较⼤或者时间步较小时,**循环神经⽹络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸,但⽆法解决梯度衰减的问题。**通常由于这个原因,循环神经⽹络在实际中较难捕捉时间序列中时间步距离较⼤的依赖关系。

**门控循环神经⽹络(gated recurrent neural network)的提出,正是为了更好地捕捉时间序列中时间步距离较⼤的依赖关系。**它通过可以学习的⻔来控制信息的流动。其中,门控循环单元(gatedrecurrent unit,GRU)是⼀种常⽤的门控循环神经⽹络。

2. ⻔控循环单元

2.1 重置门和更新门

GRU它引⼊了**重置⻔(reset gate)和更新⻔(update gate)**的概念,从而修改了循环神经⽹络中隐藏状态的计算⽅式。

门控循环单元中的重置⻔和更新⻔的输⼊均为当前时间步输⼊ XtX_tXt​ 与上⼀时间步隐藏状态Ht−1H_{t-1}Ht−1​,输出由激活函数为sigmoid函数的全连接层计算得到。 如下图所示:

具体来说,假设隐藏单元个数为 h,给定时间步 t 的小批量输⼊ Xt∈Rn∗dX_t\in_{}\mathbb{R}^{n*d}Xt​∈​Rn∗d(样本数为n,输⼊个数为d)和上⼀时间步隐藏状态 Ht−1∈Rn∗hH_{t-1}\in_{}\mathbb{R}^{n*h}Ht−1​∈​Rn∗h。重置⻔ Ht∈Rn∗hH_t\in_{}\mathbb{R}^{n*h}Ht​∈​Rn∗h 和更新⻔ Zt∈Rn∗hZ_t\in_{}\mathbb{R}^{n*h}Zt​∈​Rn∗h 的计算如下:

Rt=σ(XtWxr+Ht−1Whr+br)R_t=\sigma(X_tW_{xr}+H_{t-1}W_{hr}+b_r)Rt​=σ(Xt​Wxr​+Ht−1​Whr​+br​)

Zt=σ(XtWxz+Ht−1Whz+bz)Z_t=\sigma(X_tW_{xz}+H_{t-1}W_{hz}+b_z)Zt​=σ(Xt​Wxz​+Ht−1​Whz​+bz​)

sigmoid函数可以将元素的值变换到0和1之间。因此,重置⻔ RtR_tRt​ 和更新⻔ ZtZ_tZt​ 中每个元素的值域都是0*,* 1。

2.2 候选隐藏状态

接下来,⻔控循环单元将计算候选隐藏状态来辅助稍后的隐藏状态计算。我们将当前时间步重置⻔的输出与上⼀时间步隐藏状态做按元素乘法(符号为)。如果重置⻔中元素值接近0,那么意味着重置对应隐藏状态元素为0,即丢弃上⼀时间步的隐藏状态。如果元素值接近1,那么表⽰保留上⼀时间步的隐藏状态。然后,将按元素乘法的结果与当前时间步的输⼊连结,再通过含激活函数tanh的全连接层计算出候选隐藏状态,其所有元素的值域为-1,1。

具体来说,时间步 t 的候选隐藏状态 H~∈Rn∗h\tilde{H}\in_{}\mathbb{R}^{n*h}H~∈​Rn∗h 的计算为:

H~t=tanh(XtWxh+(Rt⊙Ht−1)Whh+bh)\tilde{H}_t=tanh(X_tW_{xh}+(R_t⊙H_{t-1})W_{hh}+b_h)H~t​=tanh(Xt​Wxh​+(Rt​⊙Ht−1​)Whh​+bh​)

从上⾯这个公式可以看出,重置⻔控制了上⼀时间步的隐藏状态如何流⼊当前时间步的候选隐藏状态。而上⼀时间步的隐藏状态可能包含了时间序列截⾄上⼀时间步的全部历史信息。因此,重置⻔可以⽤来丢弃与预测⽆关的历史信息。

2.3 隐藏状态

最后,时间步t的隐藏状态 Ht∈Rn∗hH_t\in_{}\mathbb{R}^{n*h}Ht​∈​Rn∗h 的计算使⽤当前时间步的更新⻔ZtZ_tZt​来对上⼀时间步的隐藏状态 Ht−1H_{t-1}Ht−1​ 和当前时间步的候选隐藏状态 H~t\tilde{H}_tH~t​ 做组合:

值得注意的是,**更新⻔可以控制隐藏状态应该如何被包含当前时间步信息的候选隐藏状态所更新,**如上图所⽰。假设更新⻔在时间步 t′到t(t′<t)t^{′}到t(t^{′}<t)t′到t(t′<t) 之间⼀直近似1。那么,在时间步 t′到tt^{′}到tt′到t 间的输⼊信息⼏乎没有流⼊时间步 t 的隐藏状态HtH_tHt​实际上,这可以看作是较早时刻的隐藏状态 Ht′−1H_{t^{′}-1}Ht′−1​ 直通过时间保存并传递⾄当前时间步 t。这个设计可以应对循环神经⽹络中的梯度衰减问题,并更好地捕捉时间序列中时间步距离较⼤的依赖关系。

我们对⻔控循环单元的设计稍作总结:

  • 重置⻔有助于捕捉时间序列⾥短期的依赖关系;
  • 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。

3. 代码实现GRU

MNIST–GRU实现

机器学习通俗易懂系列文章

4. 参考文献

《动手学–深度学习》


作者:@mantchs GitHub:https://github.com/NLP-LOVE/ML-NLP

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年08月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是GRU
  • 2. ⻔控循环单元
    • 2.1 重置门和更新门
      • 2.2 候选隐藏状态
        • 2.3 隐藏状态
        • 3. 代码实现GRU
        • 4. 参考文献
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档