Transform, Self Attention, Multi-Head Attention的一些笔记。
Self Attention自注意力
- 什么是self attention?
- 传统的attention是靠对比如lstm的hidden state进行内积得到的energy权重
- 这里是通过对当前层的输入,直接得到,而不是hidden,因此叫self attention(来自输入向量本身)
- 怎么实现的?通过三个向量实现,分别是:
向量:用于对所有位置进行atten to。 - 怎么atten的?是通过
得到。 - atten的得到的有什么用?可以想象是原始attention机制中的energy,其实就是一个权重得分,最后要拿去对
向量进行加权平均,得到context向量。
- 怎么atten的?是通过
向量:表示这个位置,要被query向量检索的信息,因为每次query向量attend到你的时候,都是拿key向量去给它进行内积 向量,表示这个位置真正的内容,最后是要拿来给energy加权平均的。
- 怎么得到Query,Keys,Values向量的?
- 对输入向量分别进行线性变换就得到了
- 具体点就是使用三个矩阵,
, , - 因此,原始attention相当于是self attention的特殊情况,keys和values都是向量本身,然后Query是隐状态hidden,然后计算energy,在softmax变成概率,在把所有hidden加权平均得到context
- 和原始attention结构对比
- 原始attention
- 原始attention
- 计算过程
- 单个位置计算过程
- divide by
是说这样更stable - 多个位置同时计算,使用矩阵
Multi-Head Attention多头注意力
- 直观理解什么是多头注意力
- 前面的self attention只有1组Q、K和V,那么我们设置多组Q、K、V就可以学习不同的上下文。这个不同是由训练数据驱动的。
- 有点像是卷积核设置多个channel
- 多个head得到很多
矩阵,怎么处理? - 按照第二个维度concatent,每个词得到一个超长的feature
- 不感觉太大了吗?所以使用了一个权重矩阵
对Z进行线性变换,得到一个比较小的Z
- 图示
- 多头注意力作用表现:
- 其中一个head的语义:
- 另一个head的语义:
- 其中一个head的语义:
Positional Encoding位置编码
- 为啥要位置编码?
- 因为从上面的self attention可以看出来,它并没有获取RNN里面那种位置信息,因此如果想要达到RNN那样的效果,就要加入位置编码。
- 距离,北京到上海的机票,和上海到北京的机票,这两个北京的embedding相同,但是我们希望他的语义不同,一个是出发地,一个是目的地。如果用RNN就有可能学出来。
- 怎么实现?
- 在原始的embedding上加入一层positional embedding,然后两个相加得到最后的embedding。
Layer Normalization
- 什么是Layer Normalization?
- 简单说就是对每个样本的所有特征进行normalization
- batch norm是对每个特征进行norm
- 相比Batch Normalization?
- Batch Normalization是对每个特征而言,计算每个特征维度下的均值和方差
- Layer Normalization是针对每个样本而言,计算每个样本的均值和方差
- 因此相比Batch Normalization,Layer Normalization可以在minibatch为1的情况下进行,而Batch Normalization下的minibatch不能太小。
- Batch Normalization相比之下的缺点
- 需要一个minibatch的数据,而且这个minibatch不能太小(比如1)
- 不能用于RNN,因为同样一个节点在不同时刻的分布是明显不同的。当然有一些改进的方法使得可以对RNN进行Batch Normalization,比如论文Recurrent Batch Normalization
- 计算
残差连接
- 什么是残差连接?
- 为什么要用残差连接?
- 怎么实现的?
- 输入𝑥1,𝑥2经self-attention层之后变成𝑧1,𝑧2,然后和残差连接的输入𝑥1,𝑥2,加起来,然后经过LayerNorm层输出给全连接层。全连接层也是有一个残差连接和一个LayerNorm层,最后再输出给上一层。