b站视频讲解-5min
深度学习其实就是想学习一个模型可以用于实现 o u t p u t = f ( i n p u t ) output=f(input) output=f(input)
注意力机制的目的就是对所有的输入向量执行简单的线性加权,所以需要训练模型学习最优的权重值 α,
但是,实际情况中我们不能简单的学习权重,因为输入的向量的长度是可变的,所以需要求解的权重参数 α 的数目也因此是可变的。
此外,对于权重的值,有一个限制,需要进行归一化处理。(也就是α的和应该等于1)。
因此,为了得到权重,注意力机制巧妙地使用了key和query。
类似于python字典的每个value都会有对应的key,自注意机制就是key为value本身的情况。
以普通的注意力机制为例:
当我们有query了,而且有一序列的keys值,就可以使用点积 q·k计算权重α的值,后面加一个非线性函数一般使用tanh,加softmax使得结果归一化。
得到权重α之后,output的计算就是权重α与输入值v的加权。
在上述步骤中,忽略了一个很重要的问题,所有的k、q、v都是固定的,无法学习,因此,在注意力机制中对k、q、v引入了可学习的参数矩阵:Wk、Wq、Wv。
注意力分数:没有经过归一化的注意力得分
注意力权重:经过归一化后的注意力权重,所有值的和为1
最常用的两个注意力函数是加法注意和点积注意计算:
虽然两者在理论上的复杂性相似,但点积注意力在实践中更快且更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
而对于d较小的情况,这两种机制的表现相似,加法注意力优于点积注意力
Additive Attention
当k,q长度不一样的时候最常用的做法。
上述,第一个公式中除以根号d,是想让a对长度不呢么敏感。
如上计算得到的注意力分数a的每一行都是一个query的注意力得分。
然后对行数据进行softmax计算,得到每一行是一个query的注意力权重。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)