RNN的局限性

在处理时序数据时候,RNN是一种十分简单的方法,但是它并不完美。它会记住太多的信息。
回忆一下能够状态函数HtH_tHt,它对每个进入的XtX_tXt都记录了。然而实际上并不需要完全记住这么多信息,就像一句话中的“的”之类的词就是意义不大的。记录了这些无用的信息反而会对预测产生误导。

此外还存在的一种特殊情况:概念漂移,随着时间的推移数据分布发送了变化。
面对这种情况,过去记录的状态信息可能不管用了,而且会产生误导,需要将其遗忘。

GRU神经网络

针对上述两种缺陷,GRU神经网络应运而生,它通过增设两个“门”,来实现的。

重置门

通过这个门就可以有效的解决概念漂移的问题。
Rt=Θ(Xt⋅Wxr+Ht−1⋅Whr+br) R_t=\Theta\left( X_t\cdot W_{xr} + H_{t-1}\cdot W_{hr} + b_r \right) Rt=Θ(XtWxr+Ht1Whr+br)
RtR_tRtHt−1H_{t-1}Ht1对应元素相乘,并于XtX_tXt对于元素相加,就得到了候选状态Ht′H'_tHt
考虑两种极端情况:

  1. RtR_tRt中全部是111,也就是说记住之前全部的历史信息$H_{t-1}。
  2. RtR_tRt中全部是000,也就是说遗忘掉全部的历史信息Ht−1H_{t-1}Ht1,即重置。

W,BW,BW,B是需要学习的权重,它们负责判断在哪些状态下需要遗忘(重置)说明。

更新门

在重置门中,产生了有关候选状态Ht′H'_tHt,它还需要经过更新门才能变为真正的状态HtH_tHt
Zt=Θ(Xt⋅Wxz+Ht−1⋅Whz+bz)Ht=Zt∗Ht−1+(1−Zt)∗Ht′ Z_t=\Theta\left( X_t\cdot W_{xz} + H_{t-1}\cdot W_{hz} + b_z \right) \newline H_t =Z_t*H_{t-1}+\left( 1 - Z_t\right)*H'_t Zt=Θ(XtWxz+Ht1Whz+bz)Ht=ZtHt1+(1Zt)Ht

  • 此处的*表示对应元素相乘
    通过这个公式,就可以看出来,ZtZ_tZt就是觉得当前状态更新多少到HtH_tHt中。

代码实现

pytorch中有提供GRU神经网络层,直接调用即可。

nn.GRU(vocab_size , hidden_size)
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐