一 Self-attention
1.1 引入
1 Vector Set as Input
向量(Vector)是一个数学和物理学中的概念,它可以表示为具有大小(magnitude)和方向(direction)的量。
如果输入是一排向量,且长度是可以改变的。需要自注意力机制。
有什么是这种情况:
- 一个句子
将每个单词进行one-hot编码或者Word Embedding后,每个单词就是一个向量,一个句子就是一排长度为1的向量。
- 声音信号
将一段声音信号,通过一个25ms长度、10ms步频的滑动窗口,将其转换为多个向量。
- Graph-图
比如一个社交网络,图上每个节点,可以看成一个向量。
2 Output
输出有三种可能情况,主要是输入的向量与输出label的对应关系。
- Each vector has a label. 一对一,每个向量输入都有一个对应的label输出。eg:词性分析
- The whole sequence has a label. 多对一,整个输入对应一个label输出。eg:情感分析、分子亲水性。
- Model decides the number of labels itself. (seq2seq) 由模型自己决定输出的label为多少。
2.1 Sequence Labeling(Each vector has a label)
这里主要对输入输出一一对应的情况进行分析。
每个输入的向量通过一个FC得到一个label输出。
但是这样没有前后关系可以参考,所以第一步想到的是开一个window,多输入一些前后的输入向量。
这样同样有一个问题,在input输入向量不定长时,window不能确定。且当window较大时,FC的参数也会很多。
所以这里引入自注意力机制。
1.2 Self-attention
通过self-attention层后,每个向量都携带了所有向量的部分信息。所以FC可以考虑整个seq的信息进行判断。
同时,self-attention可以使用多次,可以将Self-attention和FC交替使用。
所以self-attention的输入可以是input,也可以是hidden的output。
1. 原理
α是两个向量之间的关联性
a. 如何计算α值?
dot-product。将两个输入向量分别乘一个矩阵,得出两个向量然后点积,得出两向量相关性。
b. 如何在self-attention中使用?
要计算向量a1与其他向量的关系时:
- 计算q1:使用a1乘矩阵Wq
- 计算k值:其他向量乘矩阵Wk,可以的一系列k值
- 计算α:dot-product(q,kn)可以得到a1与an之间的α值。
- a1也需要和自己计算相关性,即α1,1 = q1·k1 。可以见下图。
c. 通过soft-max
通过该步,将计算值进行一个缩放。
d. 根据向量相关性(α)抽取信息
第二三步已经知道向量a1与其他的向量的关联性。根据与每个向量的相关性,抽取信息。
向量a1乘以对应的Wv矩阵,求得对应的每个向量的V值。然后根据前面计算的相关性乘v值,每个向量的v值相加,即为b1。
总结:
- an乘不同的矩阵得出对应的qn、kn、vn
- dot-product(q1,kn)求得向量a1与每个向量的关联性,然后做soft-max
- vn*α1,n就是每个向量取相关性后的信息,相加即为对应的b1.
以上就是如何从a1-an的向量中,求出a1对应的输出b1.
2. 从矩阵乘法理解
每一个a1-a4都要乘以Wq得到q1-q4,因此可以把a1-a4拼接起来得到一个矩阵 I ,矩阵I乘以Wq得到Q,Q的四个列向量(column)就是q1-q4,Wq是学习参数;同理算出4个k1-k4和v1-v4。总结来说就是将输入的矩阵乘以三个不同的矩阵得到Q、K、V
这里α1,1是有k1和q1两个向量进行点乘,所以可以进行进一步的结合。然后对每个q进行相城,就可以得出一个α矩阵。对该矩阵的每个column进行softmax
b1 = v1v2v3v4 * A`的第一列。所以b1-n就是v*A`。
所以整体的流程用矩阵乘法表示如下:
整个模型需要学习的参数是Wq、Wk、Wv三个矩阵。
3 Multi-head Self-attention
自注意力机制本质是找q与其他k的相关性。但是这种相关性只有一个评判维度(因为只有一组矩阵)
而多投注意力机制则可以有多组qkv矩阵,可以表示不同评价体系下的相关性。
在多头注意力下,先以自注意力机制算出每个不同评价体系的bi,n(n为head数)。就是1的一类一起做,忽略2的一类,2的一类一起做,有多个head也是一样的操作。然后将多个head算出的b组成一个矩阵进行Wo相乘,得到最终结果。
1.3 Positional Encoding(位置编码)
目前self-attention是没有每个向量的位置顺序的,而且每个向量是并行做相同的操作,所以丢掉了位置信息。
为每一个位置设定一个唯一的vector (ei,上标i表示位置),称为pisitional vector,不同的位置有专属的ei,把ei加上ai就结束了。
目前这个e是人为设置的,且仍然待研究。可以提出其他的方案。
1.4 一些Self-attention的应用
- 声音模型用于缩减模型矩阵大小
- 图形模型,将图像转换为一个较大的向量set
- 图应用(Graph),在Graph中,向量关联性不用再计算,可以使用图上节点间相连信息来判断。
二 Transformer
2.1 Seq2seq
1. 什么是 Seq2seq
Sequence-to-Sequence(Seq2seq):
输入的长度和输出的长度无关联关系,由模型自己决定输出长度。如:语音翻译、语音辨识。
输入和输出中间从逻辑来说可能还有一些其他环节,但是在 seq2seq 中可以忽略中间环节,直接对端到端的数据进行训练。
很多 NLP 任务都可以理解为 QA模式,很适合 seq2seq 模式。
eg1: seq2seq模型做文法解析输
eg2:multi-label Classification
2. 基本结构(encoder & decoder)
seq2seq 主要包括一个 encoder 和一个 decoder 结构,如左上。
Encoder
encoder 主要功能是将一排向量输入进行,输出一排向量。
在 transformer 中encoder 结构如下:
tips:
- 每个 block 不是神经网络里的一层。其中包含很多层结构
- 在 transformer 中,通过 self-attention 后不是直接输出,而是需要经过一个 residua残差l 过程(输出结果+输入)
