【Transformer】自注意力机制Self-Attention | 各种网络归一化Normalization

news/2024/7/19 9:58:21 标签: transformer, 深度学习, 人工智能

1. Transformer 由来 & 特点

1.1 从NLP领域内诞生

"Transformer"是一种深度学习模型,首次在"Attention is All You Need"这篇论文中被提出,已经成为自然语言处理(NLP)领域的重要基石。这是因为Transformer模型有几个显著的优点:

  1. 自注意力机制(Self-Attention):这是Transformer最核心的概念,也是其最大的特点。通过自注意力机制,模型可以关注输入序列中的所有位置,并为每个位置分配不同的注意力权重。这使得模型能够更好地处理长距离的依赖关系,也就是说,对于句子中距离较远的单词,模型也能有效地捕获其关系。

  2. 并行计算:在之前的很多模型中,如RNN(循环神经网络),处理序列数据需要按照时间步顺序进行,这在处理长序列时会非常慢。而Transformer模型可以同时处理所有的输入,这使得它在大规模数据训练中有显著的效率提升。

  3. 可扩展性:Transformer模型可以轻松地通过增加层数、隐藏层单元数等来增加模型大小,使其能够处理更复杂的任务。

正因为这些优点,Transformer模型在很多NLP任务上都有出色的表现,包括机器翻译、文本摘要、情感分析等等。后续发展出的BERT、GPT等模型,都是基于Transformer的架构,进一步推动了AI领域的进步。

1.2 计算机视觉 + Transformer

尽管Transformer最初是为处理自然语言处理(NLP)任务设计的,但近年来,它也被广泛应用于计算机视觉(CV)领域,包括图像分类、对象检测、图像分割等任务。

Transformer在视觉领域的应用主要体现在以下两个方面:

  1. 图像中的长程依赖:与NLP问题类似,图像中的像素也存在长程依赖性。例如,一幅图像中的某个部分可能会对图像的其他部分产生影响。Transformer的自注意力机制可以捕捉到这些依赖关系

  2. 端到端的全局优化:传统的卷积神经网络(CNN)通常会使用局部的卷积操作来提取图像特征,这些操作不容易捕获全局的图像信息。而Transformer的自注意力机制可以直接处理全局的信息,能实现端到端的全局优化。

其中,一个代表性的视觉Transformer模型是ViT(Vision Transformer)。ViT模型将图像切割为一系列小的patch,然后将这些patch视为序列输入,使用Transformer对其进行编码。这样就可以将全局的图像上下文信息整合到每一个patch的表示中,有助于提升视觉任务的性能。

至今为止,包括ViT在内的一些视觉Transformer模型已经在多个重要的计算机视觉任务中取得了最先进的结果,显示出Transformer架构的巨大潜力和广泛应用性。

必须读:ViT中的Self-Attention

1.3 自注意力机制 Self-Attention

自注意力机制(Self-Attention Mechanism),也被称为自我注意力机制或者只是注意力机制,是Transformer模型的核心部分。自注意力机制的基本思想是在处理序列数据时,不只是关注当前的输入,而是关注整个序列,并且为序列中的每一个元素赋予不同的重要性或权重

自注意力机制的运作流程如下:

  1. 首先,每个输入元素都有三个向量表示:Query(查询),Key(键),Value(值)。这些向量是输入元素经过不同的线性转换(也就是乘以权重矩阵)得到的。

  2. 然后,通过计算Query和所有Key的点积,得到每个元素的得分。这个得分反映了当前元素与其他元素的关联程度。更高的得分意味着这两个元素更相关

  3. 接着,将这些得分经过softmax函数转换为概率值,这样所有的得分加起来就为1了。这个概率值就是注意力权重,反映了模型对每个元素的关注程度。

  4. 最后,用这些注意力权重去加权求和所有的Value,得到最终的输出。

这样,每个输出都包含了整个序列的信息,而且这个信息的整合是根据每个元素与当前元素的相关性进行的。这使得模型能够捕捉到长距离的依赖关系,并且可以并行处理整个序列,大大提高了效率。这就是自注意力机制的魅力所在,也是Transformer模型能够在很多任务上取得优秀表现的原因。

2. 台大李宏毅:自注意力机制 Self-Attention

这一part是看视频做的笔记,视频可以在B站上找到~

  1. 可扩展性强:轻松增加Self-Attention的层数!!自注意力机制扩展性很强
    Seq2Seq模型:
    Seq2Seq模型
  2. 自注意力机制核心:vector --> vector 考虑了整个input sequence才产生了每一个output!!!
    在这里插入图片描述
  3. 上图中,如何产生每一个output vector?

学习链接:20’25’'起看

Step 1: Find the relevant vectors in a sequence!
找到其它vectors中,哪些vector是对判断a1的label是重要的!
在这里插入图片描述
a1和a4有多相关?相关度α计算:使用「计算attention的module」!
下面是 两种常见的【相关度α计算module】
在这里插入图片描述
其中,Dot-product (点积)是最常用的,用在了 Transformer 里。
然后使用计算 Dot-product 来计算 attention score(即:关联性)
下图中经过Dot-product得到的 α1,1 α1,2 … α1,4 就是 α1和α2,α3,α4的关联性!!!
在这里插入图片描述
soft-max的作用是:生成「注意力权重」

将这些得分经过softmax函数转换为概率值,这样所有的得分加起来就为1了。这个概率值就是注意力权重,反映了模型对每个元素的关注程度。

Step 2: Extract information based on attention scores!
根据attention score’ (注意力权重),去抽取重要的information!
在这里插入图片描述
并行计算的思想在这也有体现!上图仅展示计算b1的过程,但b1、b2、b3、b4 实际上是平行被计算的,他们是并行的(从矩阵操作的角度看)!在大规模数据中效率也很高!

下面这些图是从矩阵计算的角度来看attention的执行过程~——
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总而言之,言而总之,self-attention技术可以归结为 一整串的矩阵乘法::顶点
Multi-Head Attention
指的是多组q,k,v分别做self-attention,在同一个网络里
特点:

  1. 目的:多头注意力的设计允许模型同时在不同的表示子空间(representation subspaces)上学习和获取信息。每个头可以关注输入的不同部分。
  2. 定义:在传统的注意力机制中,我们有一个查询(Q), 键(K)和值(V)。对于多头注意力,我们不仅有一套Q、K和V,而是有多套(每个“头”一套)。这意味着模型可以在多个子空间上并行地学习不同的注意力权重。
  3. 操作:
    对于每一个头,我们首先通过权重矩阵来线性变换输入的Q、K和V。
    使用变换后的Q、K和V计算注意力权重并得到输出。
    各个头的输出会被拼接起来,并通过另一个线性变换得到最终的多头自注意力输出。
  4. 参数共享:每个头都有自己的权重矩阵,但在整个模型的训练过程中,这些权重都是被学习的。这意味着每个头可以学到不同的注意力策略。
  5. 优点:通过使用多头,模型可以捕捉到更丰富的信息和更复杂的模式。例如,一个头可能会专注于句子的语法结构,而另一个头可能会专注于句子的语义内容。
  6. 实际应用:在NLP任务中,如机器翻译、文本分类等,使用多头自注意力机制的Transformer模型已经成为了一种标准做法。此外,这种结构也已被用于其他领域,如计算机视觉,因为它提供了强大的表征学习能力。(在实际实现中,需要注意如何正确地进行权重共享、如何组合多头输出以及如何调整头的数量来达到最佳的效果。)

Positional Encoding 「位置」
一句话概括,Positional Encoding就是句子中词语相对位置的编码,让Transformer保留词语的位置信息。
似乎在NLP用的多。看:【AI理论学习】对Transformer中Positional Encoding的理解

Self-Attention 在 CV领域的使用(原始idea):
一张5x10 pixels的图可以看作是一个vector set。因为RGB的三channels图像那就是5x10x3的tensor,其中的每一个pixel就是一个三维的vector。
在这里插入图片描述
应用了 Self-Attention 的CV models:DETR,self-attention GAN
在这里插入图片描述
CNN其实就是self-Attention的一个特例。 但,数据量少的时候CNN更好用(此时self-attention因弹性大所以容易过拟合),而数据量多的时候self-attention能取得更好的结果! 参见下图。
在这里插入图片描述
此外,Self-Attention取代了RNN!因为干的事情是差不多的,但RNN需要大量的memory,而self-attention能做到“天涯若比邻”!!(如下图所示)
在这里插入图片描述
而且,RNN在计算时不是parallel的!它需要从左到右一个一个往下继续计算(看上图可知)。而self-Attention是parallel计算的,可以平行处理所有的输出,效率非常高!工业界已逐渐把RNN架构的产物逐渐改成self-Attention架构了。

3. 台大李宏毅:Transformer

3.1 概述 | Encoder | Decoder

Transformer是一个sequence-to-sequence (Seq2seq) model。也就是input和output都是sequence。而output的sequence,可以是定长的,也可以是和input一样长的,也可能是我们不知道有多长的需要机器自己判别的。

例如:语音辨识,声音讯号–>文本,这个场景下的output就是机器自己决定的。机器翻译同理。

文本 & 声音讯号互转 案例:中文文字---->台语/闽南语 点击精准空降

「硬train一发」指不知道输出是多长的,干脆直接把数据丢进去让seq2seq模型自己来决定输出啥。

Seq2seq模型中,Encoder读入数据,处理后丢给Decoder,由Decoder来决定要输出多少东西。

1. Encoder
Input一排向量,output一个同样长度的向量
每个Encoder里面可能有好几个blocks,每个block里面可能有好几个layers在干各种事情!
在这里插入图片描述
2. Decoder
以语音辨识为例,即声音讯号转文字。
在这里插入图片描述
Decoder必须自己决定输出的sequence的长度。

3. Encoder 和 Decoder 之间如何传递数据
各式各样的传递方式。。。
在这里插入图片描述

4. 李沐《动手学》:注意力机制 & Transformer框架 & 归一化 Normalization

学习链接🔗:https://zh.d2l.ai/chapter_attention-mechanisms/index.html
https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358497

在这里插入图片描述

4.1 多头注意力 Multi-Head Attention

看图上的笔记!!!!!!!!!!
在这里插入图片描述

4.2 层归一化 Layer Normalization

在这里插入图片描述
LN适用于 输入输出序列长度会变的data,所以NLP领域基本都用LN。
而BN常用于CV领域。

4.3 批量归一化 Batch Normalization (2015)

假设总共有30个样本,每5个样本构成一个batch来进行训练!

参考学习链接:(1)5分钟速食 https://www.bilibili.com/video/BV12d4y1f74C/?spm_id_from=333.337.search-card.all.click&vd_source=6b4de80fe82d569d8c1324a8320a624f
(2)台大 李宏毅 讲BN:https://www.bilibili.com/video/BV1bx411V798/?spm_id_from=333.337.search-card.all.click&vd_source=6b4de80fe82d569d8c1324a8320a624f # 真的很会讲 每次听都豁然开朗

BN可以保证网络中间的层,每一层的输入的分布都是类似的。

以下笔记来自 台大李宏毅老师 讲BN的视频:
在这里插入图片描述
在这里插入图片描述
但是在网络中的hidden layers,都吃上一层输出的结果作为input,而这些数据是否也需要 Feature Scaling???
在这里插入图片描述
在这里插入图片描述
由上图可知:BN不可以在太小的batch上面被很好地应用,因为太小的batch计算得到的两个统计参数并不能很好地代表整个training set。因此,batch_size要足够大!!!
在这里插入图片描述

在 Testing stage / Inference时,如何使用 Batch Norm???
在这里插入图片描述
BN可以提速,但一般不改变模型的精度。

4.4 四种常见的「网络归一化」

在这里插入图片描述

4.5 信息传递(编码器 --> 解码器)

在这里插入图片描述


http://www.niftyadmin.cn/n/4935110.html

相关文章

EDUSRC之一次奇葩的文件上传

当时误打误撞发现的,觉得挺奇葩的,记录下 一个正常的图片上传的点,文件类型白名单 但是比较巧的是当时刚对上面的id进行过注入测试,有一些遗留的测试 payload 没删,然后在测试上传的时候就发现.php的后缀可以上传了&a…

B3716 分解质因子 3

#include <bitset> #include <vector> #include <iostream> #include <algorithm>const int maxn 100000008;std::vector<int> prm, pre; // pre is the min-factor array. bool np[maxn];void getPrime(const int N 100000000) {//线性筛&am…

springboot项目重启的shell命令

大家好&#xff0c;我是雄雄&#xff0c;微信公众号&#xff1a;雄雄的小课堂&#xff0c;欢迎关注。 前言 我们都知道&#xff0c;springboot项目启动的时候&#xff0c;需要如下过程&#xff1a; 查找 服务的进程id杀掉该进程启动服务 并且每一步都有对应的shell命令&…

【c++】七夕快到了却还没对象?手把手教你new一个出来!

前言 本章给大家带来的是C内存管理。在C语言阶段&#xff0c;我们经常使用malloc&#xff0c;calloc&#xff0c;realloc&#xff0c;free进行内存管理。但是&#xff0c;C语言的内存管理存在很多缺陷&#xff0c;会对程序的稳定性和安全性造成影响。 不过&#xff0c;C语言的…

ORB-SLAM2第一节---地图初始化

单目初始化 1.前提条件&#xff08;640*480&#xff09; 参与初始化的两帧各自的特征点数目都需要大于100.两帧特征点成功匹配的数目需要大于或等于100.两帧特征点三角化成功的三维点数目需要大于50. 2.针对条件三 流程如下 记录当前帧和参考帧&#xff08;第一帧&#xff…

【golang】字典(map)的操作和约束原理

字典&#xff08;map&#xff09;存储的不是单一值的集合&#xff0c;而是键值对的集合。 什么是键值对&#xff1f;它是从英文key-value pair 直译过来的一个词。顾名思义&#xff0c;一个键值对就代表了一对键值对。 注意&#xff0c;一个"键"和一个"值"…

网页的语义结构

HTML 标签的名称都带有语义&#xff08;semantic&#xff09;&#xff0c;使用时应该尽量符合标签的语义&#xff0c;不要用错误语义的标签。语义良好的网页&#xff0c;天然具有良好的结构&#xff0c;对于开发者易读易写&#xff0c;容易维护&#xff0c;也能帮助计算机更好地…

C语言 二级指针和多级指针

什么是二级指针&#xff1f; 假设&#xff1a; int a 10;int * p &a;如上&#xff0c;p是指针变量&#xff0c;寄存的是a的地址&#xff0c;指向的是元素a 那么&#xff0c;指针变量p有地址吗&#xff1f;指针变量p的指针指向的是&#xff1f; int * * pp &p; …