自回归模型:过去某个时刻的输出,也会作为当前的时刻的输入。(例如encoder-decoder类的模型,再输出y2的时候需要依赖y0和y1)
Transform 也是一个encoder-decoder结构。
LayerNorm和BatchNorm区别:
BatchNorm:训练时,把当前batch内的样本的某列特征进行处理,处理成均值0方差为1(减这个batch内这一列的均值,再除以方差即可)。预测时,算一个全局的均值的方差做为使用。此外还可以通过学习λ、β参数来变换到任意均值和反查。
LayerNorm:对每个样本做处理,处理成均值0方差为1。
Attention:
三个角色:一个Query和n个Key-Value对。
计算规则:输出是所有value的加权求和,其中每个value的权重w是key和query的相似度。
举例:针对不同的Query返回使用不同value权重。
Query:[0.1,0.2]
Key1:[0.1,0.2] Value1:[0.5,0.6]
Key2:[0.2,0.4] Value2:[0.7,0.8]
那最终返回为
=Query*Key1*Value1+Query*Key2*Value2
=0.05*[0.5,0.6] + 0.1*[0.7,0.8]
=[0.025,0.03]+[0.07,0.08]
=[0.095,0.11]
常见两种实现:scaled dot-product Attention、multi-head Attention
scaled dot-product Attention【默认】缩放点积的值
为什么Q和K相乘后,还要除以根号dk??
Softmax 函数对非常大的输入很敏感。这会使得梯度的传播出现为问题(kill the gradient),并且会导致学习的速度下降(slow down learning),甚至会导致学习的停止。那如果我们使用'根号dk'来对输入的向量做缩放,就能够防止进入到 softmax 函数的饱和区,使梯度过小:
公式:
流程图:(Scale:除以根号dk Mask:是为了避免在t时刻看到t时刻以后的东西,是对t以后乘以特别大的负数)
MultiHead-Attention
简介:Attention默认是scaled dot-product Attention。但也在此基础上的变种multi-head Attention。就是把QKW使用n个W映射到n个低位空间,再做Attention,把多个空间结果拼接。
Transformer:
Self-Attention
Self-Attention由一个输入X和Q、K、V四个对象组成。
X:k个item,一个item就是一个向量
Q:k个query,一个query也是一个向量
K:k个key,一个key也是一个向量
V:k个value,一个value也是一个向量
总结:也就是说一个,一个item都有一个query、key、value。
Q、K、V都是基于输入X线性变换而来,即:x*Q_w=Q,x*K_w=K,x*V_w=V。(Q矩阵是由x乘以Q_w矩阵得到,同理K、V)
Self-Attention最后的输出shape是,输入x的条数,维度是value的维度。
个人理解:整体来看,Self-Attention就是复杂的维度变换,和Dense层一样,都是把k个长度为n的向量变成k个长为m的向量。
Self-Attention的流程说下吧:
首先对n条向量进行线性变化,得到K、Q、V,然后query1和每个Key点积得到attention score,并sotfmax归一化。每个value*归一化后的attention score。加权求和得到output1。以此类推得到output2,output3。
参考资料:Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibiliTransformer 一篇就够了(二): Transformer中的Self-attenstion - 知乎