输入:
不确定长度的向量。例如:
A.文字处理
,不同长度的句子,对词汇的向量表示可采用one-hot Encoding,word embedding(会存在类形似性),如下图:
B.一段声音信号是一排向量
,一段长度(25ms)定义为一个window,定义为一个向量即一个frame,一个window右移一点长度(10ms)得到一个新的向量(frame)
C.social network,分子
输出:
问题:
之前确定向量输入网络,现在面对的是一个序列,如何考虑一个序列的前后信息,此时就引入了self-attention。
self-attention
结构如下
:
就是每一个输入向量都与其他向量相关联后生成一个新的自己,这个FC权重是共享的哦,self attention模块计算是一个序列所有向量并行计算的,输出同样长度的输出后每个输出向量分别进入FC,再强调一次,共享权重。
序列中一个向量如何输出一个融合序列其他向量信息的新向量:
计算α表示两个向量的相关联程度
α两种计算方法,通常点积法常用
根据α去抽取其他向量信息,哪个α大,哪个v参与程度就高。
矩阵形式
之前不熟RNN,所以一直容易误解权重,此时再强调α生成q,k.v,共享矩阵。即序列输入的每个向量共享网络权重,无论是self-atttention模块,还是fc网络。
只有Wq,Wk,Wv三个矩阵权重需要学习。
Multi-head self-attention
用来应对不同的相关关系,每个头运算都是独立的,和上面计算方法相同
位置编码-positional encoding
在self-attention中没有位置信息,一段序列中每个输入顺序不影像输出,因为权重都一样。
但是序列是有位置信息的,所以引入了位置编码。为每一个位置设置一个位置向量,并采用加和的形式。这些位置向量是人为设定的,可能存在缺陷,现在也有通过数据学习位置向量。
self-attention原理大概就是这样
下面这个视频讲解注意力机制的本质还不错,四五分钟,有兴趣可以看看
注意力机制的本质|Self-Attention|Transformer|QKV矩阵_哔哩哔哩_bilibili