CNU小学生:Sequence to Sequence原理,Attension原理,Self-Attenssion原理详细讲解。

       大家好,我是CNU小学生,本文将通俗讲解Sequence2Sequence理论,Soft-Attenssion理论和Self-Attenssioner理论。

基础概念:Sequence to Sequence

       这是一个机器翻译的基本概念。现在我有一句中文:我是首都师范大学的学生。我想把它翻译成英文:I am a student of Capital Normal University. 我要怎么做这个工程呢?

       首先,对中文分词,将词汇向量化表达。分词结果:我 是 首都 师范 大学 的 学生。这7个中文词,我需要用7个向量去表达它(注:相同的词要用相同的向量表达,本例7个中文词均不相同,所以用7个不同向量表达,中文词的向量化表达可以参考word2vect工程)。

       然后,将中文词向量依次代入LSTM,形成一个新的向量。熟悉LSTM的同学都清楚,实际上每一个中文词向量代入到LSTM之后都会产生一个对应的结果向量,但在初级的Sequence to Sequence理论中,我们只保留最后一个中文词向量代入后所产生的向量。将“我 是 首都 师范 大学 的 学生”这7个中文词的词向量依次代入LSTM,产生了7个编码向量,但在这里我们只保留最后一个向量(即“学生”一词代入LSTM后产生的向量)。

       最后,我们将这个新向量(“学生”)多次重复代入另一个LSTM,再通过softmax的方式选择出对应的英文单词序列。根据LSTM的基本原理,每一次代入都会产生一个结果,这次我们保留所有结果。在理想情况下,我们代入向量第一次的时候期望LSTM输出" I " ,第二次重复代入时输出" am ",一直重复代入下去,总共代入9次,我们会得到一个单词序列“I am a student of Capital Normal University”。这个序列由8个单词构成,怎么会代入9次呢? 实际上,第9次代入所输出的结果是一个“停止信号”,类似于“/0”,我们在设计翻译程序时看到网络输出"/0",就代表这句话(这个sequence)的翻译终止。

      补充,在真实的机器翻译工程中,我们会对上面的网络进行改造,例如加致密隐藏层,LSTM叠加,双向LSTM等。

       基础稍微薄弱一点的同学可能会有一些疑问。由于篇幅有限,我只在这里指出搞懂这些问题的知识点。并且,这些问题其实并不影响你的后续阅读。

       1.怎么输出单词?

       你需要了解softmax,onehot编码。

       2.梯度如何传播?

       你需要了解kl散度,LSTM的梯度传播。

 

       下面我们来简述一下原始Sequence to Sequence结构的缺陷。首先我们在解码时荒谬地使用了多次  “学生”  向量,虽说“学生”这个向量在编码时采用的是LSTM,可以“记住”一些前文的信息,但在长句翻译中,这是远远不够的。

进阶模型:Attension

       上面说到原始sequence to sequnce 模型的缺陷就是只用了一个向量来表达全句的意思,而不是编码层的每个输出向量都考虑到,所以会丢失很多信息,在长句翻译中连LSTM都无法弥补。这就催生了Attension模型的诞生。

       Attension模型没有摆脱senquence  to sequence 的架构,输入是词向量序列,输出仍然是词序列。同样保留了编码层和解码层,编码层和原始senquence  to sequence一模一样,将“我 是 首都 师范 大学 的 学生”每个词依次代入LSTM,然后得到7个向量,与传统senquence  to sequence不同的是,我们不止保留“学生”这个词向量,我们保留所有向量。解码部分有一点点复杂,下面我来由浅入深地向大家解释它的原理。(更正:可以将所有词不通过LSTM编码直接带入ATTENSION)

      Attension模型在模仿一个“翻译新手”的翻译方式,这个翻译新手很有意思,因为是新手,所以他的翻译方式很特别:

          步骤1.浏览全文是什么(所有中文词都要看一遍)。

          步骤2.考虑一下我之前写到哪了(翻译到那个单词了)

          步骤3.结合步骤1和步骤2确定我下面该翻译的重点在哪

          步骤4.翻译出下一个单词

       如此循环往复,最终完成翻译。

       让我们来举个例子,我们现在做英译中:There is no Deep Learning without Geoffrey Hinton. 新手翻译开始工作了:

          1. 大声朗读全文 There is no Deep Learning without Geoffrey Hinton.

          2.看看我写到哪了?哦......我一个词还没写呢,这是开头。

          3.There is no Deep Learning without Geoffrey Hinton 这句话开头应该先翻译谁呢?我想了想,应该是without这个词!

          4.写出一个单词 “没有”

          5.大声朗读全文There is no Deep Learning without Geoffrey Hinton.

          6.看看我写到哪了? 我刚才好像写了个 “没有”

          7.There is no Deep Learning without Geoffrey Hinton,我写了个“没有”,后面该翻译那部分呢?应该是Geoffrey Hinton这两个词!

          8.写出一个单词,辛顿大神。结果就是:“没有 辛顿大神”

          9.大声朗读全文 There is no Deep Learning without Geoffrey Hinton.

          10. 看看我写到哪了? 我刚才好像写了个 “没有 辛顿大神”

          11.There is no Deep Learning without Geoffrey Hinton,我写了个“辛顿大神”,后面该翻译那部分呢?应该是 is 这个词!

          12.写出一个单词,“就”。结果就是:“没有 辛顿大神 就”

          13.大声朗读全文 There is no Deep Learning without Geoffrey Hinton.

          14.我翻译到哪了?“没有 辛顿大神 就”!

          15.下一次重点在哪呢?“There is no”这三个单词!

          16.写出一个,“没有”,结果就是“没有 辛顿大神 就 没有”

          17.大声朗读全文There is no Deep Learning without Geoffrey Hinton.

          18.刚才翻译到哪了?“没有 辛顿大神 就 没有”

          19.本次翻译的重点在哪呢?Deep Learning两个词!

          20.写个“深度学习”,结果就是“没有 辛顿大神 就 没有 深度学习”

          再进行一个轮回,翻译出“\0”,此次翻译就结束了。

       为什么要手把手写这么多例子呢?因为就是要让大家看到,1.翻译的时候“新手”可能同时考虑原文中的两个词甚至三四个词 。2.“新手”有时候并不是从原句的头部开始翻译的。3.有些词会被“注意”多次(比如上文的"is")。

       理解了上面的内容,我们就开始写公式了:

       Attension的编码器也是一个LSTM模型,但是在解码器的输入上与传统不同。之前的输入是编码器输出的最后一个向量,这次的输入是将编码器所有的输出向量进行整合运算,形成一个新向量。

       1.“新手”首先阅读了全文,数学过程上,我们先把每个英文单词转化为词向量(one hot 或者Word2vect均可),这些单词经过LSTM的编码,得到了8个编码向量,这就是编码过程。而“新手”阅读的就是这8个编码向量(非原始的one hot 和 Word2vect)

        这些向量我们用h_{1} ~h_{8}来表示这8个编码向量。

       2.“新手”瞟了一眼上一轮翻译出来了什么,在数学过程上,他瞟的是解码部分LSTM的上一次输出的隐层向量

        解码部分LSTM的上一次输出的隐层向量我们用{S_{t-1}}来表示。当然,“新手”马上要翻译出的这个中文单词用{y_{t}}表示,这个{y_{t}}还不知道是什么(是我们所求),我们只知道{S_{t-1}}是什么(已知)。为什么我们要看“解码器的隐层编码”而不是最终输出呢?因为隐层编码带有前面所有输出的信息,而最终输出的那个单词是不带的。

       3."新手"开始思考,把本轮翻译的重点划在哪呢?这个数学过程是一个函数,函数的输入包含了{S_{t-1}}和某个h,我们要看看h_{1} ~h_{8}哪个h是最重要的,所以在这里,我们把它抽象为g({S_{t-1}},h_{j})h_{1} ~h_{8}每个h都通过g({S_{t-1}},h_{j})都算出一个得分,再把这些得分归一化(softmax),我们就知道我们本轮翻译的重点在哪了!决定本轮翻译中点的因素有两个,一个是{S_{t-1}}("新手"上一轮翻译出了什么),一个是{h_{j}}(这些英文单词本身的LSTM编码)。将h_{1} ~h_{8}代入g({S_{t-1}},h_{j}),由此我们得到了8个分数,8个分数和为1,分别对应h_{1} ~h_{8},分数越高代表越重要。把这些分数和h_{1} ~h_{8}对应相乘,然后把相乘结果相加,就得到了本轮翻译中解码网络的输入项量。

        专业一点:

 

                             {e_{tj}}=g(S_{t-1},h_{j})           (计算绝对分值过程)

 

 

                            a_{tj}=\frac{exp({e_{tj}})}{\sum_{k=1}^{k=n}exp({e_{tk}})}       (计算softmax分值)

 

                             c_{t}=\sum_{j=1}^{T_{x}} a_{tj}h_{j}                               (将softmax分值与各自的^{h_{j}}对应相乘,把乘出来的结果全部累加,得到本轮解码网络的输入向量{c_{t}})

          4.向解码LSTM网络中输入向量{c_{t}},得到{S_{t}}(隐层输出向量)和解码输出向量y_{t},将解码输出向量经过全连接网络调整维度,再softmax,得到本轮onehot单词编码,给出翻译结果。因为LSTM的输入是自带上次输出向量{S_{t-1}}和上次隐层向量y_{t-1}的,

所以写公式的话应该是这样:

 

                              {y_{t}}=f(S_{t-1},y_{t-1},c_{t})                                                    (f 是一个LSTM模型或GRU模型)

如果你还是不明白上面这个f是怎么搞的,你可以复习一下LSTM。

当LSTM输出'\0'时,不再计算下一轮{c_{t}},翻译结束。

                                                                        

           5.说到计算绝对得分的公式g({S_{t-1}},h_{j}),大家都看不明白,它的定义是什么呢?这个定义众说纷纭,有的人这样写:

 

             g({S_{t-1}},h_{j})=W_{1}\cdot tanh(W_{2}\cdot{S_{t-1}}+ W_{3}\cdot{h_{j}}+b)                   (各个W为待训练的参数)

      也有的这样写:

             g({S_{t-1}},h_{j})=W_{1}\cdot conjoin({S_{t-1}},h_{j})                                             (conjoin表示把两个向量拼接在一起,W为待训练的参数)

      还有人这样写:

            g({S_{t-1}},h_{j})={S_{t-1}}\cdot h_{j}^{T}                                                                        (转置求內积)

据说,这三个计算分数的公式针对不同的应用场景有不同的效果,但笔者并没有探求过何时采用哪个计算公式更合适。并且还有其他变种写法,在这里不一一展开。

 

 

独特的变种:Self-Attension

           

        Self-Attension的输入仍然是LSTM编码的所有输出。如上图所示,假设我们这次翻译的输入只有2个单词,那么绿x的每一行代表其中的某个单词的编码,且这个单词被LSTM编码后维度大小是4。

        现在看上图的各种W,每个小格子代表一个待训练的参数,每个W矩阵中都有3个列向量构成,将绿x与三个待训练的参数矩阵相乘得到了紫Q,黄K和蓝V。紫Q的第一行带有绿X第一行的信息,紫Q的第二行带有绿X第二行的信息,黄矩阵和蓝矩阵同理。

         由上图,我们得到了3个矩阵,Q,K,V,这是下一步运算的重要输入。

         

        如上图所示,Q矩阵和K矩阵的转置相乘,得到的结果除以Q的列维度的开方(此例为\sqrt{3}),得到一个维度为2x2的矩阵。因为要将这个2x2矩阵的每一行去做softmax运算,在sofmax运算中有求e^{a}这种运算,非常容易把结果搞到百亿级,得到的结果太大,计算机算不出来,所以才将这个2x2的矩阵的所有元素统一除以一个参数后再做softmax,防止溢出。

         经过softmax后,我们得到了一个新的2x2矩阵,这个矩阵的每一行和为1,将这个矩阵与V矩阵相乘,得到结果Z矩阵。

         将Z矩阵的每一行作为{c_{t}}依次输入解码的LSTM中,经过{y_{t}}=f(S_{t-1},y_{t-1},c_{t})运算得到结果。

          细心的同学一定发现了,刚才的个标准的Attension中,我们输入的单词可以是n个,输出可以是m个,输入单词序列的个数不一定等于输出单词序列的个数,只有当解码网络输出'\0'的时候才停止输出。但在Self-Attension模式下,我们是无法做到输入个数和输出个数不相同的,输入和输出的序列长度必须相等。

           所以在真实翻译应用中,我们还是先堆叠几个Self-Attension在接一个原始的Attension,以此实现不同序列长度的翻译需求。或者我们把Attension做的更复杂些...........

          文中或有疏漏,欢迎指正批评。如果各位读者对我的文章还满意的话,一听可乐的钱就可以支持我继续写作,欢迎打赏。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码 大学生课程设计毕业设计项目、系统开发,供计算机等专业同学参考,提供说明材料+源代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值