杜宝坤

V1

2022/07/12阅读:13主题:全栈蓝

白话机器学习-从RNN、LSTM到GRU

一 背景

大抵是去年底吧,收到了几个公众号读者的信息,希望能写几篇介绍下Attention以及Transformer相关的算法的文章,当时的我也是满口答应了,但是确实最后耽误到了现在也没有写。

前一阵打算写这方面的文章,不过发现一个问题,就是如果要介绍Transformer,则必须先介绍Self Attention,亦必须介绍下Attention,以及Encoder-Decoder框架,以及GRU、LSTM、RNN和CNN,所以开始漫长的写作之旅。

截止目前,已经完成几篇文章的输出

  • 《白话机器学习-卷积神经网络CNN》
  • 《白话机器学习-循环神经网络RNN》
  • 《白话机器学习-长短期记忆网络LSTM》

那么接下来,需要把GRU、Encoder-Decoder框架、Attention机制、Self Attention以及Transformer一一介绍了。计划周期在2-3周吧,不好意思,让大家久等了。

关于机器学习算法这块后续的文章规划,大致是会继续介绍下图神经网络相关、强化学习相关、对抗学习相关以及元学习相关等相关文章。

GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。GRU是新一代的循环神经网络,与LSTM非常相似。GRU抛弃了Cell State,仅仅使用隐藏状态来传递信息。它比LSTM少一个门,仅仅有两个门,reset gate和update gate(如上图)。

GRU和LSTM在很多情况下实际表现上相差无几,那么为什么我们要使用新人GRU(2014年提出)而不是相对经受了更多考验的LSTM(1997提出)呢。

下图1-1引用论文中的一段话来说明GRU的优势所在。

相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。

下面我们来一起回顾下RNN以及LSTM相关的知识,然后自然的引出GRU。

二 循环神经网络-Recurrent Neural Networks

人类的思维模式都是具备连续性与关联性的。比如在我们阅读一篇文章的过程中,当理解一段话的时候,我们不会孤立的仅仅针对这段话进行理解,而是会结合上下文进行全局的逻辑推断,判断这话是什么含义。

但是传统的神经网络不能做到这一点,因为传统的神经网络包含全连接和卷积神经网络在同层之间都是没关联的。循环神经网络横空出世解决了这个问题。基于它的同层之间连接的网络结构,同层之间设计成带有循环体的的网络,可以对于具备时序关系的序列进行区间的上下文综合理解,更好的拟合人类的思维模式过程

循环神经网络的关键结构是循环体,循环体如下构造:

以上图为例,循环体A是一个大的NN网络,它的输入是 ,输出是 ,同时输出亦作为循环体的输入,这样相当于将信息不断的从网络的一个时刻传递到下一个时刻,实现了信息的记忆与传递。上面的这个图比较抽象,现在我们把这个图展开来看看。

在过去的几年内,循环神经网络在各个领域取得了令人兴奋的成功:语音识别、语言建模、翻译、图像字幕……等等。

同时,在技术的演进过程中,循环神经网络也在不断的升级,下面我们介绍下循环神经网络的又一悍将LSTM。

三 长期记忆的难题

RNN的一个吸引人之处在于,它可以将之前的信息与当前的任务联系起来,比如使用之前的视频帧可以帮助理解当前的帧。如果rnn能够做到这一点,它们将非常有用。但他们能吗?视情况而定。

RNN的优点在于可以将之前的信息与当前的信息关联起来,实现记忆区间内的联动。不过也存在一些问题,我们分两种场景来分析:

  • 短期关联

有时我们只需要查看最近的信息来推演当前的信息。例如,假设一个语言模型试图根据前面的单词预测下一个单词。如果我们试图预测“the clouds are in the sky”中的最后一个单词,我们不需要任何进一步的语境——很明显,下一个单词将是sky。在这种情况下,相关信息和需要信息的地方之间的差距很小,RNN可以学会使用过去的信息。

  • 长期关联

但是也有一些情况我们需要关联更长的信息。比如预测文章的最后一个词“我在法国长大……我能说一口流利的法语”。最近的信息表明只能推演出下一个单词可能是一种语言的名称,但如果我们想要明确具体的语言,需要更早的信息”法国“。相关信息和需要它的信息之间的时序差距完全有可能变得非常大。

不幸的是,针对时序差距的较长的信息链,RNN无法很好的进行学习,模型的表征能力收到极大的限制,亟需进行模型结构的突破,才能解决这些问题。

结合人类的思维记忆模式,RNN的问题在于只有记忆没有遗忘,所有的信息一股脑的灌进模型里面,数据少的情况还好,但是数据多了自然就没重点了。下面针对这种情况,我们设计了长短期记忆网络-LSTM,格言:只要忘记,才能记忆;若要记忆,学会忘记

四 长短期记忆网络-LSTM

长期短期记忆网络LSTM可以理解为一种特殊的RNN,能够学习长期依赖关系。是由 Hochreiter & Schmidhuber (1997)发明的,并且在实践中取得了优秀的效果。LSTM被明确地设计为避免长期依赖问题,下面我们对比下RNN与LSTM的网络结构。

  • RNN网络结构
  • LSTM网络结构

LSTM也是这种循环体的链式结构,但是循环体里面的NN结构不同。RNN里面有一个全连接,而LSTM有四个全连接网络。

图的含义如下:

  • 黄色的盒子代表全连接神经网络;
  • 粉红色的圆圈代表逐点操作,比如矩阵按位加法与矩阵按位乘法;
  • 标准箭头代表数据的流动。
  • 行合并箭头代表数据的拼接;
  • 行分叉箭头代表数据被复制成多个副本,并将副本发送到不同的位置。

五 LSTM背后的核心思想

LSTM的关键是Cell State,即下图中贯穿图顶部的水平线。

Cell State就像是一条传送带。它作用于整个时序链条,在运行的过程中保留着深度的记忆。

LSTM之所以可以将长期记忆有选择性的加入到Cell中,关键的结构是一个称之为门(Gate)的结构。门是一种选择性地让信息通过的方式,由一个激活函数是Sigmoid的神经网络层和一个逐点乘法运算组成。

Sigmoid激活函数使得神经网络层的输出是0到1之间的数字,描述每个组件应该允许多少通过。值为0表示“不让任何东西通过”,值为1表示“让所有东西通过”!

一个LSTM有三个这样的门,用来控制Cell State。

六 逐步推导LSTM

在上篇《白话机器学习-长短期神经网络LSTM》中我们已经详细推导过LSTM,不过这里为了整体介绍循环神经网络以及GRU,所以再简单复习下。

  • 遗忘阶段

在LSTM中,第一步是决定将从Cell State中遗忘哪些信息。这个决定是由“遗忘门”来判断的。遗忘门是全连接神经网络,激活函数是Sigmoid函数,输入是 ,输出是 (一个0到1之间的参数矩阵,值为0表示“不让任何东西通过”,值为1表示“让所有东西通过”),即

  • 记忆阶段 - 前置计算阶段

在LSTM中,第二步是决定向Cell State添加哪些信息。这个阶段包含两个结构:

  1. 输入门:输入门是全连接神经网络,激活层是Sigmoid,输入是输入是 ,输出是 (一个0到1之间的参数矩阵,值为0表示“不让任何东西通过”,值为1表示“让所有东西通过”!),即
  2. 候选向量:生成候选向量是全连接神经网络,激活函数是tanh,输入是输入是 ,输出是 , 即

两个神经网络的生成的向量(不考虑Batch),相互按位乘就可以得到我们想要添加的信息,已替换以往忘记的信息。

  • 更新Cell State

LSTM的第三步,就是需要更新Cell State,这个更新从两个方面进行,遗忘和记忆,结合我们上面的描述,主要是有两个部分:

  1. 遗忘,通过与遗忘门产生的向量进行按位乘法,即
  2. 记忆,通过候选向量与输入门进行按位乘法,即
  3. 更新Cell State,将上面计算的两个结果进行按位相加,即
  • 输出

LSTM的最后一步,需要决定要输出什么。

  1. 输出门:输入门是全连接神经网络,激活层是Sigmoid,输入是输入是 ,输出是 (一个0到1之间的参数矩阵,值为0表示“不让任何东西通过”,值为1表示“让所有东西通过”!),即
  2. Cell State的当前状态,即
  3. 最终输出:

七 GRU

到目前为止,我描述的是一个非常普通的LSTM。但并不是所有的lstm都和上面的一样。事实上,似乎几乎每一篇涉及lstm的论文都使用了稍微不同的版本。差别很小,但其中有一些还是值得一提的。

LSTM的一个稍微更引人注目的变化是门控循环单元,或GRU,由Cho等人(2014)引入。它将遗忘门和输入门合并成一个“更新门”。它还合并了单元格状态和隐藏状态,并进行了一些其他更改。得到的模型比标准的LSTM模型更简单,但是效果缺没有本质的差异,并且越来越受欢迎。

从整体上来说,GRU的输入输出结构与普通的RNN是一样的,与LSTM不同,同时它只有两个门控,而LSTM有三个门控。

有一个当前的输入 ,和上一个节点传递下来的隐状态(hidden state) ,这个隐状态包含了之前节点的相关信息。根据 ,GRU会得到当前隐藏节点的输出 和传递给下一个节点的隐状态

具体的计算过程参考下图,其中通过 用来遗忘和记忆。不过门控 主要控制历史信息和当前信息的权重的功能,通过和上个时刻的隐状态 进行按位乘法,进行部分遗忘,例如如果 ,则只输入当前的信息。

流程如下:

  • 重置门计算:主要用于控制历史信息和当前信息的权重,网络结构是全连接神经网络,激活函数是Sigmond,即
  • 更新门控:主要用于计算历史信息的遗忘程度,网络结构是全连接神经网络,激活函数是Sigmoid,即
  • 候选向量计算:主要是记忆的功能,记忆当前需要记录的信息,即
  • 遗忘门控,用于计算以往历史信息的权重参数,即
  • 输出与下一个隐藏状态:在GRU中输出与下一时刻的隐藏状态是一个值,使用以往门控按位乘以上个时刻的隐藏状态,并且按位加候选向量乘以更新门控(记忆,不用1去减),即

八 参考资料

  • http://colah.github.io/posts/2015-08-Understanding-LSTMs/
  • https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21
  • http://arxiv.org/pdf/1406.1078v3.pdf

九 番外篇

个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。 框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。 业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。 个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:baokun06@163.com

十 公众号导读

自己撰写博客已经很长一段时间了,由于个人涉猎的技术领域比较多,所以对高并发与高性能、分布式、传统机器学习算法与框架、深度学习算法与框架、密码安全、隐私计算、联邦学习、大数据等都有涉及。主导过多个大项目包括零售的联邦学习,社区做过多次分享,另外自己坚持写原创博客,多篇文章有过万的阅读。公众号秃顶的码农大家可以按照话题进行连续阅读,里面的章节我都做过按照学习路线的排序,话题就是公众号里面下面的标红的这个,大家点击去就可以看本话题下的多篇文章了,比如下图(话题分为:一、隐私计算 二、联邦学习 三、机器学习框架 四、机器学习算法 五、高性能计算 六、广告算法 七、程序人生),知乎号同理关注专利即可。

一切有为法,如梦幻泡影,如露亦如电,应作如是观。

分类:

后端

标签:

后端

作者介绍

杜宝坤
V1