首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RNN及其变种LSTM/GRU/SRU

RNN及其变种LSTM/GRU/SRU

作者头像
百川AI
发布2021-12-31 17:42:47
发布2021-12-31 17:42:47
1K0
举报
文章被收录于专栏:我还不懂对话我还不懂对话

1. RNN

h_t=\sigma(W^{(hh)}h_{t-1}+W^{(hx)}x_{[t]}) \tag{5}
\hat{y}_t=softmax(W^{(S)}h_t) \tag{6}

其中:

x_1,..x_T : 表示总共T个词汇的预料中各个词语的词向量。

h_t是每次迭代的隐层输出。 x_t \in R^d : 第t步的输入,词向量维度d。 W^{hx} \in R^{D_h \times d } : 输入x的权重矩阵。

W^{hh} \in R^{D_h \times D_h} ​: 前一轮 h_{t-1} ​的权重矩阵。

h_{t-1} \in R^{D_h} : 前一轮迭代的非线性函数输出。

\sigma(): 非线性激活函数,例如sigmoid。

\hat{y}_t \in R^{|V|} : 每一轮迭代t针对全部词汇的输出概率分布。|V|是其label的维度,如果是分类就是类的个数。 W^{s} \in R^{|V| \times D_h}

损失函数

通常是交叉熵,迭代t中,交叉熵如下(其中y_{t,j}是真实标签):

J^{(t)}(\theta)=-\sum_{j=1}^{|V|}y_{t,j}\times \log(\hat{y}_{t,j}) \tag{7}

在规模为T的语料(相当于样本个数)上,交叉熵错误的计算:

J=-\frac{1}{T}\sum_{t=1}^{T}J^{(t)}(\theta)=-\frac{1}{T}\sum_{t=1}^{T}\sum_{j=1}^{|V|}y_{t,j}\times \log{(\hat{y}_{t,j})} \tag{8}

梯度和长期依赖(Long-Term Dependencies)问题

梯度计算

在某轮迭代tt中考虑公式5、6,用于计算RNN错误dE/dW ,我们对每一步迭代计算错误率总和。那么每一步tt的错误率dE_t/dW 均可通过前面所列的计算出来。

\frac{\partial{E}}{\partial{W}}=\sum_{t=1}^T\frac{\partial E_{t}}{\partial{W}}\tag{10}

链式法则求导得到每一个迭代步长错误率,dh_t/dh_k 为对之前kk次迭代的偏导数。

\frac{\partial E_{t}}{\partial W}=\sum_{k=1}^t \frac{\partial E_{t}}{\partial y_{t}} \frac{\partial y_{t}}{\partial h_{t}}\frac{\partial h_{t}}{\partial h_{k}} \frac{\partial h_{k}}{\partial W} \tag{11}

问题在于\frac{ \partial h_{t} }{ \partial h_{k}}

\frac{\partial h_{t}}{\partial h_{k}}=\prod_{j=k+1}^t \frac{\partial h_{j}}{\partial h_{j-1}}=\prod_{j=k+1}^t W_{hh}^T \times \sigma' \tag{12}

对于每个元素求导W^{D_n \times D_n} ,其Jacobian矩阵:

\frac{\partial h_{j}}{\partial h_{j-1}}=[\frac{\partial h_{j}}{\partial h_{j-1,1}} \dots \frac{\partial h_{j}}{\partial h_{j-1,D_n}}]=\begin{bmatrix}\frac{\partial h_{j,1}}{\partial h_{j-1,1}} & \dots & \frac{\partial h_{j,1}}{\partial h_{j-1,D_n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial h_{j,D_n}}{\partial h_{j-1,1}} & \dots & \frac{\partial h_{j,D_n}}{\partial h_{j-1,D_n}} \end{bmatrix} \tag{13}

结合10,11,12,得到:

\frac{\partial E}{\partial W}=\sum_{t=1}^T\sum_{k=1}^t \frac{\partial E_{t}}{\partial y_{t}} \frac{\partial y_{t}}{\partial h_{t}}(\prod_{j=k+1}^t \frac{\partial h_{j}}{\partial h_{j-1}}) \frac{\partial h_{k}}{\partial W} \tag{14}

梯度爆炸:如果Jacobian矩阵的值非常大,参照激活函数及网络参数可能会出现梯度爆炸,即所谓的梯度爆炸问题。

https://zhuanlan.zhihu.com/p/28687529

sigmoid:

f(z) = 1 / (1 + exp( − z)) \\ f(z)' = f(z)(1 − f(z))

sigmoid函数在两端的导数均为0,近乎呈直线状(导数为0,函数图像为直线),此种情况下可称相应的神经元已经饱和。两函数的梯度为0,使前层的其它梯度也趋近于0。由于矩阵元素数值较小,且矩阵相乘数次(t - k次)后,梯度值迅速以指数形式收缩(意思相近于,小数相乘,数值收缩,越来越小),最终在几个时间步长后完全消失。“较远”的时间步长贡献的梯度变为0,这些时间段的状态不会对你的学习有所贡献:你最终还是无法学习长期依赖。梯度消失不仅存在于循环神经网络,也出现在深度前馈神经网络中。区别在于,循环神经网络非常深(本例中,深度与句长相同),因此梯度消失问题更为常见。

解决:

解决梯度爆炸问题,Thomas Mikolov首先提出了一个简单的启发性的解决方案,就是当梯度大于一定阈值的的时候,将它截断为一个较小的数。

解决梯度弥散的问题,两种方法。第一种方法是将随机初始化W^{(hh)} 改为一个有关联的矩阵初始化。第二种方法是使用ReLU(Rectified Linear Units)代替sigmoid函数。ReLU的导数不是0就是1.因此不太可能会出现梯度消失的情况。

当间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。Bengio, et al. (1994)

借助LSTM架构。LSTM只有状态C_t 传递。

展开为:

C_t = f_t C_{t-1}+i_tx_t =\sigma(W_f X_t+b_f)C_{t-1} + \sigma(W_iX_t+b_i)X_t \\ h_t = tanh(C_t)*o_i

求导:

\prod_{j=k+1}^t \frac{\partial h_{j}}{\partial C_{j-1}} = \prod_{j=k+1}^t tanh' \sigma(W_f X_t+b_f)

其函数图像为:基本不是0就是1。

现代的LSTM使用的是累加的形式计算状态。这种形式导致导数也是累加形式,因此避免了梯度消失。

细胞状态在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

双向RNN

如何利用上下文信息做预测。

Irsoy等人设计了一个双向深度神经网络,在每一个时间节点t,这个网络有两层神经元,一层从左向右传播,另一层从右向左传播。为了保证任何时刻t都有两层隐层,这个网络需要消耗两倍的存储量来存储权重和偏置等参数。最终的分类结果是由两层RNN隐层组合来产生最终的结果。

\overset{\rightarrow }{h}_t = f \left ( \overset{\rightarrow }{W}x_t + \overset{\rightarrow }{V}\overset{\rightarrow }{h}_{t-1}+\overset{\rightarrow }{b} \right ) \\ \overset{\leftarrow }{h}_t = f \left ( \overset{\leftarrow }{W}x_t + \overset{\leftarrow }{V}\overset{\leftarrow }{h}_{t+1}+\overset{\leftarrow }{b} \right ) \\ \hat{y}_t=g\left ( Uh_t+c \right )=g\left ( U\left[\overset{\rightarrow }{h}_t;\overset{\leftarrow }{h}_t\right] +c\right )

2. LSTM

2.1 遗忘门:

对过去记忆单元是否对当前记忆单元的计算有用做出评估。例如出现了新的主语,希望忘记旧的主语。

f_t = \sigma \left( W^{\left( f\right)}x_t+U^{\left(f \right)}h_{t-1}\right) \tag{Forget gate}

2.2 输入门

在产生新记忆之前,我们需要判定一下我们当前看到的新词到底重不重要,这就是输入门的作用。

输入门根据输入词和过去隐层状态共同判定输入值是否值得保留,从而判定它以何种程度参与生成新的记忆(或者说对新的记忆做一个约束)。因此,它可以作为输入信息更新的一个指标。

sigmoid层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M3mitoKF-1602239926120)(https://math.jianshu.com/math?formula=%5Ctilde%7BC%7D_t)],会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。

在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语,使用输入词x_t 和过去隐层状态ht−1 来产生新的记忆\tilde{c}_t .

产生新的记忆之后,就涉及更新细胞状态C。

2.3 输出门

决定输出什么值,输出主要是依赖于 cell 的状态C_t ,但是又不仅仅依赖于C_t

使用一个sigmoid层来(计算出)决定C_t 权重,决定哪些信息会被输出;

C_t 通过一个 tanh 层([-1, 1]),然后把 tanh 层的输出和 sigmoid 层计算出来的权重相乘,这样就得到了最后输出的结果。

参数量:

W_i, U_i, W_f, U_f, W_o, U_o, W_c, U_c

3. GRU

使用门限激活函数改进RNN的一种方法。

GRU有两种门:

z_t = \sigma \left( W^{\left(z \right)}x_t + U^{\left ( z \right )}h_{t-1}\right) \tag{Update gate}
r_t = \sigma \left ( W^{\left ( r \right )}x_t + U^{\left ( r \right )}h_{t-1} \tag{Reset gate}\right )
\tilde{h}_t = \tanh \left ( r_t \circ Uh_{t-1}+Wx_t \right ) \tag{New memory}
h_t = \left ( 1-z_t \right )\circ \tilde{h}_t +z_t \circ h_{t-1} \tag{Hidden state}

x_t \in R^d : 第t步的输入,词向量维度d。

W, W^{z}, W^{r} \in R^{D_h \times d } : 输入x的权重矩阵。

U, U^{r}, U^{z} \in R^{D_h \times D_h} ​: 前一轮

h_{t-1} 的权重矩阵。

h_{t-1} \in R^{D_h} : 前一轮迭代的非线性函数输出。

\sigma() : 非线性激活函数,例如sigmoid。

\hat{y}_t \in R^{|V|} : 每一轮迭代t针对全部词汇的输出概率分布。|V|是其label的维度,如果是分类就是类的个数。 W^{s} \in R^{|V| \times D_h}

  1. 新记忆产生:一个新的记忆 \tilde{h} 是由过去的隐含状态h_{t-1} 和新的输入x_t 共同得到的。也就是说,这个阶段能够对新观察到的信息(词)和历史的隐层状态h_{t-1} 进行合理合并,根据语境向量\tilde{h}_t 总结这个新词以何种状态融合。
  2. 重置门:重置信号r_t 会判定h_{t-1} 对结果\tilde{h} 的重要程度。如果h_{t-1} 和新的记忆的计算不相关,那么重置门能够完全消除过去的隐层信息(状态)。
  3. 更新门:更新信号$z_t 会决定以多大程度将 h_{t-1}向下一个状态传递。比如,如果 z_t \approx 1,则 h_{t-1}几乎完全传递给 h_t。相反的,如果 z_t \approx 0,新的 \tilde{h}$前向传递给下一层隐层。
  4. 隐层状态:使用过去隐层输入h_{t-1}x_t 最终产生了隐层状态h_t

参数有W, W^r,W^z,U, U^r, U^z

SRU

应用

RNN核心在于对向量的序列进行操作:输入可以是序列,输出也可以是序列,在最一般化的情况下输入输出都可以是序列。

每个正方形代表一个向量,箭头代表函数(比如矩阵乘法)。输入向量是红色,输出向量是蓝色,绿色向量装的是RNN的状态(马上具体介绍)。从左至右为:

  1. 非RNN的普通过程,从固定尺寸的输入到固定尺寸的输出(比如图像分类)。
  2. 输出是序列(例如图像标注:输入是一张图像,输出是单词的序列)。
  3. 输入是序列(例如情绪分析:输入是一个句子,输出是对句子属于正面还是负面情绪的分类)。
  4. 输入输出都是序列(比如机器翻译:RNN输入一个英文句子输出一个法文句子)。
  5. 同步的输入输出序列(比如视频分类中,我们将对视频的每一帧都打标签)。

Reference

  1. http://karpathy.github.io/2015/05/21/rnn-effectiveness/
  2. Understanding LSTM Networks
  3. CS224n: Natural Language Processing with Deep Learning
  4. Recurrent Neural Networks Tutorial, Part 1 – Introduction to RNNs
  5. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. RNN
    • 损失函数
    • 梯度和长期依赖(Long-Term Dependencies)问题
      • 梯度计算
      • 解决:
    • 双向RNN
  • 2. LSTM
    • 2.1 遗忘门:
    • 2.2 输入门
    • 2.3 输出门
  • 3. GRU
  • SRU
    • 应用
  • Reference
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档