【阅读】Transformer

参考
Attention Is All You Need
A General Survey on Attention Mechanisms in Deep Learning
注意力足矣(Attention Is All You Need)

一般注意力模型

这个模型接受一个输入,执行指定的任务,然后产生所需的输出

  • 输入 Xdx×nx=[x1,,xnx],每个向量 xRdx 为词、像素、声音序列特征等
  • 特征模型 feature model:输入 X,输出特征 Fdf×nf=[f1,,fnf],特征向量 fRdf
  • 查询模型 query model:得到查询向量 qRdq,用于提示注意力模型需要注意哪些特征部分
  • 注意力模型 attention model,由单个或多个注意力模块 (Fig.2) 构成:输入特征向量 F 和查询向量 q,对特征向量用权重矩阵 WK,WV 线性变换出键矩阵 Kdk×nf=WKF=[k1,,knf] 和值矩阵 Vdv×nf=WVF=[v1,,vnf]WK,WV 可以是可训练的或者预先指定的
    注意力模块为了得到 V 中的值向量的加权平均值——特征 F 中对查询 q 重要的信息。为每个键向量 k,通过某个打分函数计算其和查询向量 q 的注意力得分 el=score(q,kl)(通常在 [0,1]),组成得分向量 e=[e1,,enf]
    通过对齐层 (alignment) 归一化,比如 Softmax al=expeljexpej,得到注意力权重向量 a
    V 加权平均,得到上下文向量 (context vector) c=lalvl
  • 输出模型 output model:输入上下文向量 cRdv,训练模型输出预测值 y^Rdy^

自注意力 self att

若注意力模型 attention model 完全通过特征 F 得到
例如,查询向量也由 F 得到:Qdq×nf=WQF=[q1,,qnf];当使用 ql 查询时,生成 cl,即 C=self-att(Q,K,V)

多头注意力 multi-head att

如图 Fig.9 有 d 个并行的注意力模块,思想是使用不同的权重矩阵对查询 q 进行线性变换得到多个查询,每个查询期望专注于不同类型的信息,从而使得注意模型在上下文向量计算中引入更多信息。
每个 att head 都有自己训练的矩阵:Wq(l),WK(l),WV(l),得到查询向量、键矩阵和值矩阵 q(l),K(l),V(l),过一遍注意力模型得到上下文向量 c(l);将它们连接然后线性变换 WO,得到最终的上下文向量 c=WOconcat(c(1),,c(d))

多头自注意力

Transformer 所使用的;后面就不强调自注意力了

Transformer 介绍

Transformer 是一种序列转录模型 (sequence transduction models);序列转录模型输入、输出都为序列,通常由编码器 encoder 和解码器 decoder 组成,并用一种注意力机制 attention mechanism 连接它们
Transformer 模型在提出时仅作为机器翻译用,后来用于图像等其他领域
传统翻译通常是顺着序列跑,根据上一个位置对应的隐藏状态 ht1 和位置 t 的输入,确定 ht——这是一个难以并行的过程,且会面临历史信息存储过大或者丢失的问题
而 Transformer 能更好地支持并行,而且只使用注意力机制(在此之前通常使用 RNN 做)

Transformer 结构

概述

一般编码器/解码器结构:对于输入序列(比如单词序列)X=[x1,,xn],编码器输出 Z=[z1,,zn](序列长度不变);Z 丢进解码器输出 Y=[y1,,ym](序列长度可能改变)
如上图,Transformer 由左侧堆叠的 N 个编码器、右侧堆叠的 N 个解码器构成,N=6
对于解码器,它是自回归 auto-regressive 的:依次输出 yj,且 yj 需要通过引入 y1,,yj1 的信息而得到;因此解码器也以 Outputs 作为输入,其每次右移一位 (shifted right)

位置编码

输入特征向量序列 X=[x1,,xn],xRd(这里的 n 就是之后的 nf
在之后的 att-head 中我们只考虑键和查询的距离,并没有引入序列自带的时序信息;所以我们先为每个向量 xt 添加它所在位置 t 的信息:构造关于位置 t 的位置编码 positional encodings ptRd,并直接加给 xt

Fd×nf(old)=[x1+p1,,xn+pn]

pt=[sin(ω0t) cos(ω0t) sin(ω1t) cos(ω1t)  sin(ωd21t) cos(ωd21t)]T
其中 ωk=1100002k/d
下图中🔗,从上往下每一行依次为一个 pt

使用三角函数有一个好处,就是可以用线性变换刻画相对位置:对于 xt 使用 ωk 编码的片段 [sin(ωkt) cos(ωkt)],和相对位置为 ϕxt+ϕ 的编码片段 [sin(ωk(t+ϕ)) cos(ωk(t+ϕ))],可以用线性变换得到:

[sin(ωk(t+ϕ))cos(ωk(t+ϕ))]=[cos(ωkϕ)sin(ωkϕ)sin(ωkϕ)cos(ωkϕ)][sin(ωkt)cos(ωkt)]

编码器

多头自注意力


如上图所示,Multi-Head Att 亦如图,其为多头注意力,h=8(相当于 8 个通道,学习出不同的距离空间)

  • 对第 l 个 att-head 先使用这个头自己的线性变换,将 F(old) 变换出 Kdk×nf(l),Vdv×nf(l),Qdq×nf(l)
    (给我:K,V,Q 作为长度仍为 nf 的序列,保持了一定的 F 的序列信息,就是说“作为单词序列看还是有意义的”——不知道怎么更好地表述这个感觉;而之后通过 Multi-Head Att 的输出,也是同样长度的序列,其中每一项都是输入的加权和、而权重来自于这一项——类似卷积里的自相关给人的感觉)
  • 以缩放点乘 (Scaled Dot-Product) 计算注意力得分,ej(l) 为第 j(1jnf) 个查询向量 qj 依次与所有键向量 {k}i=1nf 的点积、列出的向量
    此外还要 Scale:除以 dk 防止某些向量因为长度较大导致得分占据优势

    E(l)=[e1(l),e2(l),,enf(l)]=K(l)TQ(l)dkej(l)=1dk[k1(l)Tk2(l)Tknf(l)T]qj(l)

  • 以 Softmax 对齐得 A(l),给 V(l) 加权得 C(l)
    j 个上下文向量 cj,为在查询向量 qj 的引导下、计算出的得分 ej 归一化后的 aj 作为权重、将值向量 {v}i=1nf 加权和后的结果

    A(l)=[a1(l),,anf(l)]=[softmax(e1(l)),,softmax(enf(l))]C(l)=[c1(l),,cnf(l)]=V(l)A(l),cj(l)=ivi(l)aji(l)

  • 创建一个上下文向量作为注意力模型的输出:对于第 j 个查询,将所有 att-head 的输出直接连接起来:concat(C(1),,C(h))R(dvh)×nf,然后用权重矩阵 WORdc×(dvh) 线性变换,得到最终 Multi-Head Attention 的输出 C

    Cdc×nf=WO[concat(c1(1),,c1(h)),concat(c2(1),,c2(h)),,concat(cnf(1),,cnf(h))]=WO[[c1(1)c1(2)c1(h)][c2(1)c2(2)c2(h)][cnf(1)cnf(2)cnf(h)]]

  • 对于上述的维度可以令 dk=dv=dq=dc/h
  • 最后过一遍残差连接和层归一化 Add & Norm

    F(new)=LayerNorm(F(old)+C)

    LayerNorm 是一个与 BatchNorm 有所异同的东西
    • BatchNorm 批标准化,输入 BN 层一批数据 batch×x
      实际上是 x 的每一维 feature 对整个 batch 标准化
      而对于 文章集合-单词序列-词特征向量 的情况:batch×seq×x,就要 x 的每一维 feature 对整个 batch×seq 标准化
    • LayerNorm 对于 batch×seq×x,它是 batch 的每个样本在自己的 seq×feature 上标准化
      这么选择的一个考量是,一个 batch 内,不同样本的 seq 不同,使用同一个均值/方差会估计不准确

前馈网络

输入之前的 F(new)=[f1,,fnf],通过前馈网络(简单 MLP + Add&Norm),输出 Z=[z1,,znf]
特别注意,我们将序列的每个向量分别丢进同一个 MLP,而不是将整个序列矩阵丢进 MLP

Z=LayerNorm(F(new)+FFN(F(new)))FFN(F(new))=[FFN(f1(new)),FFN(f2(new)),,FFN(fnf(new))]FFN(f)=W1ReLU(W0f+b0)+b1

解码器

带掩码的多头自注意力


注意力层计算加权和为 cj=iviaji,但是解码器在预测过程是自回归的,对于某个时刻 j,你输入给解码器的特征向量序列是之前的输出,即要求 cj 只与 v1,,vj 有关;所以训练时不能把当前位置之后的信息也放进去了,这可以在打分函数的 Scale 之后、Softmax 之前增加一个掩码 Mask 实现

E=Mask(E)=[e1,1e1,2e1,nfe2,2e2,nfenf,nf]

这样在之后过 Softmax 时,取 ln 会使得 变为 0,也就是对每个 e 的前缀的归一化、而后缀都变为 0
剩下同理:加权、连接、过一遍残差连接和层归一化,得到 F(dec)

以编码器输出作为输入的多头自注意力

如图,由编码器的输出 Z(enc) 得到键和值 K,V、由解码器第一部分的输出 F(dec) 得到查询 Q

K(l)=WK(l)Z(enc)V(l)=WV(l)Z(enc)Q(l)=WQ(l)F(dec)

也就是说,你从 V 中,根据来自解码器给的查询序列 Q 的每个位置 j 的查询 qj,用 K,qj 计算分数、从 V 中提取出 qj 感兴趣的信息,作为输出序列中这个位置的值

前馈网络

与上文同理

posted @   zrkc  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示