Self-Attention运行过程

Self-Attention的Input,它就是一串的Vector,那这个Vector可能是你整个Network的Input,它也可能是
某个Hidden Layer的Output,所以我们这边不是用x来表示它。(有可能是交替使用,有可能是在network的某个环节当中)

 我们用来表示它,代表它有可能是前面已经做过一些处理,它是某个Hidden Layer的Output,那Input一排a这个向量以后,Self-Attention要Output另外一排b这个向量。

那这每一个b都是考虑了所有的a以后才生成出来的,所以这边刻意画了非常非常多的箭头,告诉你b^{1}考虑了a^{1}a^{4}產生的 , b^{2}考虑a^{1}a^{4}產生的, 也是一样,考虑整个input的sequence,才產生出来的。

如何产生这个b^{1}这个向量,知道如果生成一个之后,就知道怎么生成剩下的234。

这里有一个特别的机制,这个机制是根据这个向量,找出整个很长的sequence裡面,到底哪些部分是重要的,哪些部分跟判断是哪一个label是有关係的,哪些部分是我们要决定的class,决定的
regression数值的时候,所需要用到的资讯

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

这个self-attention的module,怎麼自动决定两个向量之间的关联性呢,你给它两个向量a^{1}a^{4},它怎麼决定两者有多相关,然后给它一个数值α呢,那这边呢你就需要一个计算attention的模组,

即为,拿两个向量作为input,直接输出α那个数值

 

 有两种比较常见的做法

1.,叫做用dot product,输入的这两个向量分别乘上两个不同的矩阵,左边这个向量乘W^{q}上这个矩阵得到矩阵q,右边这个向量乘上W^{k}这个矩阵得到矩阵k
再把跟做dot product,就是把他们做element-wise 的相乘,再全部加起来以后就得到一个 scalar,
这个scalar就是α,这是一种计算α的方式
2有另外一个叫做Additive的计算方式,它的计算方法就是,把同样这两个向量通过W^{q} 和W^{k},得到跟,那我们不是把它做Dot-Product,是把它这个串起来,然后丢到这个过一个Activation Function
然后再通过一个Transformer,然后得到α


dot-product

在这里插入图片描述

CSDN另外的老哥的详解

什么是element-wise 看这个代码段就可以了

import numpy as np
 
np1 = np.array([4, 6])
np2 = np.array([-3, 7])
print(np2 * np1)
 
# [-12  42]


总之有非常多不同的方法,可以计算Attention,可以计算这个α的数值,可以计算这个关联的程度
但是在接下来的讨论裡面,我们都只用左边这个方法,这也是今日最常用的方法,也是用在Transformer裡面的方法。

那你就要把这边的a^{1}去跟这边的234,分别都去计算他们之间的关联性,也就是计算他们之间的α

 

 你把a^{1}乘上W^{q}得到q^{1},那这个q有一个名字,我们叫做Query,它就像是你搜寻引擎的时候,去搜寻相关文章的问题,就像搜寻相关文章的关键字,所以这边叫做Query

然后再把a^{2}a^{3}和4全都乘上一个W^{k},得到k这个Vector,这个Vector叫做Key, 那你把这个Query q1,跟这个Key k2,算Inner-Product就得到α

我们这边用\alpha _{1,2}来代表说,Query是1提供的,Key是2提供的时候,这个1跟2他们之间的关联性,这个α这个关联性叫做Attention的Score,叫做Attention的分数,

接下来用3和4

 其实一般在实作时候, query1也会跟自己算关联性,自己跟自己计算关联性这件事情有多重要,你可以自己在做作业的时候试试看,看这件事情的影响大不大了
计算出,a1跟每一个向量的关联性以后,接下来这边会接入一个Soft-Max

 这个Soft-Max跟分类的时候的那个Soft-Max是一模一样的,所以Soft-Max的输出就是一排α,所以本来有一排α,通过Soft-Max就得到\alpha ^{1}
这边你不一定要用Soft-Max,用别的替代也没问题,比如说有人尝试过说做个ReLU,这边通通做个ReLU,那结果发现还比Soft-Max好一点,所以这边你不一定要用Soft-Max,这边你要用什麼Activation Function都行,你高兴就好,你可以试试看,那Soft-Max是最常见的,那你可以自己试试看,看能不能试出比Soft-Max更好的结果

接下来得到这个\alpha ^{1}以后,我们就要根据这个\alpha ^{1}去抽取出这个Sequence裡面重要的资讯,根据这个α我们已经知道说,哪些向量跟是最有关係的,怎麼抽取重要的资讯呢,

 

1.首先把a^{1} 到a^{4}这边每一个向量,乘上W^{v}得到新的向量,这边分别就是用v^{1}v^{2}v^{3}v^{4}来表示
2.接下来把这边的v^{1}v^{4},每一个向量都去乘上Attention的分数,都去乘上a^{'}
3.然后再把它加起来,得到b^{1}

 (有一点不是很理解,这里放一个v的矩阵是想干什么捏)

如果某一个向量它得到的分数越高,比如说如果a^{1}a^{2}的关联性很强,这个得到的值很大,那我们今天在做Weighted Sum以后,得到的b^{1}的值,就可能会比较接近v^{2}
所以谁的那个Attention的分数最大,谁的那个就会Dominant你抽出来的结果
所以这边呢我们就讲了怎麼从一整个Sequence 得到b^{1}

于是到了生成这个b1之后。从一排的vector(向量)生成b1之后再去生成b2是一样的。但是矩阵运算有一个好处,他们是同时被生成的,不是依次生成的。是同时被生成的,怎么去计算b^{2},就是把主角变成a2

 

 

 

 

矩阵角度

已经知道每一个a都产生一个qkv

每一个a乘上一个矩阵,如果是q的话,那么乘上的就是一个W^{q}很多个不同的Wq可以合起来当做一个矩阵。 

可以吧a1a2a3a4拼起来,看成一个矩阵,这个矩阵用i表示。这个矩阵的四个column是a1到a4。

I乘W^{q},得到了举证Q。I这个矩阵column就是我们 Self-attention 的 input是a1 到a4 ; 其实是 network的参数,它是等一下会被learn出来的(被learn出来是啥意思) ; 的四个 column,就是 q1到q4。

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

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

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

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

你就是把 q1跟k1 做 inner product,得到\alpha _{1,1} ,所以 \alpha _{1,1}就是 q^{1}k^{1}的 inner product,那这边我就把
这个, k^{1}它背后的这个向量,把它画成比较宽一点代表说它是 transpose
同理\alpha _{1,2} 就是q^{1}k^{2} ,做 inner product, 其他的三和四也是一样的
那这个四个步骤的操作,你其实可以把它拼起来,看作是矩阵跟向量相乘

 

 这四个动作可以看作吧k^{1}k^{4}拼起来,当做是一个矩阵的四个row。

其他的q2q3q4也都是一样的

 所以这些 attention 的分数可以看作是两个矩阵的相乘,一个矩阵它的 row,就是k^{1}k^{4} ,另外一个矩阵.它的 column就是q^{1}q^{4}
我们会在 attention 的分数,做一下 normalization,比如说你会做 softmax,你会对这边的每一个
column,每一个 column 做 softmax,让每一个 column 裡面的值相加是 1
之前有讲过说 其实这边做 softmax不是唯一的选项,你完全可以选择其他的操作,比如说 ReLU 之类的,那其实得到的结果也不会比较差,通过了 softmax 以后,它得到的值有点不一样了,所以我们用 ,来表示通过 softmax 以后的结果。

已经计算出A^{1}

再乘以一个以v^{1}v^{2}v^{3}v^{4}为column的矩阵,就可以得到b

而把 A 的第一个 column乘上 V 这个矩阵做的事情,其实就是把 V 这个矩阵裡面的每一个 column,根据这个A^{'} 矩阵裡面的每一个 column 裡面每一个 element,做 weighted sum(各个子类相加),那就得到b1.

 所以其实整个 Self-attention,我们在讲操作的时候,我们在最开始的时候 跟你讲的时候我们讲说,我们先產生了 q k v,然后再根据这个 q 去找出相关的位置,然后再对 v 做 weighted sum,其实这一串操作,就是一连串矩阵的乘法而已

我们再复习一下我们刚才看到的矩阵乘法

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

2.这个 input 分别乘上三个矩阵W^{q},W^{k}W^{v},得到 Q K V

3.这三个矩阵,接下来 Q 乘上 K 的 transpose(转置),得到 A 这个矩阵,A 的矩阵你可能会做一些处理(比如说softmax),得到 ,那有时候我们会把这个 ,叫做 Attention Matrix,生成Q矩阵就是为了得到Attention的score,即为\alpha
4.然后接下来你把 再乘上 V,就得到 O,O 就是 Self-attention 这个 layer 的输出,生成V是为了计算
最后的b,也就是矩阵O

所以 Self-attention 输入是 I,输出是 O,那你会发现说虽然是叫 attention,但是其实 Self-attention layer裡面,唯一需要学的参数,就只有W^{q}W^{k}W^{v} 而已,只有 W^{q}W^{k}W^{v}是未知的,是需要透过我们的训练资料把它找出来的

 但是其他的操作都没有未知的参数,都是我们人為设定好的,都不需要透过 training data 找出来,那这整个就是 Self-attention 的操作,从 I 到 O 就是做了 Self-attention。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是随便学学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值