完全图解RNN、RNN变体、Seq2Seq、Attention机制
本篇文章8671字,读完约22分钟
雷锋。(公开号码:雷锋。艾科技评论出版社:本文作者何致远,最初发表在智湖的《艾洞察》栏目,艾科技评论由他授权出版。
本文以图片的形式详细介绍了经典rnn、rnn的几个重要变体、seq2seq模型和注意机制。我希望这篇文章能提供一个新的视角,帮助初学者更好地开始。首先,谈谈单层网络。在学习rnn之前,我们必须首先了解最基本的单层网络。其结构如下:
img src= quot;getimg.jrj/images/2017/09/leiphone/one_20170901181741166.jpg quot; data-rawwidth= quot;1500 quot; data-rawheight= quot;900 quot; >
输入是x,经过变换wx+b和激活函数f得到输出y。相信大家对这个已经非常熟悉了。img src= quot。geting . jrj/images/2017/09/leiphone/one _ 20170901181741166 . jpg quot。data-rawwidth= quot。1500 quot。数据-rawheight= quot。900 quot。>输入为x,输出y通过转换wx+b并激活函数F获得..我相信每个人对此都已经非常熟悉了。
第二,经典的rnn结构(n vs n)在实际应用中,我们也会遇到大量的顺序数据:
img src= quot;getimg.jrj/images/2017/09/leiphone/one_20170901181743167.jpg quot; data-rawwidth= quot;1690 quot; data-rawheight= quot;300 quot; >
如:img src= quot。geting . jrj/images/2017/09/leiphone/one _ 20170901181743167 . jpg quot。data-rawwidth= quot。1690 quot。数据-rawheight= quot。300 quot。>例如:
自然语言处理问题。X1可以看作第一个单词,x2可以看作第二个单词,依此类推。
语音处理。此时,x1,x2,x3,...是每帧的音频信号。
时间序列问题。例如,每日股票价格等等
序列数据不易被原始神经网络处理。为了对序列问题建模,rnn引入了h(隐藏状态)的概念,它可以从序列数据中提取特征,然后将其转换为输出。从h1的计算开始:
img src= quot;getimg.jrj/images/2017/09/leiphone/one_20170901181739165.jpg quot; data-rawwidth= quot;2856 quot; data-rawheight= quot;1110 quot; >
图示中记号的含义是:img src= quot。geting . jrj/images/2017/09/leiphone/one _ 20170901181739165 . jpg quot。data-rawwidth= quot。2856 quot。数据-rawheight= quot。1110 quot。>插图中标记的含义是:
圆形或正方形代表向量。
箭头表示向量的变换。如上所示,h0和x1由箭头连接,这意味着h0和x1被转换一次。
类似的标记会出现在许多论文中,这在开始时很容易混淆,但是如果你掌握了以上两点,你就可以很容易地理解图表背后的含义。
H2的计算类似于h1。应该注意的是,在每个步骤中使用的参数u、w和b是相同的,也就是说,每个步骤的参数是共享的,这是rnn的一个重要特性,必须记住。
img src= quot;getimg.jrj/images/2017/09/leiphone/one_20170901181736787.jpg quot; data-rawwidth= quot;3320 quot; data-rawheight= quot;1110 quot; >
依次计算剩下来的(使用相同的参数u、w、b):img src= quot。geting . jrj/images/2017/09/leiphone/one _ 20170901181736787 . jpg quot。data-rawwidth= quot。3320 quot。数据-rawheight= quot。1110 quot。>依次计算其余部分(使用相同的参数u、w和b):
img src= quot;static.leiphone/uploads/new/article/pic/201709/925af75ac634683dec3ee98325c143c6.jpg quot; data-rawwidth= quot;2310 quot; data-rawheight= quot;1110 quot; >
我们这里为了方便起见,只画出序列长度为4的情况,实际上,这个计算过程可以无限地持续下去。img src= quot。static . leiphone/uploads/new/article/pic/201709/925 af 75 AC 634683 dec 3 ee 98325 c 143 c 6 . jpg quot。data-rawwidth= quot。2310 quot。数据-rawheight= quot。1110 quot。为了方便起见,我们只画序列长度为4的情况。事实上,这个计算过程可以无限期地继续下去。
我们当前的rnn尚未输出,因此获取输出值的方法是直接通过h:
img src= quot;static.leiphone/uploads/new/article/pic/201709/bfecc419973239bbb4ad11a041377165.jpg quot; data-rawwidth= quot;2740 quot; data-rawheight= quot;1810 quot; >
正如之前所说,一个箭头就表示对对应的向量做一次类似于f(wx+b)的变换,这里的这个箭头就表示对h1进行一次变换,得到输出y1。img src= quot。static . leiphone/uploads/new/article/pic/201709/bfec 419973239 bbb4 ad 11 a 041377165 . jpg quot。data-rawwidth= quot。2740 quot。数据-rawheight= quot。1810 quot。如前所述,箭头表示对相应的向量f(wx+b)进行一次变换,此处的箭头表示对h1进行一次变换以获得输出y1。
其余的输出类似地进行(使用与y1相同的参数v和c):
img src= quot;static.leiphone/uploads/new/article/pic/201709/10d51ec9e8a62caf0e3edcfaced4aae9.jpg quot; data-rawwidth= quot;2310 quot; data-rawheight= quot;1820 quot; >
ok!大功告成!这就是最经典的rnn结构,我们像搭积木一样把它搭好了。它的输入是x1, x2, .....xn,输出为y1, y2, ...yn,也就是说,输入和输出序列必须要是等长的。img src= quot。static . leiphone/uploads/new/article/pic/201709/10d 51 EC 9 E8 a 62 caf 0 E3 edcfaced 4a AE 9 . jpg quot。data-rawwidth= quot。2310 quot。数据-rawheight= quot。1820 quot。>好的!你完了!这是最经典的rnn结构,我们像构建模块一样设置它。它的输入是x1,x2,.....xn,并且它的输出是y1,y2,...yn,这意味着输入和输出序列的长度必须相等。
由于这种限制,经典rnn的应用范围相对较小,但也存在一些适合用经典rnn结构建模的问题,如:
计算视频中每个帧的分类标签。因为每一帧都经过计算,所以输入和输出序列长度相等。
输入是一个字符,输出是下一个字符的概率。这是著名的char rnn(请参考:递归神经网络的不合理的有效性,地址:karpathy.github.io/2015/05/21/rnn-effectiveness/. Char rnn可以用来生成文章,诗歌,甚至代码,这是非常有趣的。
第三,n对1有时,我们必须处理的问题是,输入是一个序列,输出是一个单一的值,而不是一个序列。我们应该如何建模?事实上,我们只能转换最后h:
img src= quot;static.leiphone/uploads/new/article/pic/201709/ef46d1946129b206178f912a43f20ef0.jpg quot; data-rawwidth= quot;2310 quot; data-rawheight= quot;1770 quot; >
这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。img src= quot。static . leiphone/uploads/new/article/pic/201709/ef 46d 1946129 b 206178 f 912 a 43 f 20 ef 0 . jpg quot。data-rawwidth= quot。2310 quot。数据-rawheight= quot。1770 quot。>这种结构通常用于处理序列分类的问题。例如,输入文本判断其类别,输入句子判断其情感倾向,输入视频判断其类别,等等。
4.如果1对n的输入不是一个序列,而输出是一个序列,我该怎么办?我们只能在序列开始时计算输入:
img src= quot;static.leiphone/uploads/new/article/pic/201709/51981bde3476599528c9d116d89e4765.jpg quot; data-rawwidth= quot;2300 quot; data-rawheight= quot;1800 quot; >
还有一种结构是把输入信息x作为每个阶段的输入:img src= quot。static . leiphone/uploads/new/article/pic/201709/51981 bde 3476599528 c 9d 116d 89 e 4765 . jpg quot。data-rawwidth= quot。2300 quot。数据-rawheight= quot。1800 quot。>还有一种结构,将输入信息x作为每个阶段的输入:
img src= quot;static.leiphone/uploads/new/article/pic/201709/a55bf68ba0e06cbc733343112a924d7a.jpg quot; data-rawwidth= quot;2310 quot; data-rawheight= quot;1800 quot; >
下图省略了一些x的圆圈,是一个等价表示:img src= quot。static . leiphone/uploads/new/article/pic/201709/a55 BF 68 ba 0e 06 CBC 733343112 a 924d 7a . jpg quot。data-rawwidth= quot。2310 quot。数据-rawheight= quot。1800 quot。下图省略了一些x圆,这是一个等效的表示:
img src= quot;static.leiphone/uploads/new/article/pic/201709/eea1fe2434983a3442ee3b817ddb8712.jpg quot; data-rawwidth= quot;2300 quot; data-rawheight= quot;1990 quot; >
这种1 vs n的结构可以处理的问题有:img src= quot。static . leiphone/uploads/new/article/pic/201709/eea1 Fe 2434983 a 3442 ee3b 817 DDB 8712 . jpg quot。data-rawwidth= quot。2300 quot。数据-rawheight= quot。1990 quot。>这种1 vs n结构可以处理以下问题:
当从图像生成图像字幕时,输入X是图像的特征,输出Y序列是句子
根据类别等生成语音或音乐。
V.接下来,我们将介绍rnn: N VS M最重要的变体之一。这种结构也称为编码器-解码器模型,也可以称为seq2seq模型。
最初的n vs n rnn要求序列长度相等,但是我们遇到的大多数问题长度都不相等。例如,在机器翻译中,源语言和目标语言的句子通常长度不同。
因此,编码器-解码器结构首先将输入数据编码成上下文向量c:
有很多方法可以得到c,最简单的方法是把编码器的最后一个隐藏状态分配给c,或者把最后一个隐藏状态转换成c,或者转换所有的隐藏状态。
在得到C后,它被另一个rnn网络解码,这就是所谓的解码器。具体方法是将C作为前一初始状态h0输入解码器:
img src= quot;static.leiphone/uploads/new/article/pic/201709/56a82e7ca5e86ac86175e2c5ba9d896d.jpg quot; data-rawwidth= quot;4510 quot; data-rawheight= quot;1810 quot; >
还有一种做法是将c当做每一步的输入:img src= quot。static . leiphone/uploads/new/article/pic/201709/56 a 82 e 7 ca 5e 86 AC 86175 e2c 5b a9 d 896d . jpg quot。data-rawwidth= quot。4510 quot。数据-rawheight= quot。1810 quot。>另一种方法是使用c作为每个步骤的输入:
img src= quot;static.leiphone/uploads/new/article/pic/201709/ea5150149ff96e93aa20ffc29895e9fa.jpg quot; data-rawwidth= quot;4560 quot; data-rawheight= quot;2520 quot; >
由于这种encoder-decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:img src= quot。static . leiphone/uploads/new/article/pic/201709/ea 5150149 ff 96 e 93 aa 20 ffc 29895 e 9 fa . jpg quot。data-rawwidth= quot。4560 quot。数据-rawheight= quot。2520 quot。>因为这种编码器-解码器结构不限制输入和输出的序列长度,所以它被广泛使用,例如:
机器翻译。编码器-解码器最经典的应用,事实上,这种结构首先是在机器翻译领域提出的
文本摘要。输入是文本序列,输出是文本序列的概要序列。
阅读理解。将输入的文章和问题分别编码,然后解码得到问题的答案。
语音识别。输入是语音信号序列,输出是字符序列。
………
六.注意机制在编码器-解码器结构中,编码器将所有输入序列编码成一个统一的语义特征,然后解码。因此,C必须包含原始序列中的所有信息,其长度成为限制模型性能的瓶颈。比如机器翻译,当要翻译的句子很长的时候,一个C可能存储不了那么多的信息,这将导致翻译准确率的下降。
注意力机制通过每次输入不同的c来解决这个问题。下图显示了带有注意机制的解码器:
img src= quot;static.leiphone/uploads/new/article/pic/201709/63269dadd354f4ddb911defc9222b142.jpg quot; data-rawwidth= quot;1830 quot; data-rawheight= quot;1920 quot; >
每一个c会自动去选取与当前所要输出的y最合适的上下文信息。具体来说,我们用 衡量encoder中第j阶段的hj和解码时第i阶段的相关性,最终decoder中第i阶段的输入的上下文信息 就来自于所有 对 的加权和。img src= quot。static . leiphone/uploads/new/article/pic/201709/63269 dadd 354 F4 DDB 911 defc 9222 b 142 . jpg quot。data-rawwidth= quot。1830 quot。数据-rawheight= quot。1920 quot。>每个c将自动为y选择最合适的上下文信息来输出。具体来说,我们在编码器的j级和解码的I级测量hj之间的相关性。最后,解码器第一级输入的上下文信息来自所有对的加权和。
以机器翻译为例(汉译英):
输入序列为“我爱中国”,因此编码器中的h1、h2、h3和h4可分别视为“我”、“爱”、“中国”和“国家”所代表的信息。当翻译成英语时,第一个语境c1应该与单词“我”最相关,因此相应的语境相对较大,而相应的语境C1相对较小。C2应该与“爱”关系最密切,所以相应的价值相对较大。最后一个c3与h3和h4最相关,因此的值相对较大。
在这一点上,关于注意力模型,我们只剩下最后一个问题,那就是,这些联合执行活动的权重是如何来的?
事实上,aij也是从模型中学习到的,它实际上与解码器i-1级的隐藏状态和编码器J级的隐藏状态有关。
还以上述机器翻译为例,计算a1j(此时,箭头同时表示h和的变换):
a2j的计算:
img src= quot;static.leiphone/uploads/new/article/pic/201709/ca85745b4408ee37228e36ee1aa0f99c.jpg quot; data-rawwidth= quot;2320 quot; data-rawheight= quot;2070 quot; >
a3j的计算:img src= quot。static . leiphone/uploads/new/article/pic/201709/ca 85745 b 4408 ee 37228 e 36 ee 1a 0 f 99 c . jpg quot。data-rawwidth= quot。2320 quot。数据-rawheight= quot。2070 quot。> a3j计算:
img src= quot;static.leiphone/uploads/new/article/pic/201709/7b09ab3ba057357524d8e251ffc4b2ae.jpg quot; data-rawwidth= quot;2340 quot; data-rawheight= quot;2070 quot; >
以上就是带有attention的encoder-decoder模型计算的全过程。img src= quot。static . leiphone/uploads/new/article/pic/201709/7b 09 ab 3 ba 057357524 D8 e 251 ffc4 B2 AE . jpg quot。data-rawwidth= quot。2340 quot。数据-rawheight= quot。2070 quot。>以上是值得注意的编解码模型计算的全过程。
七.本文主要讨论四种经典的rnn模型,n对n,n对1,1对n,n对m,以及如何使用注意结构。我希望这对每个人都有帮助。
一些朋友可能会发现没有lstm内容。事实上,从外部来看,lstm与rnn完全相同,因此上述所有结构都是lstm所共有的。如果你想知道lstm的内部结构,你可以参考这篇文章:了解lstm网络(地址:colah . github . io/post/2015-08-understance-lstms/),这篇文章写得很好,建议阅读。
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
标题:完全图解RNN、RNN变体、Seq2Seq、Attention机制
地址:http://www.6st8.com/zbxw/4366.html
免责声明:联合早报中文网从世界各个维度报道世界经济新闻,时政新闻,突发新闻等,本篇的部分内容来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2018@163.com,联合早报中文网的小编将予以删除。