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

   2023-03-08 学习力1062
核心提示:搞懂Transformer结构,看这篇PyTorch实现就够了昨天下面分享一篇实验室翻译的来自哈佛大学一篇关于Transformer的详细博文。"Attention is All You Need"[1] 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,

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

昨天
下面分享一篇实验室翻译的来自哈佛大学一篇关于Transformer的详细博文。 搞懂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实现就够了

内容目录

准备工作

背景

模型结构

- 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将输入序列  映射到一个连续表示序列  。

对于编码得到的z,Decoder每次解码生成一个符号,直到生成完整的输出序列: 。对于每一步解码,模型都是自回归的[10],即在生成下一个符号时将先前生成的符号作为附加输入。

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

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

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

2. Encoder和Decoder

Encoder

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

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

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

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

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

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

Dncoder

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

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

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

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

3. Attention

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

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

搞懂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实现就够了

6. Embedding和Softmax

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

7. 位置编码

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

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

8. 完整模型

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

搞懂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

 

想要了解更多资讯,请扫描下方二维码,关注机器学习研究会

                                          

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

 
反对 0举报 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 基于pytorch框架的图像分类实践(CIFAR-10数据集)
    基于pytorch框架的图像分类实践(CIFAR-10数据集
    在学习pytorch的过程中我找到了关于图像分类的很浅显的一个教程上一次做的是pytorch的手写数字图片识别是灰度图片,这次是彩色图片的分类,觉得对于像我这样的刚刚开始入门pytorch的小白来说很有意义,今天写篇关于这个图像分类的博客.收获的知识1.torchvison
    03-08
  • 今天来捋一捋pytorch官方Faster R-CNN代码
    今天来捋一捋pytorch官方Faster R-CNN代码
    AI编辑:我是小将本文作者:白裳https://zhuanlan.zhihu.com/p/145842317本文已由原作者授权 目前 pytorch 已经在 torchvision 模块集成了 FasterRCNN 和 MaskRCNN 代码。考虑到帮助各位小伙伴理解模型细节问题,本文分析一下 FasterRCNN 代码,帮助新手理解
    03-08
  • 从零搭建Pytorch模型教程(三)搭建Transformer网络
    从零搭建Pytorch模型教程(三)搭建Transformer
    ​前言 本文介绍了Transformer的基本流程,分块的两种实现方式,Position Emebdding的几种实现方式,Encoder的实现方式,最后分类的两种方式,以及最重要的数据格式的介绍。 本文来自公众号CV技术指南的技术总结系列欢迎关注公众号CV技术指南,专注于计算机
    03-08
  • 几种网络LeNet、VGG Net、ResNet原理及PyTorch实现
    几种网络LeNet、VGG Net、ResNet原理及PyTorch
    LeNet比较经典,就从LeNet开始,其PyTorch实现比较简单,通过LeNet为基础引出下面的VGG-Net和ResNet。LeNetLeNet比较经典的一张图如下图LeNet-5共有7层,不包含输入,每层都包含可训练参数;每个层有多个Feature Map,每个FeatureMap通过一种卷积滤波器提取输
    03-08
  • Focal Loss 的Pytorch 实现以及实验
    Focal Loss 的Pytorch 实现以及实验
     Focal loss 是 文章 Focal Loss for Dense Object Detection 中提出对简单样本的进行decay的一种损失函数。是对标准的Cross Entropy Loss 的一种改进。 F L对于简单样本(p比较大)回应较小的loss。如论文中的图1, 在p=0.6时, 标准的CE然后又较大的loss
    03-08
  • Pytorch-基础入门之ANN pytorch零基础入门
    在这部分中来介绍下ANN的Pytorch,这里的ANN具有三个隐含层。这一块的话与上一篇逻辑斯蒂回归使用的是相同的数据集MNIST。第一部分:构造模型# Import Librariesimport torchimport torch.nn as nnfrom torch.autograd import Variable# Create ANN Modelclas
    03-08
  • 分享一个PyTorch医学图像分割开源库 python医学图像处理dicom
    分享一个PyTorch医学图像分割开源库 python医学
    昨天点击上方↑↑↑“OpenCV学堂”关注我来源:公众号 我爱计算机视觉授权  分享一位52CV粉丝Ellis开发的基于PyTorch的专注于医学图像分割的开源库,其支持模型丰富,方便易用。其可算为torchio的一个实例,作者将其综合起来,包含众多经典算法,实用性比
    03-08
  • 行人重识别(ReID) ——基于MGN-pytorch进行可视化展示
    行人重识别(ReID) ——基于MGN-pytorch进行可视
    https://github.com/seathiefwang/MGN-pytorch下载Market1501数据集:http://www.liangzheng.org/Project/project_reid.html模型训练,修改demo.sh,将 --datadir修改已下载的Market1501数据集地址,将修改CUDA_VISIBLE_DEVICES=2,3自己的GPU设备ID,将修改--
    03-08
  • Pytorch:通过pytorch实现逻辑回归
    Pytorch:通过pytorch实现逻辑回归
    logistic regression逻辑回归是线性的二分类模型(与线性回归的区别:线性回归是回归问题,而逻辑回归是线性回归+激活函数sigmoid=分类问题)模型表达式:f(x)称为sigmoid函数,也称为logistic函数,能将所有值映射到[0,1]区间,恰好符合概率分布,如下图所示
    03-08
  • 在 Windows 上为 Pytorch 和 Pytorch Geometric 构建 GPU 环境
    在 Windows 上为 Pytorch 和 Pytorch Geometric
    介绍这是我的第一篇文章。在研究机器学习时,我在使用 Pytorch 和 Pytorch Geometric 构建 GPU 环境时遇到了很多麻烦,所以我想留下我构建环境所做的工作。我希望这可以帮助任何处于类似情况的人。环境操作系统语GPUWindows 11 家庭 64 位蟒蛇 3.9.13RTX3060
    03-08
点击排行