当前位置: 首页 > news >正文

【深度学习】Transformer简介

 

近年来,Transformer模型在自然语言处理(NLP)领域中横扫千军,以BERT、GPT为代表的模型屡屡屠榜,目前已经成为了该领域的标准模型。同时,在计算机视觉等领域中,Transformer模型也逐渐得到了重视,越来越多的研究工作开始将这类模型引入到算法中。本文基于2017年Google发表的论文,介绍Transformer模型的原理。

 

一、为什么要引入Transformer?

最早提出的Transformer模型[1]针对的是自然语言翻译任务。在自然语言翻译任务中,既需要理解每个单词的含义,也需要利用单词的前后顺序关系。常用的自然语言模型是循环神经网络(Recurrent Neural Network,RNN)和卷积神经网络(Convolutional Neural Network,CNN)。

其中,循环神经网络模型每次读入一个单词,并基于节点当前的隐含状态和输入的单词,更新节点的隐含状态。从上述过程来看,循环神经网络在处理一个句子的时候,只能一个单词一个单词按顺序处理,必须要处理完前边的单词才能开始处理后边的单词,因此循环神经网络的计算都是串行化的,模型训练、模型推理的时间都会比较长。

另一方面,卷积神经网络把整个句子看成一个1*D维的向量(其中D是每个单词的特征的维度),通过一维的卷积对句子进行处理。在卷积神经网络中,通过堆叠卷积层,逐渐增加每一层卷积层的感受野大小,从而实现对上下文的利用。由于卷积神经网络对句子中的每一块并不加以区分,可以并行处理句子中的每一块,因此在计算时,可以很方便地将每一层的计算过程并行化,计算效率高于循环神经网络。但是卷积神经网络模型中,为了建立两个单词之间的关联,所需的网络深度与单词在句子中的距离正相关,因此通过卷积神经网络模型学习句子中长距离的关联关系的难度很大。

Transformer模型的提出就是为了解决上述两个问题:(1)可以高效计算;(2)可以准确学习到句子中长距离的关联关系。

 

二、Transformer模型介绍

如下图所示,Transformer模型采用经典的encoder-decoder结构。其中,待翻译的句子作为encoder的输入,经过encoder编码后,再输入到decoder中;decoder除了接收encoder的输出外,还需要当前step之前已经得到的输出单词;整个模型的最终输出是翻译的句子中下一个单词的概率。

【论文阅读】Transformer简介

现有方法中,encoder和decoder通常都是通过多层循环神经网络或卷积实现,而Transformer中则提出了一种新的、完全基于注意力的网络layer,用来替代现有的模块,如下图所示。图中encoder、decoder的结构类似,都是由一种模块堆叠N次构成的,但是encoder和decoder中使用的模块有一定的区别。具体来说,encoder中的基本模块包含多头注意力操作(Multi-Head Attention)、多层感知机(Feed Forward)两部分;decoder中的基本模块包含2个不同的多头注意力操作(Masked Multi-Head Attention和Multi-Head Attention)、多层感知机(Feed Forward)三部分。

【论文阅读】Transformer简介

在上述这些操作中,最核心的部分是三种不同的Multi-Head Attention操作,该操作的过程如下图所示,可以简单理解为对输入feature的一种变换,通过特征之间的关系(attention),增强或减弱特征中不同维度的强度。模型中使用的三种注意力模块如下:

  • Encoder中的Multi-Head Attention:encoder中的multi-head attention的输入只包含编码器中上一个基本模块的输出,使用上一个基本模块的输出计算注意力,并调整上一个基本模块的输出,因此是一种“自注意力”机制;
  • Decoder中的Masked Multi-Head Attention:Transformer中,decoder的输入是完整的目标句子,为了避免模型利用还没有处理到的单词,因此在decoder的基础模块中,在“自注意力”机制中加入了mask,从而屏蔽掉不应该被模型利用的信息;
  • Decoder中的Multi-Head Attention:decoder中,除了自注意力外,还要利用encoder的输出信息才能正确进行文本翻译,因此decoder中相比encoder多使用了一个multi-head attention来融合输入语句和已经翻译出来的句子的信息。这个multi-head attention结合使用decoder中前一层“自注意力”的输出和encoder的输出计算注意力,然后对encoder的输出进行变换,以变换后的encoder输出作为输出结果,相当于根据当前的翻译结果和原始的句子来确定后续应该关注的单词。

【论文阅读】Transformer简介

除核心的Multi-Head Attention操作外,作者还采用了位置编码、残差连接、层归一化、dropout等操作将输入、注意力、多层感知机连接起来,从而构成了完整的Transformer模型。通过修改encoder和decoder中堆叠的基本模块数量、多层感知机节点数、Multi-Head Attention中的head数量等参数,即可得到BERT、GPT-3等不同的模型结构。

 

三、实验效果

实验中,作者在newstest2013和newstest2014上训练模型,并测试了模型在英语-德语、英语-法语之间的翻译精度。实验结果显示,Transformer模型达到了State-of-the-art精度,并且在训练开销上比已有方法低一到两个数量级,展现出了该方法的优越性。

与已有方法的对比实验,显示出更高的BLEU得分和更低的计算开销:

【论文阅读】Transformer简介

模块有效性验证,模型中每个单次的特征维度、多头注意力中头的数量、基本模块堆叠数量等参数对模型的精度有明显的影响:

【论文阅读】Transformer简介

参考文献

[1] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Łukasz Kaiser, Illia Polosukhin. Attention Is All You Need. NIPS 2017.

 

相关文章:

  • 从权限跳转看Activity的data android:scheme
  • 男生学什么设计专业好优漫教育
  • Python+Qt虹膜检测识别
  • git stash 用法总结
  • 【GUI】-- 10 贪吃蛇小游戏之静态面板绘制
  • SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍
  • 数据结构 线性表
  • CURL踩坑记录
  • MongoDB相关基础操作(库、集合、文档)
  • c语言:回文字符串
  • LeetCode40. Combination Sum II
  • FlinkCDC实现主数据与各业务系统数据的一致性(瀚高、TIDB)
  • Axure插件浏览器一键安装:轻松享受高效工作!
  • 【广州华锐互动】VR虚拟现实技术助力太空探险:穿越时空,探索宇宙奥秘
  • 源启容器平台KubeGien 打造云原生转型的破浪之舰
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Java新版本的开发已正式进入轨道,版本号18.3
  • linux学习笔记
  • Lsb图片隐写
  • Mocha测试初探
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP 7 修改了什么呢 -- 2
  • Webpack 4 学习01(基础配置)
  • yii2权限控制rbac之rule详细讲解
  • 分布式熔断降级平台aegis
  • 前端代码风格自动化系列(二)之Commitlint
  • 阿里云ACE认证之理解CDN技术
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (+4)2.2UML建模图
  • (06)金属布线——为半导体注入生命的连接
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (论文阅读40-45)图像描述1
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 6 集成和使用 mongodb
  • .NET6 命令行启动及发布单个Exe文件
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .Net环境下的缓存技术介绍
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET值类型变量“活”在哪?
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Autowired 与@Resource的区别
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Transactional 竟也能解决分布式事务?
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ C++ ] STL---stack与queue
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [bzoj1038][ZJOI2008]瞭望塔
  • [BZOJ2208][Jsoi2010]连通数
  • [C++提高编程](三):STL初识
  • [CodeForces-759D]Bacterial Melee
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)