transformer 总结(超详细-初版)

news2024/12/22 17:25:33

相关知识链接

  • attention1
  • attention2

引言

  • 本文主要详解 transformer 的算法结构以及理论解释,代码实现以及具体实现时候的细节放在下一篇来详述。
  • 下面就通过上图中 transformer 的结构来依次解析

输入部分(Encode 侧)

  • input 输出主要包含 两个部分:embedding 的输入数据, 数据位置的 embedding
    • 关于输入数据的 embedding 有很多种方式,比如word2vec,GloVe,FastText 等(注意embedding 和热编码,向量化不一回事)
    • 关于位置的 embedding,因为 transformer使用的全局信息而不是单纯的利用单词的之间的顺序信息,所以位置信息十分重要,transformer 使用位置 embedding 来保存单词在序列中的相对或者绝对位置
      • 位置 embedding 用 PE 表示,PE 可以通过训练得到(比如 bert 的位置信息),也可以使用自定义公式得到,transformer 使用的是公式
        P E ( p o s , 2 i ) = S i n ( p o s / 10000 0 ( 2 i / d ) ) PE_(pos, 2i) = Sin(pos/100000^(2i/d)) PE(pos,2i)=Sin(pos/100000(2i/d))
        P E ( p o s , 2 i + 1 ) = C o s ( p o s / 10000 0 ( 2 i / d ) ) PE_(pos, 2i+1) = Cos(pos/100000^(2i/d)) PE(pos,2i+1)=Cos(pos/100000(2i/d))
      • pos 表示 0 - N; i 表示 嵌入维度比如是 512 维,i 就表示 0 - 511
      • 看上图,首先位置和词的 embedding维度要一致因为后面要相加;其次就是 N表示位置的个数,上述公式将向量的维度划分为奇数行和偶数行,偶数使用 sin 函数编码,奇数采用 cos 函数编码并按照原始行号拼接
  • 为什么要用这个编码方式呢?
    • 可以让模型更容易计算出相对位置,比如 PE(pos+k,2i)可以通过计算 PE(pos,2i)得到,类比 sin(A+B)展开
    • 使用这样的方式可以让模型能适应比训练集更长的句子,比如训练集中最长的句子是 20,现在来了一个 长度 21 的也能够根据公式计算出第 21 位的 embeding(注:当单词 embeding 后无论原始数据多长嵌入后的长度是一定的,但是未出现过的位置信息不确定但是不影响 embeding 的维度这样才能保证单词和位置embeding 可以相加)
      P E ( p o s + k , 2 i ) = P E ( p o s , 2 i ) ∗ P E ( k , 2 i + 1 ) + P E ( p o s , 2 i + 1 ) ∗ P E ( k , 2 i ) PE(pos+k,2i) = PE(pos,2i) * PE(k,2i+1) + PE(pos,2i+1) * PE(k,2i) PE(pos+k,2i)=PE(pos,2i)PE(k,2i+1)+PE(pos,2i+1)PE(k,2i)
      P E ( p o s + k , 2 i + 1 ) = P E ( p o s , 2 i + ! ) ∗ P E ( k , 2 i + 1 ) − P E ( p o s , 2 i ) ∗ P E ( k , 2 i ) PE(pos+k,2i+1) = PE(pos,2i+!) * PE(k,2i+1) - PE(pos,2i) * PE(k,2i) PE(pos+k,2i+1)=PE(pos,2i+!)PE(k,2i+1)PE(pos,2i)PE(k,2i)
  • 这就是encode 侧的 input 输入了

self-attention&multi-head attention

  • 此部分文章开头链接attention2有详细讲解,本文不做细讲,也可以参考下面两个参考资料也是剖析的比较通俗易懂。
  • 参考 1
  • 参考 2

Add & Norm

  • Add 和 Norm 层是由Add 和 Norm 两部分构成的计算公式如下:
    L a y e r N o r m ( X + M u l t i H e a d A t t e n t i o n ( X ) ) LayerNorm(X + MultiHeadAttention(X)) LayerNorm(X+MultiHeadAttention(X))
    L a y e r N o r m ( X + F e e d F o r w a r d ( X ) ) LayerNorm(X + FeedForward(X)) LayerNorm(X+FeedForward(X))
    • X表示多头或者前馈神经网络的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。
    • X + MultiHeadAttention(X)是一种残差连接,通常用于解决多层网络梯度消失和梯度爆炸的问题,可以让网格只关注当前差异的部分,在 ResNet 中经常用到,公式简单表达就是
      输出 = 输入 + F ( 输入 ) 输出 = 输入 + F(输入) 输出=输入+F(输入)
    • 输入就是当前层的输入,输出就是表示当前层的输出,F(输入)是当前层的变换函数,这样相加来让网络学习输入与输出的差异,可以更方便的学习残差部分
    • 梯度消失:反向传播中梯度逐渐变小并趋近于零,这样梯度信息变得非常微弱从而让浅层网络难以有效的学习和更新(通常发生在激活函数为 sigmoid 或者 tanh 的网络中因为这些函数再输入较小或者较大的时候梯度接近于零)
    • 梯度爆炸:与梯度爆炸相反,梯度逐渐增大并变得非常大导致参数更新过大,网络不稳定甚至无法收敛(通常在网络层之间连接的时候,可能是犹豫网络权重初始化不当,学习率过大,激活函数选择等原因)

Feed Forward 前馈神经网络

  • 前馈神经网络层结构相对比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,公式如下
    m a x ( 0 , X W 1 + b 1 ) W 2 + b 2 max(0, XW1 + b1)W2 +b2 max(0,XW1+b1)W2+b2
  • 作用主要是对输入的词向量映射到输出的词向量,这其中会对多头提取的信息输入进一步处理,以提取更丰富的语意信息
  • encode 侧的流程图就如下图所示

Decode 侧

  • decode部分和 encode 部分相似,但是也存在一些区别
    • decode 侧有两个 multi-head attention 层
    • decode 的第一个多头采用了 mask 操作,而第二个多头的 k,v 矩阵使用的是 encode 侧编码信息矩阵c(encode 的输出)计算,而 q 则是第一个 decode 侧的多头的输出计算
    • 最后包含一个softmax 层计算下一个翻译单词的概率(假设是翻译任务)

decode 侧第一个多头(下图来自不同来源,仅供参考)

  • 这里要捋一捋思路哈,比如:在 encode 侧是对中文"我有一只猫"进行位置+特征 embedding 后进过一系列提取信息后,传入了 decode 侧来翻译成英文,那么英文预测也是一个序列需要一个一个预测,所以就要用到 mask操作来防止第 i 个单词知道第 i+1 个单词之后的意思,具体详解如下:

    • 流程就是:首先输入< Begin >作为 decode 侧的开始标志预测第一个单词,得到 I 后,然后将"< Begin > I"作为下一次预测的输入,以此类推
    • 具体操作其实是加了一个 与输入矩阵形状相同的mask 矩阵,这样就可以把每一次计算当前时间后的信息盖住;
    • 然后的操作就是和之前的自注意力一样,通过输入矩阵 x 计算得到 q,k,v 矩阵然后计算 q 和 k转置的乘积,但是再softmax 之前需要乘以mask 矩阵,如下图所示
    • 得到的 mask QK^T进行 softmax 就会发现单词 0 那一行 1234 的位置都是 0,因为我们设置的是负无穷映射后就成 0 了,再去与矩阵 v 得到矩阵 z
  • 此处我有一个一直没看懂的疑问,为啥要加 mask,我查阅了很多文章都是说为了让模型预测第 i+1 的时候只能使用 i+1 前的信息,但是场景类似于完型填空,因为self attention 是使用的上下文信息是全文的,所以它是提前知道信息的,所以需要加 mask,但是比如这个翻译,是怎么提前看到的呢?搞了半天才明白一个重点,就是上面讲述的 decode 侧的输入,train 的时候decode 侧输入的是正确答案,所以要 mask

    • 补:train 的时候使用的 teacher forcing,啥意思呢就是mask 后让预测,不管预测是对是错都会在预测下一个的时候使用前一个预测的正确答案防止错误一个把模型预测方向带偏,但是 test 模型下就没有正确答案了,这时使用的就是走完所有 decode 流程的预测词来进行下一个预测了,而不是走一层(看下图,其实就是多头铺平了),也就是走过完整多头的预测结果
    • 关于transforer 的并行问题,可以并行参考

mask参考 1

mask参考 2

decode 侧第二个多头

  • 这个多头的区别就是输入,自注意力的 k,v 矩阵使用的 encode 侧输出的编码信息矩阵 c,第一个多头提供的输出计算 q,(train 的时候)此处的 q 就是加了掩码的正确信息,而 kv 是原始信息,好处就是 q 这边的每一个信息都可以利用上 encode 侧的所有信息,这些信息是不需要 mask 的

softmax 预测输出

  • 此部分图片 softmax参考
  • 还可以看此篇 有动图更生动形象,因为 gif 我这个编辑器不支持插入。。。

结尾

  • 上述基本就是个人对 transformer 原理的一个理论梳理,还有很多细节没有展开,也不太理解,可能在后面的代码篇会对细节增加一些补充,仅供参考
  • 最后再次祝自己金九银十能找到一个理想的工作!!!冲鸭~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[acwing周赛复盘] 第 120 场周赛20230909

[acwing周赛复盘] 第 120 场周赛20230909 总结5146. 最大GCD1. 题目描述2. 思路分析3. 代码实现 5147. 数量1. 题目描述2. 思路分析3. 代码实现 5148. 字符串匹配1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 T1好难啊。T1 数学T2 dfs/数位dpT3 计数贪心 5146. 最大…

第51节:cesium 范围查询(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><el-button-group class="top_item"><el-button type=

render和jsx

render和jsx 1..vue文件最后会变成一个对象。 一个vue文件要么是render写法&#xff0c;要么是模板写法。 为什么React在大型项目中比较适合&#xff1f; 在大型项目中比较适合&#xff1f; 因为React使用jsx&#xff0c;比较灵活。

ISYSTEM调试实践11-Profiler Timeline和软件运行时间分析

一 前言 本文主要内容是讨论嵌入式软件的时间分析&#xff0c;供大家探讨&#xff0c;如果有疑问欢迎探讨。 对于汽车软件&#xff0c;往往对执行的时序和代码运行的时间有着严格要求。对于在主循环内执行的任务函数&#xff0c;不论是手写还是Autosar生成,能否节拍执行到&…

flink时间处理语义

背景 在flink中有两种不同的时间处理语义&#xff0c;一种是基于算子处理时间的时间&#xff0c;也就是以flink的算子所在的机器的本地时间为准&#xff0c;一种是事件发生的实际时间&#xff0c;它只与事件发生时的时间有关&#xff0c;而与flink算子的所在的本地机器的本地时…

利用grafana展示Zabbix数据可视化

导入zabbix数据源&#xff0c;可以直接创建图形了。 单击“”按钮&#xff0c;选择创建仪表盘&#xff0c;单击要创建的图形&#xff0c;图形种类有很多&#xff0c;常用的有图表&#xff0c;列表&#xff0c;报警清单&#xff0c;zabbix触发器&#xff0c;文本。 创建巡检图形…

C++ 多线程 学习笔记

线程睡眠很稳定&#xff0c;但无线程睡眠不稳定 线程调用类方法&#xff1a; 有参数时调用方法&#xff1a; 当参数为引用时&#xff1a; 当同一资源被多个线程同时引用时&#xff0c;为防止资源抢占&#xff0c;使用mutex&#xff0c;互斥锁 头文件#include "mutex"…

蓝桥杯官网练习题(纸牌三角形)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 A,2,3,4,5,6,7,8,9 共 99 张纸牌排成一个正三角形&#xff08;A 按 1 计算&#xff09;。要求每个边的和相等。 下图就是一种排法。 这样的排法可能会有很多。 如果…

thinkphp6-简简单单地开发接口

目录 1.前言TP6简介 2.项目目录3.运行项目运行命令访问规则 4.model db使用db连接配置model编写及调用调用接口 5.返回json格式 1.前言 基于上篇文章环境搭建后&#xff0c;便开始简单学习上手开发接口…记录重要的过程&#xff01; Windows-试用phpthink发现原来可这样快速搭…

Spring Data JPA:简化数据库交互的艺术

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Jmeter 实现 mqtt 协议压力测试

1. 下载jmeter&#xff0c;解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例&#xff0c;下载地址&#xff1a; https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压&#xff1a; unzip apache-jmeter-5.4.3.zip 2. 下载m…

六)Stable Diffussion使用教程:图生图SD Upscale

这一篇说说SD放大(SD Upscale)。 图生图是没有 “高清修复” 选项的,因为从文生图的高清修复原理来看,图生图本身就是高清修复:只需要在重绘目标图像时,等比例增大图像的分辨率就可以了。 这里我们通过图库浏览器浏览一张图片,然后点击图生图,图片的所有出图参数就会…

运维学习之采集器 node_exporter 1.3.1安装并使用

参考《监控系统部署prometheus基本功能》先完成prometheus部署。 wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz下载压缩包。 tar -zxf node_exporter-1.3.1.linux-amd64.tar.gz进行解压。 cp node_e…

安全实战 | 怎么用零信任防范弱密码?

防范弱密码&#xff0c;不仅需要提升安全性&#xff0c;更需要提升用户体验。 比如在登录各类业务系统时&#xff0c;我们希望员工登录不同系统不再频繁切换账号密码&#xff0c;不再需要3-5个月更换一次密码&#xff0c;也不再需要频繁的输入、记录、找回密码。 员工所有的办…

Spring Boot与Kubernetes:现代云部署的完美组合

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

第六章 图 四、图的广度优先遍历(BFS算法、广度优先生成树、广度优先生成森林)

一、实现步骤 广度优先遍历的实现步骤如下&#xff1a; 1.从图的某一个节点开始&#xff0c;将该节点标记为已经访问过的节点。 2.将该节点加入到队列中。 3.当队列非空时&#xff0c;执行以下操作&#xff1a; a. 取出队列队首节点&#xff0c;并遍历该节点与之相邻的所有…

Spring AOP:面向切面编程在实际项目中的应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

算法之位运算

前言 位运算在我们的学习中占有很重要的地位&#xff0c;从二进制中数的存储等都需要我们进行位运算 一、位运算复习 1.位运算复习 按位与(&)&#xff1a;如果两个相应的二进制位都为1&#xff0c;则该位的结果值才为1&#xff0c;否则为0 按位或( | )&#xff1a;如果…

Spring Batch:处理大数据和批量任务的解决方案

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化

聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化 目录 聚类分析 | MATLAB实现基于SOM自组织特征映射聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于自组织特征映射聚类算法(SOM)的数据聚类可视化 可直接运行 注释清晰 Matlab语言 1.多特征输入&…