【Attention(4)】【QKV的自注意力机制】 主要思路(笔记)


自注意力 Self-Attention

考虑当前针对输入序列的编码方式,如果我们需要将输入序列转化为一个定长的序列,此时卷积和循环神经网络均是较好的选择,但是注意到以上两种均只是一种局部编码的方式(循环神经网络本身由于长程依赖问题 / 梯度消失,实际上也只能建模局部的信息)

换一个思路,如果我想要捕捉整个输入序列中的某种长程依赖关系,此时常用的方法包括:

  • 构建深层网络来捕捉关系 → 也就是增加神经网络的层数,但是大家这么干过都知道直接粗暴增加层数是很消耗计算资源的
  • 构造全连接网络 → 但是无法处理变长的序列,也就是说此时输入的序列必须要是等长的 = 输入层的神经元个数

想要模拟全连接神经网络的思路来构建一种更好的,可以处理变长输入序列 + 捕捉长距离关系的模型,可以考虑利用注意力机制来 动态地 生成权重,这也就是 自注意力模型 的主要思路

查询 - 键值对注意力模型 Query-Key-Value,QKV

考虑到往常的使用频率,这里先介绍一下最常用的 查询 - 键值对注意力模型(Query-Key-Value,QKV),实际上为了增强模型效果,基本不会使用上面广义形式对应的自注意力模型

假设此时的输入序列为 x,则自注意力模型可以分为以下几个步骤:

在这里插入图片描述

在这里插入图片描述

也就是说,X 序列每一个长度为 Dx,输入系统(输入N 个(这里设 N=3)),则此时得到三个长度为Dk的向量,每一个向量得到一个对应的Q K V,不改变输入的 X 的对应 N 这部分的维度,但是将长度 Dx 改变为了 Dv(这里的 Dv 是可以任意设置的,只要通过操作此时从 X 到值 V 的投影操作对应的矩阵 Wv 就可以了)

目的

也就是说通过上述操作,此时可以将不定长的序列 Dx 动态地生成适合的权重并转化为某一个定长 Dv

summary

简单总结一下注意力机制的几个优点:

1、直观上了解,它可以同时捕捉全局和局部的联系,也就是说每一个 xi 的对应的权重都是和全局比较后得出的(也就是 softmax 部分) 2、大大减少了计算时间,直观理解也就是更多地将算力用在了确实需要注意的,与任务更加相关的重要的部分 3、支持并行处理 ,注意力机制的计算都不依赖一层一层的结果输出,所以可以并行进行操作计算 4、本身模型很简单(可能只是简单的点积 / 前馈神经网络,最后再加入一层 softmax),也就是说并不会为当前的模型带来太大的负担,本身参数也不多,训练容易

5、某种程度上或许可以帮助提高神经网络模型的解释性,也就是说通过计算注意力分布,我可以知道我当前的答案或许是更多地来自哪一个输入,从而更好地为未来的结果提供一定的解释

但是可以注意到此时缺点也是很明显的:

1、将所有的输入(对比到 encode - decode 模型也就是 encoder 部分的 隐藏层 h1 h2 h3)均平行对待,也就是说并没有考虑输入可能存在位置关系(比如 h2 就是在 h1 和 h3 之间输入的),而是并行地计算它们和查询向量 q 的关系,对于 nlp 任务来说本质上是损失了信息的

当然后续的模型大多加入位置信息 embedding 来帮助缓解这个问题(比如 BERT 就是这么干的),所以并不认为这就是 attention 用在 nlp 上的致命伤

参考

https://zhuanlan.zhihu.com/p/384853008


yg9538 2023年11月24日 20:13 收藏文档