Transformer论文翻译

人工智能100

Attention Is All You Need

word版本

Transformer论文翻译
Transformer论文翻译
需要word版本的点赞,收藏,评论邮箱哦,整理不易,谢谢大家!

; 摘要

主流的序列转换模型基于复杂的卷积神经网络或循环神经网络、包括编码器和解码器。且性能好的模型往往需要注意力层连接编码器和解码器。我们提出了一个新型神经网络架构——Transformer,它完全基于注意力机制,省去了循环层和卷积层。在两个机器翻译任务上的实验表明,这些模型在质量上更优,同时具有更强的并行性,需要的训练时间显著减少。我们的模型在2014年WMT英德翻译任务中达到28.4 BLEU,比现有的最佳结果(包括集成部分)提高了2个BLEU以上。在WMT 2014年英语到法语的翻译任务中,我们的模型在8个GPU上训练3.5天后,建立了新的单模型,最先进的BLEU评分41.8,这是文献中最佳模型训练成本的一小部分。结果表明,Transformer可以很好地将其推广到其他任务,成功应用于大样本和有限样本的英语用户分析。

1. 引言

循环神经网络,特别是长期短期记忆[13]和门控复发性[7]神经网络,已作为最先进的顺序建模和转导问题(如语言建模和机器翻译)方法而牢固地建立起来[35,2,5]。此后,许多工作继续扩大了循环神经网络和编码器-解码器体系结构的界限[38、24、15]。
循环模型通常是沿着输入和输出序列的符号位置进行因子计算。将位置与计算时间中的步骤对齐,它们生成一系列隐藏状态ht,作为先前隐藏状态ht−1的函数和位置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. 模型架构

大多数具有竞争力地神经序列转换模型具有编码器-解码器结构。在此,编码器将输入序列(x_1,...,x_n)映射到序列的连续表示形式。基于序列(z_1,...,z_n),解码器然后一次生成一个符号的符号的输出序列(y_1,...,y_n) 。 模型的每一步都是自回归的[10],即在生成下时刻的符号时,会将先前生成的符号用作附加输入。
Transformer 遵循这种架构,用 堆叠的 Self-attention 和 逐点(point-wise)、全连接的层,将编码器和解码器连接, 分别如图1的左半部分和右半部分所示。
Transformer论文翻译

                 图1 Transformer模型框架

**

3.1 编码器和解码器层

**

编码器:编码器由一组N=6的相同层堆叠而成。每层有两个子层。第一个子层采用 Multi-Head Self-Attention 机制,第二个是一个简单的,位置导向的,全连接的前馈网络。我们在两个子层的每一个子层周围使用一个 Residual 连接[11],然后是层 Normalization[1]。也就是说,每个子层的输出是LayerNorm(x+Sublayer(x)),其中Sublayer(x)是子层实现的函数。为了方便这些 Residual 连接,模型中的所有子层以及嵌入层都会生成维度为dmodel=512 的输出。
解码器:解码器也由一个N=6的相同层堆叠而成。除了每个编码器层中的两个子层外,解码器还插入第三个子层,该子层在编码器堆栈的输出上执行 Multi-Head Attention。与编码器类似,我们在每个子层周围使用 Residual 连接,然后进行层Normalization。我们还修改了解码器堆栈中的自注意子层,以防止每个位置去关注其后续位置。这个掩膜,结合输出嵌入(the output embeddings)被一个位置偏移(offset)的事实,确保了位置 i的预测只能依赖于位置小于i的已知输出。

3.2 注意力

注意力功能可以描述为将query和一组key-value映射到输出,其中query, key,value和输出都是向量。 输出可以计算为value加权总和,其中分配给每个key的权重通过query与对应value的兼容性函数来计算的。
Transformer论文翻译

图2:(左)缩放的点积注意力。(右)多头注意由几个并行运行的注意层组成

; 3.2.1 尺度点积注意力

我们称我们特别地注意力机制为"Scaled Dot-Product Attention"(图2)。输入由维数为的query和key以及维数为的value组成。 我们用query计算所有key的点积,对每个结果除以,然后应用softmax函数获得对应值的权重。
实际上,我们将一组query打包成矩阵Q,key和value也打包成矩阵K和V,共同计算注意力函数。 我们将输出矩阵计算为:
Transformer论文翻译

两个最常用的注意力函数是加性注意力和点积(乘法)注意力。 除的比例因子外,点积注意与我们的算法相同。加法注意力使用具有单个隐藏层的前馈网络来计算兼容性函数。 尽管两者在理论上的复杂度相似,但是在实践中点积的关注要快得多,而且空间效率更高,因为点积可以使用高度优化的矩阵乘法代码来实现。
对于较小的d_k而言,这两种机制的性能相似,但加性注意的效果优于点积的注意,且在较大的d_k则不进行缩放。 我们怀疑对于较大的d_k值,点积会变得很大,从而将softmax函数推入梯度极小的区域。为了抵消这种影响,我们用1/√(d_k )缩放点积。

3.2.2 多头注意力

相比于使d_model 维度的key,value和query的单一注意力函数,我们发现将key,value和query线性投影到d_k, d_k和d_v维度是有益的。 然后,我们并行执行关注功能,从而产生d_v维输出值。 将它们连接起来并再次投影,得到最终值,如图2所示。
Multi-Head Attention 允许模型关注来自不同位置的不同表示子空间的信息。只需一个single attention head,平均值就可以抑制这种情况。
Transformer论文翻译

在这项工作中我们令h=8作为并行注意力层数(head数),设置 d_k=d_v=d_model/h=64。由于每个头部的降维,总的计算成本与 single-head 全尺寸注意力相似。

; 3.2.3 注意力在模型中的应用

Transformer使用muti-head注意力在以下三种不同方式:
(1)编码器-解码器层,来自解码器的query和来自编码器输出的key, value。在使得解码器的每个位置都可以关注到输入序列的所有位置。这模仿编码器-解码器模型的注意力机制。
(2)编码器包含自注意力层。在自注意力层中,所有key, value, query均来自同一位置,这种情况下,编码器的每一个位置可以关注的编码器所有上一层的位置。
(3)类似地,解码器中的自我关注层允许解码器中的每个位置关注解码器中的所有位置,包括其自身。为了保持自回归(Auto-Regressive)特性,需要防止解码器中出现向左的信息流。我们通过屏蔽SoftMax输入中与非法连接相对应的所有值(设置为−∞),在缩放的 Dot-Product Attention 的内部实现了这一点。请参阅图2。

3.3 Position-wise Feed-Forward Networks

除了关注子层之外,我们的编码器和解码器中的每个层还包含一个完全连接的前馈网络,该网络分别应用于每个position,并且完全相同。该网络也包括有两个通过ReLU连接起来的线性变换。
FFN(x)=max⁡(0,xW_1+b_1 ) W_2+b_2 (2)
虽然在不同的位置上线性转换是相同的,但它们在不同的层中使用不同的参数。另一种描述这一点的方法是两个内核大小为1的卷积。输入输出维数为d_model=512,内层维数为d_ff=2048。

3.4 Embeddings and Softmax

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

3.5位置编码

由于我们的模型不包含递归和卷积,为了使模型能够利用序列的顺序(the order of the sequence),我们必须注入一些关于序列中tokens的相对或绝对位置的信息。为此,我们将"位置编码"添加到编码器和解码器堆栈底部的输入嵌入(embeddings)中。位置编码与嵌入具有相同的维度d_model ,因此可以将两者相加。位置编码有很多选择,可学习的和可固定的[9]。
表1:不同层类型的最大路径长度、每层复杂度和最小顺序操作数。N为序列长度,d为表示维数,k为卷积的核大小,r为受限自注意的邻域大小。
Transformer论文翻译

在这项工作中,我们将使用不同频率的正余弦函数:
Transformer论文翻译

其中pos是位置,i为维度,表示位置编码的每一维对应一个正弦曲线,波长形成从2π到10000*2π的几何轨迹。 我们之所以选择这个函数,是因为我们假设它可以让模型很容易地通过相对位置进行学习,因为对于任何固定的偏移量k,〖PE〗_(pos+k)可以被表示成〖PE〗_pos的线性函数。我们对learned positional embeddings[9]进行了实验,发现两个版本产生了几乎相同的结果(见表3第(e)行)。我们选择正弦波模型是因为它可以让模型外推到比训练中遇到的序列长度更长的序列。

; 4. 为何使用 Self-Attention

在本节中,我们将自注意层的各个方面与通常用于映射一个可变长度的符号表示序列(x_1,...,x_n)映射到其他固定长度序列 (z_1,...,z_n),的循环层和卷积层进行比较,其中x_i,z_i∈R^d。例如编在一个典型的序列转导编码器或解码器中的隐藏层。为了使用自我关注,我们考虑了三个目标。
一个是每层的计算复杂度,另一个是可并行的计算量,用所需的最小顺序操作数来衡量。
学习长期依赖性是许多序列转导任务中的一个关键挑战。影响学习这种依赖性能力的一个关键因素是必须在网络中遍历的前向和后向信号的路径长度。输入序列和输出序列中任意位置组合之间的这些路径越短,学习长期依赖关系就越容易[12]。因此,我们还比较了由不同层类型组成的网络中任意两个输入和输出位置之间的最大路径长度。
如表1所示,一个自我关注层将所有位置与恒定数量的顺序执行操作连接起来,而一个循环层则需要O(N)顺序操作。在计算复杂度方面,当序列长度n小于表示维数d时,自注意层比循环层更快,这是机器翻译中最先进的模型(如word-piece[38]和byte-pair[31] representations)使用的句子表示最常见的情况。为了提高涉及非常长序列的任务的计算性能,可以将自我关注限制为仅考虑以各自输出位置为中心的输入序列中大小为r的邻域。这将把最大路径长度增加到O(n/r)。我们计划在今后的工作中进一步研究这种方法。
核宽k

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,ϵ=10−9。根据如下的公式,我们在整个训练过程中改变了学习速度:Transformer论文翻译

这对应于在第一个warmup_steps的训练步骤中线性地增加学习速率,然后与步骤数的平方反比成比例地减少学习速率。我们使用warmup_steps=4000。

5.4 正则化

我们在训练过程中使用三种类型的正则方案:
Residual Dropout 我们将Dropout[33]应用于每个子层的输出,然后将其添加到子层输入并进行规范化。此外,我们还将Dropout应用于编码器和解码器堆栈中嵌入和位置编码的和。对于基本模型,我们使用P_drop=0.1的速率。
表2:在2014年英语-德语和英语-法语的最新测试中,Transformer比以前的最先进的模型取得了更好的BLEU分数,而培训成本仅为一小部分
Label Smoothing 在训练过程中,我们采用了ϵ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(大)模型使用辍学率Pdrop=0.1,而不是0.3。
对于基本模型,我们使用了一个单一模型,该模型通过均值化最后5个 checkpoints 获得,这些检查点以10分钟的间隔写入。对于大型模型,我们均值化最后20个检查点。我们使用beam search,波束大小为4,长度惩罚α=0.6[38]。这些超参数是在对开发集进行实验后选择的。我们将推理期间的最大输出长度设置为输入长度+50,但在可能的情况下提前终止[38]。
表2总结了我们的结果,并将我们的翻译质量和训练成本与文献中的其他模型架构进行了比较。我们通过乘以训练时间、使用的GPU数量和每个GPU 5的持续单精度浮点容量来估计用于训练模型的浮点操作数。
Transformer论文翻译

; 6.2 模型变体

为了评估Transformer不同组件的重要性,我们以不同的方式改变了我们的基础模型,测量了开发集《2013年新闻测试》中英译德翻译的性能变化。我们使用了前一节中描述的波束搜索,但没有检查点平均值。我们在表3中给出了这些结果。
在表3的第(a)行中,我们改变了注意头的数量、注意键和值的尺寸,保持计算量不变,如第3.2.2节所述。虽然单头关注是0.9布鲁比最佳设置差,质量也下降了与太多的头。
表3:Transformer框架的变体。未列出的值与基本模型的值相同。所有指标都在英德翻译开发集,newstest2013。根据我们的字节对编码,列出的困惑是逐词的,不应该与逐词困惑进行比较
Transformer论文翻译

表4:Transformer很好地概括了英语选区解析(结果见《华尔街日报》第23节)
Transformer论文翻译

在表3行(b)中,我们观察到减少注意键大小dk会损害模型质量。这表明,确定兼容性并不容易,比点积更复杂的兼容性函数可能是有益的。我们在(c)和(d)行中进一步观察到,正如预期的那样,较大的模型更好,而退出对于避免过度拟合非常有帮助。在第(e)行中,我们将正弦位置编码替换为学习的位置嵌入[9],并观察到与基本模型几乎相同的结果。

6.3 英语选区解析

为了评估Transformer是否可以推广到其他任务,我们进行了英语选区分析实验。这项任务提出了具体的挑战:输出受到强大的结构约束,并且明显长于输入。此外,RNN序列到序列模型无法在小数据状态下获得最先进的结果[37]。
我们在宾夕法尼亚州Treebank[25]的《华尔街日报》(WSJ)部分训练了一个4层Transformer,其dmodel=1024,大约有40k个训练句子。我们也在一个半监督的环境中训练它,使用更大的高置信度和Berkleyparser语料库,大约有1700万句话[37]。我们只在wsj设置中使用16Ktoken的词汇表,在半监督设置中使用32K token的词汇表。
我们只做了少量的实验来选择第22节开发集上的辍学、注意力和残余(第5.4节)、学习率和光束大小,所有其他参数从英语到德语的基本翻译模型保持不变。在推理过程中,我们将最大输出长度增加到输入长度+300。我们仅对WSJ和半监督设置使用了21和α=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上找到。
感谢Nal Kalchbrenner和Stephan Gouws丰富的评论、更正和启发。

参考文献

[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.

Original: https://blog.csdn.net/qq_43659401/article/details/122721279
Author: 鸡丝米线
Title: Transformer论文翻译



相关阅读1

Title: window10环境下tensorflow-gpu-2.7.0安装

window10环境下tensorflow-gpu-2.7.0安装:cuda11.1 + cudnn8.1.1 + pycharm2020.3.5 + anaconda2021.11

pycharm2020.3.5

下载链接: pytcharm官网.

anaconda2021.11

下载链接: anaconda清华大学镜像站.

下载链接: anaconda官网.

cuda

下载链接: CUDA Toolkit 11.1.1下载.

Transformer论文翻译
Transformer论文翻译
安装完毕,环境变量自动添加。

; cudnn

下载链接: Download cuDNN v8.1.1 (Feburary 26th, 2021), for CUDA 11.0,11.1 and 11.2.

下载完解压后,将三个文件夹bin,include,lib复制到上一步cuda11安装目录

tensorflow-gpu-2.7.0

pip install tensorflow-gpu -i https://pypi.douban.com/simple

测试

测试一

import tensorflow as tf
print(tf.test.is_gpu_available())

测试二

#测试TensorFlow是否安装GPU支持
import ctypes
import importlib
import sys

def main():
    try:
        import tensorflow as tf
        print("TensorFlow成功安装。")
        if tf.test.is_built_with_cuda():
            print("安装版本的TensorFlow包括GPU支持。")
        else:
            print("安装版本的TensorFlow不包括GPU支持。")
        sys.exit(0)
    except ImportError:
        print("ERROR: Failed to import the TensorFlow module.")
    candidate_explanation = False
    python_version = sys.version_info.major, sys.version_info.minor
    print("\n- Python version is %d.%d." % python_version)
    if not (python_version == (3, 5) or python_version == (3, 6)):
        candidate_explanation = True
        print("Windows的官方发布版本需要Python版本3.5或3.6。")
    try:
        _, pathname, _ = importlib.find_module("tensorflow")
        print("\n- TensorFlow is installed at: %s" % pathname)
    except ImportError:
        candidate_explanation = False
        print("tensorflow")
    try:
        msvcp140 = ctypes.WinDLL("msvcp140.dll")
    except OSError:
        candidate_explanation = True
        print("msvcp140.dll")
    try:
        cudart64_80 = ctypes.WinDLL("cudart64_80.dll")
    except OSError:
        candidate_explanation = True
        print("cudart64_80.dll")
    try:
        nvcuda = ctypes.WinDLL("nvcuda.dll")
    except OSError:
        candidate_explanation = True
        print("nvcuda.dll")
    cudnn5_found = False
    try:
        cudnn5 = ctypes.WinDLL("cudnn64_5.dll")
        cudnn5_found = True
    except OSError:
        candidate_explanation = True
        print("cudnn64_5.dll")
    cudnn6_found = False
    try:
        cudnn = ctypes.WinDLL("cudnn64_6.dll")
        cudnn6_found = True
    except OSError:
        candidate_explanation = True
    if not cudnn5_found or not cudnn6_found:
        print()
        if not cudnn5_found and not cudnn6_found:
            print("- Could not find cuDNN.")
        elif not cudnn5_found:
            print("- Could not find cuDNN 5.1.")
        else:
            print("- Could not find cuDNN 6.")
            print("99-109")
    if not candidate_explanation:
            print("112-114")
    sys.exit(-1)
if __name__ == "__main__":
    main()

另:一些说明
1、本博客仅用于学习交流,欢迎大家瞧瞧看看,为了方便大家学习,相关论文请去知网等地方自行下载。
2、如果原作者认为侵权,请及时联系我,我的qq是1294865211,邮箱是1294865211@qq.com,我会及时删除侵权文章。
3、我的文章大家如果觉得对您有帮助或者您喜欢,请您在转载的时候请注明来源,不管是我的还是其他原作者,我希望这些有用的文章的作者能被大家记住。
4、最后希望大家多多的交流,提高自己,从而对社会和自己创造更大的价值。

Original: https://blog.csdn.net/re7890/article/details/122677400
Author: Perfect崔小姐
Title: window10环境下tensorflow-gpu-2.7.0安装

相关阅读2

Title: Tensorflow自学__1.3张量生成 输出tensor的值

刚开始跟MOOC学习tensorflow,跟着视频写代码,才发现简简单单的代码也有各种小问题。

tensor的值无法显示,始终显示0

一开始输入

a=tf.constant([1,2,3])
print(a)
print(a.dtype)

输出:

Tensor("Const:0", shape=(3, 5), dtype=int64)
<dtype: 'int64'>
(3, 5)

可以看到输出的tensor const:0

为了解决这个问题,我查阅了资料,有两种办法。

第一种办法:

sess=tf.Sesson()
print(sess.run(a))

第二种办法:

with tf.Sesson()
    print(a.eval())

输出的是:

[1 2 3 ]

设置tensor的固定输出

d=tf.zeros([2,3])

e=tf.ones(4)

f=tf.fill([2,3],9)

print(sess.run(d))
print(sess.run(e))
print(sess.run(f))

输出:

[[0. 0. 0.]
[0. 0. 0.]]

[1. 1. 1. 1.]

[[9 9 9]
[9 9 9]]

维度书写

1维:直接写个数
2维:[行,列]
多维:[n,m,j,k,...]

例如:多维 tf.fill( [3,2,3,4],9)
3:[]内部产生3块
2:倒数第二层产生2块
3:倒数第三层产生3块
4:最里层4块(也就是4个数字9)

如图Transformer论文翻译

tensor随机生成

1.生成正态分布的随机数:

g=tf.random_normal([2,3],mean=0.5,stddev=1)
print(sess.run(g))

2.生成截断式正态分布的随机数:

h=tf.random_truncated_normal([2,3],mean=0.5,stddev=1)
print(sess.run(h))

!!!!!!!!!! 出现了BUG!!!!!待解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Transformer论文翻译

查阅了一下官方文档

h=tf.truncated_normal([2,3],mean=0.5,stddev=1)
print(sess.run(h))

这样子就可以运行了,没有报错了,应该是tensorflow2.0很多函数改变了。。

输出:
Transformer论文翻译

3.生成均匀分布
Transformer论文翻译

运行一下
Transformer论文翻译

Original: https://blog.csdn.net/qq_39072370/article/details/124325890
Author: 小蛋小蛋
Title: Tensorflow自学__1.3张量生成 输出tensor的值

相关阅读3

Title: tensorflow1迁移2尝试

最近跟着看了一篇博文《深度学习之卷积神经网络CNN及tensorflow代码实现示例》,学习着里面的代码,但是遇到了问题,那就是发现里面很多是tensorflow1的代码,而我用的是tensorflow2。以这个为例子,研究tensorflow1到2的转换。

tf2直接全局转为tf1,这样代码很快就跑起来了。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

但是,这样没有办法真正让我们掌握tf2,也无法了解其精髓。因此,考虑完全将代码转为tf2。

听说有个tf_upgrade_v2的工具可以快速转换,目前正在研究中。
不过目前经常报错:
'gbk' codec can't decode byte 0x89 in position 561: illegal multibyte sequence
而且根据博文《使用 tf_upgrade_v2 命令把 tensorflow1.x 的代码快速转换成 tensorflow2.0》的转化结果,这里转化的方法,很多函数也只是自动帮你加入了tf.compat.v1,并没有办法真正把你的代码变为tf2的,只能说暂时过渡。
因此,最好还是慢慢搞懂里面的函数,学习经验,彻底代替。

学习了《tensorflow 1.X迁移至tensorflow2 的代码写法》,觉得可以逐步替换函数,同时真正了解tf1与tf2的区别。
tf1基于图模式,tf2基于eager模式,tf2更便于我们编程和调试,尽管目前tf1的代码很多,学习tf1的代码时,应该学习其思想,将其以tf2重新实现。

语法的基本改变

首先,print函数这个会报错,因为旧版本python不用加括号,新版本应该加上括号。
诸如此类的代码:

print X_data.shape

改为:

print (X_data.shape)

采用兼容性语句

有许多函数数,由于学习时间短,我暂时没有好的解决方法,只能是加上tf.compat.v1.这样用了

tf.compat.v1.function()

像tf.reset_default_graph函数,h函数用于清除默认图形堆栈并重置全局默认图形

tf.reset_default_graph()

优化器的选择函数

train_step = tf.train.AdamOptimizer(1e-3).minimize(loss)

值得注意的是,这里还得关闭eager模式

tf.compat.v1.disable_eager_execution()

当然,等后面完全迁移成功后,自然我们要转入这一模式的,但是前期一步步来,慢慢学习如何兼容。

更换为最新的函数

自然,有许多函数我们是可以找到最新的名称的,使用上新的名字或者功能。
tf.placeholder函数,生成占位符

tf_X = tf.placeholder(tf.float32,[None,8,8,1])

考虑采用keras的input函数代替。

tf_X = keras.Input(dtype=tf.float32,shape=[8,8,1])

tf.random_normal用于从"服从指定正态分布的序列"中随机取出指定个数的值

conv_filter_w1 = tf.Variable(tf.random_normal([3, 3, 1, 10]))

这个随机数生成,改起来较为容易

conv_filter_w1 = tf.Variable(tf.random.normal([3, 3, 1, 10]))

tf.nn.moments()函数用于计算均值和方差

 tf.nn.moments(conv_out2, [0, 1, 2], keep_dims=True)

它变动的只是入口参数:

batch_mean, batch_var = tf.nn.moments(conv_out2, [0, 1, 2], shift=None,keepdims=True,name=None)

数学函数,如像计算对数的tf.log、tf.arg_max(input,axis)根据axis取值的不同返回每行或者每列最大值的索引,主要是都归于math之下了。

tf.math.log()
tf.math.argmax(pred,1)

基本思想的改变

到目前为止,也只是简单的函数名改换,还没有涉及tf1和tf2的根本区别。
目前,暂时还无法对session这一块进行改造,因为对于eager模式和图模式的了解还有限,而这也是讲tf1升级为tf2中,感觉是最重要的地方。
tf2的eager模式,让我们很多函数的执行可以无需借助sess.run。

tf.Session() 创建一个新的TensorFlow会话

with tf.Session() as sess

tf.global_variables_initializer()函数

tf.global_variables_initializer()

另外,程序中仍然充斥着大量的sess.run,改完后的训练部分代码如下:


with tf.compat.v1.Session() as sess:

    sess.run(tf.compat.v1.global_variables_initializer())
    for epoch in range(1000):
        for batch_xs,batch_ys in generatebatch(X,Y,Y.shape[0],batch_size):
            sess.run(train_step,feed_dict={tf_X:batch_xs,tf_Y:batch_ys})
        if(epoch%100==0):
            res = sess.run(accuracy,feed_dict={tf_X:X,tf_Y:Y})
            print (epoch,res)
    res_ypred = y_pred.eval(feed_dict={tf_X:X,tf_Y:Y}).flatten()
    print (res_ypred)

实际上,tf2中,sess.run根本无需使用,期望写成的代码是:


for epoch in range(1000):
    for batch_xs,batch_ys in generatebatch(X,Y,Y.shape[0],batch_size):
        train_step=model.cal_train_step(batch_xs,batch_ys)
    if(epoch%100==0):
        res = accuracy=model.cal_accuray(X,Y)
        print (epoch,res)
res_ypred = y_pred.eval(feed_dict={tf_X:X,tf_Y:Y}).flatten()
print (res_ypred)

这里的model这个类还没有建立好,但是目前的设计思想是这样,可以把整个网络封装为一个类,步长和精度的计算作为其中一个方法,在循环中调用,让代码变得面向对象,真正发挥tf2的优势。

Original: https://blog.csdn.net/finhaz/article/details/122715129
Author: finhaz
Title: tensorflow1迁移2尝试