全方位总结和深入循环神经网络RNN

引言

对于NLP任务有个很典型的任务,叫做情感分类,还有对话机器人,诗词生成,还有slot填充任务等等都是可以用RNN来做的(这里我们说的RNN是广义的RNN)。

为什么这些任务需要RNN呢?
因为某些任务需要能够更好地处理序列信息,即前面的输入和后面的输入是有关系的,因此需要模型具备记忆能力

简单版本RNN

RNN为什么会有记忆能力呢,首先我们看一下RNN的结构:

x x x是一个向量,它表示某个时刻输入层的值(多个时刻的 x x x组成一个序列); s s s是一个向量,它表示隐藏层的值; U U U是输入层到隐藏层的权重矩阵, o o o也是一个向量,它表示输出层的值; V V V是隐藏层到输出层的权重矩阵。 W W W是什么:循环神经网络的隐藏层的值 s s s不仅仅取决于当前这次的输入 x x x,还取决于上一次隐藏层的值 s s s。权重矩阵 W W W就是隐藏层上一次的值作为这一次的输入的权重。

第一个式子是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。第二个式子是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的s的权重矩阵,f是激活函数。从上面的公式我们可以看出,循环层和全连接层的区别就是循环层多了一个权重矩阵 W。 注意:W,V,U为共享权重。所以 W , U , V W,U,V W,U,V一共三个。

我们把上述两个式子展开来看,就可以看出,循环神经网络的输出值,受前面历次输入值 x 1 、 x 2 . . . x t − 1 x_1、x_2...x_{t-1} x1x2...xt1影响,这就是为什么循环神经网络具备记忆能力的原因。

很多现实中的数据都是序列数据,前后相关,需要具备记忆能力的模型来建模。 比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。


双向RNN

例如我们一些完形填空的任务,都需要我们上下文的理解,才可以知道我们这个空处应该填写什么。但是简单版本的循环神经网络无法对此进行建模,因此,我们需要双向循环神经网络。

从上图可看出,双向循环神经网络的隐藏层要保存两个值,一个 A A A参与正向计算,另一个值 A ′ A' A
与反向计算。如,最终 y 2 y_2 y2的输出值取决于 A 2 A_2 A2 A 2 ′ A'_2 A2

正向计算和反向计算不共享权重,也就是说 U U U U ′ U' U W W W W ′ W' W V V V V ′ V' V都是不同的权重矩阵。

RNN也可以在纵向方向进行延伸,即深度多层RNN。前面介绍的循环神经网络只有一个隐藏层,当然也可以根据任务及数据情况,堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。


简单版本RNN存在的问题

其实大家发现无论是在一些顶会中还是在一些项目上,RNN都很少出现。这是因为RNN存在一些弊端。简单来说,就是RNN出现梯度消失和梯度爆炸的现象。

我们下面用数学推导看一些为什么RNN存在上述问题。根据我们前面定义好的RNN前向传导公式,假设 t t t最大为3,损失函数定义为:

我们以 t = 3 t=3 t=3为例,前向传播时:

反向传播可得:

我们也可以知道 t a n h tanh tanh函数在两端梯度会很小,然后通过这个累乘机制,小于1的数相乘越来越小。但是我们发现对于序列后面的输入例如t=3时,并没有累乘,所以梯度不会变得很小;而t=1时,前面累乘很多,就会梯度变得很小。

需要明确的是,RNN 中的梯度消失/梯度爆炸和普通的 MLP 或者深层 CNN 中梯度消失/梯度爆炸的含义不一样:MLP/CNN 中不同的层有不同的参数,各是各的梯度;而 RNN 中同样的权重在各个时间步共享,最终的梯度 g 等于各个时间步的梯度 g_t 的和。

由 1 中所述的原因,RNN 中总的梯度是不会消失的。即便梯度越传越弱,那也只是远距离的梯度消失,由于近距离的梯度不会消失,所有梯度之和并不会消失。RNN 所谓梯度消失的真正含义是,梯度被近距离梯度主导,导致模型难以学到远距离的依赖关系。

所以RNN无法很好的学习到远距离的依赖关系,无法处理长序列。

实践中梯度爆炸一般通过梯度裁剪来解决。


LSTM基本结构解析

LSTM中记忆机制

LSTM的动机就是由于我们人类大脑也有选择性输入和选择性遗忘机制。记忆是一种随时间而变化的状态。决定记忆状态的两大因素:选择性的输入、选择性的遗忘。在不同场景下的记忆输出不同。正是基于人们的记忆有如此特性,LSTM中引出了四个重要概念:细胞状态、输入门、遗忘门以及输出门。

LSTM的本质思想是输入有效的信息,遗忘无用的信息,输出与任务强相关的信息应用于任务处理。

LSTM总体框架

LSTM是一种特殊的RNN网络,并有许多人对其进行了改进和普及。他们的工作被用来解决了各种各样的问题,直到目前还被广泛应用。
在这里插入图片描述
总体运算流程如上图所示:黄色方框表示激活函数操作,粉色圆圈表示点操作,单箭头表示数据流向,箭头合并表示向量的合并(concat)操作,箭头分叉表示向量的拷贝操作。

LSTM:细胞状态

LSTMs的核心是细胞状态,用贯穿细胞的水平线表示。细胞状态像传送带一样,贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNNs。(人的记忆状态贯穿人的一生。)

LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息。门能够有选择性地决定让哪些信息通过。其实门的结构很简单,就是一个sigmoid层和一个点乘操作的组合。因为sigmoid层的输出是0-1的值,这代表有多少信息能够流过sigmoid层。0表示都不能通过,1表示都能通过。一个LSTM里面包含三个门:忘记门、输入门和输出门。

LSTM:忘记门

第一步:决定细胞状态需要丢弃哪些信息。这部分操作是通过一个称为忘记门的sigmoid单元来处理,通过查看 h t − 1 ℎ_{t-1} ht1和信息 x t x_t xt来输出一个0-1之间的向量,该向量里面的0-1值表示细胞状态中的哪些信息保留或丢弃多少。0表示不保留,1表示都保留。
在这里插入图片描述

LSTM: 输入门

第二步:决定给细胞状态添加哪些新的信息。利用 h t − 1 ℎ_{t-1} ht1 x t x_t xt通过一个称为输入门的操作来决定更新哪些信息。再利用ℎ和通过一个tanh层得到新的候选细胞信息(公式中的 a ( t ) a(t) a(t)),这些信息可能会被更新到细胞信息中。
在这里插入图片描述

LSTM:更新细胞状态C

第三步:更新旧的细胞信息,变为新的细胞信息。更新的规则,通过忘记门选择忘记旧细胞信息的一部分,通过输入门选择添加候选细胞信息(公式中的 a ( t ) a(t) a(t))的一部分得到新的细胞信息(注:⊙为Hadamard积)。
在这里插入图片描述

LSTM:输出门

第四步:根据输入的ℎ和来判断输出细胞的哪些状态特征。需要将输入经过一个称为输出门的sigmoid层得到判断条件,然后将细胞状态经过tanh层得到一个 − 1   1 -1~1 1 1之间值的向量,该向量与输出门得到的判断条件相乘就得到了最终该RNN单元的输出。
在这里插入图片描述

LSTM为什么work

我们前面说到RNN面临梯度消失和梯度爆炸问题,归根结底的原因是那些连乘问题,容易梯度收敛为0。那么LSTM是如何解决这个问题的呢。LSTM参数更新推导后会发现没有连乘这一项了,就避免了梯度损失。

单元状态梯度是由表示为 A , B , C , D A,B,C,D ABCD的四个元素组成的加法函数。这种加性可以在反向传播期间更好地平衡梯度值。LSTM更新并平衡了四个成分的值,从而使加法表达式不消失的可能性更大。

公式里其余的项不重要,重点看 f t f_t ft。可以看出当 f t = 1 f_t = 1 ft=1 时,就算其余项很小,梯度仍然可以很好导到上一个时刻,此时即使层数较深也不会发生 Gradient Vanish 的问题;当 f t = 0 f_t=0 ft=0时,即上一时刻的信号不影响到当前时刻,则梯度也不会回传回去; 在这里也控制着梯度传导的衰减程度,与它 Forget Gate 的功能一致。

包含激活的“遗忘门”矢量,它使网络可以使用遗忘门的适当参数更新在每个时间步更好地控制梯度值。忘记门激活的存在允许LSTM在每个时间步长上确定不应忘记某些信息,并相应地更新模型的参数。


GRU

RU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种网络。GRU既然是LSTM的变体,因此也是可以解决RNN网络中的长依赖问题。它也合并了cell state和hidden state,并且做了一些其他的改变。结果模型比标准LSTM模型更简单,并且正越来越受欢迎,

在GRU模型中只有两个门:

  • 重置门 ( r ) (r) r:控制前一状态有多少信息被写入到当前的候选状态 上的程度,重置门越小,前一状态的信息被写入的越少。
  • 更新门 ( z ) (z) z:控制前一时刻的状态信息与候选状态信息被带入到当前状态中的程度。

具体公式和结构如下:
在这里插入图片描述


RNN的技术选型

在这里插入图片描述
图1是普通的单个神经网络。
图2是把单一输入转化为序列输出,可以用来做生成模型。例如输入一个图像信息,生成一段文字,典型任务就是看图说话。
图3是把序列输入转化为单个输出。可以做一个典型序列分类的问题,例如文本分类和视频分类。
图4是把序列转化为序列,也就是 seq2seq 的做法。这里的输入序列和输出序列是错位的,意味着输入序列和输出序列长度可以不一样,经典任务 如机器翻译。
图5是无时差的序列到序列转化,可以作为普通的语言模型。这里输入和输出序列长度相同,有种一一对应的感觉(对齐),还可以做一些NER问题。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值