transformer
视频原作者:https://www.bilibili.com/video/BV1Di4y1c7Zm?p=4&spm_id_from=pageDriver
1.位置编码
2.多头注意力机制
3.残差和layerNorm
4.前馈神经网络
5.面试题讲解
TRM在做一个什么事情
TRM11.transformer多用于机器翻译,简单来说就是 输入 处理 输出
TRM22.细化transformer,上图输入 输出没有变化 transformer模块是由encoders(编码) decoders(解码)组成;类似sequens2sequens;
TRM33.再细化encoders decoders模块,encoders由6个小encoders组成;decoders由6个小decoders组成;这里的6可以自己定,这是一个×N的结构,是一个循环,我们需要注意的一个特点是,这6个encoder结构相同6个decoder结构相同,但是encoder与decoder的结构是不同的。还有一个需要注意的点,6个encoder结构上是完全相同,参数是不一样的(说明在训练的时候并不是训练了一个参数之后就进行copy而是6个都在训练;为什么说这个 因为后期albert就是共享transformer中某些层的参数去减少bert参数量的目的;decoder同理)。
TRM from paper4.transformer原论文中的图:比较清晰的给出了具体的结构,我们可以从中间切成两部分,左半部分是encoders 右半部分是decoders。XN说明N可以由自己定,原论文N=6,还有一个特点encoder与decoder的架构是不相同的 decoder中间多了一层交互层,下面变成了一个masked(被掩盖的多头注意力机制)。
image.png5.我们单独剖析出一个encoder,详细的了解里面的细节。我们可以把单个的encoder分成3个部分,输入 注意力机制 前馈神经网络
输入部分: ①embedding ②位置嵌入
5.1 位置编码
为什么需要:
RNN从RNN引入,对于RNN来说一个共识(很多人会忽略的点):RNN的参数 u输入参数,w隐层参数,v输出参数这是一套参数 对于RNN的所有的timesteps他们都共享一套参数。也就是说有100个timesteps 但是只有一套参数,更新的时候是更新一套uwv。所以RNN这种展开的结构,符合天然的时序关系,但是对于transformer的多头注意力机制部分来说,我们在处理的时候是有并行化机制的,一句话所有的单词是可以一起处理的,而不是像RNN这样一个一个的喂。这样做增快速度,但是忽略单词之间的序列关系或者说先后关系,所以说transformer相比RNN就缺少了某种东西,这个时候我们就需要位置编码。
5.2 位置编码公式
image.png image.png image.png2i代表偶数,2i+1表示奇数,偶数位置使用sin 奇数位置使用cos。得到位置编码512维度和字向量中的512个维度相加,得到一个最终的512维度作为整个transformer的输入,为什么位置嵌入式有用的?首先要明确一个点:正余弦这个函数对于同一个位置不同的向量使用不同的sin或者cos体现出的是一种绝对位置信息,与此同时绝对位置向量中蕴含着相对位置信息。
但是,这种相对位置信息会在注意力机制那里消失
小tips:RNN的梯度消失有什么不同?
RNN的梯度消失与普通网络的梯度消失并不相同,RNN是一个总的梯度和,他的梯度消失并不是变为0,而是说总梯度被近距离梯度主导被远距离梯度忽略不计。
6.transformer中最核心的部分——attention机制
6.1 基本的注意力机制
image.png人类在看一张图的时候,有重点关注,进一步我们引申一下,婴儿在干嘛这句话更关注的是图片中的哪个区域?这就是注意力机制的基本形式
image.png上图是原论文中的公式,抓住三个重点QKV三个矩阵,我们计算注意力机制的时候一定要有QKV矩阵,QK转置相乘除以某个值做softmax归一化,softmax之后我们得到的是相似度向量,乘以一个V矩阵,得到的应该是一个加权的和。
例子1:
image.pngQ:婴儿单词对应的某种向量,
K1~K4代表某种向量
V1~V4代表某种向量
首先是婴儿和左上左下右上右下分别做点乘得到某个值。点乘的结果是一个向量在另一个向量的投影长度,是一个标量,可以反应向量的相似度也就是说两个向量越相似点乘结果也就越大。点乘之后我们要判断婴儿这个词和哪个区域的点乘结果越大。得到结果之后和V矩阵相乘得到attention-value一个加权和。
image.png image.png首先输入的是Q和K1~K4做F函数 ,得到点乘的结果做softmax得到相似度,他们相加为1.和value值相加做乘法得到attention-value
我们已经知道我们需要三个矩阵QKV但是我们在这里都没有说明怎么获取QKV向量,在transformer中是怎么操作的呢?
6.2 在transformer中怎么操作的
image.png image.png输入的词做embedding 分别乘以一个矩阵得到QKV向量。向量相乘得到score 然后除以一个值。为什么要除以一个值,如果qk相乘值很大softmax在反向传播的时候梯度很小,很容易造成梯度的消失。为什么除以根号DK不是其他值,是为了保持方差控制为1 得到之后就可以得到加权和。在实际操作中我们一般使用矩阵,方便并行速度更快。
image.png image.png image.png还有一个细节是多头,我们在上图中只用了一套参数。但是实际参数中我们会使用多套。分别得到各自的QKV;为什么这么做。首先,作者做实验效果很好,以此很多人猜测,多头相当于把原始信息打到不同的空间。原来是一个空间,现在变成两个空间。保证transformer可以注意到不同子空间的信息。捕捉到更全的信息。最后我们需要把多个头合在一起输出,然后乘以一个矩阵,就得到我们多头注意力机制的一个输出
7.残差和LayNorm
x1 x2代表词向量进行输入,和位置编码对位相加得到新的x1 x2经过attention层得到输出结果z1 z2。 现在的输出是z 把x拿过来和输出结果z对位相加(x是经过位置编码的x) x和z相加作为残差的一个结果。经过layernormalization作为一个输出。
7.1残差
image.png
原来如果没有残差网络,直接输出fx就可以了,现在有了残差网络,需要把原来的x拿到下面与fx的矩阵进行对位相加。为什么残差结构有用呢?经过BC两层网络A的输出就是x。梯度消失一般是因为连乘产生梯度消失,在残差网络中因为有了1 所以确保了梯度不会为0,所以缓解了梯度消失的出现。这就是NLP中用了残差网络之后可以比较深的原因。
image.png
8.Layer Normalization
经典面试题:为什么在这里使用layer normalization而不是使用传统的BN
在NLP中,很少使用BN。因为BN在NLP任务中效果比较差所以不用。但是后期很多论文对BN进行了改进,现在先不去深究
8.1 BN提出的背景
image.png
无论在机器学习还是深度学习中,都会经常使用feature scaling 主要是为了消除量纲的影响让模型收敛得更快。
image.pngBN的重点在哪里:BN的重点是针对整个batch中的样本在同一纬度的特征的处理。
BN的优点:
第一个是可以解决内部协变量的偏移
第二个是缓解了梯度饱和问题(如果使用sigmoid激活函数的话),加快收敛
BN的缺点:
第一个是batch_size比较小的时候,效果比较差
第二个是在RNN中,效果比较差。比如现在有一堆样本 batch_size为10 9个样本长度为5。1个样本长度为20.那么在输入的时候前5个单词的均值和方差可以用10个样本算出来。但是第6个单词到第20个单词的均值和方差怎么计算呢?如果只用一个样本计算,就回到第一个问题batch_size很小的时候效果很差。RNN的输入是动态的,所以她不能得到整个batch_size的均值和方差
9.为什么使用layer-norm
理解:为什么layerNorm单独对一个样本的所有单词做缩放可以起到效果。
LN的特点:举个例子:上面讲的最后一个样本有20个单词,LN就是对这20个单词做缩放做均值方差。而BN做的是对第一个单词做均值方差..对第二个单词做均值方差..这样BN的操作在NLP中就会遇到问题,把BN引申到RNN看下图:
image.png
如果是针对同一个位置做均值方差,我和今做均值方差,爱和天做均值方差,默认的假设是我和今代表同样的信息,爱和天代表同样的信息。而LN是针对"我爱中国共产党"进行均值方差 他的假设是"我爱中国共产党"是出现在同一个意义信息里。我们这么来想这个问题,我们在获取我爱中国共产党这个句子的句向量的时候,一个常规的做法是做加权的词向量。加权词向量基本假设就是"我爱中国共产党"这句话的所有词是在同一个语义信息下的。所以我们才认为他可以理解的(个人理解)。
9.1前馈神经网络
image.png
前馈神经网络其实比较简单,就是这张图的上半部分,Z1通过一个feed forward Z2通过一个feed forward 再加上一个两层全连接再过一个残差和Normalization。
上述就是整个encoder的过程。
10.Decoder
Decoder和encoder一样由完全相同的几个模块堆叠而成Nx
模块1:多头注意力机制,但是这里有个细节点就是masked
masked: 需要对当前时刻之后的单词都mask掉
为什么需要mask:
image.png
比如我在输入love的时候输出的是you 如果decoder的输入没有mask和encoder一样的多头注意力机制,那么就是所有的次S I LOVE YOU NOW都会为生成YOU这个结果提供信息。但是这样训练出来的模型在预测时候就会出现一个问题:我们在预测YOU这个单词的时候是没有后面的那些信息的。模型看不见未来时刻的单词。如果不masked YOU NOW 那么模型训练和预测的时候就会存在gap,也就是说训练的时候可以看见YOU NOW 预测的时候看不到,那么预测效果肯定不好。所以我们需要mask。把YOU NOW给的信息抹点不看到他 预测的时候也看不到,这样gap就消失了。
模块2:交互层,比encoder多了一层。
encoder 与 decoder交互的地方。
image.png
所有encoder的输出生成值与每个decoder进行交互
image.png
encoder生成KV矩阵 decoder生成Q矩阵,交互的时候就是QKV进行交互生成多头注意力机制。
image.png
虚线代表KV矩阵的输出,和第一个decoder的Q做一个交互
网友评论