transformer(下)

📅 发布时间:2026/7/7 19:30:10 👁️ 浏览次数:
transformer(下)
接下来是decoderdecoder其实有两种接下来介绍的是autoregressive的decoder以语音辨识为例子机器收到一段声音讯号作为输入到encoder此时输出就是一排vector接下来就是decoder的运作产生语音辨识的结果首先先给他一段特殊的符号代表开始接下来decoder会吐出一个向量这个向量和我们要识别的单位是一样的以中文为例子这个输出向量的size就是我们中文汉字的长度不同语言输出的单位是不一样的比如英文可以选择字母的长度26个也可以选择用英文单词这个可能会比较多每一个中文的字都会对应一个数值得到向量之前会和做分类一样跑一个softmax这个向量里面的分数是一个distribution也就是他们的分数相加的结果是1分数最高的中文字就是最终的输出如下图接下来第一个输出的向量结果这个汉字会当作decoder新的一个输入表示成一个one-hot vector当作输入根据两个输入得到一个输出还是根据这个输出向量对于每一个字的分数分数最高的那一个输出接下来继续拿第二个输出当作第三个输入这样反复下去因为decoder自己的输出就是自己的输入所以也可能看到错误的结果也有可能引发后续的一步错步步错如下图看一下decoder的内部结构看一下transformer里面的如下图先把encoder和decoder放在一起比较如下图把中间的decoder盖起来会发现encoder和decoder并没有那么大的差别有一点区别就是这里的multi-head attention里面也加了一个masked如下图我们原来的self-attention每一个输出都需要看所有的输入来综合判断如下图但是变成masked之后我们不会再看右边的输入来输出即b1考虑a1b2考虑a1a2 b3考虑a1a2a3 b4考虑a1a2a3a4如下图更具体一点就是在计算b2的时候我们只能a2的query和a1以及a2的key去计算如下图那么为什么masked呢因为我们decoder的输入是一个一个的输出也是一个一个的都是顺序的和self-attention一次性输入输出不一样的如下图接下来还有一个关键的问题decoder必须自己决定自己输出的长度如何才能正确的知道输出的长度如下图推文接龙一个人说一个字然后继续接当有一个人冒险去推一个“断”的时候才会停下来如下图decoder要做的事情也是一样要去推一个“断”我们也要准备一个特殊的符号去作为一个断的符号如下图当decoder产生完机器学习的习之后就会自动产生end来暂停如下图接下来说一下non-autoregressive的model即NAT不一样的是一次产生整个句子比如一次投入四个begin然后产生四个output这四个output就是一个句子一种可能的做法是告诉机器一个数字然后机器根据这个数字产生相对应长度的句子另一个做法是假设我们这次输出的句子不会超过三百个字那么我们就一次性产生一个三百个字的句子然后看这个句子里面哪个会产生endend右侧的句子我们全部都不算输出全部忽略NAT的好处第一个是平行化如果是AT那么要做好多次的encoder但是NAT一次就可以所以时间上更快另外一个好处就是比较能够控制他的输出的长度以语音辨识为例子那么NAT的decoder假设我们要想让model讲话快一点那么我们可以把长度变成一半如下图可以看一下multi-modality接下来说一下decoder和encoder是如何穿句子的即我们刚才遮起来的叫做cross attention如下图首先encoder根据输入得到三个输出然后decoder根据begin经过masked self-attention得到一个向量然后把这个输出的向量乘一个矩阵做一个transform得到一个queryencoder都产生key把query和k1,k2,k3相乘的到向量a1,a2,a3接下来把a1,a2,a3乘上v1,v2,v3再相加得到v这个v接下来会丢到fully-connected network这个步骤就叫做cross attention如下图当然产生第一个中文字之后接下里的运作是一样的如下图下面是一个实际文献的效果图如下图这个encoder和decoder都有很多层原始paper里面无论那一层都是encoder最后输出才是进入decoder但其实不一定非要最后一层这个可以去研究如下图最后讲解训练的事情