Transformer详解和知识点总结

目录

    • 1. 注意力机制
      • 1.1 注意力评分函数
      • 1.2 多头注意力(Multi-head self-attention)
    • 2. Layer norm
    • 3. 模型结构
    • 4. Attention在Transformer中三种形式的应用

论文:https://arxiv.org/abs/1706.03762
李沐B站视频:https://www.bilibili.com/video/BV1pu411o7BE/?spm_id_from=333.788&vd_source=21011151235423b801d3f3ae98b91e94
D2L: https://zh.d2l.ai/chapter_attention-mechanisms/index.html
知乎讲解:https://zhuanlan.zhihu.com/p/639123398

1. 注意力机制

注意力机制由三个重要组成部分:query, key, value, query和key通过注意力评分函数计算出注意力权重,用于对value进行加权平均,得到最后的输出,如下图所示:
请添加图片描述
举例:
如果:
key的维度为(m, k),表示有m个key,每个key的向量维度为k;
value的维度为(m,v), 表示有m个value(key和value的个数一定相同),每个value的向量维度为v;
那么给定一个query的维度为(q), 那么通过注意力评分函数W(query, key)将得到一个维度为(m)的权重向量, 这个权重向量与value相乘,就完成了每个特征的加权求和,得到的维度为(v)。
当然也可以一个求多个query的结果,比如query是(n,q), 最后得到的结果维度就是(n, v);

1.1 注意力评分函数

常用的注意力评分函数有两种:加性注意力(Additive Attention)和 点积注意力 (Dot-Product Attention),Transformer这篇论文采用的是缩放点积注意力(Scaled Dot-Product Attention),就是在点积注意力的基础上加入一个缩放;

  • 加性注意力
    当查询和键是不同长度的矢量时,可以使用加性注意力作为评分函数。
    请添加图片描述

    先使用两个全连接层,将query和key统一到相同长度,然后将每一个query都和每一个键相加,再经过一个线性映射得到注意力权重

  • 缩放点积注意力

    请添加图片描述

    请添加图片描述

  • 为什么要缩放?

    1. 当dk的值比较小的时候,这两个机制的性能相差相近,当dk比较大时,加法attention比不带缩放的点积attention性能好。我们怀疑,维度dk很大时,点积结果也变得很大,那么某些向量中间的注意力分数将占绝对主导地位,将softmax函数推向具有极小梯度的区域。为了抵消这种影响,我们将点积缩小1/sqrt(dk)倍。
    2. 假设query和Key的所有元素都是独立的随机变量,并满足零均值和单位方差,那么两个向量点积的均值为0,方差为d(d为向量维度)。为保证点积的方差仍是1,那么就要将点积除以sqrt(d)

1.2 多头注意力(Multi-head self-attention)

请添加图片描述

  • 类似于卷集中的多通道,可学习到不同模式

    1. 增加可学习的参数:本身缩放点积注意力是没什么参数可以学习的,就是计算点积、softmax、加权和而已。但是使用Multi-head attention之后,投影到低维的权重矩阵W_Q, W_K, W_V是可以学习的,而且有h=8次学习机会。
    2. 多语义匹配:使得模型可以在不同语义空间下学到不同的的语义表示,也扩展了模型关注不同位置的能力。类似卷积中多通道的感觉。例如,“小明养了一只猫,它特别调皮可爱,他非常喜欢它”。“猫”从指代的角度看,与“它”的匹配度最高,但从属性的角度看,与“调皮”“可爱”的匹配度最高。标准的 Attention 模型无法处理这种多语义的情况。
    3. 注意力结果互斥:自注意力结果需要经过softmax归一化,导致自注意力结果之间是互斥的,无法同时关注多个输人。 使用多组自注意力模型产生多组不同的注意力结果,则不同组注意力模型可能关注到不同的输入,从而增强模型的表达能力。
  • 多头注意力对计算量没有影响

    多头注意力的每个头单独通过矩阵运算进行注意力计算,也可以合并成一次矩阵运算

2. Layer norm

从下面两幅示意图可以清楚的理解Layer norm以及其和Batch norm等normalization模块的区别;

下图截取自何凯明在MIT的演讲PPT:

请添加图片描述

下图截取自沐神B站视频,蓝色是BN,黄色是LN

![请添加图片描述](https://img-blog.csdnimg.cn/direct/200c168d497b4eb8aa51d48f22481ad6.png #pic_center =600x600)

可以这么理解,BN是针对每个特征,对所有的样本计算均值和方差;而LN是针对每个样本,对这个样本的所有特征计算均值和方差;

如果输入的shape为(B, C, H, W),那么BN的均值和方差的维度是(1,C, 1, 1), 计算机视觉中的LN的均值和方差维度为(B, 1, 1, 1), transformer中的均值和方差维度为(B,1, H, W),instance norm的均值和方差维度为(B, 1, 1, 1), group norm 的均值和方差维度为(B, C/m, 1, 1)

  • 为什么不使用batch norm?

    请添加图片描述

为什么这里使用LN而不是BN?

  • 计算变长序列时,每个Batch中的序列长度是不同的,如上图的蓝色示意图,这样在一个batch中做均值时,变长序列后面会pad 0,这些pad部分是没有意义的,这样进行特征维度做归一化缺少实际意义。
  • 序列长度变化大时,计算出来的均值和方差抖动很大。
  • 预测时使用训练时记录下来的全局均值和方差。如果预测时新样本特别长,超过训练时的长度,那么之前记录的均值和方差可能会不适用,预测会出现问题。

而Layer Normalization在每个序列内部进行归一化,不存在这些问题:

  • NLP任务中一个序列的所有token都是同一语义空间,进行LN归一化有实际意义
  • 因为实是在每个样本内做的,序列变长时相比BN,计算的数值更稳定。
  • 不需要存一个全局的均值和方差,预测样本长度不影响最终结果。

3. 模型结构

请添加图片描述

大多数的机器翻译网络都是这种encoder-decoder架构

  • Inputs 和 Outputs

    本篇文章做的是机器翻译任务,比如若是完成中译英问题,inputs则是中文句子,outputs是英文翻译结果;

    在翻译时采用的是auto-regressive,也就是网络在翻译当前词的时候不仅使用中文句子的信息,也会将已经翻译出来的英文单词的信息作为输入,提取其中的信息预测下一个词;

    At each step the model is auto-regressive [10], consuming the previously generated symbols as additional input when generating the next.

  • Embedding

    将输入和输出的token转成具有d_model维度的向量;

    we use learned embeddings to convert the input
    tokens and output tokens to vectors of dimension d_model.

  • 位置编码 Positional Encoding

    Attention计算时本身是不考虑位置信息的,这样序列顺序变化结果也是一样的。所以我们必须在序列中加入关于词符相对或者绝对位置的一些信息。

    为此,我们将“位置编码”添加到token embedding中。二者维度相同(例如d_model

    =512),所以可以相加。有多种位置编码可以选择,例如通过学习得到的位置编码和固定的位置编码。

    关于位置编码可学习:https://zh.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.html

  • 编码器

    编码器由N=6个相同encoder层堆栈组成。如上图中所示,每个encoder层有两个子层:

    1. multi-head self-attention
    2. FFNN(前馈神经网络层,Feed Forward Neural Network),其实就是MLP,为了fancy一点,就把名字起的很长。

    每个子层的形式可以表达为:LayerNorm(x + Sublayer(x)),其中Sublayer(x)是当前子层的输出, 两个子层都使用残差连接(residual connection),然后进行层归一化(layer normalization)。

    为了简单起见,模型中的所有子层以及嵌入层的向量维度都是d_model=512(如果输入输出维度不一样,残差连接就需要做投影,将其映射到统一维度)。(这和之前的CNN或MLP做法是不一样的,之前都会进行一些下采样)

    这种各层统一维度使得模型比较简单,只有N和d_model两个参数需要调。这个也影响到后面一系列网络,比如bert和GPT等等。

  • 解码器

    解码器:解码器同样由 N=6个相同的decoder层堆栈组成,每个层有三个子层。

    1. Masked multi-head self-attention:解码器里,Self Attention 层只允许关注到输出序列中早于当前位置之前的单词。具体做法如下图所示:在 Self Attention 分数经过 Softmax 层之前,使用attention mask,屏蔽当前位置之后的那些位置。所以叫Masked multi-head self Attention。(对应masked位置使用一个很大的负数-inf,使得softmax之后其对应值为0)

      请添加图片描述

    2. Encoder-Decoder Attention :也就是解码器中的第二个MHA层,这一个MHA的query是解码器的上一输出,key和 value都来自编码器输出最终向量,用来帮解码器把注意力集中中输入序列的合适位置。

    3. FFNN:依然是MLP层

4. Attention在Transformer中三种形式的应用

  • multi-head self attention:标准的多头自注意力层,用在encoder的第一个多头自注意力层。所有key,value和query来自同一个地方,即encoder中前一层的输出。在这种情况下,encoder中的每个位置都可以关注到encoder上一层的所有位置。
  • masked-self-attention:用在decoder中,序列的每个位置只允许看到当前位置之前的所有位置,这是为了保持解码器的自回归特性,防止看到未来位置的信息
  • encoder-decoder attention :用于encoder block的第二个多头自注意力层。query来自前面的decoder层,而keys和values来自encoder的输出memory。这使得decoder中的每个位置都能关注到输入序列中的所有位置。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【随笔】Git 基础篇 -- 分支与合并 git rebase(十)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

《QT实用小工具·二十四》各种数学和数据的坐标演示图

1、概述 源码放在文章末尾 该项目实现了各种数学和数据的坐标演示图&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef FRMMAIN_H #define FRMMAIN_H#include <QWidget> class QAbstractButton;namespace Ui { class frmMain; }class fr…

最长公共子序列(线性dp)-java

本文主要来描述两个字符串的最长公共子序列问题 文章目录 前言 一、最长公共子序列 二、算法思路 1.dp[i][j]的四种情况 2. dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]的关系 3.dp数组的状态转移方程 4.dp数组具体如下 三、代码如下 1.代码如下&#xff08;示例&#xff09;&#x…

Linux设备深探:桥接硬件与软件的秘密通道

在Linux的世界里&#xff0c;"设备"这个词汇比你想象的要丰富和多彩得多。让我们一起来探索Linux设备的奥秘&#xff0c;理解它们是如何在Linux操作系统中发挥作用的。&#x1f427;✨ 1. 什么是Linux设备&#xff1f; 在Linux中&#xff0c;设备被看作是一种特殊的…

STM32页读页写AT24CXX(HAL库 模拟IIC)

参考文章&#xff1a; 这里附上一篇看到写得很好的大佬的文章&#xff1a;STM32F407单片机通用24CXXX读写程序&#xff08;KEIL&#xff09;&#xff0c;兼容24C系列存储器&#xff08;24C01到24C512&#xff09;&#xff0c;支持存储器任意地址跨页连续读写多个页 AT24C32/64…

WebGIS实现各地区COVID-19数据一览

1.项目地址 GISpjd/WebGIS-Show-Covid19 (github.com)&#xff0c;具体每个文件的职能可以参考README文档。 2.前言 预览 >> 所用技术栈&#xff1a; 项目需求本身不是过于复杂&#xff0c;所以没有在相应前端框架下完成&#xff0c;但转入框架也是比较容易的 &#…

thinkphp6入门(22)-- 如何下载文件

假设在public/uploads文件夹下有一个文件test.xlsx 在前端页面添加下载链接&#xff0c;用户点击该链接即可下载对应的文件。 <a href"xxxxxxx/downloadFile">下载文件</a> 2. 在后端控制器方法中&#xff0c;我们需要获取要下载的文件路径&#xff0…

看linux内核启动流程需要的arm汇编学习笔记(二)

文章目录 一、ldr1.地址偏移模式2.变基模式3.标签3.1 访问宏定义3.2 访问一个字符串3.3 访问一个data 二、ldp和stp1.双字节加载2.双字节存储3.双字节存储的后变基模式 三、位操作1. 移位2. 按位操作3. 位段插入4.位段提取5.零计数指令 四、跳转指令1. cmp比较两个数2. cmn负向…

面试官为什么喜欢考察Vue底层原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

系统更新Javahome之后,eclipse ide没有同步更新的解决方案

1、确认eclipse idea当前使用jdk 路径 &#xff1a; 2、确认Ide路径为旧的之后&#xff0c;去到eclipse的应用启动路径&#xff0c;编辑【eclipse.ini】, 在【-vmargs】之前设置vm路径&#xff08;换行为必须的&#xff09;&#xff1a; -vm C:\Program Files\Java\jdk1.8.0_1…

自动驾驶硬件-GNSS

自动驾驶硬件-GNSS 高精度全局定位系统本质上可以看做一个级联的定位系统&#xff0c;先通过GNSS系统提供一个可能的位置范围&#xff0c;再利用激光雷达(Lidar)系统、视觉定位系统等方法进行局部环境的搜索匹配&#xff0c;从而实现厘米级的定位精度。由于需要由GNSS为高精度…

shell脚本2

变量 变量是在程序中保存用户数据的一段内存存储空间&#xff0c;变量名是内存空间的首地址 字母、数字、下划线组成&#xff0c;不能以数字开头 原则&#xff1a;直接使用&#xff0c;不需要变量声明 格式&#xff1a;变量名 变量的值 环境变量 关闭窗口即会失效 若要永久生…

【Ubuntu】远程连接乌班图的方式-命令行界面、图形界面

​​​​​​系统环境&#xff1a;ubuntu-22.04.2-amd64.iso 连接工具&#xff1a;MobaXterm、windows自带远程桌面mstsc.exe 重置root密码&#xff1a;Ubuntu默认root密码是随机的&#xff0c;需要使用命令sudo passwd 进行重置。 一、命令行界面-SSH连接 1.1 SSH服务安装 …

数据的属性与相似性

目录 一、数据集的结构&#xff08;一&#xff09;二维表&#xff08;二&#xff09;数据矩阵 二、属性的类型&#xff08;一&#xff09;连续属性&#xff08;二&#xff09;离散属性&#xff08;三&#xff09;分类属性&#xff08;四&#xff09;二元属性&#xff08;五&…

CentOS 镜像下载

CentOS 镜像下载&#xff1a;https://www.centos.org/download/ 选择合适的架构&#xff0c;博主选择x86_64&#xff0c;表示CentOS7 64位系统x86架构&#xff0c;如下&#xff1a; 或者直接访问以下网站下载 清华大学开源软件镜像站&#xff1a;https://mirrors.tuna.tsin…

国产低代码工具,轻松搞定数据迁移

在日常的业务系统升级或者数据维护过程中&#xff0c;数据迁移是各个企业用户不得不面临的问题&#xff0c;尤其是数据迁移过程中要保障数据完整性、统一性和及时性&#xff0c;同时也需要注意源数据中的数据质量问题&#xff0c;比如缺失、无效、错误等问题&#xff0c;需要在…

安全大脑与盲人摸象

21世纪是数字科技和数字经济爆发的时代&#xff0c;互联网正从网状结构向类脑模型进行进化&#xff0c;出现了结构和覆盖范围庞大&#xff0c;能够适应不同技术环境、经济场景&#xff0c;跨地域、跨行业的类脑复杂巨型系统。如腾讯、Facebook等社交网络具备的神经网络特征&…

实验1 eNSP安装与使用

实验1 eNSP安装与使用 一、 原理描述二、 实验目的三、 实验内容四、 实验步骤1.下载并安装eNSP2.eNSP软件界面3.搭建并运行网络拓扑4. Wireshark 捕获分组并分析 一、 原理描述 eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;是由华为提供的免费网络模…

JDK1.8的安装及环境变量的配置

下载路径&#xff1a; Java Downloads | Oracle 选择对应的操作系统进行下载 1&#xff1a;在D盘新建一个名称为Java的文件夹 [如果你下载的不是这个版本的请自行修改文件夹名称&#xff0c;如版本jdk1.8.0则文件夹名为jdk1.8.0] 2:复制红色框中的名称并在刚刚新建Java文件夹…

【攻防世界】wife_wife

原型链污染 源码 app.post(/register, (req, res) > {let user JSON.parse(req.body)if (!user.username || !user.password) {return res.json({ msg: empty username or password, err: true })}if (users.filter(u > u.username user.username).length) {return …