精华内容
下载资源
问答
  • transformer翻译

    2020-06-01 18:09:13
    https://www.yiyibooks.cn/yiyibooks/Attention_Is_All_You_Need/index.html

    https://www.yiyibooks.cn/yiyibooks/Attention_Is_All_You_Need/index.html

    展开全文
  • transformer 翻译模型

    千次阅读 2019-04-21 23:33:36
    transformer google 出品, 基于 encoder-decoder 架构的 seq2seq 自然语言翻译模型. paper 见参考[1]. 创新之处是弃用 RNN,CNN 这样的结构, 采用 self-attention 与 positional-encoding 来简化结构, 加速训练, 并...

    google 出品, 基于 encoder-decoder 架构的 seq2seq 自然语言翻译模型. paper 见参考[1].
    创新之处是弃用 RNN,CNN 这样的结构, 采用 self-attention 与 positional-encoding 来简化结构, 加速训练, 并提升效果, 取得了 SOTA 成绩.

    BLEU 评测指标

    BLEU, BiLingual Evaluation Understudy , (译作双向语言评估替工) , 一种自动评测机器翻译的方法.
    翻译讲究信达雅, 算是主观题. 之所以采用BLEU评估有两点考虑.

    1. 人力评估成本大.
    2. 便于多个翻译模型之间做对比.

    B L E U ∈ ( 0 , 1 ) BLEU\in (0,1) BLEU(0,1), 越大表示翻译越精准. 基本思想是 预测结果的 n-gram 与 测试数据的 n-gram 作对比, n ∈ { 1 , 2 , 3 } n\in \{1,2,3\} n{1,2,3}. 看命中效果.

    网络结构

    在这里插入图片描述

    self-attention

    source 与 target 是两个sequence, self-attention 是指对同一sequence内, 各个token间的关联做计算.
    论文中把提出的attention 叫 Scaled Dot-Product Attention.
    引入三个共享参数矩阵, Query,Key,Value, 对 embedding 后的token做表达的学习.
    所谓attention, 就是这么一个映射关系, o u t p u t = f ( q u e r y , { k e y _ v a l u e } ) output=f(query, \{key\_value\} ) output=f(query,{key_value}).
    A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V (1) Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V \tag 1 Attention(Q,K,V)=softmax(dk QKT)V(1)

    图2. o u t p u t = f ( q u e r y , { k e y _ v a l u e } ) output=f(query, \{key\_value\} ) output=f(query,{key_value})的直观图示
    M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO
    where h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) headi=Attention(QWiQ,KWiK,VWiV), W O ∈ R h d v × d m o d e l W^O\in \mathbb R^{hd_v\times d_{model}} WORhdv×dmodel

    vanilla attention

    除了 source_seq 与 target_seq 各自的 self_attrntion 之外, 还有二者之间的 vanilla_attention. 对应图1 transformer 架构图中, decoder内的第二个 sub-layer. 此时有 vanilla_attention(decoder_Q,encoder_memory_K, encoder_memory_V).

    Positional Encoding

    将token所在seq的位置信息加以编码表示. 可以是 {sin/cos三角函数, embedding中学习} 两种方案, ablation study 显示差异不大.

    mask

    • future mask
      decoder中有个特别点就是masking, masking 的作用就是防止在训练的时候 使用未来时刻才输出的单词。比如训练时,第一个单词是不能参考第二个单词的生成结果的(但可以参考自己)。Masking就会把这个信息变成0,用来保证预测位置 i 的信息只能基于比 i 小的输出。
      下面章节的tf实现部分, 会有 下三角矩阵的api说明.

    feed-forward

    是图片中 feed-forward 的超集, 也包含了 add&norm.
    其中 add 残差的操作与时机可以参考

    # feed-forward, add & norm
        def call(self, inputs, **kwargs):
            # Inner layer, ReLU
            outputs = Dense(self.num_units[0], activation=tf.nn.leaky_relu)(inputs)
            # Outer layer, linear
            outputs = Dense(self.num_units[1])(outputs)
            # Residual connection
            outputs += inputs
            # Normalize
            outputs = utils.modules.layer_norm(outputs)
    
            return outputs
    

    train/predict 不同的 inference

    train 阶段, 直接输出整体的 logits #shape=(N, T2, vocab_size) , 与y_ = label_smoothing(tf.one_hot(y, depth=self.hp.vocab_size)) # (N, T2, vocab_size) 计算交叉熵.

    在预测阶段, predicts y_hat auto-regressively. 即根据句子Source的中间语义表示C和之前已经生成的历史信息.
    y i = g ( C , y 1 , y 2 , . . . , y i − 1 ) y_i=g(C,y_1,y2_,...,y_{i−1}) yi=g(C,y1,y2,...,yi1)
    where C C C 为 source sentence 的语义编码.

    tf 实现

    官方基于tf, 又搞了 tensor2tensor 库, 内含transformer的实现. github 有人基于tf给出了实现, 见参考 [3].

    • 数据集
      Germany_2_English 翻译任务. 为了单机体验完整流程, 控制数据量. 训练集有 19万 样本, 验证集有 993 条样本. 英德的word加起来构成了 size=8000 的 vocabulary.
    • 超参
      v o c a b _ s i z e vocab\_size vocab_size=32000, d _ m o d e l d\_model d_model=512, m a x _ l e n _ s o u r c e = 100 max\_len\_source=100 max_len_source=100, m a x _ l e n _ t a r g e t = 100 max\_len\_target=100 max_len_target=100.
    • input/output
       	xs: tuple of
              x: int32 tensor. (N, T1) . T1为当前batch样本的最长原文长度.
              x_seqlens: int32 tensor. (N,)
              sents1: str tensor. (N,)
          ys: tuple of
              decoder_input: int32 tensor. (N, T2). T2为当前batch样本的最长译文长度.
              y: int32 tensor. (N, T2)
              y_seqlen: int32 tensor. (N, )
              sents2: str tensor. (N,)
      
      在这里插入图片描述
      在这里插入图片描述
    • 主干逻辑
    def train(self, xs, ys):
        '''
        Returns
        loss: scalar.
        train_op: training operation
        global_step: scalar.
        summaries: training summary node
        '''
        # forward
        memory, sents1 = self.encode(xs)
        logits, preds, y, sents2 = self.decode(ys, memory)
    
        # train scheme
        y_ = label_smoothing(tf.one_hot(y, depth=self.hp.vocab_size))
        ce = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y_)
        nonpadding = tf.to_float(tf.not_equal(y, self.token2idx["<pad>"]))  # 0: <pad>
        loss = tf.reduce_sum(ce * nonpadding) / (tf.reduce_sum(nonpadding) + 1e-7)
    
    • future mask
    diag_vals = tf.ones_like(inputs[0, :, :])  # (T_q, T_k)
    # 详见, https://www.tensorflow.org/api_docs/python/tf/linalg/LinearOperatorLowerTriangular?version=stable, 对角线的元素被保留, 不置0.
    # 但<=1.4 版本的tf, 是没有这个api的.  可以用 tf.matrix_band_part(input, -1, 0) 替代
    tril = tf.linalg.LinearOperatorLowerTriangular(diag_vals).to_dense()  # (T_q, T_k)
    masks = tf.tile(tf.expand_dims(tril, 0), [tf.shape(inputs)[0], 1, 1])  # (N, T_q, T_k)
    
    paddings = tf.ones_like(masks) * padding_num
    outputs = tf.where(tf.equal(masks, 0), paddings, inputs)
    

    bert

    基于双向transformer的预训练语言表达模型.

    参考

    1.transformer paper, Attention Is All You Need
    2. blog, 机器翻译评价指标之BLEU详细计算过程
    3. github 非官方实现, transformer
    4. blog, 从Encoder-Decoder(Seq2Seq)理解Attention的本质
    5. github, bert-use-demo
    6. blog, Seq2Seq中的Attention和self-attention
    7. my blog, residual connection, 残差链接

    展开全文
  • 双壁合一 卷积神经网络(CNNS) Fundamentals of Convolutional Neural Networks LeNet && ModernCNN ...整合CNN和RNN的优势,Vaswani et al., 2017 创新性地使用注意力机制设计了 Transformer 模型。 该模型利用 at
  • transformer_news:基于transformer的中英文平行语料翻译系统
  • PyTorch实现基于Transformer的神经机器翻译
  • tensorflow2.0版本 Transformer模型 中英翻译
  • 原文链接...自从Attention is All you need 这篇文章发布后,Transformer火的一塌糊涂,热度不低于Bert。接下来让我们一起领略这个号称可以取代RNN,CNN的结构究竟是什么。 概...

    原文链接https://jalammar.github.io/illustrated-transformer/

    所需知识储备: RNN, Seq2Seq序列模型,Residual残差计算...

    自从Attention is All you need 这篇文章发布后,Transformer火的一塌糊涂,热度不低于Bert。接下来让我们一起领略这个号称可以取代RNN,CNN的结构究竟是什么。

    概览:

    以机器翻译任务来示例,Transformer有着上述的黑盒结构,里面是多层的encoder和decoder:

    其中每一个encoder单元有着完全相同的结构(但是并不互相共享权重),每个encoder单元可以分为两层:

    encoder的输入首先流入Self-Attention单元,然后进入feed forward network(FFNN),之后完全相同的FFNN被应用在相同位置。

    Decoder 的结构与上面的类似,但是中间又多了一个attention层,这使得解码时能够集中在输入句子的最相关部分(与seq2seq模型中使用attention的方法类似):

    在上述模型中加入Tensor:

    这一部分看图就行,先是词嵌入的表示,然后词嵌入输入encoder:

    在这里,我们开需要注意Transformer的一个关键属性,即每个位置的单词在编码器中流向属于自己的路径。Self attention层中的这些路径之间存在依赖关系, FFNN层则不具有这些依赖。因此各种路径可以在流过FFNN层时并行执行。各个encoder之间的数据流如下图所示:

    概述Self-Attention:

    在阅读Attention is All You Need论文之前,我个人从未遇到过这个概念。 让我们提炼它是如何工作的:

    如果我们想要翻译下面的英文句子:

    The animal didn't cross the street because it was too tired

    ‘it’在句子中指的是什么?是''street"还是‘animal’?对人而言这是简单的问题,但对于算法而言却不是。当算法模型在处理'it'这一个词的时候,Self-attention的作用就是将他与‘animal’相关联。当模型处理每个单词(输入序列中的每个位置)时,Self-attention允许它查看输入序列中的其他位置从而优化当前词汇的编码。

    如果你很熟悉RNN,想象一下如何使得RNN中的hidden state能够融合之前处理过的词汇与当前正在处理的词汇的语义信息?在Transformer中,Self-attention就是起到了这样的作用。它能够将其他相关单词的“语义理解”融入我们当前正在处理的单词中。比如上面的示例中,encoder堆栈的最上层的encoder #5 在编码'it'时,部分注意力集中在The animal上,并在it的语义表示上与这些词进行了融合。

    请务必查看Tensor2Tensor Notebook https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb,您可以在其中加载Transformer模型,并使用此交互式可视化对其进行检查。

    详解Self-attention

    计算Self-attention的第一步--从每个编码器的输入向量创建三个向量(在这种情况下就是词嵌入)。 因此,对于每个单词,我们创建一个Query向量,一个Key向量和一个Value向量(简称Q,K,V)。 这些向量是通过将词嵌入乘以我们在训练过程中训练的三个矩阵而创建的。(这些向量帮助attention理解与计算,是语义的抽象)

    请注意,这些新向量的尺寸小于嵌入向量。 它们的维数为64,而嵌入和encoder输入/输出向量的维数为512。当然这里并不是必须这样设置,而是一种可以使multihead attention计算大致固定结构的选择,。

    第二步--计算一个数值score。假设我们正在计算这个例子中第一个单词“Thinking”的self attention。 我们需要根据这个词对输入句子的每个单词进行评分。 当我们在某个位置编码单词时,分数决定了对输入句子的其他部分放置多少焦点。

    该数值score的计算方式是q与k向量的点积,k向量随着关注词汇的变化而变化。如上例图示,如果我们在计算#1单词(thinking)的attention时,我们应该先计算q1*k1,再计算q1*k2

    第三步第四步--将score除以8(论文中使用的k向量维数64的平方根,这使得模型具有更稳定的梯度。这里可能存在其他合理的值,但默认值是这么计算的),然后将结果传入softmax操作。 Softmax将分数标准化,因此从而使得它们都是正数并且加起来为1。(Softamx score决定了在当前位置某个词的语义被表达出来多少,明显的是当前位置的词具有较大的score,但是关注其他位置的与当前位置有关的词也非常有用 ps:上下文语义)

    第五步—将v向量与对应的softmax值相乘(为最后的相加做准备),该做法的缘由是保持我们关注的单词不变的情况下,过滤掉不相关词汇(比如将他们乘以非常小的数值)

    第六步—将上一步v*softmax后的矩阵加总求和,即为此位置(本例为第一个单词)self-attetion层的输出,总流程为下图所示:

    上述过程阐述了self attention的总体计算流程,但在实际使用过程中,为了加速计算等需求,常常以词级别矩阵来计算Self attention.

    Self attention 的矩阵计算方式:

    将我们上一节的输入变为矩阵X(由word embedding拼接而成),乘以对应的权重矩阵WQ,WK,WV,得到Q,K,V矩阵:

    其他流程与上一节相同,因为我们正在处理矩阵,所以我们可以在一个公式中浓缩步骤2到6来计算self attention层的输出:

    ‘多头巨兽’—attention with multi heads

    Attention is all you need论文中提出了multi-head attention来精炼改进self attention,这样做带来的改进是:

    1. 扩展了模型关注不同位置的能力。在上见面的示例中,self attention最后输出的z1仅包含了其他位置的一点点语义,其值还是极有可能由本位制单词支配。
    2. 它为注意层提供了多个“表示子空间”。 正如我们接下来将看到的,我们不仅有一个,而且还有多组Query / Key / Value权重矩阵(Transformer使用8个注意头,因此我们最终为每个编码器/解码器设置了8组矩阵)。 每组矩阵都是随机初始化的。 然后,在训练之后,每组矩阵用于将输入矩阵(或来自较低编码器/解码器的矢量)投影到不同的表示子空间中。

    使用上一节的self attention计算方式计算,会出现8次不同的矩阵乘法(8组不同的权重矩阵),得到8个不同的z值(矩阵),称为attention head。

             前馈网络FFNN并不能接收8个矩阵作为输入,所以必须将这8个矩阵进行整合,得到一个矩阵。做法是将8个z矩阵先拼接再乘以一个附加权重矩阵WO.这样得到的矩阵Z就可以作为FFNN的输入了。

    Multi-head attention总计算流程如下:

    使用位置编码表示序列的顺序

    到目前为止,上述模型还缺少一种记录输入序列中词顺序的方法。

    为了解决这个问题,transformer为每个输入嵌入添加了一个向量(positional encoding)。 这些向量遵循模型学习的特定模式,这有助于确定每个单词的位置,或者序列中不同单词之间的距离。这种方法的意义是将这些值添加在embedding中,当它们被映射到Q / K / V向量中且在点积计算期间,能够提供embedding vector之间的距离表示。图示该过程如下:

    残差的使用

    encoder架构中还有一个细节是每个编码器中的每个子层(Self-attetion,ffnn)在其周围都具有残差(Residual)连接,然后是层规范化步骤(layer norm)。同样,在decoder 中也是这样的结构,用2个encoder 、2个decoder构成的seq2seq网络结构为:

    Decoder

    PS:该部分动图在原链接中看更直观。

    用两张图表示decoder的解码过程:

    第一步--通过encoder得到K,V矩阵,依次输入各个decoder解码出第一个step的结果。

    第二步到最后一步—通过上一步解码出的结果作为decoder输入,经过decoder解码器解码出当前step的结果:

    在decoder中,self attention层与其在encoder中不尽相同,区别在:

    在解码器中,仅允许self attention关注输出序列中的较早位置。 这是通过在self attention计算中的softmax步骤之前屏蔽未来位置(将它们设置为-inf)来完成的。

    Encoder-Decoder Attention层与multi head attention类似,不同的是它从它下面的层建立Q矩阵,并从编码器堆栈的输出中获取K,V矩阵。

    Linear + Softmax

    Deep Learning必备基础知识,不赘述。

    训练过程的重点

    与seq2seq一致,不赘述

    展开全文
  • Transformer论文翻译

    千次阅读 2019-03-04 00:02:44
    基本是机器翻译,进行了简单的人工修正,凑活看吧 ...我们提出了一种新的简单网络结构,即Transformer,它完全基于注意机制,完全不需要递归和卷积。对两个机器翻译任务的实验表明,这些模型在质量上更优,同时更...

    基本是机器翻译,进行了简单的人工修正,凑活看吧
    原论文: 《Attention Is All You Need》
    源代码:https://github.com/tensorflow/tensor2tensor

    关于注意力机制的更多信息,参考
    https://blog.csdn.net/qq_29695701/article/details/88896227
    http://nlp.seas.harvard.edu/2018/04/03/attention.html(推荐)

    摘要
    主要的序列转导模型是基于复杂的循环或卷积神经网络,包括编码器和解码器。性能最好的模型还通过一个注意机制连接编码器和解码器。我们提出了一种新的简单网络结构,即Transformer,它完全基于注意机制,完全不需要递归和卷积。对两个机器翻译任务的实验表明,这些模型在质量上更优,同时更具并行性,训练时间明显更少。我们的模型在WMT 2014英语翻译任务中实现了28.4 BLEU,比现有的最佳效果(包括合奏)提高了2倍以上。在WMT2014英语到法语翻译任务中,我们的模型在8个GPU上训练3.5天后建立了一个新的单一模型,即最先进的BLEU分数41.8,这只是文献中最佳模型训练成本的一小部分。结果表明,该Transformer可以很好地推广到其他任务中,并成功地应用于大样本和有限样本的英语用户分析。

    1. 简介

    循环神经网络,特别是长期短期记忆[13]和门控复发性[7]神经网络,已作为最先进的顺序建模和转导问题(如语言建模和机器翻译)方法而牢固地建立起来[35,2,5]。此后,许多工作继续扩大了循环神经网络和编码器-解码器体系结构的界限[38、24、15]。

    循环模型通常是沿着输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成一系列隐藏状态 h t h_{t} ht,作为先前隐藏状态 h t − 1 h_{t−1} ht1的函数和位置t的输入。这种固有的顺序性排除了训练示例中的并行化,而训练示例在较长的序列长度下变得至关重要,因为内存约束限制了批处理。通过例子。最近的工作通过因子分解技巧[21]和条件计算[32]显著提高了计算效率,同时在后者的情况下也提高了模型性能。然而,顺序计算的基本约束仍然存在。

    注意力机制已经成为各种任务中引人注目的序列建模和转换模型的组成部分,允许在不考虑依赖项在输入或输出序列中的距离的情况下对依赖项进行建模[2,19]。然而,在除少数情况外的所有情况下[27],这种注意力机制常与循环网络结合使用。

    在这项工作中,我们提出了Transformer,一个避免了循环的模型架构,它完全依赖一个注意机制来绘制输入和输出之间的全局依赖性。Transformer 允许更大程度的并行化,可以在8个p100 gpu上经过短短12小时的训练后,在翻译质量上达到一个新的水平。

    2. 背景

    减少顺序计算的目的形成了扩展神经GPU〔16〕、ByteNet〔18〕和ConvS2S〔9〕的基础,所有这些都使用卷积神经网络作为基本构建块,并使用并行的方式来计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号联系起来所需的操作次数随着位置之间的距离增加而增加,这对于ConvS2S是线性的,对于ByteNet是对数。这使得学习远距离位置之间的依赖性变得更加困难[12]。在Transformer中,这被减少到一个恒定的操作次数,尽管平均注意力加权位置而导致了有效分辨率(resolution)的降低,这是我们在3.2节中描述的多头注意力(Multi-Head Attention)的效果。

    自我注意(Self-attention),有时被称为内注意,是一种注意力机制,它将一个序列的不同位置联系起来,以计算序列的表示。在阅读理解、抽象总结、文本蕴涵和学习任务独立句子表达等多种任务中,人们成功地运用了 Self-attention[4]、[27]、[28]、[22]。

    端到端的记忆网络是一种基于循环的注意力机制,而不是顺序一致的循环,并且在简单的语言问答和语言建模任务上表现良好[34]。

    然而,据我们所知,Transformer是第一个完全依赖于 Self-Attention 来计算其输入和输出表示的转导模型,而不使用序列对齐的RNN或卷积。在下面的章节中,我们将描述Transformer,激发 Self-attention(motivate self-attention),并讨论它相对于[17],[18]和[9]等模型的优势。

    3. 架构

    很多具有竞争力的神经序列转导模型都含有编码器-解码器结构[5,2,35]。在这里,编码器将符号表示的输入序列( x 1 , … , x n x_{1},…,x_{n} x1,,xn)映射为连续表示序列 z = ( z 1 , … , z n ) z=(z_{1},…,z_{n}) z=(z1,,zn)。给定 z z z,解码器然后一次生成一个符号的输出序列( y 1 , … , y m y_{1},…,y_{m} y1,,ym)。在每一步中,模型都是自动回归(auto-regressive)的[10],在生成下一步时,将先前生成的符号序列作为附加输入

    Transformer遵循这一总体架构,使用 堆叠的 Self-attention逐点(point-wise)、全连接的层用于编码器和解码器,分别如图1的左半部分和右半部分所示。
    在这里插入图片描述

    3.1 编码器和解码器堆栈

    编码器:编码器由一组 N = 6 N=6 N=6的相同层堆叠而成。每层有两个子层第一个子层采用 Multi-Head Self-Attention 机制第二个是一个简单的,位置导向的,全连接的前馈网络。我们在两个子层的每一个子层周围使用一个 Residual 连接[11],然后是层 Normalization[1]。也就是说,每个子层的输出是 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) LayerNorm(x+Sublayer(x)),其中 S u b l a y e r ( x ) Sublayer(x) Sublayer(x)是子层实现的函数。为了方便这些 Residual 连接,模型中的所有子层以及嵌入层都会生成维度为 d m o d e l = 512 d_{model}=512 dmodel=512 的输出

    解码器:解码器也由一个 N = 6 N=6 N=6的相同层堆叠而成。除了每个编码器层中的两个子层外,解码器还插入第三个子层,该子层在编码器堆栈的输出上执行 Multi-Head Attention。与编码器类似,我们在每个子层周围使用 Residual 连接,然后进行层Normalization。我们还修改了解码器堆栈中的自注意子层,以防止每个位置去关注其后续位置。这个掩膜,结合输出嵌入(the output embeddings)被一个位置偏移(offset)的事实,确保了位置 i i i的预测只能依赖于位置小于 i i i的已知输出。

    3.2 注意力机制

    注意力函数可以描述为从一个查询(query)和一组键值对(key-value pairs)到一个输出的映射,其中,查询(query)、键(key)、值(value)和输出(output)都是向量。输出(output)是以值(value)的加权和进行计算的,其中分配给每个值(value)的权重是通过查询(query)的匹配函数(compatibility function)和相应的键(key)计算的。
    在这里插入图片描述

    3.2.1 Scaled Dot-Product Attention

    我们称我们的特别的关注(attention)为“Scaled Dot-Product Attention”(图2)。输入包括 d k d_{k} dk维的查询和键,以及 d v d_{v} dv维的值。我们计算查询与所有键的点积,并将每个点积除以 d k \sqrt{d_{k}} dk ,然后应用SoftMax函数得到这些值的 权重

    在实践中,我们同时计算一组查询上的注意力函数,将它们打包成矩阵Q。键和值也打包成矩阵K和V。我们计算输出矩阵的方式为:
    A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V Attention(Q,K,V)=softmax(dk QKT)V

    两个最常用的注意力函数是加性注意(additive attention)[2]和点积(乘法)注意(dot-product attention)。除比例因子 1 d k \frac{1}{\sqrt{d_{k}}} dk 1外,点积注意与我们的算法相同。加性注意使用一个前馈网络和一个单独的隐藏层来计算兼容性函数(compatibility function)。虽然二者在理论复杂度上相似,但在实践中,点积注意速度更快,空间效率更高,因为它可以使用高度优化的矩阵乘法代码来实现。

    对于较小的 d k d_{k} dk值,这两种机制的性能相似,但加性注意优于点积注意,而不会缩放较大的 d k d_{k} dk值[3]。我们怀疑,对于 d k d_{k} dk的较大值,点积的增长幅度较大,会将SoftMax函数推送到具有极小梯度的区域。为了抵消这种影响,我们将点积乘以 1 d k \frac{1}{\sqrt{d_{k}}} dk 1

    3.2.2 Multi-Head Attention

    不同于使用 d m o d e l d_{model} dmodel维度的键、值和查询来执行单一注意功能,我们发现,使用另一种可学习的线性投影(projection)分别对查询、键和值进行h次线性投影(projection)会更有效,这些投影 将这些元素分别映射到维度为 d k d_{k} dk d k d_{k} dk d v d_{v} dv的空间在这些元素的每个投影版本上,我们并行执行注意力函数,得到 d v d_{v} dv维的输出值。如图2所示,之后它们被连接起来,并再次进行投影,从而得到最终的值

    Multi-Head Attention 允许模型关注来自不同位置的不同表示子空间的信息。只需一个single attention head,平均值就可以抑制这种情况。
    M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d n ) W O MultiHead(Q,K,V)=Concat(head_{1},...,head_{n})W^{O} MultiHead(Q,K,V)=Concat(head1,...,headn)WO
    w h e r e    h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) where\ \ head_{i}=Attention(QW^{Q}_{i},KW^{K}_{i},VW^{V}_{i}) where  headi=Attention(QWiQ,KWiK,VWiV)
    其中,投影指的是参数矩阵 W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i V ∈ R d m o d e l × d v W^{Q}_{i}\in \mathbb{R}^{d_{model}\times d_{k}}, W^{K}_{i}\in \mathbb{R}^{d_{model}\times d_{k}}, W^{V}_{i}\in \mathbb{R}^{d_{model}\times d_{v}} WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dv

    在这项工作中,我们使用 H = 8 H=8 H=8的并行 attention layers 或 heads。对于每个模型, d k = d v = d m o d e l / h = 64 d_{k}=d_{v}=d_{model}/h=64 dk=dv=dmodel/h=64。由于每个头部的降维,总的计算成本与 single-head 全尺寸注意力相似。

    3.2.3 Applications of Attention in our Model

    Transformer 采用三种不同的方式使用Multi-Head Attention:

    • 在“编-解码器 注意”层中,查询(Query)来自前一个解码器层,记忆的键和值(the memory keys and values)来自编码器的输出。这使得解码器中的每个位置都可以处理输入序列中的所有位置。这模仿了典型的编码器-解码器注意机制的Seq2Seq模型,如[38,2,9]。

    • 编码器包含自我关注层。在一个自我关注层中,所有键、值和查询都来自同一个地方,在本例中,是编码器中前一层的输出。编码器中的每个位置都可以处理编码器前一层中的所有位置。

    • 类似地,解码器中的自我关注层允许解码器中的每个位置关注解码器中的所有位置,包括其自身。为了保持自回归(Auto-Regressive)特性,需要防止解码器中出现向左的信息流。我们通过屏蔽SoftMax输入中与非法连接相对应的所有值(设置为 − ∞ -\infty ,在缩放的 Dot-Product Attention 的内部实现了这一点。请参阅图2。

    3.3 Position-wise Feed-Forward Networks

    除了关注子层之外,我们的编码器和解码器中的每个层都包含一个完全连接的前馈网络,该网络分别应用于每个position,并且完全相同。该网络也包括有两个通过ReLU连接起来的线性变换。
    F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0,xW_{1}+b_{1})W_{2}+b_{2} FFN(x)=max(0,xW1+b1)W2+b2
    虽然线性变换在不同的位置上是相同的,但它们在不同的层之间使用不同的参数。另一种描述这一点的方法是两个内核大小为1的卷积。输入输出维数为 d m o d e l = 512 d_{model}=512 dmodel=512,内层维数为 d f f = 2048 d_{ff}=2048 dff=2048

    3.4 Embeddings and Softmax

    与其他序列转导(Sequence Transduction)模型类似,我们使用可学习的嵌入(Embeddings)将输入tokens和输出tokens转换为 d m o d e l d_{model} dmodel维的向量。我们还使用常用的可学习的线性变换和SoftMax函数将解码器的输出转换为待预测的下一个token的概率。在我们的模型中,我们在两个嵌入层之间共享相同的权重矩阵和Pre-SoftMax线性变换,类似于[30]。在嵌入层中,我们将这些权重乘以 d m o d e l \sqrt{d_{model}} dmodel

    3.5 Positional Encoding

    由于我们的模型不包含递归和卷积,为了使模型能够利用序列的顺序(the order of the sequence),我们必须注入一些关于序列中tokens的相对或绝对位置的信息。为此,我们将“位置编码”添加到编码器和解码器堆栈底部的输入嵌入(embeddings)中。位置编码与嵌入具有相同的维度 d m o d e l d_{model} dmodel,因此可以将两者相加。位置编码有很多选择,可学习的和可固定的[9]。
    在这里插入图片描述
    在这项工作中,我们将使用不同频率的正余弦函数
    P E p o s , 2 i = s i n ( p o s / 1000 0 2 i / d m o d e l ) PE_{pos,2i}=sin(pos/10000^{2i/d_{model}}) PEpos,2i=sin(pos/100002i/dmodel)
    P E p o s , 2 i + 1 = c o s ( p o s / 1000 0 2 i / d m o d e l ) PE_{pos,2i+1}=cos(pos/10000^{2i/d_{model}}) PEpos,2i+1=cos(pos/100002i/dmodel)
    其中,pos是位置,i是维度。也就是说,位置编码的每个维度都对应于一个正弦曲线。波长形成一个从 2 π 2\pi 2π 10000 ⋅ 2 π 10000\cdot2\pi 100002π的几何轨迹。我们之所以选择这个函数,是因为我们假设它可以让模型很容易地通过相对位置进行学习,因为对于任何固定的偏移量k, P E p o s + k PE_{pos+k} PEpos+k都可以表示为 P E p o s PE_{pos} PEpos的线性函数。
    我们对learned positional embeddings[9]进行了实验,发现两个版本产生了几乎相同的结果(见表3第(e)行)。我们选择正弦波模型是因为它可以让模型外推到比训练中遇到的序列长度更长的序列

    4. 为何使用 Self-Attention

    在本节中,我们将自关注层的各个方面与递归和卷积层进行比较,后两个通常被用于将一个可变长度的符号表示序列( x 1 , … , x n x_{1},…,x_{n} x1,,xn)映射到另一个等长序列( z 1 , … , z n z_{1},…,z_{n} z1,,zn),其中 x i ,   z i ∈ R d x_{i},\ z_{i}\in \mathbb{R}^{d} xi, ziRd,如同在一个典型的序列转导编码器或解码器中的隐藏层。为了使用自我关注,我们考虑了三个目标。

    一个是每层的总计算复杂性。另一个是可以并行化的计算量,用所需的最小顺序操作数来衡量。

    第三个是网络中远程依赖项之间的路径长度。学习长期依赖性是许多序列转导任务中的一个关键挑战。影响学习这种依赖性能力的一个关键因素是必须在网络中遍历的前向和后向信号的路径长度。输入序列和输出序列中任意位置组合之间的这些路径越短,学习长期依赖关系就越容易[12]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。

    如表1所示,一个自我关注层将所有位置与恒定数量的顺序执行操作连接起来,而一个循环层则需要O(N)顺序操作。在计算复杂度方面,当序列长度n小于表示维数d时,自注意层比循环层更快,这是机器翻译中最先进的模型(如word-piece[38]和byte-pair[31] representations)使用的句子表示最常见的情况。为了提高涉及非常长序列的任务的计算性能,可以将自我关注限制为仅考虑以各自输出位置为中心的输入序列中大小为 r r r的邻域。这将把最大路径长度增加到 O ( n / r ) O(n/r) O(n/r)。我们计划在今后的工作中进一步研究这种方法。

    核宽 k &lt; n k&lt;n k<n的单个卷积层不连接所有输入和输出位置对。这样做需要一堆O(n/r)卷积层(对于连续的内核)或O( l o g k ( n ) log_{k}(n) logk(n))(对于扩展卷积[18]),增加网络中任意两个位置之间最长路径的长度。卷积层通常比循环层更昂贵,其系数为k。可分离卷积[6]可将复杂性大大降低至o(k·n·d+n· d 2 d^{2} d2)。然而,即使k=n,可分离卷积的复杂度也等于我们在模型中采用的自注意层和 point-wise 前馈层的组合。

    作为附带的好处,自我关注可以产生更多可解释的模型。我们检查模型中的注意力分布,并在附录中展示和讨论示例。个体的注意力不仅能清楚地学习执行不同的任务,而且许多注意力表现出与句子的句法和语义结构相关的行为。

    5. 训练

    本节介绍了我们的模型的训练方式。

    5.1 训练数据与批次

    我们训练了标准的WMT 2014英语-德语数据集,包含约450万个句子对。语句使用字节对编码[3]进行编码,该编码具有大约37000个标记的共享源-目标词汇表。对于英语-法语,我们使用了更大的WMT 2014英语-法语数据集,该数据集包含3600万句句子,并将标记拆分为32000个词条词汇[38]。句子对按近似的序列长度分批在一起。每个训练批包含一组句子对,其中包含大约25000个源标记和25000个目标标记。

    5.2 硬件及计划

    我们用8个Nvidia P100 GPU在一台机器上训练我们的模型。对于使用本文中描述的超参数的基本模型,每个训练步骤大约需要0.4秒。我们对基础模型进行了总计100000步或12小时的训练。对于我们的大型模型(如表3的底线所述),步进时间为1.0秒。大模型接受了300000步(3.5天)的训练。

    5.3 优化

    我们使用Adam优化方案[20],其中 β 1 = 0.9 ,   β 2 = 0.98 ,   ϵ = 1 0 − 9 \beta_{1}=0.9,\ \beta_{2}=0.98,\ \epsilon=10^{-9} β1=0.9, β2=0.98, ϵ=109。根据如下的公式,我们在整个训练过程中改变了学习速度:
    l r a t e = d m o d e l − 0.5 ⋅ m i n ( s t e p _ n u m − 0.5 , s t e p _ n u m ⋅ w a r m u p _ s t e p s − 1.5 )      ( 3 ) lrate=d^{-0.5}_{model}\cdot min(step\_num^{-0.5},step\_num\cdot warmup\_steps^{-1.5})\ \ \ \ (3) lrate=dmodel0.5min(step_num0.5,step_numwarmup_steps1.5)    (3)
    这对应于在第一个warmup_steps的训练步骤中线性地增加学习速率,然后与步骤数的平方反比成比例地减少学习速率。我们使用warmup_steps=4000。

    5.4 正则化

    我们在训练过程中使用三种类型的正则方案:
    Residual Dropout 我们将Dropout[33]应用于每个子层的输出,然后将其添加到子层输入并进行规范化。此外,我们还将Dropout应用于编码器和解码器堆栈中嵌入和位置编码的和。对于基本模型,我们使用 P d r o p P_{drop} Pdrop=0.1的速率。
    在这里插入图片描述
    Label Smoothing 在训练过程中,我们采用了 ϵ l s = 0.1 \epsilon_{ls}=0.1 ϵls=0.1[36]的标签平滑。这样做,虽然使模型有更大的不确定性,但也提高了准确性和BLEU分数。

    6 结果

    6.1 机器翻译

    在WMT 2014英语到德语翻译任务中,表2中的大 transformer 模型比之前报告的最好的模型(包括Ensembles)强2.0 Bleu以上,建立了一个新的最先进的BLEU分数28.4。该模型的配置列在表3的底线中。训练时间为3.5天,平均成绩为100分。即使是我们的基础模型也超越了以前发布的所有模型和集成,而这也只是训练成本的一小部分。

    在WMT 2014英语到法语翻译任务中,我们的大模型获得了41.0的BLEU分数,超过了之前发布的所有单一模型,低于之前最先进模型训练成本的1/4。为英语到法语训练的Transformer(大)模型使用辍学率 P d r o p = 0.1 P_{drop}=0.1 Pdrop=0.1,而不是0.3。

    对于基本模型,我们使用了一个单一模型,该模型通过均值化最后5个 checkpoints 获得,这些检查点以10分钟的间隔写入。对于大型模型,我们均值化最后20个检查点。我们使用beam search,波束大小为4,长度惩罚 α = 0.6 \alpha=0.6 α=0.6[38]。这些超参数是在对开发集进行实验后选择的。我们将推理期间的最大输出长度设置为输入长度+50,但在可能的情况下提前终止[38]。

    表2总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过乘以训练时间、使用的GPU数量和每个GPU 5的持续单精度浮点容量来估计用于训练模型的浮点操作数。

    6.2 模型变体

    为了评估Transformer不同组件的重要性,我们以不同的方式改变了我们的基础模型,测量了开发集《2013年新闻测试》中英译德翻译的性能变化。我们使用了前一节中描述的波束搜索,但没有检查点平均值。我们在表3中给出了这些结果。

    在表3的第(a)行中,我们改变了注意头的数量、注意键和值的尺寸,保持计算量不变,如第3.2.2节所述。虽然单头关注是0.9布鲁比最佳设置差,质量也下降了与太多的头。
    在这里插入图片描述
    在这里插入图片描述
    在表3行(b)中,我们观察到减少注意键大小dk会损害模型质量。这表明,确定兼容性并不容易,比点积更复杂的兼容性函数可能是有益的。我们在(c)和(d)行中进一步观察到,正如预期的那样,较大的模型更好,而退出对于避免过度拟合非常有帮助。在第(e)行中,我们将正弦位置编码替换为学习的位置嵌入[9],并观察到与基本模型几乎相同的结果。

    6.3 英语选区解析

    为了评估Transformer是否可以推广到其他任务,我们进行了英语选区分析实验。这项任务提出了具体的挑战:输出受到强大的结构约束,并且明显长于输入。此外,RNN序列到序列模型无法在小数据状态下获得最先进的结果[37]。

    我们在宾夕法尼亚州Treebank[25]的《华尔街日报》(WSJ)部分训练了一个4层Transformer,其 d m o d e l = 1024 d_{model}=1024 dmodel=1024,大约有40k个训练句子。我们也在一个半监督的环境中训练它,使用更大的高置信度和Berkleyparser语料库,大约有1700万句话[37]。我们只在wsj设置中使用16Ktoken的词汇表,在半监督设置中使用32K token的词汇表。

    我们只做了少量的实验来选择第22节开发集上的辍学、注意力和残余(第5.4节)、学习率和光束大小,所有其他参数从英语到德语的基本翻译模型保持不变。在推理过程中,我们将最大输出长度增加到输入长度+300。我们仅对WSJ和半监督设置使用了21和 α = 0.3 \alpha=0.3 α=0.3的 beam size。

    我们在表4中的结果表明,尽管缺乏特定于任务的调整,我们的模型仍然运行得非常好,产生的结果比以前报告的所有模型都好,除了重复性神经网络语法[8]。

    与RNN序列到序列模型[37]相比,Transformer优于Berkeley-Parser[29],即使仅在仅针对40K句子的WSJ训练集进行训练时也是如此。

    7 结论

    在这项工作中,我们提出了完全基于注意的第一序列转导模型Transformer,用多头自注意取代了编码器-解码器体系结构中最常用的循环层。

    对于翻译任务,Transformer的训练速度明显快于基于循环层或卷积层的架构。在WMT 2014英语到德语和WMT 2014英语到法语的翻译任务中,我们实现了一种新的艺术状态。在前一项任务中,我们的最佳模型甚至超过了之前报道的所有合奏。

    我们对基于注意力的模型的未来感到兴奋,并计划将其应用到其他任务中。我们计划将Transformer扩展到涉及输入和输出模式(文本除外)的问题,并调查本地、受限注意机制,以有效处理图像、音频和视频等大型输入和输出。我们的另一个研究目标是减少一代人的顺序。

    我们用来训练和评估模型的代码可以在https://github.com/tensorflow/tensor2tensor上找到。


    参考文献
    [1] Jimmy Lei Ba, Jamie Ryan Kiros, and Geoffrey E Hinton. Layer normalization. arXiv preprint arXiv:1607.06450, 2016.
    [2] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. Neural machine translation by jointly learning to align and translate. CoRR, abs/1409.0473, 2014.
    [3] Denny Britz, Anna Goldie, Minh-Thang Luong, and Quoc V. Le. Massive exploration of neural machine translation architectures. CoRR, abs/1703.03906, 2017.
    [4] Jianpeng Cheng, Li Dong, and Mirella Lapata. Long short-term memory-networks for machine reading. arXiv preprint arXiv:1601.06733, 2016.
    [5] Kyunghyun Cho, Bart van Merrienboer, Caglar Gulcehre, Fethi Bougares, Holger Schwenk, and Yoshua Bengio. Learning phrase representations using rnn encoder-decoder for statistical machine translation. CoRR, abs/1406.1078, 2014.
    [6] Francois Chollet. Xception: Deep learning with depthwise separable convolutions. arXiv preprint arXiv:1610.02357, 2016.10
    [7] Junyoung Chung, Çaglar Gülçehre, Kyunghyun Cho, and Yoshua Bengio. Empirical evaluation of gated recurrent neural networks on sequence modeling. CoRR, abs/1412.3555, 2014.
    [8] Chris Dyer, Adhiguna Kuncoro, Miguel Ballesteros, and Noah A. Smith. Recurrent neural network grammars. In Proc. of NAACL, 2016.
    [9] Jonas Gehring, Michael Auli, David Grangier, Denis Yarats, and Yann N. Dauphin. Convolu- tional sequence to sequence learning. arXiv preprint arXiv:1705.03122v2, 2017.
    [10] Alex Graves. Generating sequences with recurrent neural networks. arXiv preprint arXiv:1308.0850, 2013.
    [11] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep residual learning for im- age recognition. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 770–778, 2016.
    [12] Sepp Hochreiter, Yoshua Bengio, Paolo Frasconi, and Jürgen Schmidhuber. Gradient flow in recurrent nets: the difficulty of learning long-term dependencies, 2001.
    [13] Sepp Hochreiter and Jürgen Schmidhuber. Long short-term memory. Neural computation, 9(8):1735–1780, 1997.
    [14] Zhongqiang Huang and Mary Harper. Self-training PCFG grammars with latent annotations across languages. In Proceedings of the 2009 Conference on Empirical Methods in Natural Language Processing, pages 832–841. ACL, August 2009.
    [15] Rafal Jozefowicz, Oriol Vinyals, Mike Schuster, Noam Shazeer, and Yonghui Wu. Exploring the limits of language modeling. arXiv preprint arXiv:1602.02410, 2016.
    [16] Łukasz Kaiser and Samy Bengio. Can active memory replace attention? In Advances in Neural Information Processing Systems, (NIPS), 2016.
    [17] Łukasz Kaiser and Ilya Sutskever. Neural GPUs learn algorithms. In International Conference on Learning Representations (ICLR), 2016.
    [18] Nal Kalchbrenner, Lasse Espeholt, Karen Simonyan, Aaron van den Oord, Alex Graves, and Ko- ray Kavukcuoglu. Neural machine translation in linear time. arXiv preprint arXiv:1610.10099v2, 2017.
    [19] Yoon Kim, Carl Denton, Luong Hoang, and Alexander M. Rush. Structured attention networks. In International Conference on Learning Representations, 2017.
    [20] Diederik Kingma and Jimmy Ba. Adam: A method for stochastic optimization. In ICLR, 2015.
    [21] Oleksii Kuchaiev and Boris Ginsburg. Factorization tricks for LSTM networks. arXiv preprint
    arXiv:1703.10722, 2017.
    [22] Zhouhan Lin, Minwei Feng, Cicero Nogueira dos Santos, Mo Yu, Bing Xiang, Bowen Zhou, and Yoshua Bengio. A structured self-attentive sentence embedding. arXiv preprint arXiv:1703.03130, 2017.
    [23] Minh-Thang Luong, Quoc V. Le, Ilya Sutskever, Oriol Vinyals, and Lukasz Kaiser. Multi-task sequence to sequence learning. arXiv preprint arXiv:1511.06114, 2015.
    [24] Minh-Thang Luong, Hieu Pham, and Christopher D Manning. Effective approaches to attention- based neural machine translation. arXiv preprint arXiv:1508.04025, 2015.
    [25] Mitchell P Marcus,Mary Ann Marcinkiewicz, and Beatrice Santorini. Building a large annotated corpus of english: The penn treebank. Computational linguistics, 19(2):313–330, 1993.
    [26] David McClosky, Eugene Charniak, and Mark Johnson. Effective self-training for parsing. In Proceedings of the Human Language Technology Conference of the NAACL, Main Conference, pages 152–159. ACL, June 2006.11
    [27] Ankur Parikh, Oscar Täckström, Dipanjan Das, and Jakob Uszkoreit. A decomposable attention model. In Empirical Methods in Natural Language Processing, 2016.
    [28] Romain Paulus, Caiming Xiong, and Richard Socher. A deep reinforced model for abstractive summarization. arXiv preprint arXiv:1705.04304, 2017.
    [29] Slav Petrov, Leon Barrett, Romain Thibaux, and Dan Klein. Learning accurate, compact, and interpretable tree annotation. In Proceedings of the 21st International Conference on Computational Linguistics and 44th Annual Meeting of the ACL, pages 433–440. ACL, July 2006.
    [30] Ofir Press and Lior Wolf. Using the output embedding to improve language models. arXiv preprint arXiv:1608.05859, 2016.
    [31] Rico Sennrich, Barry Haddow, and Alexandra Birch. Neural machine translation of rare words with subword units. arXiv preprint arXiv:1508.07909, 2015.
    [32] Noam Shazeer, Azalia Mirhoseini, Krzysztof Maziarz, Andy Davis, Quoc Le, Geoffrey Hinton, and Jeff Dean. Outrageously large neural networks: The sparsely-gated mixture-of-experts layer. arXiv preprint arXiv:1701.06538, 2017.
    [33] Nitish Srivastava, Geoffrey E Hinton, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdi- nov. Dropout: a simple way to prevent neural networks from overfitting. Journal of Machine Learning Research, 15(1):1929–1958, 2014.
    [34] Sainbayar Sukhbaatar, Arthur Szlam, Jason Weston, and Rob Fergus. End-to-end memory networks. In C. Cortes, N. D. Lawrence, D. D. Lee, M. Sugiyama, and R. Garnett, editors, Advances in Neural Information Processing Systems 28, pages 2440–2448. Curran Associates, Inc., 2015.
    [35] Ilya Sutskever, Oriol Vinyals, and Quoc VV Le. Sequence to sequence learning with neural networks. In Advances in Neural Information Processing Systems, pages 3104–3112, 2014.
    [36] Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, and Zbigniew Wojna. Rethinking the inception architecture for computer vision. CoRR, abs/1512.00567, 2015.
    [37] Vinyals & Kaiser, Koo, Petrov, Sutskever, and Hinton. Grammar as a foreign language. In Advances in Neural Information Processing Systems, 2015.
    [38] Yonghui Wu, Mike Schuster, Zhifeng Chen, Quoc V Le, Mohammad Norouzi, Wolfgang Macherey, Maxim Krikun, Yuan Cao, Qin Gao, Klaus Macherey, et al. Google’s neural machine translation system: Bridging the gap between human and machine translation. arXiv preprint arXiv:1609.08144, 2016.
    [39] Jie Zhou, Ying Cao, Xuguang Wang, Peng Li, and Wei Xu. Deep recurrent models with fast-forward connections for neural machine translation. CoRR, abs/1606.04199, 2016.
    [40] Muhua Zhu, Yue Zhang, Wenliang Chen, Min Zhang, and Jingbo Zhu. Fast and accurate shift-reduce constituent parsing. In Proceedings of the 51st Annual Meeting of the ACL (Volume 1: Long Papers), pages 434–443. ACL, August 2013.


    附录
    在这里插入图片描述

    展开全文
  • #DSSM模型适用于个性化推荐,无新用户冷启动,要求至少有一条阅读记录
  • 写这个博客的原因在于:大部分解释Transformer的文章都只注重讲解Encoder部分,在Encoder中又侧重讲解self-attention原理。为了读者更好地理解整个Transformer的训练过程,我决定结合代码写一篇在理解了Encoder部分...
  •   在Transformer的代码实现的基础上,采用机器翻译数据,进行基于Transformer的机器翻译实战—数据集代码链接。 如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信! ...
  • transformer翻译(英–>中) transformer结构 具体原理可以参考这篇文章Transformer 数据格式 因为我们的中文数据是繁体字,因此需将其转换为简体: import copy import math import matplotlib.pyplot as ...
  • 摘要 最近的工作凸显了Transformer结构在序列任务上的处理优势,与此同时,神经架构搜索(NAS)已开始...为了直接搜索计算量大的WMT 2014 English-German翻译任务,我们开发了Progressive Dynamic Hurdles方法,该方法
  • Transformer原理解析及机器翻译的应用

    千次阅读 2020-09-15 21:01:01
    基于Seq2Seq模型的机器翻译 引入Attention的Seq2Seq模型-机器翻译 Transformer 首先,可以思考为什么会需要Transformer? 大部分的机器翻译等序列生成任务都是基于Encoder-Decoder的模式,而Encoder和Decoder一般...
  • transformer的核心是self-attention,self-attention可参考: 图解transformer 李宏毅老师的transform 一、机器翻译 对于机器翻译而言,分为源语言与目的语言(如英文与中文) 对源语言建立词典,大小为src_vocab_...
  • 无奈怒翻了这篇文章,一边翻译一边研究,要学的东西还很多啊。 The Illustrated Transformer In the previous post, we looked at Attention – a ubiquitous method in modern deep learning models...
  • 用PyTorch玩转Transformer英译中翻译

    千次阅读 2021-02-04 14:58:13
    因此,我们在本文中也具体分享Transformer翻译任务中的使用,教你从零开始玩转Transformer机器翻译模型! 02 数据处理 2.1 原始数据格式 如下所示,原始的数据集是en-cn的sentence pair。 [ ['Some analysts argue...
  • NLP——基于transformer翻译系统

    千次阅读 2020-08-14 12:24:50
    文章目录基于transformer翻译系统1. 数据处理1.1 英文分词1.2 中文分词1.3 生成字典1.4 数据生成器...
  • transformer(下)机器翻译+pytorch实现

    千次阅读 多人点赞 2020-12-16 17:27:30
    transformer(下)机器翻译(pytorch实现)说在前面实验环境1.加载数据 建立input pipeline2.位置编码 positional encoding3.掩码 masking4.scaled dot product attention5.multi-head attention6.point wise feed ...
  • Transformer翻译篇 章节 MASK机制 Encoder 模型搭建 训练函数 MASK机制 源码在colab上,数据集若要自己下载data 原始的句子首先需要转换为词表中的索引,然后进入词嵌入层。举个例子,假如某个时间步长上输入...
  • 机器翻译模型Transformer代码详细解析

    千次阅读 2019-02-18 17:00:41
    谷歌一个月前发了一篇论文Attention is all you need,文中提出了一种新的架构叫做Transformer,用以来实现机器翻译。它抛弃了传统用CNN或者RNN的定式,取得了很好的效果,激起了工业界和学术界的广泛讨论。本人的另...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,859
精华内容 4,743
关键字:

transformer翻译