The Simple RNN Language Model

image-20210211185344655

简单的RNN语言模型。

Training an RNN Language Model

image-20210211190631508

RNN在$t$时刻的输出是预测第$t+1$个词的概率分布$y^(t)$;而对于训练集中给定的文本来说,第$t+1$个词是已知的某个词,所以真实答案$y(t)$其实是一个one-hot向量,在第$x(t+1)$位置为1,其他位置为0。所以如果是交叉熵损失函数的话,表达式如上图中间的等式。RNN整体的损失就是所有时刻的损失均值。

image-20210211191026911

输入序列the students opened their 预测后面的词。

image-20210211191137637

训练RNN语言模型,其实loss是所有时刻t的损失的均值。

image-20210211191633630

  • 然而:计算 整个语料库 的损失和梯度太昂贵了

  • 在实践中,输入序列实际上是一个 句子 或是 文档,这就跟随机梯度下降法中,随机抽小批样本一样。

  • 回忆 :随机梯度下降允许我们计算小块数据的损失和梯度,并进行更新。
  • 计算一个句子的损失(实际上是一批句子),计算梯度和更新权重。重复上述操作。

Training the parameters of RNNs: Backpropagation for RNNs

image-20210211192116116

损失函数对权重矩阵W等参数的偏导是什么?

Problems with Vanishing and Exploding Gradients

Vanishing gradient intuition

image-20210212125204219

梯度消失的直觉,根据链式法则,求每个节点对隐藏变量$\mathbf{h}_i$的梯度时,如果其接近0时,传播越深,梯度信号就会越来越小,直至消失。

image-20210212140058181

Vanishing gradient proof sketch (linear case)

image-20210212140204624

  • 对于隐藏层$\mathbf{h}^{(t)}$来说,就是激活函数作用到,上一个隐藏输入和输入分布的权重和加上偏置。

  • 如果激活函数是恒等函数,比如$\sigma(x) = x$,
    其梯度就是上面的整体的导数的对角阵再乘以 ;即单位矩阵乘以

  • 考虑第$i$时刻损失 对于在之前时刻 隐藏层 的梯度,令

    如果$\mathbf{W}_{h}$本身非常小,当$l$变大时,这项会产生指数问题。

image-20210212143125560

  • $\mathbf{W}_{h}^{l}$什么问题?
  • 假设$\mathbf{W}_{h}$的特征值都小于1:
  • 可以将其梯度写作$\mathbf{W}_{h}$的一组基的形式,这时,就会导致梯度消失
  • 那非线性激活函数$\sigma$呢?也一样,除了需要证明对于在维度上一些$\gamma$独立和$\sigma$有$\lambda_i < \gamma$

image-20210212144556708

为什么梯度消失是一个问题?

  • 梯度信号从远处传来会消失是因为,它比近处的小得多
  • 因此,模型权重只会更新对应的近处影响,而不是长期的影响

Effect of vanishing gradient on RNN-LM

image-20210212144854345

  • 语言模型的任务:预测下一个词
  • 为了从训练样本学习到这个,语言模型需要建立依赖于在第7步“tickets” 和最后目标词“tickets”之间的的模型。
  • 但是如果梯度很小,模型就无法学习到这个依赖关系。因此模型无法在测试时预测类似的长距离依赖关系

Why is exploding gradient a problem?

image-20210212150150737

  • 如果梯度变得过大,那么SGD更新步伐将变大
  • 这将导致错误的更新:我们取太大的步伐,到达一个怪异的错误的参数配置(产生大的loss)

    • 你想下你发现一个斜坡来跳跃,但突然你在低谷了
  • 在最坏的情况下,这会在你网络中导致NaN(那么你得从之前某个checkpoint重新训练)

Gradient clipping: solution for exploding gradient

image-20210212150859173

  • 梯度裁剪:就像算法1中,如果梯度的模大于阈值,就在SGD之前缩小它
  • 直觉:取同样方向的一步,不过是一小步
  • 实际上,记得裁剪梯度是非常重要的,但梯度爆炸是一个容易解决的问题。

How to fix the vanishing gradient problem?

image-20210212151219392

  • 主要问题是在,对于RNN很难学到遍历许多时刻后保留信息

  • 在RNN变种里,隐藏状态不断被重写

  • RNN有独立记忆怎么样?

    引入LSTM

Long Short-Term Memory RNNs (LSTMs)

image-20210212151628214

  • 在1997年一种类型的RNN被Hochreiter and Schmidhuber 提出,其作为梯度消失问题的解决措施。

  • 在时刻$t$, 有一个隐藏状态$\mathbf{h}^{(t)}$和cell状态$\mathbf{c}^{(t)}$

    • 都是长度为$n$的向量
    • cell存储长期信息
    • LSTM能从cell中读取、删除,和写入信息 ,cell是一个概念而不是计算机里的RAM
  • 通过控制三个对应的门来删除、写入、读取选择性的信息
    • 门也是长为$n$的向量
    • 在每个时刻,每个门元素能打开(1), 关闭(0),或者介于之间状态
    • 门是动态的:基于当前上下文来计算它们的值

image-20210212160622165

我们有一个输入序列$\mathbf{x}^{(t)}$,要计算隐藏状态$\mathbf{h}^{(t)}$序列和cell状态$\mathbf{c}^{(t)}$.在时刻$t$:

  • 遗忘门:控制上一个cell状态的保持和遗忘,$\mathbf{f}^{(t)}=\sigma(\mathbf{W}_f\mathbf{h}^{(t-1)}+\mathbf{U}_f\mathbf{x}^{(t)} + \mathbf{b}_f)$
  • 输入门:控制新cell的哪些内容写入到cell, $\mathbf{i}^{(t)}=\sigma(\mathbf{W}_i\mathbf{h}^{(t-1)}+\mathbf{U}_i\mathbf{x}^{(t)} + \mathbf{b}_i)$
  • 输出门:控制哪些cell的部分输出到隐藏层, $\mathbf{o}^{(t)}=\sigma(\mathbf{W}_o\mathbf{h}^{(t-1)}+\mathbf{U}_o\mathbf{x}^{(t)} + \mathbf{b}_o)$
  • 新cell内容:写入cell的新内容: $\mathbf{\tilde c}^{(t)}=\text{tanh}(\mathbf{W}_c\mathbf{h}^{(t-1)}+\mathbf{U}_c\mathbf{x}^{(t)} + \mathbf{b}_c)$
  • Cell状态: 删除上一个cell“forget”中一些内容,写入“input”一些新cell内容:$\mathbf{c}^{(t)}=\mathbf{f}^{(t)}\circ \mathbf{c}^{(t-1)}+\mathbf{i}^{(t)}\circ \mathbf{\tilde c}^{(t)}$
  • 隐藏状态:读取从cell中“输出”一些内容:$\mathbf{h}^{(t)}=\mathbf{o}^{(t)}\circ \text{tanh} \mathbf{c}^{(t)}$

注意:门都是应用的逐元素积或者说Hadamard积。

image-20210213003729927

你可以把LSTM方程可视像上图一样, colah LSTM

image-20210213003942932

具体来说,来看每个门的作用。

How does LSTM solve vanishing gradients?

image-20210213004955463

LSTM怎么解决梯度消失问题?

  • LSTM比RNN更容易保留许多时刻后的信息。
    • 比如,如果对于一个cell ,遗忘门设置为1,输入门设置为0,那么这个cell的信息被无限地保留
    • 相比,普通RNN很难学到循环权重矩阵$\mathbf{W}_h$, 其保留在隐藏层state的信息
    • 实际上,你能得到大约100个时刻而不是7个时刻
  • LSTM不确保,没有梯度消失,但是提供了让模型更容易学习长矩依赖的方式

LSTMs: real-world success

image-20210213151650925

LSTM:现实的成功

  • 在2013——2015,LSTMs开始取得最先进的成果:
    • 成功的任务包含,手写识别,语音识别,机翻,解析,和图片标题,以及语言模型
    • LSTM成为大部分NLP任务的统治方法
  • 在2021年,别的方法(如Transformers)已经成为许多任务的统治方法
    • 例如,在WMT
    • 2016 WMT,总结报告包含 “RNN” 44次
    • 2019 WMT , “RNN” 7 次, “Transformer” 105次

Is vanishing/exploding gradient just a RNN problem?

image-20210213152606764

梯度消失/爆炸仅仅是RNN中的问题吗?

  • 不是!所有的神经网络(包括前馈和卷积网络)都会存在梯度爆炸或是梯度消失的问题,特别是很深的网络。

    • 由于链式法则/非线性激活函数的选择,梯度当其反向传播是渐渐变小
    • 因此,低层学习得十分缓慢(很难训练)
  • Solution: 许多新的深层前馈/卷积结构,添加更直接的连接(这允许梯度流向更远)

    例子:

    • 残差连接,“Resnet”
    • 跳跃连接
    • 通过默认保留信息的相同连接
    • 这些深度网络更容易训练

image-20210213153746863

其它方法:

  • 稠密连接的, “DenseNet”
  • 直接连接所有将来的层
  • 高速公路连接, “HighwayNet”
  • 类似于残差连接,但是等同连接和变换层被一个动态门控制
  • 受LSTMs的影响, 应用在深层前馈/卷积网络

image-20210213154309665

总结:梯度消失和梯度爆炸是普遍问题,RNNs尤其不稳定,是因为重复使用相同权重矩阵。

Bidirectional and Multi-layer RNNs: motivation

image-20210213154604534

在情感分类任务中,

  • 我们可以把隐藏状态看作是这个句子中单词terribly的上下文表示。这个称之为上下文表示
  • 这些上下文表示只包含左边上下文信息
  • 那怎么表示右边上下文信息呢?
  • 这个例子中,exciting是在右边的上下文,它修饰terribly的意思(从否定变为肯定)

Bidirectional RNNs

image-20210213161012591

双向RNNs

上图中,结合后的隐层状态,绿色就可以表示右边的上下文。

image-20210213161321755

双向RNNs,计算符号。

image-20210213161455919

简化的双向RNN,双向箭头表示双向,和描述的隐层状态被假定为结合的前向和反向状态。

image-20210213161858762

  • 注意:双向RNNs只适用于,当你输入整个序列
    • 它不适用于语言建模,因为LM你只有左边上下文。
  • 如果你有整个上下文(比如,任何编码),双向是强大的(你要默认使用它)
  • 例如,BERT(Bidirectional Encoder Representations from Transformers )是基于双向的强大预训练上下文表示系统。
    • 你将在几周后学习更多包含BERT的transformers

Multi-layer RNNs

image-20210213162449032

  • RNNs在一个维度上已经很深了(展开到许多时刻)
  • 我们通过应用多层RNNs来让其在另一个维度deep
  • 这允许神经网络计算更复杂的表达
    • 低层RNNs应该计算低层特征,而高层RNNs应该计算高层
  • 多层RNNs也叫作堆叠RNNs

image-20210213162516113

RNNs的第i层隐层状态就是第i+1层的输入。

Multi-layer RNNs in practice

image-20210213171053469

  • 高表现的RNNs经常是多层的(但没有卷积或前馈网络那么深)
  • 例如,在2017年一篇论文,Britz et al发现神经机器翻译,2 to 4 层RNN编码器是最好的, 4层解码器是最好的。
    • 通常, 跳跃连接/稠密连接是在训练深度RNNs需要的
  • 基于Transformer的神经网络(如,BERT)通常是深层的,像12层或24层
    • 其有很多skipping-like连接

总结

image-20210213171117921

参考

[1] cs224n-2019-notes05-LM_RNN

[2] cs224n-2021-lecture06-fancy-rnn

[3] Recurrent Neural Networks Tutorial, Part 3

[4] 循环神经网络RNN 梯度推导(BPTT)

[5] CS224N(1.24)Language Models and RNNs

[6] Science is interesting.07 Vanishing Gradients and Fancy RNNs

[7] 2019年CS224N课程笔记-Lecture 7: Vanishing Gradients and Fancy RNNs

[8] cs224n(2019)-Lecture 7 梯度消失和有趣的RNN