- 预备知识:
- 向量内积的几何意义:表征一个向量在另一个向量上的投影,表征两个向量的夹角
- 投影值大说明两个向量相关度高。如果两个向量夹角是九十度,那么这两个向量线性无关,完全没有相关性!
- 词向量之间相关度高在一定程度表示在关注词A的时候,应当给予词B更多的关注
- softmax操作的意义:归一化
- 一个矩阵与其转置的运算可以看成这些向量分别与其他向量计算内积
- self-attention:
- attention机制的核心:加权求和
- attention机制中的Q,K,V矩阵本质都是X的线性变换。不直接使用x,而是对其进行线性变换的原因:提升模型的拟合能力,变换矩阵w都是可以训练的,起到一个缓冲的效果。
- 对self-attention来说,它跟每一个input vector都做attention,所以没有考虑到input sequence的顺序。
- self-attention的计算过程:
- attention可以有很多种计算方式,加性attention,点积attention等
- Q,K,V是三个矩阵,分别是Query Key Value的缩写,Query与Key作用得到attention的权值,之后这个权值作用在Value上得到attention值
-
Attention是将query和key映射到同一高维空间中去计算相似度,而对应的multi-head attention把query和key映射到高维空间的不同子空间中去计算相似度。
-
每一层attention之后会有一个FFN,FFN的作用是空间变换FN包含了2层linear transformation层,中间的激活函数是ReLu。
-
FFN的加入引入了非线性(ReLu激活函数),变换了attention output的空间, 从而增加了模型的表现能力。把FFN去掉模型也是可以用的,但是效果差了很多。
-
自注意力机制进行缩放的原因(即在通过softmax之前除以一个数的原因):
-
维度较大时,向量内积容易使得 SoftMax 将概率全部分配给最大值对应的 Label,其他 Label 的概率几乎为 0,反向传播时这些梯度会变得很小甚至为 0,导致无法更新参数。因此,一般会对其进行缩放。
-
缩放值一般使用维度 dk 开根号,是因为点积的方差是 dk,缩放后点积的方差为常数 1,这样就可以避免梯度消失问题。
-
至于最后一层为什么一般不需要缩放,因为最后输出的一般是分类结果,参数更新不需要继续传播,自然也就不会有梯度消失的问题。
-
- 使用softmax除了归一化为加权求做准备,其实也是仿照知识蒸馏使用大模型在现有标记数据上生成软标签,而不是硬的二分类,因为软标签捕获了不同类之间的关系,这是大模型所没有的,这里的软标签就是缩放的 SoftMax。
- 位置编码:每一个不同的位置都有一个专属的向量,该向量是人工标注的。因为self-attention处理时是不考虑词的顺序的,但这个信息有时是很重要的,所以需要一起训练,一般是作为一个向量和输入x进行加性组合。
- 和一些传统模型对比:
-
CNN:
-
在做CNN时,一张图片可看做一个很长的向量,也可看做 一组向量:一张5 ∗ 10 5*105∗10的RGB图像可以看做5 ∗ 10 5*105∗10的三个(通道)矩阵,把三个通道的相同位置看做一个三维向量
-
CNN看做简化版的self-attention:CNN只考虑一个感受野里的信息,self-attention考虑整张图片的信息
-
self-attention是复杂版的CNN:CNN里面每个神经元只考虑一个感受野,其范围和大小是人工设定的;自注意力机制中,用attention去找出相关的像素,感受野就如同自动学出来的。
-
- RNN:
- RNN是线性处理,只考虑之前所有输入的因素。(目前通过可通过双向RNN,使得每一个输出可看做考虑了所有的输入信息)
- 自注意力机制能并行处理输入,每一个输出都考虑了所有输入的影响(但如果出现噪音,岂不是每个输出都受到了噪音的影响?)
-
- self-attention可用于图论,判断哪些节点之间是有关联的。缺点计算量非常大,优化其计算量是未来研究的重点。
- transformer:
- Self-Attention 是 Transformer最核心的思想
- transformer模型:基于encoder-decoder架构,encoder端是并行计算的
Transformer模型广泛应用于NLP领域,机器翻译、文本摘要、问答系统等等,目前火热的Bert模型就是基于Transformer模型构建的。 -
self-attention模块:让源序列和目标序列首先“自关联”起来。
-
transformer模型的总体架构:
-
采用encoder-decoder架构
-
Encoder层和Decoder层分别由6个相同的encoder和decoder堆叠而成
-
Encoder层引入了Muti-Head机制,可以并行计算,Decoder层仍旧需要串行计算
-
Encoder层和Decoder层内部结构:
-
Encoder具有两层结构,self-attention和前馈神经网络。self-attention计算句子中的每个词都和其他词的关联,从而帮助模型更好地理解上下文语义,引入Muti-Head attention后,每个头关注句子的不同位置,增强了Attention机制关注句子内部单词之间作用的表达能力。前馈神经网络为encoder引入非线性变换,增强了模型的拟合能力。
-
Decoder接受output输入的同时接受encoder的输入,帮助当前节点获取到需要重点关注的内容
-
-
每一个head都对应了一组Q,K,V
- Layer Normalization:
- 当使用梯度下降算法做优化时,可能会对输入数据进行归一化,但是经过网络层作用后,数据已经不是归一化的了。随着网络层数的增加,数据分布不断发生变化,偏差越来越大,导致不得不使用更小的学习率来稳定梯度。
- 层归一化作用就是保证数据特征分布的稳定性,将数据标准化到ReLU激活函数的作用区域,可以使得激活函数更好的发挥作用
- Mask 机制:
- padding mask:因为这些填充的位置,其实是无意义的,所以attention机制不应该把注意力放在这些位置上,所以需要进行一些处理
- Sequence mask:
- sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,模型中的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。
- 具体做法:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到的目的。
- 在多头注意力机制中,将一个(映射后的)高维矩阵拆分成多个低维矩阵进行计算,最后再将计算结果拼接。这里注意,并不是将输入inputX拆分成多个,因为这样做会丢失原句信息。
-
self-attention(以及transformer)--简单学习笔记
于 2022-09-22 21:56:50 首次发布