热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

搞懂Transformer结构,看这篇PyTorch实现就够了(上)

作者|AlexanderRush翻译|哈工大SCIR赵正宇来源|哈工大SCIR下面分享一篇实验室翻译的来自哈佛大学一篇关于Transformer的详细博文。“Attentionis

作者 | Alexander Rush

翻译 | 哈工大SCIR赵正宇

来源 | 哈工大SCIR

下面分享一篇实验室翻译的来自哈佛大学一篇关于Transformer的详细博文。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

“Attention is All You Need”[1] 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,还为许多NLP任务提供了新的结构。虽然原文写得很清楚,但实际上大家普遍反映很难正确地实现。

所以我们为此文章写了篇注解文档,并给出了一行行实现的Transformer的代码。本文档删除了原文的一些章节并进行了重新排序,并在整个文章中加入了相应的注解。此外,本文档以Jupyter notebook的形式完成,本身就是直接可以运行的代码实现,总共有400行库代码,在4个GPU上每秒可以处理27,000个tokens。

想要运行此工作,首先需要安装PyTorch[2]。这篇文档完整的notebook文件及依赖可在github[3] 或 Google Colab[4]上找到。

需要注意的是,此注解文档和代码仅作为研究人员和开发者的入门版教程。这里提供的代码主要依赖OpenNMT[5]实现,想了解更多关于此模型的其他实现版本可以查看Tensor2Tensor[6] (tensorflow版本) 和 Sockeye[7](mxnet版本)

  • Alexander Rush (@harvardnlp[8] or srush@seas.harvard.edu)

0. 准备工作

# !pip install http://download.pytorch.org/whl/cu80/torch-0.3.0.post4-cp36-cp36m-linux_x86_64.whl numpy matplotlib spacy torchtext seaborn

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

内容目录

准备工作

背景

模型结构

– Encoder和Decoder

– Encoder

– Decoder

– Attention

– Attention在模型中的应用

– Position-wise前馈网络

– Embedding和Softmax

– 位置编码

– 完整模型

(由于原文篇幅过长,其余部分在下篇)

训练

– 批和掩码

– 训练循环

– 训练数据和批处理

– 硬件和训练进度

– 优化器

– 正则化

– 标签平滑

第一个例子

– 数据生成

– 损失计算

– 贪心解码

真实示例

– 数据加载

– 迭代器

– 多GPU训练

– 训练系统附加组件:BPE,搜索,平均

结果

– 注意力可视化

结论

本文注解部分都是以引用的形式给出的,主要内容都是来自原文。

1. 背景

减少序列处理任务的计算量是一个很重要的问题,也是Extended Neural GPU、ByteNet和ConvS2S等网络的动机。上面提到的这些网络都以CNN为基础,并行计算所有输入和输出位置的隐藏表示。

在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数随位置间的距离增长而增长,比如ConvS2S呈线性增长,ByteNet呈现以对数形式增长,这会使学习较远距离的两个位置之间的依赖关系变得更加困难。而在Transformer中,操作次数则被减少到了常数级别。

Self-attention有时候也被称为Intra-attention,是在单个句子不同位置上做的Attention,并得到序列的一个表示。它能够很好地应用到很多任务中,包括阅读理解、摘要、文本蕴涵,以及独立于任务的句子表示。端到端的网络一般都是基于循环注意力机制而不是序列对齐循环,并且已经有证据表明在简单语言问答和语言建模任务上表现很好。

据我们所知,Transformer是第一个完全依靠Self-attention而不使用序列对齐的RNN或卷积的方式来计算输入输出表示的转换模型。

2. 模型结构

目前大部分比较热门的神经序列转换模型都有Encoder-Decoder结构[9]。Encoder将输入序列 《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

Transformer的整体结构如下图所示,在Encoder和Decoder中都使用了Self-attention, Point-wise和全连接层。Encoder和decoder的大致结构分别如下图的左半部分和右半部分所示。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

2. Encoder和Decoder

Encoder

Encoder由N=6个相同的层组成。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

我们在每两个子层之间都使用了残差连接(Residual Connection) [11]和归一化 [12]。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

每层都有两个子层组成。第一个子层实现了“多头”的 Self-attention,第二个子层则是一个简单的Position-wise的全连接前馈网络。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

Dncoder

Decoder也是由N=6个相同层组成。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

除了每个编码器层中的两个子层之外,解码器还插入了第三种子层对编码器栈的输出实行“多头”的Attention。 与编码器类似,我们在每个子层两端使用残差连接进行短路,然后进行层的规范化处理。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

3. Attention

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

“多头”机制能让模型考虑到不同位置的Attention,另外“多头”Attention可以在不同的子空间表示不一样的关联关系,使用单个Head的Attention一般达不到这种效果。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

4. Attention在模型中的应用

Transformer中以三种不同的方式使用了“多头”Attention:

1) 在”Encoder-Decoder Attention”层,Query来自先前的解码器层,并且Key和Value来自Encoder的输出。Decoder中的每个位置Attend输入序列中的所有位置,这与Seq2Seq模型中的经典的Encoder-Decoder Attention机制[15]一致。

2) Encoder中的Self-attention层。在Self-attention层中,所有的Key、Value和Query都来同一个地方,这里都是来自Encoder中前一层的输出。Encoder中当前层的每个位置都能Attend到前一层的所有位置。

3) 类似的,解码器中的Self-attention层允许解码器中的每个位置Attend当前解码位置和它前面的所有位置。这里需要屏蔽解码器中向左的信息流以保持自回归属性。具体的实现方式是在缩放后的点积Attention中,屏蔽(设为负无穷)Softmax的输入中所有对应着非法连接的Value。

5. Position-wise前馈网络

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

6. Embedding和Softmax

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

7. 位置编码

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

我们也尝试了使用预学习的位置Embedding,但是发现这两个版本的结果基本是一样的。我们选择正弦曲线版本的实现,因为使用此版本能让模型能够处理大于训练语料中最大序了使用列长度的序列。

8. 完整模型

下面定义了连接完整模型并设置超参的函数。

《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》
《搞懂Transformer结构,看这篇PyTorch实现就够了(上)》

END. 参考链接

[1]
https://arxiv.org/abs/1706.03762

[2]
https://pytorch.org/

[3]
https://github.com/harvardnlp/annotated-transformer

[4]
https://drive.google.com/file/d/1xQXSv6mtAOLXxEMi8RvaW8TW-7bvYBDF/view?usp=sharing

[5]
http://opennmt.net

[6]
https://github.com/tensorflow/tensor2tensor

[7]
https://github.com/awslabs/sockeye

[8]
https://twitter.com/harvardnlp

[9]
https://arxiv.org/abs/1409.0473

[10]
https://arxiv.org/abs/1308.0850

[11]
https://arxiv.org/abs/1512.03385

[12]
https://arxiv.org/abs/1607.06450

[13]
https://arxiv.org/abs/1409.0473

[14]
https://arxiv.org/abs/1703.03906

[15]
https://arxiv.org/abs/1609.08144

[16]
https://arxiv.org/abs/1608.05859

[17]
https://arxiv.org/pdf/1705.03122.pdf

原文 :

http://nlp.seas.harvard.edu/2018/04/03/attention.html


推荐阅读
  • 干货 | 携程AI推理性能的自动化优化实践
    作者简介携程度假AI研发团队致力于为携程旅游事业部提供丰富的AI技术产品,其中性能优化组为AI模型提供全方位的优化方案,提升推理性能降低成本࿰ ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 【疑难杂症】allennlp安装报错:Installing build dependencies ... error
    背景:配置PURE的算法环境,安装allennlp0.9.0(pipinstallallennlp0.9.0)报错ÿ ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 「爆干7天7夜」入门AI人工智能学习路线一条龙,真的不能再透彻了
    前言应广大粉丝要求,今天迪迦来和大家讲解一下如何去入门人工智能,也算是迪迦对自己学习人工智能这么多年的一个总结吧,本条学习路线并不会那么 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • Win10+Python3.7+Tensorflow安装
    Win10+Python3.7+Tensorflow安装Step1:安装AnacondaStep2:Tensorflow的安装转载请注明出处:https:blog.csdn.net ... [详细]
  • 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
    前言最近看到很多应届生晒offer,稍有名气点的公司给出的价格都是一年30多W或者月薪20几k,相比之下工作几年的自己薪资确实很寒酸.根据我自己找工作经历,二线城市一般小公司招聘 ... [详细]
  • PyTorch框架中有一个非常重要且好用的包:torchvision,该包主要由3个子包组成,分别是:torchvision.datasets、torchvision.models、torchv ... [详细]
  • TensorFlow入门上
    前置准备在阅读本文之前,请确定你已经了解了神经网络的基本结构以及前向传播、后向传播的基本原理,如果尚未了解,可以查看下文。神经网络初探​chrer.com也可以直接在我博客阅读Te ... [详细]
  • bat大牛带你深度剖析android 十大开源框架_请收好!5大领域,21个必知的机器学习开源工具...
    全文共3744字,预计学习时长7分钟本文将介绍21个你可能没使用过的机器学习开源工具。每个开源工具都为数据科学家处理数据库提供了不同角度。本文将重点介绍五种机器学习的 ... [详细]
  • CodeBERT理解
    1.动机大型的预训练模型,比如ELMo、GPT、Bert等提高了NLP任务的最新技术。这些预训练模型在NLP的成功驱动了多模态预训练模型,比如ViBE ... [详细]
author-avatar
Gray_林剑峰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有