失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 深度学习TF—9.循环神经网络RNN及其变体GRU LSTM

深度学习TF—9.循环神经网络RNN及其变体GRU LSTM

时间:2023-01-22 17:34:28

相关推荐

深度学习TF—9.循环神经网络RNN及其变体GRU LSTM

文章目录

引言一、RNN神经元结构(1)二、RNN神经元结构(2)三、循环神经网络的类型四、单向循环神经网络的局限五、长短时记忆网络LSTM六、Gated Recurrent Unit—GRU

引言

    虽然全连接神经网络理论上只要训练数据足够,给定特定的x,就能得到希望的y,但是全连接神经网络只能处理独立的输入,前一个输入和后一个输入是完全没有关系的。针对某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的情况,此时,就需要用到循环神经网络RNN,该神经网络能够很好的处理序列信息。

标准的全连接神经网络(fully connected neural network)处理序列数据会有两个问题:

1)全连接神经网络输入层和输出层长度固定,而不同序列的输入、输出可能有不同的长度,选择最大长度并对短序列进行填充(pad)不是一种很好的方式;

2)全连接神经网络同一层的节点之间是无连接的,当需要用到序列之前时刻的信息时,全连接神经网络无法做到,一个序列的不同位置之间无法共享特征。

一、RNN神经元结构(1)

参考于一文搞懂RNN(循环神经网络)基础篇

    一个简单的循环神经网络,它由输入层、隐藏层(单个)、输出层构成。

x是输入层的值

U是输入层到隐藏层的权重矩阵

s是隐藏层的值

权重矩阵 W就是上一个时刻隐藏层的值作为这一时刻的输入的权重。循环神经网络的隐藏层的值s不仅仅取决于当前时刻的输入x,还取决于前一时刻隐藏层的值s。

V是隐藏层到输出层的权重矩阵

    下图展示了上一时刻的隐藏层是如何影响当前时刻的隐藏层的。

    循环神经网络时间线展开图为:

这个网络在t时刻接收到输入xt 之后,隐藏层的值是st ,输出值是 ot 。st的值不仅仅取决于 xt,还取决于 st-1。

    循环神经网络计算方法用公式表示为:

二、RNN神经元结构(2)

    对于 RNN,一个非常重要的概念就是时刻。RNN 会对每一个时刻的输入结合当前模型的状态给出一个输出。t 时刻 RNN 的主体结构 A 的输入除了来自输入层 Xt,还有一个循环的边来提供从 t−1 时刻传递来的隐藏状态。

    将RNN 的主体结构 A 按时间复制可得:

如何设计循环体 A 的网络结构是 RNN 解决实际问题的关键。和卷积神经网络(CNN)过滤器中参数共享类似,在 RNN 中,循环体 A 中的参数在不同时刻也是共享的。

循环体A的结构为:

    下图展示了一个最简单的使用单个全连接层作为循环体 A 的 RNN。图中黄色的 tanh 小方框表示一个使用 tanh 作为激活函数的全连接层。

t 时刻循环体 A 的输入包括 Xt和从 t−1 时刻传递来的隐藏状态 ht-1。循环体 A 的两部分输入如何处理呢?将 Xt和 ht-1直接拼接起来,成为一个更大的矩阵/向量 [Xt,ht-1]。假设 Xt 和 ht-1 的形状分别为 [1, 3] 和 [1, 4],则最后循环体 A 中全连接层输入向量的形状为 [1, 7]。拼接完后按照全连接层的方式进行处理即可。

    RNN前向传播如图所示:

三、循环神经网络的类型

one to one:其实和全连接神经网络并没有什么区别,这一类别算不得是 RNN。one to many:输入不是序列,输出是序列。many to one:输入是序列,输出不是序列。many to many:输入和输出都是序列,但两者长度可以不一样。many to many:输出和输出都是序列,两者长度一样。

四、单向循环神经网络的局限

    单向 RNN 的缺点是在 t 时刻,无法使用 t+1 及之后时刻的序列信息,所以就有了双向循环神经网络。理论上循环神经网络可以支持任意长度的序列,然而在实际中,如果序列过长会导致优化时出现梯度消散的问题(the vanishing gradient problem),所以实际中一般会规定一个最大长度,当序列长度超过规定长度之后会对序列进行截断。RNN 面临的一个技术挑战是长期依赖(long-term dependencies)问题,即当前时刻无法从序列中间隔较大的那个时刻获得需要的信息。在理论上,RNN 完全可以处理长期依赖问题,但实际处理过程中,RNN 表现得并不好。但是 GRU 和 LSTM 可以处理梯度消散问题和长期依赖问题。

    针对于RNN的梯度爆炸问题,

可抽象为WR的k次方,当WR较小时,梯度弥散。当WR较大时,梯度爆炸。针对梯度爆炸问题,解决方案是引入Gradient Clipping(梯度裁剪)。通过Gradient Clipping,将梯度约束在一个范围内,这样不会使得梯度过大。

    在tensorflow 文档中,可以看到Gradient Clipping板块有五个函数。这里,我们仅仅介绍其中两个:

tf.clip_by_norm(t,clip_norm,name=None)tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)tf.clip_by_norm(t,clip_norm,name=None)参数说明: t: a tensor ; clip_norm: 阈值,即maximum L2-norm。如果 tensor的L2-norm大于clip_norm,则 t = t * clip_norm / l2norm(t)否则t = ttf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)参数说明: t_list: multiple tensors; clip_norm: a clipping ratio; use_norm: 如果你已经计算出global_norm,你可以在use_norm进行指定。tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)更慢一些,因为它需要等所有的梯度都求出来才可以进行梯度截断。

算法步骤如下:

首先设置一个梯度阈值:clip_gradient在后向传播中求出各参数的梯度,这里我们不直接使用梯度进去参数更新,我们求这些梯度的l2范数然后比较梯度的l2范数||g||与clip_gradient的大小

如果前者大,求缩放因子clip_gradient/||g||,由缩放因子可以看出梯度越大,则缩放因子越小,这样便很好地控制了梯度的范围最后将梯度乘上缩放因子便得到最后所需的梯度

lr = 0.01max_grad_norm = 5tvars = tf.trainable_variables()grads, _ = tf.clip_by_global_norm(tf.gradients(loss, tvars), max_grad_norm)opt = tf.train.GradientDescentOptimizer(lr)# opt = tf.train.AdamOptimizer(lr)optimizer = opt.apply_gradients(zip(grads, tvars))

五、长短时记忆网络LSTM

    在实际建模中,RNN 经常出现梯度爆炸或梯度消失等问题,因此我们一般使用长短期记忆单元或门控循环单元代替基本的 RNN 循环体。它们引入了门控机制以遗忘或保留特定的信息而加强模型对长期依赖关系的捕捉,它们同时也大大缓解了梯度爆炸或梯度消失的问题。循环网络的每一个隐藏层都有多个循环单元,隐藏层 ht-1 的向量储存了所有该层神经元在 t-1 步的激活值。一般标准的循环网络会将该向量通过一个仿射变换并添加到下一层的输入中,即 W* ht-1+U* Xt。而这个简单的计算过程由于重复使用 W 和 U 而会造成梯度爆炸或梯度消失。因此我们可以使用门控机制控制前一时间步隐藏层保留的信息和当前时间步输入的信息,并选择性地输出一些值而作为该单元的激活值。 之所以叫“门”结构,是因为使用 sigmoid 作为激活函数的全连接神经网络层会输出一个 0 到 1 之间的数值,描述当前输入有多少信息量可以通过这个结构。于是这个结构的功能就类似于一扇门,当门打开时(sigmoid 全连接层输出为 1 时),全部信息可以通过;当门关上时(sigmoid 神经网络层输出为 0 时),任何信息都无法通过。

    LSTM 有三个门,分别是“遗忘门”(forget gate)、“输入门”(input gate)和“输出门”(output gate)。

“遗忘门”的作用是让循环神经网络“忘记”之前没有用的信息,控制以前记忆的信息到底需要保留多少

“输入门”决定哪些信息进入当前时刻的状态,分为以前保留的信息加上当前输入有意义的信息

通过“遗忘门”和“输入门”,LSTM 结构可以很有效地决定哪些信息应该被遗忘,哪些信息应该得到保留。且更新当前时刻状态Ct,输入与输入门对应元素相乘表示当前时刻需要添加到Ct的记忆,前一时间步的记忆 Ct-1 与遗忘门 ft 对应元素相乘就表示了需要保留或遗忘的历史信息是多少,最后将这两部分的信息相加在一起就更新了记忆Ct的信息。

LSTM 在得到当前时刻状态 Ct 之后,需要产生当前时刻的输出,该过程通过“输出门”完成。

LSTM 的内部状态向量𝒄𝑡并不会直接用于输出,这一点和基础的RNN 不一样。基础的RNN 网络的状态向量 既用于记忆,又用于输出,所以基础的RNN 可以理解为状态向量𝒄和输出向量 是同一个对象。在LSTM 内部,状态向量并不会全部输出,而是在输出门的作用下有选择地输出。

LSTM计算公式总结如下:

实际过程也可以用该图表示:

直观比较LSTM与RNN的梯度求导,会发现

RNN中有权重的n次方,易出现梯度弥散与梯度爆炸

而LSTM中是权重的累加,几个门的相互制约不会出现梯度弥散与梯度爆炸现象

六、Gated Recurrent Unit—GRU

    LSTM 具有更长的记忆能力,在大部分序列任务上面都取得了比基础的RNN 模型更好的性能表现,更重要的是,LSTM 不容易出现梯度弥散现象。但是LSTM 结构相对较复杂,计算代价较高,模型参数量较大。因此,科学家们尝试简化LSTM 内部的计算流程,特别是减少门控数量。研究发现,遗忘门是LSTM 中最重要的门控 ,甚至发现只有遗忘门的简化版网络在多个基准数据集上面优于标准LSTM 网络。在众多的简化版LSTM中,门控循环网络(Gated Recurrent Unit,简称GRU)是应用最广泛的RNN 变种之一。GRU把内部状态向量和输出向量合并,统一为状态向量 ,门控数量也减少到2 个:复位门(Reset Gate)和更新门(Update Gate)。

    GRU 的两个门:一个是“更新门”(update gate),它将 LSTM 的“遗忘门”和“输入门”融合成了一个“门”结构;另一个是“重置门”(reset gate)。

    这两个门控机制的特殊之处在于,它们能够保存长期序列中的信息,且不会随时间而清除或因为与预测不相关而移除。从直观上来说,重置门决定了如何将新的输入信息与前面的记忆相结合,更新门定义了前面记忆保存到当前时间步的量。如果我们将重置门设置为 1,更新门设置为 0,那么我们将再次获得标准 RNN 模型。使用门控机制学习长期依赖关系的基本思想和 LSTM 一致,但还是有一些关键区别:

GRU 有两个门(重置门与更新门),而 LSTM 有三个门(输入门、遗忘门和输出门)。GRU 并不会控制并保留内部记忆(c_t),且没有 LSTM 中的输出门。LSTM 中的输入与遗忘门对应于 GRU 的更新门,重置门直接作用于前面的隐藏状态。

    重置门强制隐藏状态遗忘一些历史信息,并利用当前输入的信息。这可以令隐藏状态遗忘任何在未来发现与预测不相关的信息,同时也允许构建更加紧致的表征。而更新门将控制前面隐藏状态的信息有多少会传递到当前隐藏状态,这与 LSTM 网络中的记忆单元非常相似,它可以帮助 RNN 记住长期信息。由于每个单元都有独立的重置门与更新门,每个隐藏单元将学习不同尺度上的依赖关系。那些学习捕捉短期依赖关系的单元将趋向于激活重置门,而那些捕获长期依赖关系的单元将常常激活更新门。

参考:

1.一文搞懂RNN(循环神经网络)基础篇

2.循环神经网络(Recurrent Neural Network,RNN)

3.机器之心GitHub项目:从循环到卷积,探索序列建模的奥秘

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!

如果觉得《深度学习TF—9.循环神经网络RNN及其变体GRU LSTM》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。