【动手学深度学习笔记】门控循环单元(GRU)

156 阅读2分钟

视频链接

注解

一、为什么要引入GRU?

00:46 RNN无法处理长序列,因为RNN将序列的全部信息全部放在一个隐藏状态中,距离如今很久之前的信息对将来的预测帮助微乎其微,这是一个原因;还有另一个原因是,一个序列中的每一个观察值的重要性不同。因此我们要引入”门“这个概念,我们有以下两种门:

  • 能“关注“的机制(更新门)
  • 能”遗忘“的机制(重置门)

二、什么是门?

04:05 将上一层的隐藏状态Ht1H_{t-1}与当前层的InputXtX_t输入到Reset gate(重置门)和Update gate(更新门)中,分别得到两个输出RtR_tZtZ_t

从公式来看,这两个门相当于一个全连接层

Rt=σ(XtWxr+Ht1Whr+br)Zt=σ(XtWxz+Ht1Whz+bz) \begin{aligned} R_t=\sigma(X_tW_{xr}+H_{t-1}W_{hr}+b_r) \\ \\ Z_t=\sigma(X_tW_{xz}+H_{t-1}W_{hz}+b_z) \end{aligned}

通过学习WxrW_{xr}WxzW_{xz}WhrW_{hr}WhzW_{hz}brb_rbzb_z参数,即可得到重置以及更新的效果

三、重置门是怎么工作的?

07:43 上面我们通过Reset gate和Update gate得到了两个值RtR_tZtZ_t,那么我们要怎么根据这两个值来求出当前层的隐藏状态HtH_t呢?此时我们引入候选隐状态H~t\widetilde H_t

H~t=tanh(XtWxh+(RtHt1)Whh+bh) \widetilde H_t=\tanh(X_tW_{xh}+(R_t\odot H_{t-1})W_{hh}+b_h)

上式的符号“\odot”代表矩阵对应位置元素相乘(Hadamard Product 哈达玛积)

这里可以通过公式理解候选隐状态的含义,RtR_t经过了一个Sigmoid函数的处理,矩阵中的每个元素是一个值域为(0,1)(0,1)之间的值,若我们的网络认为这个元素对后续的预测作用不大时,RtR_t中的元素值会趋近于0,该元素与上个隐藏状态的对应元素相乘,即可达到一个“遗忘”的效果

四、更新门是怎么工作的?

10:58 求出了候选隐状态之后,我们就可以利用剩下的ZtZ_t值来求得该层的“真正”隐状态HtH_t

Ht=ZtHt1+(1Zt)H~t H_t=Z_t\odot H_{t-1}+(1-Z_t)\odot \widetilde H_t

类比上面的分析,我们可以看出,当ZtZ_t趋近于1时,由于当前层的输入XtX_t只包含在H~t\widetilde H_t中,该层就几乎不参考XtX_t的值,即这一层几乎不做更新;当ZtZ_t趋近于0时,此时就跟RNN的作用是相似的,这里不多做赘述。实际上,ZtZ_tRtR_t的值会在[0,1][0,1]这个区间内浮动,灵活性很强。