关于面试中的那些Transformer

话不多说,先上图吧!!!
在这里插入图片描述

1.简介

Transformer,使用的就是Seq2Seq框架,解决的也是Seq2Seq的问题,但是它利用独有的自注意力机制,解决了序列中的长期依赖问题,同时实现了并行计算,在很多任务中都有很好的表现。它也是由编码器和解码器组成。

2.编码器

Transformer的编码器是由一个多头自注意力机制以及一个前馈神经网络组成,每个层后都跟有一个残差连接以及层归一化。一共有6层,第一层的输入是词向量,其他每层的输入都是上一层的输出。

2.1多头自注意力

首先多头自注意力机制,它将输入序列分别经过三个线性变换表示为Q,K,V三个向量,然后使用点积注意力计算Q和K的点积,得到一个注意力分数,然后再与V相乘,相当于对V加权,这样就实现了输入序列对自己的一个信息筛选。

为什么多头?

之所以称为多头,是因为计算注意力分数矩阵时,先将输入序列切分为了n头(论文中为8头),这么做是为了能够让模型在不同的子空间中学到不同方面的信息,最后再将多头综合起来,就相当于把不同方面的信息结合到一起,起到增强模型表达能力的作用,也有助于网络捕捉到更丰富的信息。

为什么时‘自’注意力?

自注意力是由于编码器部分接收到输入序列,经过三个线性连接将其表示为Q,K,V,虽然所用权重不同,但是本质上还是输入序列本身,Q和K的点乘就是计算序列本身各个单词之间的相关程度,会生成一个N*N的注意力分数(N表示序列长度),然后再对V进行加权,就相当于得到了每个单词在这个序列中的一个重要程度,也就是自己看到了自己。
其特点也就是能够无视单词之间的距离直接计算依赖关系,从而能学到序列的内部结构。
在这一块也实现了并行计算,因为例如在RNN中计算注意力,后一个单词的注意力分数要依靠当前的输入以及上一单词的隐层状态,只能顺序进行,而在这里便可以同时计算出每个单词的注意力,每个单词都会和其他所有单词去计算注意力。

为什么Q,K要使用不同的权重矩阵生成,而不能只使用同一个值和自身进行相乘?

Q,K的权重不同,可以理解为是在不同的子空间中进行的投影,正是因为有这种不同的空间的投影,才能增强模型的表达能力,提高模型的泛化能力。
如果只使用一个值和自身相乘,即K*K的话,这样生成的注意力矩阵就是一个对称矩阵,再去和K相乘的话,效果也不会太好。

为什么选择点积而不选择加性注意力?

加性注意力公式为 s c o r e = v ∗ t a n h ( w 1 i ∗ s i + w 2 i ∗ h i ) score=v*tanh(w1_i*s_i+w2_i*h_i) score=vtanh(w1isi+w2ihi),从公式来看,加性注意力相当于一个隐层一样,所以在总体计算的时候,他并没有比点积注意力简单多少,所以为了计算能更快,使用了点积注意力。

为什么在计算点积的时候要除以 d k \sqrt {d_k} dk ?

因为当K的维度特别大的时候,点积就有可能变的很大,导致后面的softmax函数进入一个梯度很小的范围,不利于训练。

为什么在计算完点积后会做scale,而其他的softmax的场景不需要做?

因为两个变量去做点积,其结果可能会很大,从而将softmax推向梯度缓和区,使得收敛困难。而加性注意力是W和随机变量相乘,另外还有tanh激活函数可以让分布趋于[-1,1]之间,当然不需要进行缩放。

2.2 前馈神经网络

多头注意力后接了一个前馈神经网络,这个前馈神经网络由两个线性连接组成,第一个线性连接后加入relu激活函数,是为了加入非线性因素,增加模型的非线性表达能力。

2.3 残差连接和层归一化

多头自注意力以及前馈神经网络后都加入了一层残差连接和一层层归一化。

残差连接

残差连接是为了解决网络训练困难的问题。前向传播时,输入信号可以从低层直接传给高层,一定程度上可以解决网络退化问题;反向传播时,错误信号可以不经过任何中间权重矩阵变换直接传播到低层,一定程度能够缓解梯度弥散的问题。

层归一化
LN

层归一化是在最后一维上做归一化,可以防止层内的数值变化过大,加速模型的训练过程,使其更快的收敛。
适用范围:小batch场景,动态网络场景和RNN,特别是自然语言处理领域。

BN

在Batch这个维度做归一化,随着网络的深度增加,每层特征值分布会逐渐向激活函数的饱和区间靠近,这样继续下去就会导致梯度消失。BN就是通过将该层的特征值分布重新拉回到标准正态分布,特征值将落在激活函数对于输入较为敏感的区间,从而避免梯度消失。
缺点是batch较小时,效果不太好。
在RNN中效果不好。
适用场景:MLP和CNN

3.解码器

解码器由三部分组成,遮盖的多头自注意力,编码器-解码器多头注意力以及前馈神经网络组成。同样,每层后面都有跟随一个残差连接和一个层归一化。

3.1 遮盖的多头自注意力

这里基本结构和编码器中的多头自注意力一样,但是由于这是解码端,实际中当前词是看不到后面的词的,是无法和后面的词产生注意力的,所以在输入序列中,使用一个下三角矩阵对输入序列进行遮盖,使模型看不到未来信息,更符合实际情况。

3.1 编码器-解码器多头注意力

这里是编码器和解码器交互的地方,编码器通过一系列的运算输出输入序列的表示向量,在这里输入解码器中,使解码器在解码当前单词时能够同时考虑输入序列提供的信息,也是增强了模型的表达能力,使模型能生成更丰富的信息。

4.位置编码

在序列输入编码器时,先对输入序列进行表示,在Transformer中叠加了输入序列的词嵌入向量和位置向量(绝对位置)。
词嵌入向量为随机初始的参数,在训练过程中不断学习更新。
位置向量使用三角函数表示,因为三角函数的取值区间总是在[-1,1]之间,并且它还是一个周期函数,所以不管是多长的序列,它的都不会出现这个范围之外,也就不存在样本以外的点。同时这个位置向量是直接计算得到的,并没有参数训练的过程。

以上是对Transformer模型的一些总结,若叙述有误或有其他见解,欢迎批评指正哦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值