首页 > 其他分享 >搞懂Transformer结构,看这篇PyTorch实现就够了

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

时间:2024-09-03 17:25:30浏览次数:19  
标签:Transformer attention 模型 Attention Encoder PyTorch 位置 搞懂


前言

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

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

“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版本)

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实现就够了_语言模型_02

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实现就够了_语言模型_03

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

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

2. Encoder和Decoder

Encoder

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

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

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

搞懂Transformer结构,看这篇PyTorch实现就够了_深度学习_06

搞懂Transformer结构,看这篇PyTorch实现就够了_语言模型_07

搞懂Transformer结构,看这篇PyTorch实现就够了_人工智能_08

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

搞懂Transformer结构,看这篇PyTorch实现就够了_深度学习_09

Dncoder

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

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

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

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

搞懂Transformer结构,看这篇PyTorch实现就够了_深度学习_12

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

3. Attention

搞懂Transformer结构,看这篇PyTorch实现就够了_语言模型_14

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

搞懂Transformer结构,看这篇PyTorch实现就够了_语言模型_16

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

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

搞懂Transformer结构,看这篇PyTorch实现就够了_深度学习_18

搞懂Transformer结构,看这篇PyTorch实现就够了_深度学习_19

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实现就够了_人工智能_20

6. Embedding和Softmax

搞懂Transformer结构,看这篇PyTorch实现就够了_语言模型_21

7. 位置编码

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

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

搞懂Transformer结构,看这篇PyTorch实现就够了_语言模型_24

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

8. 完整模型

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

搞懂Transformer结构,看这篇PyTorch实现就够了_深度学习_25

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

搞懂Transformer结构,看这篇PyTorch实现就够了_人工智能_26

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

搞懂Transformer结构,看这篇PyTorch实现就够了_人工智能_27

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

搞懂Transformer结构,看这篇PyTorch实现就够了_深度学习_28

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

搞懂Transformer结构,看这篇PyTorch实现就够了_语言模型_29

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

搞懂Transformer结构,看这篇PyTorch实现就够了_语言模型_30

标签:Transformer,attention,模型,Attention,Encoder,PyTorch,位置,搞懂
From: https://blog.51cto.com/u_16163442/11909380

相关文章

  • 《BERT基础教程:Transformer大模型实战》一本相见恨晚的大模型入门书(附PDF)
    前言随着chatgpt的火热,大模型成为业界新的热点。而未来每个人,不仅仅是人工智能或者计算机行业从业者,未来的工作或多或少可能都会被大模型的影响。所以了解transformer为基础的大模型(Bert,gpt)就很有必要了。本书聚焦谷歌公司开发的BERT自然语言处理模型,由浅入深地介绍了BERT的工......
  • 【论文】OmniVec2:一种基于Transformer的新型大规模网络多模态多任务学习
    前言《OmniVec2:ANovelTransformerbasedNetworkforLargeScaleMultimodalandMultitaskLearning》研究背景研究问题:这篇文章提出了一种新的多模态多任务网络及其相关的训练算法,旨在处理来自约12种不同模态的数据,包括图像、视频、音频、文本、深度、点云、时间序列、表格、图......
  • pyro plate的介绍,plate也能设置cuda pytorch概率编程 贝叶斯神经网络
    class plate(name: str, size: Optional[int] = None, subsample_size: Optional[int] = None, subsample: Optional[torch.Tensor] = None, dim: Optional[int] = None, use_cuda: Optional[bool] = None, device: Optional[str] = None)[source]¶基......
  • python 数据分析 损失数值 如何放到csv中呢 人工智能 深度神经网络,Pytorch ,tensorflo
    损失数值如何放到csv中呢 在Python中,使用`csv`模块将数据写入CSV文件是一种常见的操作。从你提供的代码片段来看,你想要将损失数值写入名为`middle_losse.csv`的文件中。但是,你提供的代码片段中存在一些需要修改的地方,以确保数据能够正确地写入CSV文件。首先,`csv.writer`对象的`wr......
  • pyro 概率编程语言 能直接调用pytorch的save函数保存模型,贝叶斯神经网络
    NeuralNetworks—Pyrodocumentationhttps://docs.pyro.ai/en/stable/nn.htmldocs.pyro.ai/en/stable/nn.html神经网络¶该模块pyro.nn提供在深度概率编程上下文中有用的神经网络模块的实现。烟火模块¶Pyro包括一个类PyroModule,的子类torch.nn.Module,其属性可以被火焰效果修......
  • 论文阅读01-Improving Closed and Open-Vocabulary Attribute Prediction using Trans
    论文框架研究背景和动机这篇论文试图解决什么问题?为什么这个问题重要?这个问题在当前的研究领域中有哪些已知的解决方案?研究方法和创新点论文提出了什么新的方法或模型?这个方法或模型是如何工作的?它与现有的方法相比有哪些改进?论文中的创新点是否显著且有实际意义?理......
  • 大模型书籍推荐:大模型黑书《基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处
    一、内容介绍Transformer正在颠覆AI领域。这本书将引导你使用HuggingFace从头开始预训练一个RoBERTa模型,包括构建数据集、定义数据整理器以及训练模型等。《基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理》分步展示如何微调GPT-3等预训练模型。研究机器翻......
  • 第J2周:ResNet50V2算法实战与解析(pytorch版)
    >-**......
  • 2分钟搞懂如何计算uart速率
    一、前言1960年代,DEC(DigitalEquipmentCorp)公司的GordonBell采用大约50个分离元件设计了一个电路板,发明了UART。时至今日,已经60多年,虽然在个人消费类电子产品中,UART已近乎绝迹;但在工业、科研、国防、航空/航天等领域,UART却无处不在。很多从事多年嵌入式开发的老铁居然还不会......
  • PyTorch构建模型训练模块
    前面几篇分别是数据导入模块,模型类的构建模块,损失函数模块,优化器模块,上述模块搭建好后建立训练模块,将上述几个模块在训练模块中调用完成训练。这个不太好解释直接看模块示例: 上面是训练模块,分别传入训练总轮次steps,实例化模型model,损失函数loss_func,但是下面训练的时候它将损......