通俗理解transformer萌新版

本文仅限自己学习,如有侵权请联系,会进行删除。
还有很多不足,例如残差网络那块,还在学习中,如有新想法会继续更新。

本文参考:
Transformer的QKV:https://blog.csdn.net/fzz97_/article/details/128920353
多头注意力机制:https://blog.csdn.net/mjssdhy/article/details/123815890?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1-123815890-blog-130156696.235v38pc_relevant_yljh&spm=1001.2101.3001.4242.2&utm_relevant_index=4
Transformer介绍:https://www.jianshu.com/p/e6b5b463cf7b
动手学深度学习:https://www.jianshu.com/p/e6b5b463cf7b
论文:https://arxiv.org/abs/1706.03762
在这里插入图片描述

2.模块分析

2.1.input/output Embedding

  一切程序的运行,源于输入。当我向计算机说出“我是学生”的时候,计算机是不认得中文的,首先我们需要转变成他可以认识的数字。那么第一种方案是独热编码One-Hot。他很简单的给每个字分配一个独一无二的向量,如下图所示
在这里插入图片描述
这里的列数是特征数量,可以为任意值。但这样会产生两个问题:
1.输入语句的单词数量挤满了当前的词性空间怎么办?
2.如何体现语序?

  很明显,单靠独热编码已经解决不了这两个问题了。因此考虑词嵌入方式,即将语句投影到低维空间中,实际操作中只需要乘一个W矩阵就行。这样就有了单词位置矩阵,这个单词还能体现单词与单词的关系。到这步还有体现语序的问题要解决。举个栗子:“我来自中国,是个学生。”如果仅仅只有词嵌入,这句话在电脑眼中和“我是个学生,来自中国“没有区别,实际上我们需要”来自“和”是个“的前后顺序信息,因此引入了position encoding。他的构成为:

t是单词在句子中的位置。这样设计的好处有:
1.单个单词的词向量的模为固定值
2.两个词向量的距离公式经过化简后只和w和间隔
在这里插入图片描述有关。
【ps:想验证的话可以挑T和T+kt代入。】
  现在我们得到两个矩阵,分别是embedding矩阵A和相对位置矩阵B。为了方便运算,这两个矩阵的大小一样【列数一定要是偶数嗷,不然相对位置矩阵不能写成sin,cos对】。下图展示的是整个input流程:
在这里插入图片描述
  其中inputs和outputs分别为英文和对应的中文翻译。现在一个单词的向量可以写成下面这个形式:
在这里插入图片描述
  理解下这张图中的加号。首先我们知道的是Xe和Xp的长度是一样的,Qe和Qp的形状是一样的,由此可得在该情况下矩阵相加的效果和矩阵分块一致。
在这里插入图片描述

  这也就解释了为什么输入不考虑连接embedding和position,明明这样可以更清晰的体现位置关系。因为加法和连接在效果上是一致的。

2.2.注意力机制

在这里插入图片描述
  在这张图片中我们首先看到的是樱桃,随后才会关注图中其他内容,就是人眼的注意力导致。而现在,我们希望把这样的注意力移植到计算机中,让他能关注并处理我们感兴趣的数据并且忽略其他不相干的数据。这就是注意力机制。
  注意力的实现有多种形式,而在本文仅介绍乘积注意力,因为transformer用的是这个。
  首先我们将注意力的构成分为两个矩阵:我关注的事物和其特征构成的矩阵Query和图片中含有的事物和其特征构成的矩阵Key。这两个矩阵分别是这个样子,他们的行数可以不一样。
在这里插入图片描述,用的时候要将其中一个转置下,不然做不了矩阵乘法,然后对其做softmax归一化【对行或对列看你的需求】得到一个符合概率分布的矩阵,再和图中的特征相乘就能得到一个权重矩阵了。以下是整个流程:
在这里插入图片描述
  值得注意的是,这个过程中的KQV在不同种注意力机制中的含义也不同。在正常情况下Q代表查询,K和V代表键值对,而在自注意力机制中KQV都是同一个东西。具体问题具体分析,该步骤是注意力机制的核心。完整公式可以写为:
在这里插入图片描述

2.2.1.自注意力机制

  自注意力机制是在论文Attention Is All You Need中提出的transformer中使用的注意力机制。先给上论文中的公式(红线是我的标注,不要在意)。其实这个公式是点积注意力公式,但自注意力只是在他的基础上做了一些小变动。自注意力机制只是提供了一种解释场景的方法和思想。那么现在回到公式【这个公式很重要】:
在这里插入图片描述
  首先来看我们的最初输入Q,K,V矩阵,他们的形状是一样的,他们长这个样子,他们的矩阵中包含了位置信息和相对位置信息,接下来我们要利用这些信息去研究他们的词性:
在这里插入图片描述
  具体怎么研究词性,很简单,让他们与矩阵W相乘即可,与矩阵的乘法就好像经过线性层。要注意的是这里的三个W是内容不同的矩阵,目的是学习多样的词性空间。经过如下处理后我们得到了真正的KQV,而那一个个W就是transformer要训练的参数:
在这里插入图片描述
  经过处理后的Q,K,V不仅包含位置信息和相对位置信息,还包含了词与词的关系。
在这里插入图片描述

  我们可以看到从input阶段出来后他一分为3进入Multi-Head Attention,我们得到的就是下图三个矩阵:
在这里插入图片描述

  了解将要进入注意力层的数据后,先不着急运算公式,我们来探讨下注意力到底是个什么东西。先来看看
向量乘积公式:
在这里插入图片描述
在这里插入图片描述
  其中是两个向量的夹角,cos值越大代表夹角越小,不难理解若能有矩阵存储cos值,那么就能体现行元素和列元素的联系。在这里插入图片描述得到的是大小为nn的矩阵,他包含了行元素和列元素的相互联系。但矩阵元素可能并不是cos形式或定值cos形式,如果是的话,那就是在乘W的时候做了处理。关于这点笔者也不是很理解。或许在进行这一步前还有一步归一化操作,又或者是因为论文只是提出一个概念,关于细节的内容没有深入探讨,总之笔者在这块还没搞懂。【若日后学习中有了新的理解或发现自己的错误,笔者会回来更新】。

  总之照他的意思我们已经得到了一个权重矩阵,现在只需要对行进行归一化就能得到一个权重比例矩阵了。但在归一化前还有个小问题要处理,这个问题出在softmax上:
在这里插入图片描述

若一句话过长且单词多,Q和K的向量内积中小的元素会被不断稀释最终几乎为0,这样进行反向传播时局部梯度可能会变得很小甚至为 0,导致走得很慢。所以一般会让他除以一个定值,这里选择根号dk。原因是想让数据分布符合标准正态分布,先给出方差公式:在这里插入图片描述
  论文中说矩阵中每一行满足方差为根号dk,原因如下图【dk就是经过K经过W处理后的列数】,如果特征空间足够大的话确实可以假设其符合标准正态分布。在这里插入图片描述

在这里插入图片描述
  很显然想满足上文提到的方差条件的话需要做到在这里插入图片描述这一步操作我认为应该是包含在如下操作中了:
在这里插入图片描述
所以我们的W中不仅有要学习的位置信息,还含有对矩阵的微操,使qk符合均值为0,方差为dk的分布。

至此在这里插入图片描述公式解释完毕。我们得到了心心念念的注意力矩阵,而这个矩阵的内容就是某单词与其他单词的远近关系【这里离我们想要的注意力还有点差距,但自注意力的雏形已经出现了】。
然后再和我们最初的位置矩阵V相乘,就能做到基本的分类了,他的格式如图所示:
在这里插入图片描述
  F的每一行就是单词和其他单词的关联度。再将他和矩阵V相乘【V中每一列是各个单词在该维度的长度】。由于每一行都做了归一化,矩阵中关联度强的两个单词对应的元素接近1【靠越近,值越像】。

2.2.2多头注意力机制

  先给上论文中的图,这篇论文画的图都很漂亮:
在这里插入图片描述
  现实生活中,当别人向你问“树的旁边是什么?”的时候,他的重点可能在“树”,而你的重点可能在“是什么”。这就是语境的差异,我们希望电脑也能学会区分语境,那么应该怎么做呢?在注意力机制的学习中,我们已经知道怎么获得词与词之间的关系。但我们希望能获得多种语境下单词与单词的联系,多头注意力机制应运而生。
其实也很简单,每一组QKV都给他一组不同的W,体现不同语境。
在这里插入图片描述
  最后再用W0把他们拼接在一起,这样的好处是我们可以根据语境学习,避免了单调的情况。
在这里插入图片描述

2.3.基于位置的前回馈网络

在这里插入图片描述
先附上这一层的公式。简单来说就是先把向量映射到高维空间,再投影回来。这样可以提取更抽象的特征。应该是团队测试出来的。。

2.4.LayerNorm和BatchNorm

  transformer在处理文本任务中采用的是LayerNorm,其对一个样本的所有特征,也就是矩阵进行标准化。而BatchNorm是对所有样本的某个特征进行标准化,BatchNorm的优势在于不会破坏一个样本的各个特征之间的关系【例如把西瓜的大小作为x轴,甜度作为y轴,x轴进行标准化不影响整体曲线】,但BatchNorm存在无法处理大小不同数据和一次性处理数据量过大的问题。例如下图:
在这里插入图片描述
而若是采用在其中补全数据的做法会破坏数据的可比较性。除此之外,对于每句话的一个单词的特征进行标准化没有意义,单词在不同语境中表示的意思也有所不同。相比之下LayerNorm就没有这种问题,因为他是对一个样本的全体数据进行标准化。而且也能克服一次性处理过多数据的问题,毕竟特征数量总归是要比训练集数量少的。

2.5.残差连接

在这里插入图片描述
就是那个从输入中抽出的一个线。。。
用处是解决梯度消失和网络退化的问题。网上有写的很多好的文章,就不在这里赘述了。

2.6.掩码层

在这里插入图片描述
  解码器有一个掩码层。假设有一个英语翻译成中文的任务。如果没有这个掩码层,我们在做中文的词性分析时前面的单词会受到句子后面的单词影响。
  举个栗子,“I want to eat sugar” “我将要去吃糖”,如果中文直接整句做自注意力,那么“要”和“吃”大概率会很接近,但实际上“吃”和“糖”也会很靠近,这就导致三个单词的词向量可能堆在一个地方,这样就不容易翻译了。实际上翻译任务可以视为预测任务,需要避免在进行序列预测时使模型获取本不应该知道的信息。
  具体实现就是引入下三角单位矩阵:
在这里插入图片描述

3.架构分析

  整体架构就是N个解码器串联,上个解码器的输出作为下个解码器的输入【编码器同理】。然后编码器输出的单词的特征矩阵作为K和V传入,而解码器的单词的特征矩阵作为Q传入,公式与上述的点积注意力一致。

4.疑问

1.注意力Q*K的归一化是在哪里实现的?是和W矩阵中包含了这一步吗?
2.输入太大,目前可以采用cnn降维输入,是否有其他办法?
3.前馈神经网络为什么要投影到高层再回来?去掉这一层会使模型效果降低多少?
4.语种不同是否导致要设计不同的掩码层mask?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值