论文日记四:Transformer(论文解读+NLP、CV项目实战)
导读
重磅模型transformer,在2017年发布,但就今天来说产生的影响在各个领域包括NLP、CV这些都是巨大的!
Paper《Attention Is All You Need》,作者是在机器翻译这个领域进行的实验,当然我们今天知道它被应用到了很多地方,作者也在结论部分说它将被应用到图像、音频、视频等任务中,本文以机器翻译任务来解释transformer网络结构,之后还会在cv任务中进行介绍。

论文首先指出当前LSTM、GRU这些RNN系列网络和CNN存在的问题:
1) RNN使用隐藏层存储并传递前面时刻的信息,只能从左到右依次计算或从右至左依次计算,这限制了模型的并行能力;
2) RNN在序列过长会导致梯度爆炸或者梯度消失,这种顺序计算的过程中会有信息的丢失;
3) CNN使用卷积每次看比较小的窗口,对于距离较远的像素,需要用多层卷积一层层扩大感受野才能把两个像素建立关系;
而transformer能同时提取所有上下文信息,具有更好的并行性,符合GPU框架,并且将序列中的任意两个位置之间的距离都缩小为1,解决了长序列的依赖问题。
网络模型
Transformer的结构如下,它是一种encoder-decoder结构,现在来一个个解读其结构:

Encoder
- Embedding: 这里可理解为将我们喂进去数据集的语料(词)转化成特征向量,论文中使用的词嵌入向量的维度为512;
- Self-attention:这是Transformer的核心,在encoder中进入Multi-Head Attention(多个self-attention集成)的线有一条变成三条,这里表示每个词向量复制成3个向量,它们分别是Query向量(Q)、Key向量(K)和Value向量(V),由于它们三都是自己复制过来的,因此称为自注意力机制,他们的计算公式如下:

这里为什么要有Q,K,V呢,结合公式看下面示意图:

上述示意图展示了self-attention的计算过程,首先将输入转为嵌入向量,根据嵌入向量得到q,k,v三个向量,为每一个计算一个相似度q*k,为了梯度稳定,除以了根号dk,再经过softmax层就会得到一个非负、加起来和为1的权重分布,再与v相乘,之后加权得到输出的结果。
根据嵌入向量怎么得到q、k、v的呢? 看示意图,基于矩阵的方式得到:

- Multi-Head Attention:
Multi-Head Attention可以看成h个不同的self-attention的集成,论文中h设为了8,那为什么要有multi-head attention模块呢?一个解释是,我们希望它能像卷积里的多通道一样,不同的self-attention我们希望它看到不一样的东西,这种结构能将输入向量映射到不同的空间维度,提高transformer的抽取语义信息的能力,它的示意图如下:

上图左侧示意图就是上述我们讲过的self-attention的计算过程,不过其中有个Mask的红色模块,这个我们放到后面介绍。右侧就是Multi-Head Attention模块,它先将Q、k、V输入,通过不同的线性层映射到不同的空间(每个空间是一个头),再分别在这些空间中进行左侧示意图的计算,最后将得到的结果进行拼接,再经过一个额外的映射层映射到原来的空间,这是计算公式:

- Add & Norm:
这是残差连接及归一化层,缓解网络随着深度的增加退化问题,能使模型训练得更深,归一化层用的是Layer Normalization(LN),它在有循环机制的网络和batchsize较小的时候效果好,它和Batch Normalization(BN)的区别在于归一化的维度是相互垂直的,其示意图如下:

左侧是LN,它取的是同一个样本的不同通道做归一化;右侧是BN,它是取不同样本的同一通道的特征做归一化;那这里实际用起来有什么不一样呢?为什么transformer里是用的LN呢?首先第一个问题,我们可以从示意图中看到BN是按照样本计算归一化统计量的,我们知道,在NLP任务中,样本尺度不一,这种情况下算出的单个batch样本的均值和方差不能反映全局的统计分布信息,当测试时我们遇到大度大于任何一个训练样本的测试样本时,无法找到保持的归一化统计量。而LN与样本数多少无关,它根据样本的特征数做归一化,更符合NLP的规律。举个简单例子,如果把一批文本组成一个batch,BN就是对 batch 中每句话的同一位置的词进行操作,而 LN是对每一句 句子中的所有词 进行操作,这样的LN是不是更符合NLP了。
- Feed Forward:
论文中称此层为Position-wise Feed-Forward Network,它是由两个线性层和中间的一个由Relu组成的激活层构成。可以看做是kernel size 为1的卷积。输入的维度是512,中间层的维度是2048。
Decoder
- Masked Multi-Head Attention
我们知道作为decoder在预测当前步的时候,是不能让模型知道后面的内容的,而attention的计算方式是能够得到全局的信息,因此设计了这个模块,它具体的实现方法是:当预测第t步时,将t后面的变成很大的负数,这样经过softmax后这些负数就变成0了。
- Decoder流程解读
可以看到decoder也是有N层堆叠起来,对于其中的每一层,上半部分是与encoder结构一样,下半部分是由上面介绍的Masked Multi-Head Attention接上残差连接和LN层组成,我们注意到上半部分的输入来自两个部分,K、V来自Encoder的输出,而Q来自与解码器的上一个下半部分的输出,其计算方式就是我们上述介绍过的Attention的计算方法。之后经线性层、softmax得到反映每个单词概率的输出向量。
- Position Embedding:
我们从Transformer的模型结构中看到无论时encoder还是decoder都有一个Position模块,这是因为到目前为止我们介绍的transformer模型并没有捕捉顺序序列的能力,也就是说无论句子的结构怎么打乱,Transformer都会得到类似的结果,不像RNN,它从左至右计算,天生就有序列顺序能力。
因此论文中在编码词向量时引入了位置编码(Position Embedding)的特征,位置编码会在词向量中加入了单词的位置信息,这样Transformer就能区分不同位置的单词了。编码公式如下:

其中pos表示单词的位置,i表示emdedding向量中的位置,即512维中的每一维;
对于每个位置pos进行编码,然后与相应位置的word embedding进行相加,构成当前位置的新word embedding。
论文总结
1)Transformer不同与RNN需要从左至右计算,可以直接捕捉全文信息,算法的并行性非常好,且其设计最大的带来性能提升的关键是将任意两个单词的距离是1,这对解决NLP中棘手的长期依赖问题是非常有效的。
2)Embeddings and Softmax: 论文中将embedding层的参数与最后的Softmax层之前的线性变换层参数进行了共享,并且在embedding层,将嵌入的结果乘上维度的根号,这是为了缩小他们的间距。
3) 训练细节:初始化:PyTorch里面实现的是nn.xavier_uniform,优化器是以β1=0.9,β2=0.98和ϵ=10的负9次方的Adam为基础;正则化采用了两种,第一种是dropout,作用在Position-wise Feed-Forward Networks层的一个sub-layer的输出在加上下一个sublayer的输入做nomalized之前应用dropout,同时在embeddings和positional encodings求和时应用droput,论文种dropout设为0.1;第二种是Label Smoothing,这里论文取的ϵ=0.1,他们发现会损失困惑度,但能提升准确率和BLEU值,今天来看,label smoothing为什么能提点?它能合均匀分布,用更新的标签向量来代替传统的独热编码,这样label smoothing后的分布就相当于往真实分布中加入噪声,避免模型对于正确标签over confidences,使得预测正负样本的输出值差别不那么大,从而避免过拟合,提高模型的泛化能力。
4)transformer架构成为超大型自然语言文本预训练微调范式的奠基石,后来的Bert,GPT2这些都有其贡献,当然我们今天知道在图像这些任务上也大放异彩,其让文本、图像等多模态可集成在同一框架内。
实战训练
我提供了两种基于transformer的demo项目演示,分别在NLP任务的文本分类和CV任务
NLP
这里搭建了一个基于transformer的结构来进行文本分类任务的demo,你可以在github上访问。
CV
这里搭建了一个基于transformer的网络结构来进行detection任务的demo,你可以在github上访问。
论文日记四:Transformer(论文解读+NLP、CV项目实战)的更多相关文章
- Python NLP完整项目实战教程(1)
一.前言 打算写一个系列的关于自然语言处理技术的文章<Python NLP完整项目实战>,本文算是系列文章的起始篇,为了能够有效集合实际应用场景,避免为了学习而学习,考虑结合一个具体的项目 ...
- PGL图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]
原项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5100049?contributionType=1 1.图学习技术与应用 图是一个复杂 ...
- oracle入坑日记<四>表空间
1 表空间是什么 1.1.数据表看做的货品,表空间就是存放货品的仓库.SQLserver 用户可以把表空间看做 SQLserver 中的数据库. 1.2.引用[日记二]的总结来解释表空间. 一个数 ...
- 【论文解析】MTCNN论文要点翻译
目录 0.论文连接 1.前言 2.论文Abstract翻译 3.论文的主要贡献 4.4 训练 5 模型性能分析 5.1 关于在线挖掘困难样本的性能 5.2 将人脸检测与对齐联合的性能 5.3 人脸检测 ...
- NLP 自然语言处理实战
前言 自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和 ...
- 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理
温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...
- 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方 ...
- Android项目实战(四十九):Andoird 7.0+相机适配
解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...
- Android项目实战(四十四):Zxing二维码切换横屏扫描
原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=&q ...
随机推荐
- 30-externals(拒绝某些包被打包进来)
const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module. ...
- React 监听页面滚动,界面动态显示
以下是常见的监听滚动以及相应的操作 窗口滚动事件 当页面滚动时,如何动态切换布局/样式 1. 添加滚动事件的监听/注销 1 //在componentDidMount,进行scroll事件的注册,绑定一 ...
- 2023-04-06:拥抱Golang,优化FFmpeg音频编码器,探究encode_audio.c的内部结构。
2023-04-06:拥抱Golang,优化FFmpeg音频编码器,探究encode_audio.c的内部结构. 答案2023-04-06: 见moonfdd/ffmpeg-go库. 这段代码是一个示 ...
- Java 世界的法外狂徒:反射
概述 反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段.方法.构造函数等)的能力.通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态查找和调用. 虽 ...
- 从源码角度剖析 golang 如何fork一个进程
从源码角度剖析 golang 如何fork一个进程 创建一个新进程分为两个步骤,一个是fork系统调用,一个是execve 系统调用,fork调用会复用父进程的堆栈,而execve直接覆盖当前进程的堆 ...
- App性能测试之iTest
本文主要介绍下App性能测试工具iTest_V4.7的使用. 功能简介 1.监控Andorid系统(支持手机,平板,电视,车机等智能终端设备)以及应用app的cpu.内存.流量.电池.帧率.页面耗时等 ...
- STL-vector(ACM)
1.长度可变的数组 2.这里不是很懂,v.size() 代码源里说这个v.size()是无符号类型的,使用时要说明类型, 但是我在使用时并没有出现warning,有大佬知道原因吗? 前置板子 3.ve ...
- 【Leetcode】 # 20 有效的括号 Rust Solution About Rust Stack implement
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合.注意空字符 ...
- 02. vmware搭建centos虚拟机并使用静态ip,局域网内可互通
一.虚拟机镜像地址 我这里有镜像 二.目的 使用vmware搭建centos虚拟机集群,进行基础服务搭建,对系统业务提供服务支撑 三.效果 centos虚拟机ip不会自动改变,使用设置的静态ip,可以 ...
- MyBatis体系笔记
MyBatis 什么是MyBatis MyBatis是优秀的持久层框架 MyBatis使用XML将SQL与程序解耦,便于维护 MyBatis学习简单,执行高效,是JDBC的延伸 1.MyBatis开发 ...