avatar

目录
深度学习04-进化吧,RNN

RNN的先天缺陷

由于RNN的BPTT机制,使得RNN先天具有以下两个问题:

  • 时间步较小 --> 出现梯度爆炸问题 --> 应对办法:梯度裁剪
  • 时间步较大 --> 出现梯度衰减问题 --> 应对办法:?

为了解决"?",先来在实际场景中理解这个问题,举个栗子:

“I grew up in France… I speak fluent _____(French).”

这就需要结合上下文背景才能填空,也就是相关信息和所需信息之间的差距(时间步)可能非常大,这样经过多阶段的误差反向传播后出现梯度消失(推导下BPTT可知)

LSTM

能够选择性地“忘记”,选择性地“记住”的单元结构

输入门、遗忘门和输出门

  • 控制信息的流动​

三个门的激活函数都是sigmoid函数,所以三个门的值域均为[0,1][0, 1](起到了控制作用),计算如下:

()It=σ(XtWxi+Ht1Whi+bi)()Ft=σ(XtWxf+Ht1Whf+bf)()Ot=σ(XtWxo+Ht1Who+bo)(输入门)I_t = σ(X_tW_{xi} + H_{t−1}W_{hi} + b_i)\\ (遗忘门)F_t = σ(X_tW_{xf} + H_{t−1}W_{hf} + b_f)\\ (输出门)O_t = σ(X_tW_{xo} + H_{t−1}W_{ho} + b_o)

其中,Wxi,Wxf,WxoRd×h\boldsymbol{W}_{xi},\boldsymbol{W}_{xf},\boldsymbol{W}_{xo} \in \mathbb{R}^{d \times h}Whi,Whf,WhoRh×h\boldsymbol{W}_{hi},\boldsymbol{W}_{hf},\boldsymbol{W}_{ho} \in \mathbb{R}^{h \times h}是权重参数,bi,bf,boR1×h\boldsymbol{b}_{i},\boldsymbol{b}_{f},\boldsymbol{b}_{o} \in \mathbb{R}^{1 \times h}
是偏差参数。

候选记忆细胞

  • 得到当前时间步的候选记忆

激活函数为tanh函数,值域为[1,1][-1, 1],计算如下:

()C~t=tanh(XtWxc+Ht1Whc+bc)(候选记忆细胞)\widetilde{C}_t = tanh(X_tW_{xc} + H_{t−1}W_{hc} + b_c)

其中,WxcRd×h\boldsymbol{W}_{xc} \in \mathbb{R}^{d \times h}WhcRh×h\boldsymbol{W}_{hc} \in \mathbb{R}^{h \times h}是权重参数,bcR1×h\boldsymbol{b}_{c} \in \mathbb{R}^{1 \times h}
是偏差参数。

记忆细胞

  • 应对循环神经网络中的梯度衰减问题,并更好地捕捉时间序列中时间步距离较大的依赖关系

当前时间步记忆细胞CtRn×h\boldsymbol{C}_{t} \in \mathbb{R}^{n \times h}的计算组合了上一时间步记忆细胞和当前时间步候选记忆细胞的信息,其中通过遗忘门和输入门来控制信息流动。

Ct=FtCt1+ItC~tC_t = F_t ⊙C_{t−1} + I_t ⊙\widetilde{C}_t

如果遗忘门一直近似11且输入门一直近似00,过去的记忆细胞将一直通过时间保存并传递至当前时间步。

隐藏状态

  • 传递隐藏状态至输出层

Ht=Ottanh(Ct)H_t = O_t⊙tanh(C_t)

当输出门近似11时,记忆细胞信息将传递到隐藏状态供输出层使用;当输出门近似00时,记忆细胞信息只自己保留。

GRU

GRU效果与LSTM相当,而且更易于计算(贫穷限制了我们的计算能力…)

重置门和更新门

  • 重置门:丢弃与预测无关的历史信息,有助于捕捉时间序列里短期的依赖关系
  • 更新门:控制隐藏状态应该如何被包含当前时间步信息的候选隐藏状态所更新,有助于捕捉时间序列里长期的依赖关系

假设隐藏单元个数为hh,给定时间步tt的小批量输入XtRn×d\boldsymbol{X}_{t} \in \mathbb{R}^{n \times d}(样本数为nn,输入个数为dd)和上一时间步隐藏状态Ht1Rn×h\boldsymbol{H}_{t-1} \in \mathbb{R}^{n \times h}。重置门RtRn×h\boldsymbol{R}_{t} \in \mathbb{R}^{n \times h}和更新门ZtRn×h\boldsymbol{Z}_{t} \in \mathbb{R}^{n \times h}中每个元素的值域都是[0,1][0, 1],计算如下:

Rt=σ(XtWxr+Ht1Whr+br)Zt=σ(XtWxz+Ht1Whz+bz)R_{t} = σ(X_tW_{xr} + H_{t−1}W_{hr} + b_r)\\ Z_{t} = σ(X_tW_{xz} + H_{t−1}W_{hz} + b_z)

候选隐藏状态

  • 计算候选隐藏状态来辅助稍后的隐藏状态计算

将当前时间步重置门的输出与上一时间步隐藏状态做按元素乘法(重置门中元素值接近0,意味着丢弃上一时间步的隐藏状态;元素值接近1,则表示保留上一时间步的隐藏状态)。然后,将按元素乘法的结果与当前时间步的输入连结,再通过含激活函数tanh的全连接层计算出候选隐藏状态,其所有元素的值域为[1,1][-1, 1]

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

隐藏状态

  • 应对循环神经网络中的梯度衰减问题,并更好地捕捉时间序列中时间步距离较大的依赖关系

Ht=ZtHt1+(1Zt)H~tH_t = Z_t⊙H_{t−1} + (1−Z_t)⊙\widetilde{H}_t

假设更新门在时间步tt′ttt<tt′ < t)之间一直近似11。那么,在时间步tt′tt之间的输入信息几乎没有流入时间步tt的隐藏状态HtH_{t}。实际上,这可以看作是较早时刻的隐藏状态Ht1H_{t′−1}一直通过时间保存并传递至当前时间步tt

深度循环神经网络

  • 隐藏状态的信息不断传递至当前层的下一时间步和当前时间步的下一层,使得特征表征能力更强

注意:并不是越深的网络效果越好,层数的加深会导致模型的收敛变得困难,DeepRNN一般2~3层就行了

Ht(1)=ϕ(XtWxh(1)+Ht1(1)Whh(1)+bh(1))Ht()=ϕ(Ht(1)Wxh()+Ht1()Whh()+bh())Ot=Ht(L)Whq+bq\boldsymbol{H}_t^{(1)} = \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh}^{(1)} + \boldsymbol{H}_{t-1}^{(1)} \boldsymbol{W}_{hh}^{(1)} + \boldsymbol{b}_h^{(1)})\\ \boldsymbol{H}_t^{(\ell)} = \phi(\boldsymbol{H}_t^{(\ell-1)} \boldsymbol{W}_{xh}^{(\ell)} + \boldsymbol{H}_{t-1}^{(\ell)} \boldsymbol{W}_{hh}^{(\ell)} + \boldsymbol{b}_h^{(\ell)})\\ \boldsymbol{O}_t = \boldsymbol{H}_t^{(L)} \boldsymbol{W}_{hq} + \boldsymbol{b}_q

双向循环神经网络

  • 瞻前顾后,其在每个时间步的隐藏状态同时取决于该时间步之前和之后的子序列(包括当前时间步的输入)

Ht=ϕ(XtWxh(f)+Ht1Whh(f)+bh(f))Ht=ϕ(XtWxh(b)+Ht+1Whh(b)+bh(b))\begin{aligned} \overrightarrow{\boldsymbol{H}}_t &= \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh}^{(f)} + \overrightarrow{\boldsymbol{H}}_{t-1} \boldsymbol{W}_{hh}^{(f)} + \boldsymbol{b}_h^{(f)})\\ \overleftarrow{\boldsymbol{H}}_t &= \phi(\boldsymbol{X}_t \boldsymbol{W}_{xh}^{(b)} + \overleftarrow{\boldsymbol{H}}_{t+1} \boldsymbol{W}_{hh}^{(b)} + \boldsymbol{b}_h^{(b)}) \end{aligned}

Ht=(Ht,Ht)()\boldsymbol{H}_t=(\overrightarrow{\boldsymbol{H}}_{t}, \overleftarrow{\boldsymbol{H}}_t)(连结)

Ot=HtWhq+bq\boldsymbol{O}_t = \boldsymbol{H}_t \boldsymbol{W}_{hq} + \boldsymbol{b}_q

文章作者: Kolen
文章链接: http://mrkolen.github.io/2020/02/23/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A004-%E8%BF%9B%E5%8C%96%E5%90%A7%EF%BC%8CRNN/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kolen's Nest
打赏
  • 微信
    微信

评论