关于序列建模,是时候抛弃RNN和LSTM了

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

作者表示:我们已经陷入 RNN、LSTM 和它们变体的坑中很多年,是时候抛弃它们了!


在 2014 年,RNN 和 LSTM 起死回生。我们都读过 Colah 的博客《Understanding LSTM Networks》和 Karpathy 的对 RNN 的颂歌《The Unreasonable Effectiveness of Recurrent Neural Networks》。但当时我们都「too young too simple」。现在,序列变换(seq2seq)才是求解序列学习的真正答案,序列变换还在语音到文本理解的任务中取得了优越的成果,并提升了 Siri、Cortana、谷歌语音助理和 Alexa 的性能。此外还有机器翻译,现在机器翻译已经能将文本翻译为多种语言。在图像到文本、文本到图像的变换以及视频文字说明的应用中,序列变换也是卓有成效。


在 2015-2016 年间,出现了 ResNet 和 Attention 模型。从而我们知道,LSTM 不过是一项巧妙的「搭桥术」。并且注意力模型表明 MLP 网络可以被「通过上下文向量对网络影响求平均」替换。下文中会继续讨论这一点。


经过两年多的时间,我们终于可以说:「放弃你的 RNN 和 LSTM 路线吧!」


我们能看到基于注意力的模型已越来越多地被用于谷歌、Facebook 和 Salesforce 的 AI 研究。它们都经历了将 RNN 模型和其变体用基于注意力的模型替换的过程,而这才刚刚开始。RNN 模型曾经是很多应用的构建基础,但相比基于注意力的模型,它们需要更多的资源来训练和运行。(参见:https://towardsdatascience.com/memory-attention-sequences-37456d271992)


为什么?


RNN、LSTM 和其变体主要对时序数据进行序列处理。如下图中的水平箭头部分:


640?wx_fmt=png

RNN 中的序列处理过程,来自《Understanding LSTM Networks》


这些箭头表明,在长期信息访问当前处理单元之前,需要按顺序地通过所有之前的单元。这意味着它很容易遭遇梯度消失问题。


为此,人们开发了 LSTM 模型,LSTM 可以视为多个转换门的合并。ResNet 也借鉴于这种结构,它可以绕过某些单元从而记忆更长时间步的信息。因此,LSTM 在某种程度上可以克服梯度消失问题。

640?wx_fmt=png

LSTM 中的序列处理过程,来自《Understanding LSTM Networks》


但这并不能完全解决该问题,如上图所示。LSTM 中仍然存在按顺序地从过去单元到当前单元的序列路径。实际上,现在这些路径甚至变得更加复杂,因为路径上还连接了加如记忆的分支和遗忘记忆的分支。毫无疑问,LSTM、GRU 和其变体能学习大量的长期信息(参见《The Unreasonable Effectiveness of Recurrent Neural Networks》),但它们最多只能记住约 100s 的长期信息,而不是 1000s 或 10000s 等。


并且,RNN 的一大问题是它们非常消耗计算资源。即如果需要快速训练 RNN,需要大量的硬件资源。在云端上运行这些模型的成本也很高,随着语音到文本的应用需求快速增长,云计算资源目前甚至赶不上它的需求。


解决方案是什么?


如果序列处理无可避免,那么我们最好能找到可向前预测和向后回顾的计算单元,因为我们处理的大多数实时因果数据只知道过去的状态并期望影响未来的决策。这和在翻译语句或分析录制视频时并不一样,因为我们会利用所有数据并在输入上推理多次。这种向前预测和后向回顾的单元就是神经注意力模块,下面将简要介绍这一点。


为了结合多个神经注意力模块,我们可以使用下图所示的层级神经注意力编码器:


640?wx_fmt=png

层级神经注意力编码器


观察过去信息的更好方式是使用注意力模块将过去编码向量汇总到上下文向量 C_t。请注意上面有一个层级注意力模块,它和层级神经网络非常相似。


在层级神经注意力编码器中,多层注意力可查看过去信息的一小部分,例如 100 个向量,而上面层级的注意力模块能查看到 100 个下层的注意力模块,也就是 100×100 个向量。即利用层级模块可极大地扩展注意力机制观察的范围。


这就是一种能回顾更多的历史信息并预测未来的方法。


这种架构类似于神经图灵机,但令神经网络通过注意力决定从记忆中需要读取什么。这意味着一个实际的神经网络将决定过去的哪个向量对未来的决策更重要。


但记忆的储存呢?与神经图灵机不同,上面的架构将会把所有的历史表征储存在记忆中。这可能是不高效的,若储存视频中每一帧的表征,而大多数情况下表征向量并不会一帧帧地改变,所以这导致储存了太多的相同信息。我们确实可以添加另一个单元来防止储存相关数据,例如不储存与之前太相似的向量。但这只是一种技巧,更好的方法可能是让架构自己判断哪些向量需要储存,而哪些不需要。这一问题也是当前研究领域的重点,我们可以期待更多有意思的发现。


所以,最后总结来说:忘了 RNN 和它的变体吧,你仅需要的是注意力机制模块。


目前我们发现很多公司仍然使用 RNN/LSTM 作为自然语言处理和语音识别等架构,他们仍没有意识到这些网络是如此低效和不可扩展。例如在 RNN 的训练中,它们因为需要很大的内存带宽而很难训练,这对于硬件设计很不友好。本质上来说,递归是不可并行的,因此也限制了 GPU 等对并行计算的加速。


简单来说,每个 LSTM 单元需要四个仿射变换,且每一个时间步都需要运行一次,这样的仿射变换会要求非常多的内存带宽,因此实际上我们不能用很多计算单元的原因,就是因为系统没有足够的内存带宽来传输计算。这对于模型的训练,尤其是系统调参是非常大的限制,因此现在很多工业界应用都转向了 CNN 或注意力机制。


论文:Attention Is All You Need


640?wx_fmt=png


论文链接:https://arxiv.org/abs/1706.03762

作者:Eugenio Culurciello

编译:刘晓坤、思源

文章版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。

640?wx_fmt=png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何运用并行编程Parallel提升任务执行效率

本文来自小易,【DoTNET技术圈】公众号已获得转载授权。《.NET并发变成实战》读后感:并行编程Parallel手打目录:一、前言二、任务并行库(TPL)的介绍三、Parallel.Invoke的使用四、Parallel.For的使用五、Parallel.ForEa…

通过 GitHub Actions 自动创建 Github Release

通过 GitHub Actions 自动创建 Github ReleaseIntro在 GitHub 上维护了几个小的开源项目,每次在发布新版本的时候会创建一个 release,这样可以比较方便的找到对应的版本的代码,不需要再人肉的从 git log 中找到指定的 commit,而且…

利用win7的applocker功能来有组织的阻止相关软件运行

我有4年没用360相关的软件了,没有360的弹窗用电脑就是舒服。但是我的电脑有时候会有别人来用,我的同学或者我的父母。但是他们经常会自作主张地在我的电脑上装上360卫士,还有360浏览器。每次都是装了我再删,反反复复也不是办法。后…

人工智能会让工作环境变得更公平,还是更压抑?

人工智改变的不仅仅是工作内容……人工智能(AI)正在踏足商业领域。正如我们本周的特别报道所诠释到的那样,所有类型的公司都在利用人工智能来预测需求,雇佣员工和对付客户。2017年,企业在与人工智能相关的并购交易中支…

离开时请告诉自己生意就是生意

离开时请告诉自己生意就是生意 离职或者被离职,是职场中很常见的事情,每天这个星球上不知道要发生多少次,不管你经历过与否、体会到其中的滋味与否,他都会一直存在着!当这一切发生时,不管你是获利者还是受害…

如何假装成一名好程序员?

最近我对一位资深程序员就工作生活问题进行了深度采访,采访内容如下:Q:请问你工作多久了?A:5年了Q:你觉得,程序员这份工作对你有什么影响吗?A:有Q:那你的生活…

c语言 gbk字模点阵数组,GBK点阵显示字库的制作和使用

GBK编码共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。以两个字节表示一个汉字,编码范围是0x8140~0xfefe,兼容GB2318,并覆盖了unicode中的所有汉字。Win7记事本默认以GBK保存汉字。开发环境…

云服务器下行_腾讯云轻量应用服务器简单测评

这台机器的配置是1核心1G内存3M带宽,一直在吃灰,到现在才想起来应该测评一下腾讯云活动推荐​cloud.tencent.com测评机器概况从图中可以看到这台机器CPU采用 AMD EPYC 7K62 48-Core Processor 主频2.60GhzI/O大致129.3MB/S 用来建站是没问题的。3Mbps上行带宽跑满,下…

这是我见过的最全的训练数据集,没有之一!

从大学毕业起,小编就开始收集各类数据集,经过近几年的积累和沉淀,小编收集整理了32套数据集,内容涵盖“自动驾驶”、“人脸识别”、“世界杯”、“股票数据”、“基因组数据”、“全球各大社交媒体数据”等。现在,小编…

运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)

前言上一篇简单介绍了Consul,并使用开发模式(dev)进行流程演示,但在实际开发中需要考虑Consul的高可用和操作安全性,所以接着来聊聊集群和ACL的相关配置,涉及到的命令会在环境搭建过程中详细介绍。正文关于…

c语言判断x的个位数是否为5,用C语言编程从键盘输入一个正整数,判断其个位数是否为5,若是5则输出“yes”,否则输出“no”...

#include int main(){int five;printf("输入一个整数:");scanf("%d",&five);while(five>10){five five%10;}if(five 5)printf("yes");elseprintf("no");return 0;}扩展资料:“模”是“Mod”的音译,模运…

从基础概念到数学公式,这是一份520页的机器学习笔记(图文并茂)

导读:近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 520 页的学习教程(英文版),详细、明了地介绍了机器学习中的相关概念、数学知识和各种…

Excel模板导出之动态导出

说明目前Magicodes.IE已支持Excel模板导出时使用JObject、Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程。本功能的想法、部分实现初步源于arik的贡献,这里再次感谢arik!在开始本篇教程之前,我们重温一下模板导出…

简述原型模型的特点_3D打印硅胶复模手板的步骤和特点有哪些

硅胶手板是一种主要用于手板模制作的硅胶制品,手板硅胶主要要求:不缩水、不变形,硬度合适不太复杂的产品使用。硅胶手板经常用硅胶模具来制造为产品快速成型复制提供便利性,产品收缩率可达到千分之二,主要用于手板模型…

快速成长为数据挖掘高手的秘诀

随着大数据时代的到来,数据挖掘的重要性越发显著。所谓数据挖掘,一般是指从大型数据库中将隐藏的预测信息抽取出来的过程,而更为精确的解释就是“从数据中挖掘知识”。目前而言,数据挖掘大致分为四个层次:纯粹数据加工…

ASP.NET Core 基于角色的 JWT 令牌

原文:https://bit.ly/3vYljq3作者:Rick Strahl翻译:精致码农-王亮声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的。其中可能会去除一些本人实在不知道如何组织但又不影响理解的句子。ASP.NET Core 中…

圆形比例分布图怎么做_解读宝山区2035总体规划:建设用地的比例在上海非中心城区中最高...

《上海市宝山区总体规划暨土地利用总体规划(2017-2035)》已经发布,在宝山区2035总体规划中,一个重要的核心指标成为了亮点,这就是宝山区的建设用地面积为244.3平方公里。宝山区的陆地总面积是301.6平方公里,由此宝山区建设用地面积…

Lanchester战争模型:用可分离变量的微分方程占卜战事

看过国产的战争题材电视剧《亮剑》的各位老铁一定熟悉李云龙集结重兵攻打县城的故事。在故事中,李云龙利用人数上的优势对平安县城进行了围点打援,最后用二营长的意大利炮消灭了城楼上的鬼子官。但是众所周知,抗日时期中国军队的单兵作战能力…

微软软件安装平台

http://www.microsoft.com/web/downloads/platform.aspx 转载于:https://www.cnblogs.com/kkun/archive/2011/03/09/1978039.html

如何在 C# 中使用 yield

yield关键词是在 C# 2.0 中被引入的,我们都知道实现了 IEnumerable 接口的类都可以用于被 foreach 迭代,这是因为 IEnumerable 接口中提供了一个可迭代的 GetEnumerator() 方法,代码定义如下:public interface IEnumerable{IEnume…