1.问题提出
全连接神经网络(FCN),可以很好的处理输入为1个向量(特征向量)的情况,但是如果输入是一组向量,FCN处理起来不太方便
以词性标记的问题为例
对于处于同一个句子中的相同的2个单词saw
,词性不同,前者为动词(V),后者为名词(N)
如果尝试使用FCN去解决这个问题,将每个单词转化为向量输入FCN,对于相同的2个单词,FCN的输出应该是相同的,不能根据单词在句子中所处的不同位置做出判断,FCN只关注外表
2.Self-Attention
2.1 定义
整体结构如下
这样的结构可以叠加多层
Self-attention内部结构如下
输入原始向量\(\vec{a}\),经过Self-attention后输出经过处理的向量\(\vec{b}\),是考虑所在向量序列的上下文的输出
2.2 工作原理
2个向量的关联程度\(\alpha\)计算如下,即attention score
分别计算\(a^1\)和\(a^1\)、\(a^2\)、\(a^3\)、\(a^4\)的关联程度\(\vec{\alpha_1}\),再经过softmax得到\(\vec{\alpha_1^\prime}\)
再求出\(\vec{v}\),和刚刚求得的\(\vec{\alpha_1^\prime}\)作内积(加权求和),即得输入\(\vec{a^1}\)考虑上下文之后得最终输出\(\vec{b^1}\)
以上处理是对向量\(\vec{a^1}\)输出\(\vec{b^1}\)的处理过程,同理对\(\vec{a^2}\)、\(\vec{a^3}\)、\(\vec{a^4}\)也做类似的处理,可得\(\vec{b^2}\)、\(\vec{b^3}\)、\(\vec{b^4}\)
2.3 矩阵表示
由输入向量序列得到Q、K、V矩阵
attention score计算
输出计算
整体结构如下
2.4 直观理解
- 理解1:针对某一个具体得问题,对于向量序列中的某一个向量,比如\(\vec{a^1}\),如果\(\vec{a^1}\)和另外一个向量\(\vec{a^i}\)的关联程度比较大,则计算出来的attention score就比较大,加权求和得到最后的输出向量,就和\(\vec{a^i}\)比较相近
- 理解2:q(query)、k(key)、v(value)
- q,可以理解为要查询当前向量,想要或者其和序列中哪个向量关系更紧密
- k,可以理解为对其他向量提取了一个关键字,用于和q计算关联程度
- v,可以理解为其他向量对于最后输出向量的贡献值,(k,v可以结合起来考虑,类比键值对的概念理解)
3.multi-head Self-attention
为什么需要multi-head Self-attention?
一组权重\(W^q\)、\(W^k\)、\(W^v\),对应了输入序列中的一中关系,可能存在多种关系,所有需要多组参数,称之为multi-head
4.Positional Encoding
上述Self-attention并没有考虑当前输入向量在整个输入向量序列中的位置关系,考虑对输入向量加上一个位置向量
位置向量\(e^i\)可以是手工设计的,也可以是从数据中学习出来的
5.Self-attention vs RNN
RNN也用来处理向量序列输入,和Self-attention相比,最主要的区别是RNN不能并行处理,输出之间存在依赖关系,而Self-attention可以用矩阵的方式表达,是可以并行处理的。此外,如果RNN要考虑第一个向量和最后一个向量之间的关系,要传递很多次memory,比较难,而Self-attention任意两个向量之间是通过计算attention score衡量联系程度的,所以远距离向量之间的关系比较容易得出。
标签:向量,Self,attention,FCN,vec,输入 From: https://www.cnblogs.com/dctwan/p/17411445.html