首页 > 其他分享 >【学习笔记】Transformer

【学习笔记】Transformer

时间:2023-09-14 15:58:48浏览次数:44  
标签:输出 Transformer attention 笔记 Encoder 学习 block Decoder 输入

在看Transformer之前,建议先学习一下Self-attention

同样,这边笔记是参考李宏毅老师的课程ppt,感兴趣的可以去看原视频~

Sequence-to-Sequence

没错!Transformer是一个sequence-to-sequence (Seq2Seq) 的模型,也就是输入一个sequence,模型会输出一个sequence。

前面讲self-attention提到模型有三种输出:1. 每个向量都有一个label;2. 整个序列有一个label;3. 输出sequence的长度由模型自己决定,也就是这边的Seq2Seq。

经典的应用包括:机器翻译、语义识别、问答机器人...几乎什么样五花八门的任务,只要输入和输出是sequence,就都可以拿来用Seq2Seq硬做,并且效果居然也不错。当然啦,针对不同的任务客制化model会比Seq2Seq效果更好,但足以看出Seq2Seq的应用之广泛。

模型结构

简单来说,Transformer就是经典的Encoder-Decoder结构:输入序列进入编码器,编码器的输出再进入解码器,最终输出一个序列。

下面来分别讲一讲Encoder和Decoder具体在做些什么。

Encoder

下面这张图的左边是不是和上一讲的Self-attention很像?每个输入向量都会经过Encoder输出一个向量,当然,RNN和CNN也可以办得到这一点!

把Encoder放大,右边就是Transformer编码器的结构啦。可以看出,它的主体其实就是Self-attention,中间灰色的框框被视为一个block,输入向量要经过N个这样的block。

可是,右边的图花花绿绿看起来好复杂!

我们来看下面这张图:输入向量经过一个block,得到的输出再作为下一个block的输入...最终得到输出向量。

每个block做的事情也很简单:经过self-attention得到的各个向量分别喂给一个全连接层得到输出。

简单复习一下,self-attention做的事情就是整合序列信息,每个向量经过投影后得到query、key、value,计算每个query和所有key的相似度 (attention score) 作为各个value的权值,而加权和就是最后的输出。

 但是,Transformer编码器做的事情要稍微复杂一点点,每个向量经过self-attention得到的输出,还要加上原始的输入(这就是ResNet里的残差连接)!如果b是输入向量,对应self-attention的输出向量为a,那么b + a才是我们需要的。

这之后,还要再经过一个Norm层。注意,这里不是常见的Batch Normalization,而是Layer Normalization。BN是对整个batch的样本在特征维上做normalization,而LN是每个样本自己做normalization,不需要考虑整个batch。这是合理的,每个序列长度都不统一,自己做normalization效果自然会更好。

经过LN之后的输出,才是要进入全连接层的输入。同样,这边也要用到残差连接和LN:FC的输出加上FC的输入,经过LN后得到这一个block的最终输出。

 听起来很像绕口令对不对?但是仔细看懂上面的图片在做什么之后,再回过来看Transformer的Encoder会豁然开朗。

输入向量经过embedding层,加上位置编码(同样在self-attention里提到过),进入第一个block:先做multi-head attention,输出+输入做Layer norm,经过全连接层后再做一次残差连接和LN,得到block的输出。这样的block会重复N次。

 block一定要这么设计吗?当然不一定。在Transformer之后,有不少论文做了相关的研究,比如下面这个就把Layer Norm放在了attention前面,效果更好了。

Decoder

讲完编码器,我们来看解码器。解码器有两种,AT和NAT。

  • Autoregressive (AT)

解码器通过某种方法把Encoder的输出读进来(后面会细说),输入一个特殊的START向量来作为序列的开始。

假设要处理翻译任务,这个输出向量的维数就和字典的长度一样,每个字都会对应一个数值,分数最高的那一个字就是最后的输出。

拿到第一个输出之后,把它作为下一个输入进入Decoder,重复前面的步骤,依次得到新的输出和新的输入...这样的过程就叫做自回归 (Autoregressive) 。

但是,难道就这么无休止的输出下去吗?

当然不了!有始 (START) 有终 (END) ,在字典里我们也要加入一个特殊的END,标志着输出序列的结束。

现在,我们来看看Decoder具体在做些什么。

诶,怎么这么眼熟?没错,它和Encoder长得很像!把中间那一块挡住,Decoder和Encoder的block简直一模一样嘛!

但是,这边为什么是Masked Attention呢?

和前面的Encoder不一样,Decoder是一个一个输出的,在产生当前输出的时候,只考虑它左边的那些输入,而不是一下子看到整个输入序列。

  • Non-autoregressive (NAT)

和自回归解码器不同,NAT解码器一次性产生所有输出——因此,也是一次性输入BEGIN!

可是,我们并不知道输出序列有多长啊?NAT是怎么办到的呢?

有两个方法:

  1. 再加一个predictor,把编码器的输出作为输入,预测序列的长度
  2. 输入一个很长的STRAT序列,输出只取END之前的部分

Encoder - Decoder

前面挖的坑还没填,Decoder和Encoder是怎么联动的呢?

这里就要引入一个叫”cross-attention“的东西啦。不要被名字吓到,就那么回事儿——只不过key和value来自Encoder的最后一层输出,query来自Decoder经过Masked Attention的输出。当然,输出都要先做投影再做attention。

现在看看Transformer整体架构,是不是就懂啦~

Training

我们观察一下Decoder的输入,其实这不就是Decoder的输出嘛!

所以在训练的时候,我们可以把Ground Truth(真实值)拿来做输入,再拿输出和GT算交叉熵,希望所有交叉熵的总和越小越好。

可是在做inference的时候,Decoder看不到正确答案啊!显然和训练的情况存在一个mismatch。

如果Decoder在训练的时候只看过正确的东西,那么inference时可能会出现“一步错,步步错”的情况。所以,在训练的时候,我们不能只给Decoder看正确的答案,也要输入一些错误的东西给它看。这一招叫Schedule Sampling。

比如,GT是“机器学习”,可我们会故意输入“机气学习”,这样如果Decoder犯错输出了“机气”,后面也不至于跟着全部错下去。是不是很有意思?人生也是这样,需要引入一些“随机性”,不断地踩坑、走弯路,看过更多不一样的风景,好坏都参透,后面的路才能走得更稳。

 

到这里,Transformer就全部讲完啦!

欢迎大家评论区留言讨论!

标签:输出,Transformer,attention,笔记,Encoder,学习,block,Decoder,输入
From: https://www.cnblogs.com/Aikoin/p/17702700.html

相关文章

  • Java进阶学习之Java架构师的学习路线
    Java架构师,首先要是一个高级Java攻城狮,熟练使用各种框架,并知道它们实现的原理。Java架构师的作用就是要满足业务需求,用低的硬件网络成本和技术维护成本。Java架构师还要根据业务发展阶段,提前预见发展到下一个阶段系统架构的解决方案,并且设计当前架构时将架构的升级扩展考虑进去,做......
  • jquery框架学习(keep update)
    1.jquery在日常的开发中,是较为常用的一种技术,所以今天也不算较为系统详细的学习吧。2.主要是对jquery当中,许多常用的方法进行学习和总结吧3.jquery当中主要的特点就是:选择器,js当中呢,主要就是dom树结构。4.下面就不多说了,开始我们jquery当中方法的学习。1.①......
  • office学习之word
    本帖仅是个人学习贴,对他人可能无太大帮助一、结合excel表格批量完成邀请函员工工作证工资条合同的客户信息的批量录入  二、插入图片文本框等设置浮于文字上方这样就不影响文字的排版了Ctrlshift左键可以复制文本框 三、word模板的来源有word自带的主题模板......
  • Myspace数据库架构经验学习
    50万账户两台Web服务器和一个数据库服务器。第二代架构:运行在3个SQLServer数据库服务器,一主二从,读写分离。1-2百万账户垂直分割:不同的数据库服务于站点的不同功能,如登录、用户资料和博客。账户到达2百万后,数据库服务器开始受制于I/O容量,用高带宽、专门设计的网络将大量磁盘存储设......
  • JVM学习笔记(三)
    这是该专题Blog连载的第三部分,整理一下发上来。-------------------------------------------------------与垃圾收集GC相关的3件事:1.哪些内存需要回收?2.何时回收?3.怎么回收?上面3条分别对应了2部分知识:1.垃圾收集算法(对应1)。2.垃圾收集器(对应2、3)。下面分别学习这些知识。 一、什......
  • Memcached深入学习总结
    在上一家公司时,产品主要使用memcached做缓存。虽然目前这家公司memcached使用的比较少(刚进公司做云存储相关服务时小规模使用了一下,后来做另一个系统时换redis做了缓存),但前几天整理资料时看到了原先写的memcached相关笔记,在此整理一下发上来。----------------------------------......
  • MongoDB Sharding深入学习
    对于MongoDB的Sharding(分片)技术并不陌生,但是发现里面其实还是有不少值得深入学习的东西。笔记整理一下发上来跟大家分享。-----------------------------------一、MongoDB分片机制:1、一个分片包含数据的某一子集。若某一分片包含多台服务器。则每台服务器都拥有完整的数据副本。......
  • 互联网架构学习相关资料
    最近看到很多不错的互联网架构方面的学习资料和个人blog。原来都是整理放在Mybase中,现在搬到Blog上,一是方便查看及更新,二是希望对看到的人也有所帮助。 整理如下(排序不分先后):1.架构设计与架构思想2.高性能MYSQL的构架与相关软件介绍3.http://wenku.baidu.com/view/e8b2e23343323......
  • 读清华学霸的学习计划表有感
    近日,网络上疯传清华大学某特等奖学金得主的学习计划表,看后感叹此人真是不辱"学霸"的称号。不说别的,就是除周末外每天凌晨1点睡觉,早上6点起床这一条来说,我几乎就做不到。想想自己每天23点睡,早上7点半8点起,而且大多数下班时间都不是在学习,真有点感觉是在浪费生命了。看来,今后我也要多......
  • JVM学习笔记(二)
    接上文------------------------------------二、类文件结构虚拟机不关注Class的来源是什么语言,它只要符合Class文件应有的结构就可以在Java虚拟机中运行。1.Class类文件结构Class文件是一组8位字节为基础的二进制流,各个数据项目严格按照顺序紧凑排列在Class文件中,中间没有添加任何......