zoukankan      html  css  js  c++  java
  • NMT 机器翻译

    本文近期学习NMT相关知识,学习大佬资料,汇总便于后期复习用,有问题,欢迎斧正。

    目录

      RNN

      Seq2Seq

      Attention 

      Seq2Seq + Attention

      Transformer

      Transformer-xl

    1. RNN

    根据输出和输入序列不同数量rnn可以有多种不同的结构,不同结构自然就有不同的引用场合。如下图,

    one to one 结构,仅仅只是简单的给一个输入得到一个输出,此处并未体现序列的特征,例如图像分类场景。
    one to many 结构,给一个输入得到一系列输出,这种结构可用于生产图片描述的场景。
    many to one 结构,给一系列输入得到一个输出,这种结构可用于文本情感分析,对一些列的文本输入进行分类,看是消极还是积极情感。
    many to many 结构,给一些列输入得到一系列输出,这种结构可用于翻译或聊天对话场景,对输入的文本转换成另外一些列文本。
    同步 many to many 结构,它是经典的rnn结构,前一输入的状态会带到下一个状态中,而且每个输入都会对应一个输出,我们最熟悉的就是用于字符预测了,同样也可以用于视频分类,对视频的帧打标签。

    2. Seq2Seq

      在 many to many 的两种模型中,上图可以看到第四和第五种是有差异的,经典的rnn结构的输入和输出序列必须要是等长,它的应用场景也比较有限。而第四种它可以是输入和输出序列不等长,这种模型便是seq2seq模型,即Sequence to Sequence。

      它实现了从一个序列到另外一个序列的转换,输入序列和输出序列不等长。比如google曾用seq2seq模型加attention模型来实现了翻译功能,类似的还可以实现聊天机器人对话模型。经典的rnn模型固定了输入序列和输出序列的大小,而seq2seq模型则突破了该限制。

    这里写图片描述

    这里写图片描述

      其实对于seq2seq的decoder,它在训练阶段和预测阶段对rnn的输出的处理可能是不一样的,比如在训练阶段可能对rnn的输出不处理,直接用target的序列作为下时刻的输入,如上图一。而预测阶段会将rnn的输出当成是下一时刻的输入,因为此时已经没有target序列可以作为输入了,如上图二。

    encoder-decoder结构

      seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。

      encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。

    这里写图片描述

      Decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的rnn中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。
    这里写图片描述

      decoder处理方式还有另外一种,就是语义向量C参与了序列所有时刻的运算,如下图,上一时刻的输出仍然作为当前时刻的输入,但语义向量C会参与所有时刻的运算。

    这里写图片描述

    优点:能够解决输入输出语句定长问题

    缺点:

    当输入序列非常长时,模型难以学到合理的向量表示
    序列输入时,随着序列的不断增长,原始根据时间步的方式的表现越来越差,这是由于原始的这种时间步模型设计的结构有缺陷,即所有的上下文输入信息都被限制到固定长度,整个模型的能力都同样收到限制,我们暂且把这种原始的模型称为简单的编解码器模型。
    编解码器的结构无法解释,也就导致了其无法设计。

    长输入序列带来的问题:
    使用传统编码器-解码器的RNN模型先用一些LSTM单元来对输入序列进行学习,编码为固定长度的向量表示;然后再用一些LSTM单元来读取这种向量表示并解码为输出序列。
    采用这种结构的模型在许多比较难的序列预测问题(如文本翻译)上都取得了最好的结果,因此迅速成为了目前的主流方法。
    这种结构在很多其他的领域上也取得了不错的结果。然而,它存在一个问题在于:输入序列不论长短都会被编码成一个固定长度的向量表示,而解码则受限于该固定长度的向量表示。

    这个问题限制了模型的性能,尤其是当输入序列比较长时,模型的性能会变得很差(在文本翻译任务上表现为待翻译的原始文本长度过长时翻译质量较差)。

    “一个潜在的问题是,采用编码器-解码器结构的神经网络模型需要将输入序列中的必要信息表示为一个固定长度的向量,而当输入序列很长时则难以保留全部的必要信息(因为太多),尤其是当输入序列的长度比训练数据集中的更长时。”

    3. Attention

    参考大佬博客《深度学习中 的 Attention机制

    当我们人在看一样东西的时候,我们当前时刻关注的一定是我们当前正在看的这样东西的某一地方,换句话说,当我们目光移到别处时,注意力随着目光的移动也在转移。
    这意味着,当人们注意到某个目标或某个场景时,该目标内部以及该场景内每一处空间位置上的注意力分布是不一样的。
    这一点在如下情形下同样成立:当我们试图描述一件事情,我们当前时刻说到的单词和句子和正在描述的该事情的对应某个片段最先关,而其他部分随着描述的进行,相关性也在不断地改变。

    从上面两种情形来看,对于 Attention的作用角度出发,我们就可以从两个角度来分类 Attention种类:
    空间注意力 Spatial Attention
    时间注意力 Temporal Attention
    这样的分类更多的是从应用层面上,而从 Attention的作用方法上,可以将其分为 Soft Attention 和 Hard Attention,这既我们所说的, Attention输出的向量分布是一种one-hot的独热分布还是soft的软分布,这直接影响对于上下文信息的选择作用。

    注意力机制即 Attention mechanism在序列学习任务上具有巨大的提升作用,在编解码器框架内,通过在编码段加入Attention模型,对源数据序列进行数据加权变换,或者在解码端引入Attention 模型,对目标数据进行加权变化,可以有效提高序列对序列的自然方式下的系统表现。

    Attention机制的基本思想是:打破了传统编码器-解码器结构在编解码时都依赖于内部一个固定长度向量的限制。
    Attention机制的实现是 通过保留LSTM编码器对输入序列的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时将输出序列与之进行关联。

    换一个角度而言,输出序列中的每一项的生成概率取决于在输入序列中选择了哪些项。

    Attention-based Model 其实就是一个相似性的度量,当前的输入与目标状态约相似,那么在当前的输入的权重就会越大。就是在原有的model上加入了Attention的思想。

    没有attention机制的encoder-decoder结构通常把encoder的最后一个状态作为decoder的 输入(可能作为初始化,也可能作为每一时刻的输入),但是encoder的state毕竟是有限的,存储不了太多的信息,对于decoder过程,每一个步骤都和之前的输入都没有关系了,只与这个传入的state有关。attention机制的引入之后,decoder根据时刻的不同,让每一时刻的输入都有所不同。

      采用传统编码器-解码器结构的LSTM/RNN模型存在一个问题:不论输入长短都将其编码成一个固定长度的向量表示,这使模型对于长输入序列的学习效果很差(解码效果很差)。而attention机制则克服了上述问题,原理是在模型输出时会选择性地专注考虑输入中的对应相关的信息。使用attention机制的方法被广泛应用在各种序列预测任务上,包括文本翻译、语音识别等。

    Attention-based Model 

    Attention-based Model其实就是一个相似性的度量,当前的输入与目标状态越相似,那么在当前的输入的权重就会越大,说明当前的输出越依赖于当前的输入。严格来说,Attention并算不上是一种新的model,而仅仅是在以往的模型中加入attention的思想,所以Attention-based Model或者Attention Mechanism是比较合理的叫法,而非Attention Model。
    参考博客 浅谈Attention-based Model【原理篇】,对Attention的公式梳理一下。

      对于“match”, 理论上任何可以计算两个向量的相似度都可以,比如:

    余弦相似度
    一个简单的 神经网络,输入为hh和ww,输出为αα
    或者矩阵变换α=hTWzα=hTWz (Multiplicative attention,Luong et al., 2015)

    4. seq2seq + Attention

    学习大佬博客《图解Seq2Seq Attention模型

    5. Transformer

    参考文章:《图解Transformer》https://jalammar.github.io/illustrated-transformer/

    论文地址

      self-attention:

    当模型处理单词的时候,self attention层可以通过当前单词去查看其输入序列中的其他单词,以此来寻找编码这个单词更好的线索。更容易捕获长距离依赖信息。

      Multi-headed:

    1. 它拓展了模型关注不同位置的能力。

    2.它为attention层提供了多个“representation subspaces”。

     6. Transformer-xl

      解决transformer的长距离依赖问题,一是在Transformer中引入重用机制,二是使用相对位置编码。

    重用机制

    为了突破使用固定长度片段带来的语境限制,这篇论文在Transformer体系结构中引入了重复机制。

    在训练期间,为模型处理下一个新的片段时,会缓存前一个片段计算的隐藏状态序列,并作为扩展语境重用,如下图中所示。

    虽然梯度仍然保留在一个片段内,但这个额外的输入,允许网络利用历史信息,从而能够对长期依赖建模,并避免场景碎片。

    除了这些好处之外,重复机制还能够加快评估速度。在评估期间,可以重复使用来自先前片段的表征,而不是像Vanilla模型从头开始。

    在针对enwiki8数据集的实验中,Transformer-XL在评估过程中比Vanilla模型快1800倍。

    相对位置编码

    但是,想要重用隐藏状态,还需要解决一个关键的技术挑战:重用状态时,如何保持位置信息的一致性?

    在标准的Transformer中,序列顺序的信息,都是由一组位置编码提供,每一个位置都有绝对的位置信息。但将这个逻辑应用到重用机制中时,会导致性能损失。

    这个问题的解决思路是,对隐藏状态中的相对位置信息进行编码。从概念上讲,位置编码为模型提供了关于应如何收集信息的时间线索,即应该在哪里介入处理。

    以相对的方式定义时间线索,将相同的信息注入每层的注意分数,更加直观,也更通用。

    基于这个思路,可以创建一组相对位置编码,使得重用机制变得可行,也不会丢失任何的时间信息。

    将相对位置嵌入Transformer之中,并配合重用机制,就得到了Transformer-XL的架构。

    基于这些改进,Transformer-XL在相关的数据集上都取得了很好的成绩。论文中表示,这是第一个在字符级和单词级建模方面比RNN结果更好的自注意力模型。

     参考博客:量子位

  • 相关阅读:
    VS2005中Ajax控件作用说明
    DevExpress 2.0 GridControl 使用方法
    主机信息
    sql2005中运用一条sql语句完成数据导出到Excel中
    跟我学做c#皮肤美化
    (转)QT事件传递与事件过滤器
    (转)主成分分析(Principal components analysis)最大方差解释
    这是填充首页的
    (转)C++中extern “C”含义深层探索
    (转)如何配置Qt使用VS2010进行开发
  • 原文地址:https://www.cnblogs.com/missidiot/p/10560539.html
Copyright © 2011-2022 走看看