快速、通俗地理解Transformer

注意力机制

目的:为了解决“信息瓶颈”的问题

优势:生成文本时可使用整个故事的上下文(这也是 RNN、GEU、LSTM 所办不到的)

模型逐字生成文本时,它有能力引用或关注与生成单词相关的单词(模型知道此时参考哪些单词的能力时在训练过程中通过反向传播学到的),且不受短时记忆的影响(类比 RNN 的参考窗口较短,无法访问到较早生成的单词)

transformer的网络结构

encoder

编码器分为:输入部分 -> 注意力机制 -> 前馈神经网络 3个模块

self-attention通俗的理解:变形金刚的“拆解对照表”,计算各个零件的权重,标明相互关系

前馈网络通俗的理解:根据这些权重变一次形状

  • 输入部分:

    • embedding

      如:输入 “我爱你...”(共12个字)每个可对应1个向量(如 1*512 的向量)

      方法:1、随机初始化;2、word -> vector,数据量大的时候两者差不多,但打比赛的话建议都尝试!

    • 位置嵌入

      为何需要?对于输入的所有文字,encoder是并行处理的,这样做可以提高速度但是忽略了文字在句子中的先后关系,因此需要给向量增加位置信息

      $$
      PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}}) \\ PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})
      $$


      求和操作:

      求和之后的向量作为整个transformer的输入

      引申:为何位置嵌入会有用?

      借助上述的公式我们可以得到一个特定位置的 d_{model} 维的向量,借助三角函数性质:

      $$
      \begin{cases} \begin{aligned} sin(\alpha+\beta)=sin\alpha cos\beta+cos\alpha sin\beta \\ cos(\alpha+\beta)=cos\alpha cos\beta-sin\alpha sin\beta \end{aligned} \end{cases}
      $$

       

      我们可以得到:

      $$
      \begin{cases} PE(pos+k,2i)=PE(pos,2i)\times PE(k,2i+1)+PE(pos,2i+1)\times PE(k,2i) \\ PE(pos+k,2i+1)=PE(pos,2i+1)\times PE(k,2i+1)-PE(pos,2i)\times PE(k,2i) \end{cases}
      $$

不难看出,对于pos+k 位置的向量的某一维 2i 或 2i+1 而言,可以表示为

pos 位与 k 位的向量的 2i 与 2i+1 维的线性组合,这意味着位置向量中包含了位置信息

但是这种相对位置信息会在“注意力机制”处消失!(可参考相关论文)

  • 注意力机制:权重

    为何是“权重”:games 翻译为中文仅考虑自己,则翻译为“游戏”,但是“Beijing Games”时则翻译为“比赛”,进一步地,“2022 Beijing Winter Games”中,games 则翻译为“冬奥会”

    • 基本的注意力机制

      婴儿在干嘛?

      如图所示,展示了人在观察图片的时候的关注点分布情况

      计算(权重)公式:

      $$
      Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V
      $$

       

      其中,d_k 的作用是:因为 QK^T 的值很大,而 softmax() 在反向传播的时候梯度很小,这样容易造成梯度消失的现象,故需要除以一个值来消除该弊端;同时 d_k​ 的取值也有讲究,最终可以控制方差为1

      Q K V 向量起到的作用很类似数据库操作中的:query key value

      其中,QK^T 即点乘代表的含义是:计算相似度,因为点乘描述的是向量之间投影的长度,投影值越大则向量越“接近”,即越“关注”

      其中,s1, s2, s3, s4 代表“相似度”,a1~a4 代表“归一化后的”相似度“

    • 在TRM中如何操作

      • 只有单词向量的情况下,如何获取 Q\ K\ V ?

        和 X 矩阵相比,输出矩阵 Z 的维度没有变,只是其中被编码掺入了其他单词的上下文信息,在多头注意力机制中使用不同的 Q K V 计算,这样做事为了消除 Q K V 初始值的影响(一件事找8个人做,万一哪一个不靠谱也不影响大局),最后加权平均合成一个 Z

        实际代码中使用矩阵形式,方便并行

      • 多头注意力机制:

        一头可以理解为一套空间,即“平行宇宙”,最后合并在一起输出

  • 残差和 LayNorm

    • 残差

      输出 F(x) 和输出 F(x)+x 的区别?

      $$
      流程:A \to B \to C \to D \\ 根据后向传播的链式法则, \frac{\partial L}{\partial X_{Aout}}=\frac{\partial L}{\partial X_{Din}}\frac{\partial X_{Din}}{\partial X_{Aout}} \\ 而\ X_{in}=X_{Aout}+C(B(X_{Aout})) \\ 所以: \\ \frac{\partial L}{\partial X_{Aout}}=\frac{\partial L}{\partial X_{Din}}[1+\frac{\partial X_{Din}}{\partial X_{C}}\frac{\partial X_{C}}{\partial X_{B}}\frac{\partial X_{B}}{\partial X_{Aout}}]
      $$

       

      注意:梯度消失的原因一般在于上述公式中括号内的右半部分的“连乘积”,而残差网络中多了一个 “ 1 ” ,故不会出现梯度消失的情况,这也是在NLP任务中,使用该结构可以使网络结构加深的原因

    • Layer Normalization

      为何使用LN而不使用BN(batch normal),因为BN效果差hhh~

      • 什么是BN?

        feature scaling 的作用:消除量纲的影响,让模型收敛更快

        在做 BN 的时候,针对的是1个batch中所有样本的每一个(同一个)特征,比如对一个班里的某一个学习小组(batch)同学的体重指标做 BN ,身高做 BN,成绩做 BN

        BN 的优点:

        • 可以解决内部协变量偏移

        • 缓解了梯度饱和问题(如果使用sigmoid激活函数的话),加快收敛

        BN的缺点:

        • batch_size 小的情况下效果差

          原因:使用某个 batch 中的均值和方差模拟全部样本的均值和方差

        • 在 RNN 中效果较差

          原因和第一点原因类似,举个例子:

          现在有 10 个样本句子(9个样本长度为5个单词,1个样本长度为20个单词),在处理的时候,前5个单词的均值和方差可以用10个样本算出来,但是6-20个单词的均值和方差怎么算呢?只能用第10个样本句子来算(此时batch_size就很小了)

          在上图中,BN 默认的假设是:“我”和“今”、“爱”和“天”...代表同样的语义信息,但这很显然是有问题的

      • 为什么使用 layer-norm

        理解:为什么 LayerNorm 单独对一个样本所有单词做缩放可以起到效果?

        以上图为例子,LN 默认的假设是“今天天气真不错”中的词语有相同的语义信息,这样似乎可以说得过去

  • 前馈神经网络:

    全连接 + Add&Normalize

decoder

encoder-decoder attention通俗的理解:变形金刚组装的时候不仅要考虑自己,还要兼顾拆解时候的整体信息

  • masked 多头注意力机制

    代码的角度上讲,需要对当前单词和之后的单词都做mask(不让你看到)

    • 为什么需要mask?

      很简单,输入 love 的时候,后续应该输出为 you,但是如果没有mask的情况下,love 后面的 you 和 now 都在为此时的输出提供信息,这显然是不合逻辑的

      专业的角度来说,做预测的时候是没有 GT 做参考的,因此需要将上图的后 2 根箭头 mask 掉!

  • 交互层

所有 encoder 的输出(K V 矩阵)去和每一个 decoder 做交互

encoder 生成 K V 矩阵,decoder 生成 Q 矩阵

其中,虚线代表 K V 矩阵

RNN到transformer

不管输入多长,统一压缩成相同长度编码 c​ 的做法,导致翻译精度下降

通过每个时间输入不同的 c 来解决这个问题,其中系数 \alpha_{ti} 标明了 t 时刻所有输入的权重

以 c_t​ 的视角看,其代表着该时刻不同输入的“注意力” -> Attention 分布

网络结构定下来后,可通过神经网络数据训练,得到最好的 Attention 权重矩阵,通过改机制我们打破了智能利用 encoder 行程单一向量的限制,让每一时刻模型都能动态的看到全局信息,将注意力集中到对当前单词最重要的信息上:团结就是力量!

然而随着 GPU 等大规模并行运算的发展,人们发现 RNN 的顺序结构效率太低

既然 Attention 模型本身已经对全部输入进行打分,RNN 中的顺序就没什么用了,不如简化之

则演变:Self-Attention机制

  • encoder 编码阶段

    利用 Attention 机制计算每个单词与其他所有单词之间的关联,如当翻译 games 时,“2022” “Beijing” “Winter” 都有较高的 Attention Score,利用这些权重加权表示,放到前馈神经网络中并得到新的表示,就很好的嵌入了上下文的信息,这样的步骤重复几次效果更好。

    这个过程有点像照镜子:想给别人留下好印象,则出门前最好多照几次镜子,需要特别关注的部位(脸蛋、身材)就多打扮一下

  • decoder 解码阶段

    不仅需要关注之前产生的输出,还得看encoder得到的输出

    例子:你在别人心中的印象,不仅受制于你今天的打扮(encoder),还来自于他以前对你的印象(之前的输出)

attention机制的衍变

  • 23
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值