transformer论文解读
- 1. 相关工作
- 2. 模型架构
- 3. 如何理解 Layer Norm
- 4. Encoder 和 Decoder 结构
- 5. 从 attention 到 Scaled Dot-Product Attention
- 6. Multi-Head Attention
- 7. Transformer 的三个 multi-head attention 的原理和作用
- 8. Embedding 和 Softmax 层
- 9. Positional Encoding
- 10. 为什么使用 self-attention!
- 参考资料
1. 相关工作
CNN 的的卷积核窗口大小有限,每次只能看比较短的部分序列,但是它的多通道机制被认为可以去识别多模式,transformer 论文参考这个机制,在 attention 的机制进一步引出了 Muti-Head Attention,来模拟卷积层的多输出通道效果。
Self-attention 在 transformer 论文之前已经有人提出,但 transformer 是第一个只依赖自注意力机制(self-attnetion)来实现 encoder-decoder 架构的模型。
2. 模型架构
(直到 GPT 出来之前)大多数有竞争力的神经序列转换模型都是采用编码器-解码器结构,transformer 模型也不例外。
编码器将输入的符号表示序列 (\(x_1,x_2,…,x_n\)) 映射为一个连续表示序列 (\(z_1,z_2,…, z_n\))。得到编码器输出序列 \(z\) 后,解码器逐个元素的生成符号的输出序列 (\(y_1,y_2…,y_m\))。解码器输出是自回归的,将当前轮的输出和输入拼接,作为下一轮的输入。
Transformer 的基本组件是: point-wise、self-attention、add & norm、feed forward、linear、softmax。
为了方便残差连接,模型中的所有子层 Sub Layer 以及嵌入层 Embedding Layer 都生成维度为 \(d_{model} = 512\) 的输出向量。
3. 如何理解 Layer Norm
NLP/Transformer 模型的输入是三维向量,batch、句子序列长度 \(n\)、单词映射为 embedding vector 都分别表示为一个维度。
Batch norm 和 layer norm 的区别一句话总结就是 bn 是切特征,ln 是切样本。
BN: 对于每个特征维度,计算它在整个批次中的均值和标准差,然后对该特征进行归一化。LN: 对每个样本单独计算其所有特征的均值和标准差,然后在该样本内进行归一化。

Layer Norm 层的计算可视化如下图所示:

4. Encoder 和 Decoder 结构
Decoder 同样由 \(N = 6\) 个相同的层组成。Decoder 的 attention 是带掩码的,确保位置 \(i\) 的预测只能依赖于小于 \(i\) 的已知输出。
5. 从 attention 到 Scaled Dot-Product Attention
标准自注意力的数学表达式如下:
\]
1,首先,注意力函数可以描述为将一个查询(query)和一组键-值对(key-value pairs)映射到一个输出 output,\(q\)、\(k\)、\(v\) 都是向量。输出都是对 value 进行加权求和得到的,每个 value 对应的权重 weight 是通过 \(q\) 和 \(k\) 之间的相似度计算得到。
2,将 q 和 k 的内积作为相似度(Dot-Product),然后除以向量的长度 \(\sqrt{d_k}\)(Scaled),结果再应用 softmax 函数,就会得到 \(n\) 个非负且相加求和等于 \(1\) 的权重向量,最后将权重应用于 value,就得到了最终输出 output。
余弦相似度常用来比较两个向量的相似度(距离),伪代码如下:
CosineSimilarity = sum(x[i]*y[i])/(sqrt(sum(x[i]*x[i]))*sqrt(sum(y[i]*y[i])))。
实际中,为了方便计算,会同时对一组查询(queries)计算注意力函数,将 q、k、v 都是构建成矩阵 \(Q\)、\(K\)、\(V\)( 维度相等),涉及到两个矩阵乘法。
作者提到当向量维度变大的时候,softmax 函数会造成梯度消失问题,所以设置了一个 softmax 的 temperature 来缓解这个问题。这里 temperature 被设置为了 \(\sqrt{d_k}\)。
作者提出的注意力机制算法跟之前的 Dot-Product Attention 相比就是单纯多了 Scaled(除以 \(\sqrt{d_k}\))。
另外 decoder 模块的 attention 多了一个 Mask,实际是第 \(t\) 时刻的 \(q\) 只能看前面阶段的对应的 \((k, v)\) 对,计算当中表现就是对于 \(q_t\) 和 \(k_t\) 及其之后的那些权重值都替换成一个极大的负数,这样经过 softmax 后(做指数 \(e^{w_t}\)),对应位置的 \(v\) 就变成了 0。
6. Multi-Head Attention
Scaled Dot-Product Attention 是不带任何参数的!
与其做单个的注意力函数,不如将 \(Q\)、\(K\)、\(V\) 投影到一个低维度、投影 \(h\) 次,然后再做 \(h\) 次的自注意力函数,并将这 \(h\) 个函数的输出拼接在一起,最后再次进行线性投影回来。
\text{Where} \ \text{head}_i = Attention (QW_i^Q, KW_i^K, VW_i^V)\]
\(Q\)、\(K\) 的线性(映射)层的权重维度是 \([d_\text{model}, d_k]\),\(V\) 的线性(映射)层的权重维度是 \([d_{model}, d_v]\),输出线性(映射)层权重维度是 \([h*d_v, d_{model}]\)。
作用:多头注意力机制可以注意到不同子空间的信息,捕捉到更加丰富的特征信息,实现类似卷积核的多通道机制的效果。

7. Transformer 的三个 multi-head attention 的原理和作用

原理:
- 解码器中的第二个注意力层,其查询 \(q\) 来自前一层的解码器层,但 \(k\)、\(v\) 来自于编码器最后一层的输出。
- 编码器第一个注意力层:不考虑多头和线性投影层的情况,三个输入 \(q\) \(k\) \(v\) 本质上都是一个东西,三个输入都是原始输入本身自己,输出就是输入本身的加权和,而权重又来源自己本身跟跟各个向量的相似度函数,所以也叫自注意力层(self-attention)。
- 解码器的第一个注意力层:编码器的最终输出作为 key value 输入进来,解码器下一层的输出作为 query 输入进来。
作用:
Self-Attention(自注意力):对于每个位置上的 token,Self-Attention 将其与序列中的所有其他位置进行关联,从而使模型能捕捉到句子内部的语义关系。Encoder-Decoder Attention(编码器-解码器注意力):允许解码器在生成下一个词时参考编码器的输出。这种机制实现了输入和输出序列之间的联系,是实现翻译等任务的关键所在。Masked Self-Attention(掩码自注意力):过掩码机制屏蔽掉序列中未来位置的 tokens,从而确保模型预测生成的每个 token 仅依赖于当前生成位置之前的 tokens。
从 nlp 角度理解 Attention + MLP: Attention 负责从全局的角度把整个序列的信息聚合起来(捕捉上下文信息 + 信息聚合),然后用 MLP 做语义的转换。
8. Embedding 和 Softmax 层
Embedding 层的作用学习一个长为 \(d_{model}\) 的向量来表示 token,编码器和解码器的输入都需要 embedding 层,两个嵌入层和 softmax 之前的线性变换之间共享相同的权重矩阵重(维度都是一样的),并且将权重值乘以 \(\sqrt{d_{model}}\)。
学习 embedding 时,可能会把每个向量的 \(\text{L2\ norm}\) 学得相对较小(维度越大权重值越小),乘以 \(\sqrt{d_{model}}\) 后放大,使得和 PE 相加时在 scale 上匹配。
L2 归一化(L2 Norm)是一种将向量缩放到单位长度的操作,使得向量的模为1。对于一个给定向量 \(\mathbf{v}\) ,L2 归一化后的向量 \(\mathbf{\hat{v}}\),计算公式如下:
\]
9. Positional Encoding
Attention 层的输出本身是不具备时序信息的,因为其本质是 value 向量的一个加权和,而权重是 query 和 key 的距离,跟序列信息无关。把输入 tokens 位置打乱,attention 的输出向量的所有元素的值大小不会变化,只有元素位置的变化,这显然不符合直觉。
而 Position encoding 层的作用是使得生成的 embedding vectors 值跟位置相关(加入时序信息),更符合人类文字的意义(文字的位置打乱,相应语义肯定会变化)。它的做法是将位置信息编码为向量,并将这些向量加到输入的嵌入向量中。Positional Encoding 通常通过以下公式计算:
PE(pos, 2i+1) = \cos \left(pos/10000^{2i/d}\right)\]
10. 为什么使用 self-attention!
比较了四种不同的层: self-attention、rnn、cnn、self-attention (restricted),分别比较了计算复杂度FLOPs、顺序操作(并行度)、最大路径长度。
参考资料
transformer论文解读的更多相关文章
- [论文解读] 阿里DIEN整体代码结构
[论文解读] 阿里DIEN整体代码结构 目录 [论文解读] 阿里DIEN整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x04 模型基类 4.1 基本逻辑 ...
- 论文解读丨表格识别模型TableMaster
摘要:在此解决方案中把表格识别分成了四个部分:表格结构序列识别.文字检测.文字识别.单元格和文字框对齐.其中表格结构序列识别用到的模型是基于Master修改的,文字检测模型用到的是PSENet,文字识 ...
- NLP论文解读:无需模板且高效的语言微调模型(上)
原创作者 | 苏菲 论文题目: Prompt-free and Efficient Language Model Fine-Tuning 论文作者: Rabeeh Karimi Mahabadi 论文 ...
- itemKNN发展史----推荐系统的三篇重要的论文解读
itemKNN发展史----推荐系统的三篇重要的论文解读 本文用到的符号标识 1.Item-based CF 基本过程: 计算相似度矩阵 Cosine相似度 皮尔逊相似系数 参数聚合进行推荐 根据用户 ...
- CVPR2019 | Mask Scoring R-CNN 论文解读
Mask Scoring R-CNN CVPR2019 | Mask Scoring R-CNN 论文解读 作者 | 文永亮 研究方向 | 目标检测.GAN 推荐理由: 本文解读的是一篇发表于CVPR ...
- AAAI2019 | 基于区域分解集成的目标检测 论文解读
Object Detection based on Region Decomposition and Assembly AAAI2019 | 基于区域分解集成的目标检测 论文解读 作者 | 文永亮 学 ...
- BERT论文解读
本文尽量贴合BERT的原论文,但考虑到要易于理解,所以并非逐句翻译,而是根据笔者的个人理解进行翻译,其中有一些论文没有解释清楚或者笔者未能深入理解的地方,都有放出原文,如有不当之处,请各位多多包含,并 ...
- Gaussian field consensus论文解读及MATLAB实现
Gaussian field consensus论文解读及MATLAB实现 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.Introduction ...
- zz扔掉anchor!真正的CenterNet——Objects as Points论文解读
首发于深度学习那些事 已关注写文章 扔掉anchor!真正的CenterNet——Objects as Points论文解读 OLDPAN 不明觉厉的人工智障程序员 关注他 JustDoIT 等 ...
- NIPS2018最佳论文解读:Neural Ordinary Differential Equations
NIPS2018最佳论文解读:Neural Ordinary Differential Equations 雷锋网2019-01-10 23:32 雷锋网 AI 科技评论按,不久前,NeurI ...
随机推荐
- 2023上海理工大学校内选拔赛A-D题
前言 不要在意标题,既然是随记,就随性点() 今天参加了2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛)_ACM/NOI/CSP/CCPC/ICPC算法编程 ...
- 面试官:JDK中都用了哪些设计模式?
设计模式是前辈们经过实践验证总结的解决方案,帮助我们构建出更具可维护性.可扩展性和可读性的代码.当然,在面试的过程中,也会或多或少的被问到.那么今天,我们就来看一道设计模式中的常见面试问题:JDK 中 ...
- Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程 Xorbits Inference (Xinference) 是一个开源平台,用 ...
- 删除链表倒数第N个节点(19)
双指针法 双指针法主要是最开始有两个指针fast,slow都指向链表的虚拟头节点dummy,然后快指针先移动,这里需要先向后移动n+1位(因为你最终是要找到目标节点的前一个节点),然后slow和fas ...
- ocelot 从15.x版本升级到16.x版本 UnableToFindDownstreamRouteError Message: Failed to mat ch Route configuration for upstream path
项目里面用到 ocelot ,之前老的项目用的是 15.x 最近要一个新项目也要用到,直接安装了最新的16.x,结果死活都匹配不到上游路径. 刚开始以为是自己代码写得有问题,各种找问题,结果后来把oc ...
- 2023/11/16 NOIP 模拟赛
T1 基于1的算术 标签 暴力枚举 思路1 赛时想了个假的 DP,只拿了 77 分,,, 小于 \(10^{15}\) 的仅由 \(1\) 组成的数只有 \(15\) 个,直接枚举即可. 想了一个做法 ...
- 逆向WeChat(六)
上篇回顾,逆向分析mojo,mmmojo.dll, wmpf_host_export.dll,还有如何通过mojoCore获取c++binding的remote或receiver,并调用它们的功能接口 ...
- CSS – Position
前言 定位是 CSS 里蛮重要的一课. 图片黑影 (overlay), back to top button, header, footer 紧贴在屏幕上下方等效果都是靠 position 完成的. ...
- EF Core – Custom Migrations (高级篇)
前言 会写这篇是因为最近开始大量使用 SQL Server Trigger 来维护冗余 (也不清楚这路对不对). EF Core migrations 没有支持 Trigger Github Issu ...
- BOOST库array使用 类似std库的vector
BOOST库的array, 类似std库的vector. 下图所示书籍的下载地址,我的另一篇博客内有记载: https://www.cnblogs.com/happybirthdaytoyou/p/ ...