目录
4.多头自注意力(Multi-head self-Attention)
本篇文章为参考多篇笔记记录的个人学习笔记
1.Transformer 模型
将 Transformer 模型视为一个黑盒,如图1所示。在机器翻译任务中,将一种语言的一个句子作为输入,然后将其翻译成另一种语言的一个句子作为输出。Transformer 本质上是一个 Encoder-Decoder 架构。因此中间部分的 Transformer 可以分为两个部分:编码组件(Encoder)和解码组件(Decoder)(在论文中作者使用了 6 层编码器)
图1
每个编码器由两个子层组成:Self-Attention 层(自注意力层)和 Position-wise Feed Forward Network(前馈网络,缩写为 FFN)如图 2 所示。每个编码器的结构都是相同的,但是它们使用不同的权重参数。
解码器也有编码器中这两层,但是它们之间还有一个注意力层(即 Encoder-Decoder Attention),其用来帮忙解码器关注输入句子的相关部分(类似于 seq2seq 模型中的注意力)。
2.嵌入(Embedding)
嵌入(Embedding)是一种将高维数据(如文本或图像)转换为较低维度的向量表示的技术。这种表示捕捉了数据的关键特征,使得在处理、分析和机器学习任务中更加高效。通常用于将离散的、非连续的数据转换为连续的向量表示,以便于计算机进行处理。
嵌入(Embedding)仅发生在最底层的编码器中。所有编码器都会接收到一个向量列表——底部编码器接收的是嵌入向量,其他编码器接收的是前一个编码器的输出。编码器会接收一个向量作为输入,编码器首先将这些向量传递到 Self-Attention 层,然后传递到前馈网络,最后将输出传递到下一个编码器。
如图是一个例子,图片通过卷积和flatten操作组合成的嵌入操作变成了向量。
3.自注意力(self-attention)
前言:自注意力(Self-Attention)机制是 Vision Transformer(ViT)模型的核心组成部分。在ViT模型中存在 Encoder Block,每个 Block 里面有 Self-Attention 层(自注意力层)和 Position-wise Feed Forward Network(前馈网络,缩写为 FFN),在自注意力层里面就是下面6步计算方式。
ViT -> Encoder Block -> Self-Attention
在ViT 模型中,自注意力机制使得模型能够处理图像数据,类似于它在自然语言处理中处理文本数据的方式。
在 ViT 模型中,输入图像首先被分割成多个固定大小的小块,称为 patches。这些 patches 通过一个线性层(称为 patch embedding layer)转换为嵌入向量。这些嵌入向量,连同位置编码,作为序列输入到 Transformer 编码器中。在 Transformer 编码器中,每个 patch 的嵌入向量会通过自注意力机制处理,以捕捉图像中不同区域之间的关系 。
自注意力机制允许模型在处理一个特定的 patch 时,考虑图像中所有其他 patches 的信息,从而捕捉全局依赖关系。这种机制特别适用于捕捉图像中的长距离依赖,这是传统卷积神经网络(CNN)难以有效做到的,因为 CNN 通常依赖于局部感受野 。
ViT 模型通过自注意力机制,有效地将 NLP 中的 Transformer 架构的优势引入到计算机视觉领域,特别是在图像分类任务中。这种结合不仅展示了 Transformer 架构的通用性,还证明了其在处理视觉任务中的潜力 。ViT 的提出标志着视觉模型发展的一个重大转变,它通过自注意力机制捕获序列中任意位置的依赖关系,更好地处理长距离依赖问题。
本质思想就是从大量信息中有选择的筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息。聚焦的过程体现在权重系数(经过Softmax函数处理之后得到的概率矩阵)的计算上,权重越大越聚焦于其对应的 value 值上。即权重代表了信息 的重要性,而 value 是其对应的信息。
第1步:首先输入数据图片等首先经过嵌入层(Embedding Layer)“卷积拉长” 转换为嵌入向量X(token,霹雳吧啦Wz),由相同的原始输入x,经过这三个权重矩阵 W(这 3 个矩阵通过训练获得)相乘变换后的Q、K、V。
第 2 步:用得到的Q、K计算注意力分数。这些分数决定了我们在编码当前这个位置时,需要对其他位置放置多少的注意力。
其中查询(Query)向量 q1 代表正在编码的图片patch块,而键(Key)向量 k1 代表转置后的q1自己,k2 代表其他的patch块。
q1⋅k1=112 这个分数表示第一个patch块与它自己的关联强度,q1⋅k2=96 这个分数表示第1个patch块与第2个patch块之间的关联强度。这个分数往往低于第一个分数,表明虽然第一个patch块和第二个patch块之间存在一定的关联,但这种关联一定不如第一个patch块与它自己的关联强。
在nlp中,通过这些分数,模型可以决定在编码每个词时应该给予句子中其他词多少注意力,比如句子“I don't like it”,就可以通过注意力分数来判断上下文中哪个词和这个“it”是强关联的,就能判断出这个it指代的是什么。
第 3 步:将每个分数除以那个dk (Key 向量的维度),目的是在反向传播时,求梯度更加稳定。实际上,你也可以除以其他数。
第 4 步:将这些分数进行 Softmax 操作。Softmax 将分数进行归一化处理,使得它们都为正数并且和为 1。
这些 Softmax 分数决定了在编码当前位置的词时,对所有位置的词分别有多少的注意力。很明显,当前位置有最高的分数,但有时注意一下与当前位置相关的位置是很有用的。
第 5 步:将每个 Softmax 分数分别与每个 Value 向量相乘。这种做法背后的直觉理解是:对于分数高的位置,相乘后的值就越大,我们把更多的注意力放在它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大,我们就可以忽略这些位置的词。
第 6 步:将加权 Value 向量(即上一步求得的向量)求和。这样就得到了自注意力层在这个位置的输出。
输入 X 通常指的是嵌入向量,它们是原始数据(如单词、句子或其他类型的序列数据)经过嵌入层转换得到的连续向量表示,输出 Z 是输入 X 的一种转换和增强形式。
Z 包含了 X 的原始信息,并且通过自注意力机制引入了序列内部的依赖关系和上下文信息。这种新的表示 Z 可以被用作下游任务(如分类、聚类、相似性搜索等)的特征输入,也可以作为神经网络中下一个层的输入。
下面的 Multi-head self-Attention 生成的 z' 就可以理解为 z 的增强版表征。
即 x -> z -> z' 成为越来越强和丰富表征的向量。
4.多头自注意力(Multi-head self-Attention)
为什么要多头?
理解:
其实机器学习本质就是 y=sigma(wx+b) ,就是一种非线性变换,通过模型把不理想的变成我们理想的。
非线性变换本质:改变空间位置的坐标,通过模型手段,非线性变换把它从不合理变合理。
所以原先只有一个位置的输入 X,变成了有“多个”位置,是不是会更容易通过非线性变换去找到符合我们要求的点,这就是多头大的意义。
所谓“多头”,就是在生成QKV时,对每个patch有多组不同的W权重矩阵,每组 Wi 权重矩阵有三个,分别与输入的嵌入向量X相乘得到Qi、Ki、Vi ,如下图所示。
n头就有n组W,生成n组QKV,最后进行自注意力计算,得到n组Z,把n组Z矩阵整合为一个矩阵,把拼接后的矩阵和一个权重矩阵 W0 矩阵相乘得到满足我们需求的Z矩阵。
得到最终的矩阵 Z ,这个矩阵包含了所有注意力头的信息。这个矩阵会输入到 FFN 层。
将图片分割成多个patch,对于每个patch,会使用n组不同的W权重矩阵来计算n组QKV,使得模型能够在不同的位置和不同的表示子空间中捕捉信息,从而增强了模型对图像细节的理解和处理能力。
笔记更新中 ————————
标签:分数,编码器,矩阵,笔记,patch,学习,Vit,注意力,向量 From: https://blog.csdn.net/SSSSSHCL/article/details/142955392