赞
踩
作者:一朵小脑花
链接:https://www.zhihu.com/question/445556653/answer/3035151954
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
闲话少说,就问一件事情,大家在搞科研的时候有没有遇到这种情况,就是当前输入维度为NN训练一个网络,但后期NN的大小可能就变了,这时候普通的MLP或者CNN都会傻眼,但Transformer可以非常完美地解决这个问题,并且效果极佳。
在介绍Transformer之前,首先要了解其中的一个非常重要的模块,那就是Attention。
先说要解决的问题,目前很多模型的输入都是一个向量,输出是一个分布或者一个类别:
然而存在以下情况,即输入是多个向量,而且有可能是改变的:
输出的话存在这么几种情况:
1、比如输入是NN,输出还是NN,例如一个句子中所有的词对应词性的判断;
2、输入是NN,输出是1,例如对一段话来判断好坏;
3、输入输出维度不定,例如翻译任务:
例如“This is a cat”和“This is not a cat”两句话,一个4个词一个5个词,都想输入这个模型怎么办呢?这就是Attention想要解决的问题。这里只讨论第一种输出情况,即NN个输入NN个输出的情况。
在引入Attention之前我们能想到的便是FC全连接的操作,即1个词输入到一个FC中,但由于句子中可能存在同义词的问题(例如“I saw a saw”,前一个saw是动词,后一个是名词),所以需要引入上下文机制:
虽然能用这种window的思想做,但存在很多bug,例如window给多长?给定的window内的信息能不能学到我想要的上下文信息?变长的输入到底怎么解决?......
这时候Self Attention就要来了!言简意赅地总结,Self Attention就是输入几个向量,输出就是几个向量。并且输出的每个向量中,都包含了其余输入向量的信息。如下图:
了解了Self-Attention的实现结果,那么Self-Attention到底是怎么运作的呢?简单来说,可以表示成下面的隐含层的样子:
即每一个bib_i都包含了其他的aa的输入信息。当然,具体的实现肯定不是这样的。这里要提到一种Dot-product的方式,可以计算两个向量之间的相关性,如下图:
两个向量经过两个矩阵参数运算后,得到两个向量qq和kk,经过点乘可以得到二者的联合信息。
那么在Self-Attention中,具体的实现方式就是应用的Dot-Product,如下图:
第1个向量与qq(query)计算得到的值,分别与其余的向量的kk(key)做点积,再经过一个softmax得到最终的权重。
上述的权重可以理解为,其余每个向量的信息对于该向量的权重比例,接下来要利用这个权重对每个向量的信息进行提取,如下图:
以上,b1b_1的计算就结束了,是不是很简单?其余的bib_i也是通过这种方式并行计算统一得到的,这里就不再用这种方式展示了。
有了上面的介绍理解起来会很轻松,接下来从矩阵乘法的角度再介绍一遍Self-Attention。
上面的方法是一个一个计算出来得到的,但实际计算过程中会用矩阵相乘,其中a1,a2,…,ana_1,a_2,\dots,a_n可以拼凑起来,如下图所示:
以上我们可以轻易地得到QQ,KK,VV矩阵。
那么对于权重α\alpha的计算,可以清晰地用下面的图表示出来(在此不得不提李宏毅老师讲的是真的细,线代的内容都讲):
我们可以发现最终的α\alpha矩阵AA可以用KTQK^TQ表示出来。
至此我们得到了相应的α\alpha矩阵,那么最终的bb矩阵怎么得到呢?
按照先前所讲的,得到bb就是把α\alpha的值与vv相乘,矩阵表示的话如下图所示:
把刚刚的矩阵乘法概括一下,从QQ,KK,VV得到最终的bb矩阵OO,如下图:
这里面只有WqW^q,WkW^k,WvW^v是需要学习的参数,其余的都是能计算得到的。这时候发现,即使II的维度发生变化,也只是会导致QQ,KK,VV发生变化,但参数的值并不会发生改变。
对Self-Attention的进阶,是Multi-head-Attention,其实很简单,就是把Self-Attention的query变成多个头,然后自己的头去算自己的值,最后再通过一些方式处理一下(例如再加入个矩阵相乘,或者拼接,这里就是玄学了),得到最终的bib_i。
这时候有个非常有趣的问题,那就是,输入的所有向量,它们好像并没有位置的关系,也就是输入的向量,没有先输入或者后输入的影响。
最简单的方式,就是在aia_i前面加上一个专属的位置信息eie_i,就可以解决啦:
当然,Self-Attention也存在很多的问题,比较经典的一个就是在做语音处理的时候,由于信息很长,最终会导致AA矩阵非常大,这时候就可以人为的限制输入长短影响:
提到Transformer,不得不说的一大经典任务就是Seq2Seq的任务,虽然当下ChatGPT等众多模型已经把这种任务玩烂了,但目前值得去学习和优化的依旧没有减少。而Seq2Seq任务不得不提的一个模块,就是Encoder编码和Decoder解码模块。
首先说Encoder部分,其目的就是输入一排向量,再输出一排向量,其实这么一想,不光Self-Attention,RNN等都可以实现。
对于Transformer的Encoder来说,其架构可以转化成下面的样子(非常好理解):
也就是输入一坨子向量,经过一个Block,输出中间向量,再经历nn个Block之后,得到最终的输出向量。而每个Block中,应用的便是Self-Attention与FC的结合。
而真正的Block在操作过程中,并不是简单的经过了Self-Attention与FC,而是有一个类似于Resnet残差的操作,还有一个针对特征Norm的操作,如下:
在经过Self-Attention之后会加上之前的向量数据,并经过一个norm,同理FC也是类似的操作。
对比原论文中的操作,我们可以看一下,整个Encoder网络是长这个样子的,其中输入也有Self-Attention中所介绍的位置信息:
下面介绍下Decoder的网络结构,首先是Autoregressive(AT)网络。
首先要将Encoder的输入放到Decoder的网络中,每次输入也都会用到Encoder输出的信息。这里具体怎么放进去的稍后说,Decoder的流程如下:
1、在最开始的时候,Decoder要单独输入一个Start的token(告诉机器,这是这句话最开始的一个表示),然后经过Decoder之后,输出得到一个向量(黄色),这个黄色向量经过Softmax之后,可以得到一个具体的概率值,从而选择相应的字符,比如这里是“机”;
2、把Start tocken和“机”一起输入,这种时候会输出一个“器”;
3、循环往复,直到生成完一整句话。
综上来看,Decoder的输入是有先后顺序的,后一个向量的输出会由前面的向量所决定。
我们这里对比看一下Encoder和Decoder的区别:
其实遮住中间一部分看,Encoder和Decoder的网络基本是类似的,都是经过Attention和FC之后,再加上一点小操作输出。注意这里有一个Mask-Attention的操作,具体方式是这样实现的:
例如计算第二个b2b^2的时候,只拿前两个的qq去操作,而不用后面的输入了,说白了就是Decoder的过程并不能“看着答案写作业”了,要一个一个往后输入才能得到。
这时候又有一个问题了,那就是Decoder输出到底什么时候结束呢?(输出最终有多长?)简单啊,在输出的向量的softmax里面多加一个值,用来决定是否是End不就完了么:
接下来说另一个Decoder的技术,叫Non-Autoregressive(NAT)。
前面说了,AT解码是一个一个往外输出的,所以会比较耗时,NAT的想法就是一口气输入多个Start,然后一口气输出多个向量,接着再看具体哪个是End,然后找End前面的部分就好,这样做非常的省时。但是,NAT效果往往不如AT。
下面开始详细说,Encoder和Decoder具体是怎么结合的。细心的朋友可以发现,之前中间遮住的部分,其实是有两个输入的:
也就是Encoder的输入要输入到Decoder中两次,为什么呢?下面这幅图说明了这个Cross Attention的原理:
可以发现,Decoder在经过mask版的Attention之后,还会再有一个Attention结构(Cross-Attention)。Decoder 的单个的输出,去生成qq,而Encoder中生成的向量,去生成相应的kk和vv,然后再按照Self-Attention那一套去加权计算,得到一个值,就是当前Decoder单个输入所对应的值。
当然,产生第二个字符之后,操作也是一样的。(生成一个新的qq,随后继续操作)
接下来就是玄学时刻:如何训练。首先,我们需要有很多label的数据,比如一组语音,对应着“机器学习”这四个字理论的输出。这时候其实就可以转化成一个分类问题了:
值得注意的是,在Decoder的输入环节,也是输入的真实值,毕竟如果一套试卷给了答案,做完后效果肯定会更好的啊。
针对Transformer来说,还有很多小Trick可以操作。首先就是Copy Mechanism,对于常用的数据,可以直接通过copy的方式生成,从而减小错误率。
再有就是局部最优和全局最优的情况。可能最开始选择最好的,但越往后生成的效果越差,但如果最开始选差一点,后面的效果就会很好,这里可以用Beam Search的操作。
以上基本就是Attention和Transformer相关的最基础的知识了,当然利用Transformer后期操作的方法还有很多,比如经典的GPT、Bert都有用过,有机会再去讲解啦。
参考文献:
1、https://proceedings.neurips.cc/paper_files/paper/2017/hash/3f5ee243547dee91fbd053c1c4a845aa-Abstract.html(Attention is all you need)
2、https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/self_v7.pdf
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。