ViT记录
NLP中seq2seq结构对self attention机制的引入
序列转序列结构常用于机器翻译,其分为编码器和解码器两部分。其中,编码器负责将输入文本转译为上下文编码向量,解码器负责对其进行解码,翻译为目标语言。
该上下文编码向量长度一般是固定的,导致模型对于变长输入文本的处理能力不一致。为了提升模型对于该序列的利用能力,学界引入了注意力机制根据输入序列的不同部分为其赋予不同的注意力权重。
对注意力机制进行抽象,可以归结为Q,K,V三个矩阵的计算,如下图所示:
一个注意力层会在内部维护q,k,v三个权重矩阵,分别对应查询权重、键权重、值权重三方面权重。将输入序列向量与q,k,v矩阵分别相乘,就得到了Q(Query,查询向量,包含当前位置的输出序列信息,用于计算注意力权重),K(Keys,键向量,包含序列中每个位置的信息,用于计算注意力权重),V(Values,值向量,包含输入序列中每个位置的具体数值信息,用于根据注意力权重计算输出的上下文向量值)三个向量。
可以使用下面的公式表示从输入向量 x、待学习的 qkv 三个权重矩阵出发,得到注意力值的计算过程:
对上述操作的理解:
- qkv三个矩阵的计算可以理解为使用对应权重对输入向量的线性变换
注意力机制的解释
从上述例子中我们可以知道,注意力机制的引入目的是“有的放矢”地处理中间向量,提高模型效率。其实在自注意力机制概念提出之前,已经有其他意义比较相近的研究被提出:
自下而上的基于显著性的注意力机制:
- maxpooling 最大池化
- geating 门控
自上而下的汇聚式注意力
概念:从更高级别的表示或上下文信息开始,逐渐聚焦于更低级别的表示或局部信息
对于一个待加入注意力的输入序列\(X=(x_1,x_2,...,x_N)\),其中N表示信息项数目,设\(z\in\{1,2,...,N\}\)表示被选择信息索引位置,给定一个和任务相关的查询(Query)向量q,则z=i的信息项的注意力值可以表示为:
\[ p(z=i|X,q)=softmax(s(x_i,q)) \]
其中\(s(x_i,q)\)为注意力打分函数,一般采用缩放点积形式来定义。注意这里面的d表示输入信息的维度。
\[ s(x_i,q)=\frac{x_i^Tq}{\sqrt{d}} \]