五 点云深度学习系列博客: 注意力机制原理概述( 二 )


K被认为是核 , 即被理解为衡量偏离差异的权重 。如果将上面公式按照输入与键的差异权重 , 重写其自身公式 , 则可得到:
如果把上述权重替换为一个高斯核驱动的高斯权重 , 那么函数f即可表示为:
这里给出一个示意图 , 以对比平均汇聚(左图)和基于高斯核驱动的注意力汇聚(右图)推导出的不同f对于样本键值对的拟合情况 。可以看到 , 后者的拟合性能会好很多 。
上述模型是一个无参模型 , 对于带可学习参数的情况 , 建议阅读 [2] 注意力机制章节 。这里所使用的高斯核及其对应的高斯权重 , 用来描述查询与键的关系 。在注意力机制中 , 这种关系的量化表示 , 即为注意力评分 。上述对查询值建立预测的过程 , 可以表示为对查询建立基于键值对的评分 , 通过对评分赋权 , 以获得查询值 , 表示为:
其中α表示权重 , q表示查询 , kv表示键值对 。在教材[2] 中还介绍了如何处理查询和键长度不匹配时间的加性注意力处理方法以及缩放点积注意力 , 用于定义注意力评分 , 这里不再详述 。
3. 多头注意力与自注意力
1)多头注意力
【五点云深度学习系列博客: 注意力机制原理概述】多头注意力用来组合使用查询、键值不同的子空间表示 , 基于注意力机制实现对不同行为的组织 , 来学习结构化的知识以及数据依赖关系 。通过独立学习得到不同的线性投影 , 来变换查询、键和值 。然后 , 将变换后的查询、键值并行地送到注意力汇聚中 , 然后将多个注意力汇聚的输出拼接在一起 , 并且通过另一个可以学习的线性投影进行变换 , 并产生最终输出 。这种设计被称为多头注意力 [5] 。下图展示了一个可学习的多头注意力模型:
这里给出每个注意力头的数学定义 , 给定查询q, 键k , 值v , 每个注意力头h的计算方法为:
这里的f可以是加性注意力和缩放点积注意力 。多头注意力的输出经过另一个线性变换 , 以连接欸多个注意力机制输出 , 进而模仿更复杂的函数 。
2)自注意力与位置编码
基于注意力机制 , 将NLP问题中的词元序列输入注意力汇聚 , 将一组词元同时充当查询、键值 。每个查询都会关注所有的键值对并生成一个注意力输出 。由于查询、键值均来自同一组输入 , 因此被称为自注意力机制 。这里将给出基于自注意力机制的编码方法 。
给定一个词元输入序列x1,x2,...,xn , 对应的输出为一个相同的序列y1,y2,...,yn 。y表示为:
这个公式起初我不是很理解 。不过结合文本翻译的具体任务 , 就方便理解了 。这里的意思是 , 一个词元某个位置上的元素 , 对应了输入和输出 。即键值都是这个元素本身 。我们需要学习的函数 , 即通过学习每个词与词元中的所有词汇的权重 , 来建立对值的预测 。
在处理词元时 , 由于自注意力需要并行计算 , 而放弃了顺序操作 。为了使用序列的顺序信息 , 可以在输入表示中添加位置编码来注入绝对的或相对的位置信息 。通过对输入矩阵添加一个相同形状的位置嵌入矩阵 , 以实现绝对位置编码 , 其行列对应的元素表示为:
这种基于三角函数方法表示的位置嵌入矩阵元素并不直观 。我们只知道编码维度与三角函数驱动的曲线频率存在一种关系 。即每个词元内部不同维度的信息 , 其对应的三角函数曲线频率是不同的 , 如图表示: