Geeks_Z の Blog Geeks_Z の Blog
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)

Geeks_Z

AI小学生
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)
  • Python

  • MLTutorials

  • 卷积神经网络

  • 循环神经网络

  • Transformer

    • Self-Attention概述
    • Self-Attention理论推导
      • 理论推导
      • 矩阵形式的Self-Attention
      • 整体回顾Self-attention的矩阵操作
    • Multi-head Self-attention
    • Self-Attention-APP
    • Self-Attention拓展
    • Transformer
    • Transformer代码实现
    • Transformer模型的参数量与计算量
    • Self-Attention通过线性变换计算Q K V的原理
    • Transformer中FFNs的作用
    • Bert
    • VAE
    • Temp
  • VisionTransformer

  • 扩散模型

  • 计算机视觉

  • PTM

  • MoE

  • LoRAMoE

  • LongTailed

  • 多模态

  • 知识蒸馏

  • PEFT

  • 对比学习

  • 小样本学习

  • 迁移学习

  • 零样本学习

  • 集成学习

  • Mamba

  • PyTorch

  • CL

  • CIL

  • 小样本类增量学习FSCIL

  • UCIL

  • 多模态增量学习MMCL

  • LTCIL

  • DIL

  • 论文阅读与写作

  • 分布外检测

  • GPU

  • 深度学习调参指南

  • AINotes
  • Transformer
Geeks_Z
2023-11-03
目录

Self-Attention理论推导

理论推导

Self-Attention的Input,是一串的Vector,那这个Vector可能是你整个Network的Input,它也可能是某个Hidden Layer的Output,所以用 a 表示它:

image-20210404202435331

Input一排a向量以后,Self-Attention要Output另外一排b向量。每一个b都是考虑了所有的a以后才生成出来的,b1 虑了a1…a4,b2 虑了a1…a4 ,b3,b4 是一样,考虑整个input的sequence,才产生出来的。

关于如何产生b1 个向量,这里有一个特别的机制,这个机制是根据 a1 个向量,找出整个很长的sequence里面,到底哪些部分是重要的。

image-20210404202942477

每一个向量跟 a1 关联的程度,用一个数值叫 α 来表示。

image-20210404204458431

计算这个α 数值有各种不同的做法

  • dot product:输入的这两个向量分别乘上两个不同的矩阵,左边这个向量乘上Wq 矩阵得到矩阵q,右边这个向量乘上Wk 矩阵得到矩阵k,再把q k 做dot product,就是把他们做element-wise 的相乘,再全部加起来以后就得到一个 scalar,这个scalar就是α,这是一种计算α 方式(Transformer)。

  • Additive:把同样这两个向量通过Wq Wk,得到q k,拼接这两个向量,然后输入到Activation Function,再通过一个Transform,然后得到α。

那你就要把这边的a1 跟这边的a2a3a4,分别都去计算他们之间的关联性,也就是计算他们之间的α

image-20210404211656032

a1 乘上Wq 到q1,这个q 做Query,它就像搜寻相关文章的关键字。接下来,a2a3a4 要去把它乘上Wk,得到k 个Vector,k 个Vector叫做Key,那你把这个Query q1,跟这个Key k2,算Inner-Product就得到α。我们这边用,α1,2 代表说,Query是1提供的,Key是2提供的时候,1跟2他们之间的关联性α 做Attention的Score,即Attention的分数,接下来也要跟a3,a4 计算

image-20210404211950882

把a3 上Wk,得到另外一个Key也就是k3,a4 上Wk 到k4,然后你再把k3 个Key,跟q1 个Query做Inner-Product,得到1跟3之间的关联性,得到1跟3的Attention,你把k4 q1 Dot-Product,得到,α1,4,得到1跟4之间的关联性。其实一般在实作时候,q1 会跟自己算关联性。

计算出a1 每一个向量的关联性以后,接下来这边会接入一个Soft-Max

image-20210404212945356

这个Soft-Max跟分类的时候的那个Soft-Max是一模一样的,所以Soft-Max的输出就是一排α,所以本来有一排α,通过Soft-Max就得到α′,这边你不一定要用Soft-Max,用别的替代也没问题,比如说有人尝试过说用ReLU,结果发现还比Soft-Max好一点,Soft-Max是最常见的。接下来得到这个α′ 后,我们就要根据这个α′ 抽取出这个Sequence里面重要的资讯,根据这个α 们已经知道说,哪些向量跟a1 最有关系的,怎么抽取重要的资讯呢?

image-20210404213559086
  • 首先把a1 a4 每一个向量,乘上Wv 到新的向量,这边分别就是用v1v2v3v4 表示

  • 接下来把这边的v1 v4,每一个向量都去乘上Attention的分数,都去乘上α′

  • 然后再把它加起来,得到b1

,b1=∑iα1,i′vi

如果某一个向量它得到的分数越高,比如说如果a1 a2 关联性很强,这个α′ 到的值很大,那我们今天在做Weighted Sum以后,得到的b1 值,就可能会比较接近v2

所以谁的那个Attention的分数最大,谁的那个v 会Dominant你抽出来的结果

至此,从一整个Sequence 就得到了b1

image-20210409092350116

从这一排 vector 得到 b1,跟从这一排 vector 得到 b2,它的操作是一模一样的。要强调一点是,这边的 b1 到 b4,它们并不需要依序产生,它们是一次同时被计算出来的

怎么计算这个 b2?我们现在的主角,就变成 a2

image-20210409093744204
  • 把 a2 乘上一个 matrix,变成 q2

  • 然后接下来根据 q2,去对a1 a4 这四个位置,都去计算 attention 的 score

    • 把 q2 跟 k1 做个这个 dot product
    • 把 q2 跟 k2 也做个 dot product
    • 把 q2 跟 k3 也做 dot product
    • 把 q2 跟 k4 也做 dot product,得到四个分数
  • 得到这四个分数以后,可能还会做一个 normalization,比如说 softmax,然后得到最后的 attention 的 score,,,,,α2,1′α2,2′α2,3′α2,4′ 我们这边用 α′ 示经过 normalization 以后的attention score

  • 接下来拿这四个数值,分别乘上 v1v2v3v4

    image-20210409094148657
    • 把 ,α2,1′ 上 v1
    • 把 ,α2,2′ 乘上 v2
    • 把 ,α2,3′ 乘上 v3
    • 把 ,α2,4′ 乘上 v4,然后全部加起来就是 b2
    ,b2=∑iα2,i′vi

同理就可以,由 a3 乘一个 transform 得到 q3,然后就计算 b3,从 a4 乘一个 transform 得到 q4,就计算 b4,以上说的是 Self-attention 它运作的过程。

矩阵形式的Self-Attention

我们现在已经知道每一个 a 都产生 qkv

image-20221125214408693

我们每一个 a,都乘上一个矩阵,我们这边用 Wq 来表示它,得到 qi,每一个a 要乘上 Wq,得到qi,这些不同的 a 把它合起来,当作一个矩阵来看待

image-20210409100755718

一样a2a3a4 都乘上 Wq 得到q2q3 q4,那你可以把 a1 到 a4 拼起来,看作是一个矩阵,这个矩阵我们用 I 来表示,这个矩阵的四个 column 就是 a1 到 a4。I 乘上 Wq 就得到另外一个矩阵,我们用 Q 来表示它,这个 Q 就是把 q1 到 q4 这四个 vector 拼起来,就是 Q 的四个 column,所以我们从 a1 到 a4,得到 q1 到 q4 操作,其实就是把I 这个矩阵,乘上另外一个矩阵 Wq,得到矩阵Q。I 这个矩阵它里面的 column就是我们 Self-attention 的 input a1 到 a4;Wq 是 network 的参数,它是等一下会被learn出来的 ;Q 的四个 column,就是 q1 到 q4。

接下来产生 k 跟v 的操作跟 q 是一样的

image-20210409101331347

所以每一个 a 得到qkv ,其实就是把输入的这个,vector sequence 乘上三个不同的矩阵。

下一步是,每一个 q 都会去跟每一个 k,去计算这个 inner product,去得到这个 attention 的分数

那得到 attention 分数这一件事情,如果从矩阵操作的角度来看,它在做什么样的事情呢

image-20210409102703364

你就是把 q1 跟 k1 做 inner product,得到 α1,1,所以 α1,1 是 q1 跟k1 的 inner product,那这边我就把这个,k1 背后的这个向量,把它画成比较宽一点代表说它是 transpose

同理 α1,2 就是 q1 跟 k2,做 inner product, α1,3 就是 q1 跟 k3 做 inner product,这个 α1,4 就是 q1 跟 k4 做 inner product

那这个四个步骤的操作,你其实可以把它拼起来,看作是矩阵跟向量相乘

image-20210409102832459

这四个动作,你可以看作是我们把 k1 到 k4 拼起来,当作是一个矩阵的四个 row

那我们刚才讲过说,我们不只是 q1,要对k1 到 k4 计算 attention,,,q2,q3,q4 要对 k1 到 k4 计算 attention,操作其实都是一模一样的

image-20210409103622596

所以这些 attention 的分数可以看作是两个矩阵的相乘,一个矩阵它的 row,就是 k1 到 k4,另外一个矩阵它的 column。

我们会在 attention 的分数,做一下 normalization,比如说你会做 softmax,你会对这边的每一个 column 做 softmax,让每一个 column 里面的值相加是 1,之前有讲过说,其实这边做 softmax不是唯一的选项,你完全可以选择其他的操作,比如说 ReLU 之类的,那其实得到的结果也不会比较差,通过了 softmax 以后,它得到的值有点不一样了,所以我们用 A′,来表示通过 softmax 以后的结果。

我们已经计算出 A′,那我们把这个v1 到 v4 上这边的 α 以后,就可以得到 b

image-20210409105513608

把 v1 到 v4 成是V 这个矩阵的四个 column,把它拼起来,然后接下来你把 V 上A′ 的第一个 column 以后,你得到的结果就是 b1

如果你是用矩阵操作的角度来看它,就是把A′ 的第一个 column 乘上 V,就得到 b1,然后接下来就是以此类推

image-20210409105935046

就是以此类推,把 A′ 的第二个 column 乘上 V,就得到 b2,A′ 的第三个 column 乘上 V 就得到 b3,A′ 的最后一个 column 乘上 V,就得到 b4

所以我们等于就是把 A′ 这个矩阵,乘上 V 这个矩阵,得到 O 这个矩阵,O 这个矩阵里面的每一个 column,就是 Self-attention 的输出,也就是 b1 到 b4。

整体回顾Self-attention的矩阵操作

image-20210409110638357
  • I 是 Self-attention 的 input,Self-attention 的 input 是一排的vector,这排 vector 拼起来当作矩阵的 column,就是 I

  • 这个 input 分别乘上三个矩阵,Wq Wk 跟Wv,得到 Q K V

  • 这三个矩阵,接下来 Q 乘上 K 的 transpose,得到 A 这个矩阵,A 的矩阵你可能会做一些处理,得到 A′,那有时候我们会把这个 A′,叫做 Attention Matrix,生成 Q 矩阵就是为了得到Attention的score

  • 然后接下来你把 A′ 再乘上 V,就得到 O,O 就是 Self-attention 这个 layer 的输出,生成V 为了计算最后的b,也就是矩阵O

所以 Self-attention 输入是 I,输出是 O,那你会发现说虽然是叫 attention,但是其实 Self-attention layer 里面,唯一需要学的参数,就只有 Wq Wk 跟Wv 而已,只有Wq Wk 跟Wv 未知的,是需要透过我们的训练资料把它找出来的。但是其他的操作都没有未知的参数,都是我们人为设定好的,都不需要透过 training data 找出来,那这整个就是 Self-attention 的操作,从 I 到 O 就是做了 Self-attention。

#Transformer
上次更新: 2025/06/25, 11:25:50
Self-Attention概述
Multi-head Self-attention

← Self-Attention概述 Multi-head Self-attention→

最近更新
01
帮助信息查看
06-08
02
常用命令
06-08
03
学习资源
06-07
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Geeks_Z | MIT License
京公网安备 11010802040735号 | 京ICP备2022029989号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式