step1: “Inputs Embedding” + "Positional Encodin
比如
This is a cat.
,我们人可以直到this是【这】is是【是】【个】【猫】,但是计算机是不明白的,它只能看懂数字,所以 step1我们做
Inputs Embedding
意思就是说,对于NLP任务的话,this我要写成一个向量的形式代表它,最简单是 one-hot encoding。
但是 one-hot encoding 并不能代表出一个词的语义信息,
但是对于计算机来说的话,它计算机它不明白,计算机它其实只能是时间数字,所以,第一步我们去做一个input in Beijing的意思就是说,对于NLP任务的话,我this,我要形成一个向量来去代表,它就this,我用一个比如说vector,一个4个数的vector,比如说四个数的vector,就比如说这个地方1000代表this is0100,对,就一个victor去编码,它所以最简单的就是one hot including,这是one hot including。
下图中,run 和 jump 其实是一个类,这个地方它其实就是借鉴了一个 unpervise 的思想,也就是无监督的思想,就是在高维空间里面,类别相近的一些词应该去形成一个 cluster,
它其实并不能表现出我们这个词的一个语义信息,什么叫语义信息?就比如说我应该是在我相似的词,比如说在一个开森dimension,或者是一个你高层空间里面,比如说我是dog,兔子和和这个猫它其实是比较相近的,都是动物类的,对,所以我们应该是去编码的时候要去考虑一些它的语义信息,
那么很自然的我们有一些形成它 embedding 的手段,比如说下图中的两句英语,
所以,我们怎么获取 NLP 中每个词的 embedding 呢?
我们如何获取NLP中每个词的embedding呢?除了one-hot encoding,还有很多方法(GLoVe)。起初大家用one-hot embedding.下图是非常好的NLP工具库,你如果做NLP任务的话,简单举例GLoVe这个工具包,它就是一个unsupervise learning 的算法。
你看任何 unsupervise learning 的论文,核心永远是一句话,就是说在高维空间里面,每一个输入(input),比如对于NLP来说的每一个词,对于image来说的话,每一张图片,对于社交网络来说的话每一个node,比如说欺诈检测,对于一段音频来说的话它的每一帧,比如音频里的色情检测,或者什么……
总的来说,UNsupervise 的核心就是在高维空间里面,比如说 dog 和 rabbit 我去算一个similarity(内积),内积越大的话,说明我这两个词(vector)是比较相近的.形成了一个cluster,然后通过一些 loss。
上面主要讲,对于一个NLP任务来说,每个词我们如何来形成一个representation表示。
视频8:00之后开始
对于计算机视觉来说,我怎么形成一个image corss 的一个 representation呢?一般来说,我输入的就是一张图片,一个CWH的图片
而图片它不像文字一样,文字的话会有上下文信息,而图片的话我们一般会通过一个 BackBone(imagenet_pretrained resnet),比如说普通的就是 resnet50,经过一个BackBone呢,就形成了一个高维空间——
[
C
′
,
W
′
,
H
′
]
,这个地方就形成了每个picture的embedding。
除此之外,音频每个帧也有一个通过i3d的预训练网络,形成了每一帧的一个embedding,那么,对于一个社交网络图节点来说的话。比如一张图,欺诈检测的话,图里面哪些是异常节点,那么它怎么形成一个 node embedding呢?它就有可能就是年龄与不同的特征加权和,来形成我们每一个 node embedding,这个就需要手工设计了。那么对于生物分子来说,它也有一下 embedding,比如说你可以把你这个每一个生物分子,它有一些生物分子的计算工具,这个课程我们后面会讲,这个比赛的前top都是用一些物理学的方法,去算的一个工具,这个我们后面会讲,存粹是为了打比赛,
但是我们目前讲这个 attention的话,完全就是知道了,第一步我们要形成 Embedding,目的就是想给每一个 Inputs ,无论是 NLP 里面的每一个字,还是 CV 里面的每一个像素,还是音频里面的每一帧,还是一个社交网络图,去形成这么一个embedding,这个大家一定要记住。
另外一个,就是说为了去记录每一个字的位置,比如说了一句话:“This is a cat.”,除了形成embedding,还需要知道这句话在整个context中的位置,我需要赋予embedding,这里最原始就是加一个 sin 和 cos 的变化,
为了去记录每一个字的位置,也就是每一个字在context中的位置,我需要赋予我这个embedding。所以这个地方最原始的方法是加一个sin和cosin的变化,去赋予我这个字的embedding一个
context info
,如下图所示:
到这里,我们形成了每一个字的embedding,就是一个vector。
那么,第二步,就是通过attention的方法,
首先说一下 self-attention,从宏观角度来说的话,它其实就是,首先给一个形式化的描述,
i
n
p
u
t
:
[
N
,
S
,
D
]
=
=
>
o
u
t
p
u
t
:
[
N
,
S
,
D
]
,N是batch维度,S是sequence的长度,这个sequence长度在NLP里面的话就是一段话里面的各个word(词),在CV里面,比如20*20的图片,S则是一个400的pixel,S=400(多少帧)。
在NLP里面,如果一句话有10个词的话,这个地方 S=10。我们经过 attention这个机制,更新完之后,经过了aggravate和update之后,我们的输出也是[N, S, D]。那么,相比于CNN它是怎么做呢?
画一个图来解释:
我们的输入和输出都为
D
的意思是hidden demission,就是我这个sequence的每一个feature的维度,其值可能是64,或为32,一般不会128,128时容易过拟合。
第一行是This,第二行is 以此类推,一共4行,S=4.
首先把Input,先讲self-attention,输出一个output,input怎么做呢?
首先,我们肯定是在feature,在hidden demission里面做,是在一个隐空间去做,高维空间去做,所以第一步就是要把input把它映射成,当然这个地方也有一个含义,也是通过learning的方法去做。
也就是说,我们input的时候,就形成了三个不同特征的一个矩阵,这个矩阵的意思通常来说呢就是Q,K, V
它们的维度也是
4
×
4
的 Attention Vector ,意思就是说
下图,对角线上的值,本身就比较大,
上图右侧,attention map也叫similarity map,即相似度矩阵。如果大家经常看一些论文的话,里面的诸如 attention map和similarity map 就是这么来的。
就是通过 Q 和K 的内积来的,Q和K的一个转置,来求出来的。
然后第二步呢,就是attention map 如何去做aggregate?这个attention map 如果大家学过GNN 的话,比如说一些 Cora 数据集,这个 attention map 又称为 邻接矩阵aka adj matrix,这个邻接矩阵就是一个图的结构。
把GNN的链接矩阵,和attention map关联起来,那你对transformer的理解就过关了。而且对attention的理解也非常深了。
通过 D 这个input,我形成了 Q、K,由Q、K算出了一个 similarity map(或attention map)之后,再去跟 V 相乘,
S
∗
D
的。
我形成 output 这个值,是通过 attention 学出来这个关联性(correction),跟我 V 的第一个维度相乘,关联性大的,比如说This is
attention_map 的一行,乘以 V 的一列,形成 output 的一个值。什么意思呢?
就是之前想
S
×
S
就代表 This 和其它 (This is a Dog) 的关系强弱,我利用这个关系强弱,去更新我的 S,S 其实就是代表我原来feature的第一个维度,它是一个动态更新(dynamis update)。
就是我形成我 output 这个值,我是通过我 attention 学出来这个关联性
correction),跟我 V 的第一个维度相乘,关联性大的,比如说This is a dog。
比如说This 和dog关联性大,第一行Dog这个地方的值就比较大,那么我形成的一个新的 This 第一维的 feature,就包含了更多的 dog 的信息。
以此类推,第一行
×
第2列,一直来说就形成了一个新的This的feature。
我的目的是把我第一行This的feature去更新,那么我更新的时候,我利用correction(关联性)——similarity_map,跟我这个 V 的第一维去相乘,里面的意思是如果我这里面的 dog 关联程度比较大,那么我更新出来的新的This的第一个feature,里面更多的包含跟dog的correction。
这是一个非常巧妙的 attention,其实就是一句话,Z
Q
K
T
之后,要过softmax,
softmax其实就是形成一个百分比关系,那么就是你看我第一行,The [0.71, 0.04, 0.07, 0.18],说明The ,有71%的和The是一个correction,有18%是和dog是一个correction,
过了softmax之后,再去和 V 去相乘,当然这个地方,softmax有非常多的形式,它不局限于softmax,还有tanh,就是把 Z 约束到 [0,1] 之间的一个值。
所以说,这就是整个一个 self-attention,我本身这个 Input,这个feature,S和D经过 3 个 FC,或者 3 个
Q
K
T
=
[
S
,
S
]
,这个[S,S]的attention map里面的值代表的是我这个值应该去跟我哪些相似度比较高,这个是一个NLP里面的例子
如果是CV里面的例子的话,都是一些S-400pixel,举个例子,比如说我在操场打篮球,如何去识别这个打篮球呢?
那S就是一系列的pixel,那怎么判断一个人在打篮球呢?
更合理的方法就是,我和操场有一定关系,我和篮板、篮球架有一定关系,甚至和观众有一定关系,相比于如果是一个CNN,CNN它其实需要一个
4
0
0
×
4
0
0
的similarity map,关于篮球的那些pixel,篮球、篮板等相应程度应该比较大,应该和有关篮球框、篮球架的关系度比较大,
在GNN中,在一个社交网络图里面,以Cora数据集为例子,它是若干个科学家的citeation ,论文的引用关系。
那么这个 attention map 就应该是比如同一个类别的,比如都是数学领域的论文,那么数学领域的attention map值应该比较大。
这就是一个非常简单的,我的输入是[N,S,D],我的输出也是[N,S,D],所以说这是一个非常简单,但是非常高效的。transformer是self-attention和cross-attention的结合,