学习内容
本文以NLP为基础来介绍自注意力机制,而没有用图像为基础,但是其实两者都是相同的。 在图像中我们可以将图像切块(块的划分是自定义的),然后计算块与块之间的关系;
这里介绍了self-attention 的由来的应用
这里有几个问题需要说明:
- 常问的: 为什么是用dot-product来获取关系
我的理解是,如果两个特征高度相关,那么这两个特征之间的相似元素必然很多,那么点积之后的值就会很大,也就是关系型很强; 而且使用dot-product来计算关系是一个常用的方法。
1. 预备知识
1.1 Sophisticated Input(复杂输入)必须是 Vector set
在之前的一节中,我们的输入是一个向量,然后经过回归或者是分类来得到一个标量或者类别; 但是如果我们的输入长不只是有一个,而且多个呢? 而且是可以改变的呢?
一个句子: this is a cat
我们把每个单词作为一个向量;那么整个句子就是多个可变向量; 但是一个向量(单词)怎么表示呢?
- 第一种:我们可以以字母为单位,采用one-hot来表示一个单词;
但是问题又来了,你这样表示的话,两个单词之间的关系你是不知道的,没有语义的资讯,都是孤零零的!
通过这里我们就可以看到,所有的单词可能一种类别的都在一起 ,这里的Word Embedding会给每个词一个向量。 具体Word Embedding是怎么表示的,[Word Embedding](https://www.zhihu.com/question/32275069)
一段语音!
这里就会把一段Sequence当作信号;比如我们选取25ms的作为一个frame; 同时我们如果想表达整个句子的话,需要 往前和往后调整10ms; 为什么设置25和10ms,这是前人证明过的,你只需要用就行了。 所以1s --》 100frames
一个图
- 比如Social network中,每个人也就是每个节点就是一个向量,而每个人之间的edge就是关系,两个人可能是朋友关系或者是其它关系; 而每个人也就是每个向量就是这个人的资讯,比如它的性别、年龄和工作等等。
2. 比如一个分子也可以看做是一个graph 比如现在比较出名的drug discovery; 一个分子就是一个模型,一个原子就是一个向量。
1.2 输出(以上面各个输入为基础)
三种输出可能性;
Each vector has a label
和上面的输入相对应: 如果我们输入是一个句子的话,我们以词性标注(POS tagging)作为例子,那么我们输出的就是每个单词(向量)的标签; 如果我们输入的是一个语音,每段语音(frame)也会有一个标签; 如果我们输入的是一个图,每个向量(结点=人),那么我们的输出就会是每个节点买不买某个商品;
The whole sequence has a label
可能我们只想判断一句话的情感; 也可能判断某一段语音是谁讲的; 亦或者该分子的亲水性;
Model decides the number of labels itself(seq2seq)
比如语音翻译和语音辨识都是seq2seq,也就是长度不一;
2. self-attention
如果输入vector set的时候都可以使用self-attention
2.1 加入FC层
我们重点说第一种,一对一的,以Sequence Labeling为例,你要给每个向量一个label;
我们可以直接通过一个FC网络就可以实现了;
2.2 加入WIndow
但是这样就会有一个问题,你只关心一个单词的词性,如果两个单词一样的话,一个表示动词,一个表示名词,那么这样没有交集的处理会导致FC层无法处理。 所以需要让FC层考虑更多的上下文资讯。 所以我们可以扩大视野,简称window!
但是window也是有很大的缺点的,首先,如果我们要考虑整个句子,那么window会开的很大;其次,如果输入是多变的,那么我们的window很明显也是变化的,一个训练资料中我们要统计最长的句子多长,之后再加以设定;最后就是参数过多,容易过拟合;
2.3 加入Self-attention
self-attention中一个标量的获得是由下面所有的一块决定的。
怎么产生
b
1
b^{1}
b1; 也就需要计算KaTeX parse error: Undefined control sequence: \a at position 1: \?a?{1}和
a
2
a^{2}
a2、
a
3
a^{3}
a3的关系; 也就是
α
1
\alpha^{1}
α1、
α
2
\alpha^{2}
α2等。
而这个关系是怎么样找到的呢? 两种方法: dot-product和Additive
其中dot-product是将向量乘上一个矩阵W得到q,之后q · k = $\alpha$ 右侧则是自己看吧!! transformer中使用的就是dot-product。 所以加入了相关性后计算如下:
当然也可以进行softmax归一化! softmax不唯一,可以使用Relu、Norm等等。
最后我们得到经过attention score的向量组合! 你需要清楚地知道下面三个q、k、v是什么! 而我们需要的b1就是我们所求
同理,我们就可以得到{
a
2
、
a
3
、
a
4
a_{2}、a_{3} 、a_{4}
a2?、a3?、a4?} —》 {
b
2
、
b
3
、
b
4
b_{2}、b_{3} 、b_{4}
b2?、b3?、b4?}
2.4 总结一下:
2.4.1 得到q、k、v
当然
W
q
、
W
k
、
W
v
W^{q}、W^{k}、W^{v}
Wq、Wk、Wv都是矩阵!
2.4.2 得到attention score : α
下图中上方是推理第一向量得到的α的过程,下面则是将多个向量表达方式线性代数化了! 也就是K作为row, q作为了column。
2.4.3 得到b
同样的道理
2.4.4 最后总结
输入I —》 输出O; 中间Q是关系矩阵, A’是注意力矩阵。
特别注意的是: 这里只有
W
q
、
W
k
、
W
v
W^{q}、W^{k}、W^{v}
Wq、Wk、Wv是需要学习的,其它的都是已知的,不需要训练; 为什么呢? 自己去往上翻一翻就知道了。
3. Multi-head self-attention
如果一件事有不同的形式,有很多不同的定义,需要多个head!不同的q 每个head是一种相关性,多个head就是多个相关性; 这个head也是一个超参数!!!
最后再
4. Position Encoding
可以看到自监督中是没有位置的定义的! 比如动词不能作为句头,动词一般充当谓语。所以需要加入位置信息。但是位置信息不是单纯的位置,而是包含了位置的其它资讯,包含了重要性(我的理解是这样的)。
所以
e
i
e^{i}
ei长什么样子呢? 最早的transformer(attention is all your need) 方法一: hand-crafted
这是人设的! 但是sequence是改变的,所以很费劲
方法二: sinusoidal或者cos 最早的
方法三: 自己炼丹吧!!这是一个尚待研究的问题 比如左下角FloATER是自己创造的
5. Many Applications
Transformer 和 Bert 语音可以、图像也可以; 具体怎么做,自己看视频,因为我是做NLP的,直接省略! 比如图像中的一个pixel多个Channel; 或者是一行;
6. Self-attention v.s CNN
CNN是精简版的Self-attention! 因为Self-attention需要的感受野是全部的。 而在CNN中,感受野是确定的!
self-attention是一个flexible的model, 而且越是flexible的model越是需要更多的data,data不够,更容易overfitting;比如下面的图中, 我们比较了六个模型的分别使用CNN 和 Transformer的随着数据集量的增大后准确率的结果。 可以看出,数据集在少的时候,CNN是好的,但是随着数据集的增加,self-attention逐渐的更好。 这是因为感受野的不同的!
6. Self-attention v.s RNN
因为RNN可以被Self-attention取代,就不讲RNN了。 初始是一个memory 是预定义的!,处理的是一个sequence! 第一个RNN的block吃memory和第一个vector,然后输出新的memory和经过一个FC层来做我们需要的预测; 第二个RNN的block吃上一个吐出来的东西好第二个vector!
两者之间有很大的不同: 我们直观上可能感觉,RNN只考虑前几个的关系,而没有考虑全部;其实RNN也可以是双循环的,也可以认为是全部的关系; 所以这不是主要的区别。
最下面的链接将的是 ALL Transformers are RNN;
7.self-attention for graph
图的优点是有关联已经确定了,不需要再次计算了; 只需要计算强弱就行了!不需要决定有还是没有! 没有必要再学习了! 其实GNN是另一种self-attention
GNN水也是很深的!!
8. To learn more。。。
横轴是速度,纵轴是准确率! self-attention 首先用在Transformer中,但是它很慢,所以才有了下面的各种变形!! 但是准确率和速度兼顾的方法还需要进一步的深究!
!
|