Month: July 2024

  • 关于知识分享和工程技术实践的一点经验

    1、PPT制作需要兼顾简洁和细致,风格要基本一致(title以及整体样式格式等),逻辑流程清晰,内容相对完整;有动画演示的页面要先预播一下确认一下播放的顺序和效果,看上去要顺畅协调自然。 2、实验环节要多动手,保证全过程要完整的验证,有些问题在实验的某个环节看似走通了,其实在后续的环境还会出现其他的问题,多次尝试后可能会发现在前面那个看似走通的过程中的解决方法只是暂时的,并不能完整的解决问题。引起问题的原因在于其他地方,找到了问题的原因后整个过程才能顺利解决。所以要完整的验证实验整个环节过程。 3、及时将过程总结成文档,勤于文档撰写,markdown格式的文档编写比较方便,将实验中的一些细节,如软件开发版本,代码中出现的bug及修正,实验的流程以及注意的地方及时记录下来,以防止忘记; 4、同理一些新的技能,新的技巧trick,和自己的新想法以及TODO等内容也要勤于记录; 5、不断学习积累,工程经验也只有在实践中加以锻炼,孰能手巧,重复+接受新知识才能不断进步;科技进步发展很快,终身学习时代持续的学习和知识积累才能不断进步,不落后于时代。

  • LDM算法实验实践记录-Diffusion Models系列5

    上篇文章向大家介绍了LDM算法的多个应用生成场景,这篇文章将记录LDM的实践过程中需要注意的一些细节。我们将以训练lsun数据集中lsun_churches子数据集为例进行说明。 LSUN(Large-scale Scene Understanding)数据集是一个用于图像理解和生成的广泛使用的数据集。我们基于LSUN数据集的church子数据集进行LDM相关实验,LSUN数据集采用了lmdb的格式进行的打包,在下载到本地后需先用unzip解压,然后用python的脚本程序进行导出。关于LSUN数据集的使用方式可以参考引文2。 关于LDM算法的开源实现这里加以说明几点:1、AutoEncoderKL类实现了一个扩展版本的VAE模型,增加了感知损失函数和GAN相关损失函数;2、CrossAttention等基于空间图像的Attention实现首先对四阶张量进行变形为三阶张量后和NLP中的transformer中的自注意机制的计算方式一样,其中crossattention中多了一个context的变量,如果没有传入context则自动退化为self attention的计算;3、DDPM和DDIM的采样均有实现,DDPM主要用于训练,DDIM主要是推理过程中进行采样;4、configs目录和models目录都定义了两个阶段模型的训练的配置文件,都可以作为–base这个选项的值传入,main.py是作为训练VAE和LDM两个模型的统一启动桥本文件,通过yaml文件的配置进行了训练任务的定义,main.py通过解析这个配置文件以支持不同的训练任务;5、可以通过conda创建特定的env来搭建实验环境,其中需要注意的是transformer的版本需要再补充定义一下(经验证transformer==3.0.0版本满足实验要求),可能当时开源这个代码的时候是和代码兼容的,但最新的transformer版本出现了不兼容的问题;6,在ddpm.py的1030行加上一句self.logvar = self.logvar.to(self.device),实现变量在同样的设备上,否则可能出现一个在cpu设备上一个在gpu设备上的运行时error。实验过程的一些问题记录可以参考引文3。 References

  • LDM算法原理和多个生成应用场景介绍-Diffusion Models系列4

    Latent Diffusion Model是DDPM算法的基础上做了多个方面的优化和改进,具体表现在: 1、其采用了隐空间(Latent Space)进行的扩散模型的训练和推理,在二维图像域隐空间可以将图像的分辨率降低为原来的1/4,1/8甚至更高,在更小的尺度上进行扩散模型的训练,使得模型训练和推理的速度和算力上具有很大的优势; 2、这里采用了一个高效的VAE模型(autoencoderkl)将图像的原始空间转换为隐空间,其在原始的VAE模型的基础上使用了更多的loss,包括生成对抗的loss,图像质量的感知loss,以及图像重建的mse loss和约束隐空间服从标准对角正态分布(协方差只在对角线上有值,独立正态分布)的KL loss(Kullback-Leibler divergence)。 3、条件注入的有几种可行的方式:1、将条件数据(context embedding)和噪声数据相拼接做为输入,在条件拼接中:(1)、训练时网络的输入为基于真值 x0​ 的原始图像数据对应的潜空间表示 z0​和时间t以及variance schedule信息采样后形成的zt 和条件的 context embedding c 拼接在一起的结果,即为[zt,c];(2)、推理时的输入为潜空间上的对角高斯分布zT和条件数据c以及时间信息的Positional Embedding的拼接[zt, c, PE(t)],预测的结果为z(t-1),网络的输出为z空间的error,和真实的采样error算loss,和DDPM算法本身一样。2、将条件数据(context embedding)作为跨注意力机制中的y作为条件输入并通过参数模块进行跨注意力机制的计算,这里有两种方式:(1)仅仅使用跨注意力机制,这时的模型就不再将条件嵌入和隐空间数据zt进行拼接,而仅仅作为条件输入y,zt作为跨注意机制的q;(2)将跨注意力机制和条件拼接相结合,其中条件拼接和第一方面描述的总体情况类似。3、CBN(条件的批处理归一化,将条件作为信息的调制),这里不做特别说明。 4、针对第3点描述的条件注入的方式,这里将根据几个特殊的条件约束生成的应用场景做一下详细说明。1、超分辨率图像生成,以一个低分辨率图像LR_image(low resolution image)作为条件,训练数据支持低分辨率和对应高分辨率的图像对作为一个真值元组;2、semantic,这个可以作为基于语义分割图的条件约束图像生成,和原始图像一起作为真值元组;3、layout,基于布局结构的约束生成,和上述条件类似;4,inpainting,为了满足更强的编辑功能,还可以加上对编辑区域的文字约束,以实现约束更强的图像编辑,如“文本引导的图像编辑”(text-guided image editing),要满足这个功能,在训练数据上要有支持这种条件生成图片,掩码区域和约束文字的三元组训练数据。在实现细节上可以按如下的思路:(1)将不带有mask的原始图像编码为隐空间的z0,将带有mask的图像编码为隐空间的z_mask,将原始图像编码为条件嵌入c(可以沿用隐空间编码的方式,这时等价为z0),以及时间信息嵌入。(2)原始图像的嵌入作为cross attention参与交叉注意力的信息计算,原始图像的嵌入方法可以用隐空间编码的方式,也可以利用多层丰富的卷积特征图信息。其中z_mask的生成的方式可以值得讨论,1种是在原始数据中将mask区域进行遮罩进行隐空间编码,然后在隐空间中在更小的尺寸上对缩小的mask区域再次进行遮罩操作(对应的区域设置为0)。 5、在条件生成的LDM模型中,采样过程q_sample只对隐空间z0进行,其他条件嵌入信息如文本嵌入图像嵌入,以及时间信息嵌入等只和采样的zt拼接作为输入的一部分,输出的直接结果为e_t(和隐空间一样大小的误差空间)预测的结果为z(t-1),条件信息不参与去噪,只作为输入信息的一部分指导去噪训练的过程。

  • DDIM算法原理简介-Diffusion Models系列3

    这篇文章将向大家简要介绍DDIM算法相关原理。前两篇已经简要的向大家介绍了DDPM算法的基本原理,在DDPM算法中,前向的扩散过程和逆向的去噪过程是“对称”的,而且一般迭代次数都比较高,比如从纯高斯噪声到清晰图片需要成千次的迭代。每一次迭代一般称为一次采样(sample,根据概率分布的特性,通过随概率函数的特性生成随机数),每一次采样都要运行一次去噪网络模型,这样对整个推理的性能有很大的影响(GAN方法生成图像只需要运行 一次网络模型就可以输出最终的结果)。 针对上面DDPM的逆向生成过程的效率和性能问题,DDIM算法在逆向采样方面进行了重新的建模,支持在不需要重新训练DDPM已经训练好的模型的基础上,通过新的采样方式,减少采样步骤,同样能够达到生成高质量图片的效果。通过拟合条件概率分布,得出的结果为: 对上述概率建模推导计算的具体过程在参考引文1中有较为清晰的说明。基于上述公式的采样策略为: 上式中,s为当前的需要采样的step,而k时上次采样的step,其不需要满足近邻关系,只需要满足s<k即可。由于k时刻的已知,加上需要满足前向时的重参化的公式: 即通过转换,可以通过公式的变换,基于已经训练的网络的推理的error输出epsilon和xt,得出x0。 上面的式子中将sigma设为0,也可以设为其他的值,具体可以参看引文1中的说明,下面的代码就是对上述最后两个公式的实现,具体可以参考引文2。 References

  • DDPM算法实践-Diffusion Models系列2

    在今后较长的一段时间内,本人的工作方向主要专注在AI和计算机基础核心的相关理论原理和实践技能的知识分享和相关培训教学任务上,如在合作方的介绍下前不久给北京交通大学的本科同学们做的关于深度学习的小学期实践课程培训。现在处在个人创业(自由职业)的初期阶段,还请大家多多鼓励和支持。博客的内容是本人平时汇总总结的相关知识的一些注意的点,1为汇总方便以后的查阅,2为分享出来希望对感兴趣的读者有所帮助。不正确的地方欢迎大家批评指正,不喜勿喷,欢迎大家提出意见和建议。 DDPM算法在实现细节上有一些需要注意和特别的方法,在这里做一下简要记录。 1、模型的神经网络采用U-Net结构,U-Net最早用于医学图像分割上,其输出特征图和输入特征图可以保持相同的分辨率尺寸,而且适合于编码器解码器的这种特征建模,由于DDPM的算法预测的error和生成的图像的尺寸一样,因此用U-Net结构的神经网络是适合于DDPM的建模的输入输出场景需求的。 2、基于方差调度(variance schedule)和重参化技巧,训练时样本可以基于从1和T的时间上的均匀采样去获得t时刻的样本(通过x(0)的uncorrupted data和方差调度以及时间t和重参化技巧去一次性求出t时刻的样本,其中error为从标准高斯分布进行的随机采样,如下图中的第四行伪代码所示)。 3、神经网络同时也要考虑时间t的特殊性(神经网络的结构和参数在不同采样时刻是共享的),作者从transformer的输入特性中借鉴了相关想法,加入了Positional Embedding的时间信息,这样神经网络就能够学习到预测的误差的函数在时间上的表现有差异(对时间有依赖)。其中可以采用SinusoidalPositionEmbeddings。基于时间t和时间embeddng向量位置的正弦向量和余弦向量的拼接(concanate)或交织(interleaved)。 4、DDPM在和生成图像尺寸相同的纯标准高斯噪声空间开始迭代生成清晰图像,其U-Net结构是在二维图像的基础上进行的计算,一般二维图像的数据的训练数据的张量形状为(n,c,h,w),而一般基于NLP的自然语言的训练数据的张量形状为(n, l, e),其中l为输入的token的长度,e为embedding的长度(可以理解为通道数)。下面的一个attention module的实现是基于图像张量上进行的,对代码做了相应的注解。其中用到了einsum和rearrange相关的支持张量的计算和变形的函数。 5、图像中像素基于归一化到-1到1之间的范围,在转化为正式图像时,其先转换到0-1这样的范围,然后再乘以255(t.numpy().astype(np.uint8)。整个的DDPM训练和测试的代码借鉴了开源实现,做了相关的代码验证,关键的地方加了注释和说明,详情请参考链接: difffusion-models/annotated_native_ddpm_impl.ipynb

  • DDPM原理简介-Diffusion Models系列1

    DDPM(Denoising Diffusion Probabilistic Model)是基于扩散模型的里程碑的模型,这篇文章将向大家介绍DDPM模型的数学原理以及相关实验实践方法。在介绍原理的过程中,尽可能针对公式做一些详细的介绍,在介绍的过程中,作者本人对于相关算法的过程理解也会更加的深入,和相关感兴趣的读者一样,知识和相关原理的认识是一个不断加深的过程,希望在介绍这些技术原理的同时,自己也能有更多的进步,也希望对相关的读者有所帮助。 DDPM借鉴了非平衡热力学的相关思想,系统从一个无序(完全高斯随机噪声,高熵)的结构逐渐变成一个有序(低熵)的结构(图像等)。下面将介绍这个过程的一些相关的数学方法和流程。 DDPM有前向和逆向过程,前向是从有序到无序的过程,通过不断的向数据样本中添加随机噪声使得数据一般的清晰图像到随机的高斯噪声(熵增过程)。具体公式为(其中beta的取值范围为0-1之间,但随着时间不断增大,亦即模糊化的过程越来越快,关于beta随着时间t的变化可以有不同的scheduler去生成,如线性的,二次的或余弦的): 上述公式可以通过一个均值为0,方差为1的高斯采样(如果是二维图像数据,则所有像素都是独立同分布采样)生成的随机数eposilon来组合生成,其公式表示为: 上述t时刻的状态在t-1时刻已知的情况下,和t-1时刻之前的状态无关,因此我们也称为这个前向的加噪的过程为马尔可夫链过程。接下来将以问答的形式来介绍后续的相关原理。 问题1:有快速生成t时刻和t+1时刻的样本的方法吗? 回答:可以确认有快速生成t时刻样本的方法,而不需要经过t次高斯随机函数的迭代计算,这种方法称为重参化技巧(The reparameterization trick)。具体公式描述为: 对上述公式的推导过程解释如下,第二行是基于t-1时刻的数据由t-2时刻的数据加噪声生成而来,将第一行的t-1时刻的数据通过t-2时刻的数据生成去替代而得出: 图3公式的后两项为两个均值为0的高斯分布的叠加,epsilon前的系数分别为两个高斯的标准差,根据高斯分布叠加原理,叠加后的高斯分布的方差为两个高斯分布的方差之和(根据高斯概率分布的公式推导)。因此得出图2第二行的第二项,epsilon bar表示叠加后的高斯分布。依次类推得出最后的结果。因此通过t个步骤的叠加后,噪声数据仍表现为高斯分布,当步骤T足够大时,不断加噪后生成的样本数据XT将服从均值为0(无限接近0)的标准随机高斯分布(因为图2中的x0的系数接近于0)。 问题2:前向加噪的过程是已知的概率分布(高斯概率分布函数已知),而生成的过程从各向同性的完全随机高斯分布的高熵数据情况开始,其逆过程为去噪的过程。逆过程为什么也服从高斯分布?逆过程的求解过程怎样,是否只要学习到逆过程高斯分布的噪声就可以进行递推迭代了呢? 关于逆向过程也可以近似为高斯分布的原因也可以从多个角度进行解释,比如1、从t-1到t的加噪过程可以近似的看成是线性的变换加一个小的噪声,影响较小,可以近似为高斯分布;2、根据贝叶斯公式的变换,同时t-1时候的x(先验分布)也可以近似的看成是高斯分布(根据高斯概率公式的推导,两个高斯分布的乘积仍是高斯分布)。由于在训练时,我们是已知0时刻的原始样本x的,因此在原始样本x0已知的情况下,从t时刻到t-1时候的变化概率可以用如下公式进行建模。 上述公式是三个前向高斯分布的运算,具体的运算过程可以参考引文1,其利用到了高斯分布是自然指数函数,利用了指数函数运算特性进行的公式推理。 既然逆向过程的每一步变化也服从小的扰动的高斯分布,关键是怎么学习到这样的分布,即均值和方差,在这里主要就是构建一个神经网络,通过输入t时刻的x和t时间特征,就能输出对应的均值和方差。在学到误差之后,就可以通过t时刻的x和误差以及相关的超参数去构造t-1时刻的x,其公式表达如下,其中epislon为学习到误差,sigma(theta)为方差表达式,具体公式的推导可以参考引文1中的详细描述。因此逆向过程可以理解为系统学习到了从无序到有序构建过程的数学模型结构和构建流程算法。 问题3:用图4以及图5的公式去构建逆向扩散过程的数学原理根据是什么? 回答:上述逆向构建扩散过程的原理在于可以基于公式推导出通过优化VLB,找出其接近的下界,间接的优化了数据x(0)的最大似然,或其CE(cross entroy),因为最大似然和CE的相关loss都是小于VLB的。VLB求得最小,可以理解为其间接优化了我们的目标损失函数。具体的VLB的求解过程可以通过参考引文1中的公式推导,最终的结果(从x(t)到x(t-1)的转换)等同于求解图4的条件概率。 References

  • GPT1和GPT2模型结构与训练方法简介-NLP模型系列3

    这篇文章也将以问答的形式介绍GPT1和GPT2模型的相关技术,欢迎读者提出问题、意见和建议。 问题1:GPT模型的全称是什么,用来做什么? 回答:GPT模型的全称是”Generative Pre-trained Transformer”,是一种NLP领域里的生成式模型,其中Pre-trained的意思是在基于大量的无标记的语料库的基础上进行的无监督训练(样本没有label),训练的任务是基于当前的输入的序列预测下一个最大可能出现的token。GPT模型可以用来做文本生成,对话系统以及文本补全等,通过不断生成下一个token,就可以连续生成较长token的文本序列。 问题2:GPT模型具体怎么达到生成下一个token,并生成长文本的目标的?请介绍一下模型的大体结构和训练细节。 回答:GPT模型的结构采用的Transformer的解码器结构,但和Transformer的编码器解码器结构不同,GPT的解码器结构是独立的,其不依赖于编码器的输出和W^K和W^V参数矩阵进行计算所得K,V和Q进行交叉自注意力机制的实现,即GPT的解码器采用的是自注意力结构(单独解码器架构)。GPT和Bert不同的地方在于GPT依赖序列去预测下一个token,因此其是单向的关系建模,而Bert通过随机遮掩的机制去进行token的embedding的学习,会学习到token的前后的上下文关系。 问题3:GPT中输入的token序列长度一般是不同的,特征embedding怎么通过线性层输出并计算softmax的? 回答:在处理不同长度的输入序列时,和Bert类似,都根据最大长度做了填充,并通过attention mask对填充的位置进行了定义,在输出时也类似做了稀疏化处理,只对实际长度位置的token的特征通过线性层输出(输出为词汇量大小的输出向量)并计算softmax和loss。 问题2:GPT1和GPT2有哪些不同?第2版本有哪些改进? 回答:具体的不同有:1、参数量不同,表现在层数不同,隐藏层维度不同,注意力头数量不同。GPT2在这些方面都做了较大的提升,整体的参数量从GPT1的1.1亿提升到GPT2的最大版本的15亿参数量;2、训练数据来源和数据量不同,GPT1采用的时Bookcorpus的数据集,GTP2采用的时WebText(40GB文本数据)。 References

  • BERT模型结构及训练方法简介-NLP模型系列2

    这篇文章也将以问答的形式介绍Bert模型的相关技术,欢迎读者提出问题、意见和建议。 问题1:Bert模型的全称是什么,用来做什么? 回答:Bert模型的全称是“Bidirectional Encoder Representations from Transformers”, 从名称上来看,其作用是编码器,将语言进行编码表示,bidirectional的意思是双向的,即考虑了语言的上下文的更加全面细微的信息。可以看成是NLP中一种普适的语言特征提取的工具,供下游的NLP任务去对语言进行feature engineering。Bert作为语言的一种通用的作用模型,利用了互联网上的大量的未标记的数据进行的无监督学习,用户可以下载已经训练好的参数的bert模型去构建更加细分的NLP任务,如知识问答(question answering),情感分析(sentiment analysis)等。 问答2:既然Bert用来构建语言的特征用来更加细分的下游任务,其和word2vec等词嵌入模型有哪些区别? 回答:Bert和word2vec等都是语言特征模型,其作用有相似的地方,但也不同。具体表现为:1、词嵌入算法如word2vec等是基于浅层的神经网络,其特征的构建和表达能力相对就会弱一些,如word2vec中一个词只对应一个向量,在模型训练完成后成为静态的表示,没有充分考虑其多义性,而且无法捕捉长距离上下文依赖;2、Bert是对一整个句子的特征表示(是整个句子序列的上下文敏感嵌入,而不是基于一个个词),而且基于双向的表示特性,能够捕获单词在上下文较长距离的敏感信息,对同一个词在不同的上下文序列的不同含义能够进行有区分的编码。虽然通过拼接word2vec等word embedding也可以表示语言序列,但是在处理复杂的NLP任务中Bert具有明显的优势。 问题3:Bert的模型结构,输入输出是什么?其和Transformer的自编码器中的编码器部分的模型结构上有什么不同,双向性在模型结构上如何体现? 回答:首先Transformer的结构能够对序列的所有位置关系进行建模,自然包含双向性,这和双向LSTM的概念不一样(LSTM本身只单向的构建顺序关系,可以堆叠逆向的LSTM去构建双向LSTM,也有称为no causal)。Bert使用的就是Transformer自编码器中的编码器的部分。Bert的输入为:1、词嵌入,BERT使用WordPiece分词,每个词或子词都有一个词嵌入,2、位置嵌入,positional embedding,和Transformers自编码器或seq2seq模型中的位置嵌入一样;3、分段嵌入,对于句对的任务,如问答,下一句预测任务,前一句的分段嵌入为A,下一句的分段嵌入为B;特殊标记,[CLS]开头表示整体对句子进行“分类”,[SEP]分隔符表示句子结束。Bert的输出为每个输入词汇的新的嵌入(新的表示,同一个词在不同的句子中的输出的词嵌入可能不同)。这些词嵌入的汇合可以作为下游细分NLP任务的输入。 问题4:上面问题中的WordPiece是什么,和一般的word2vec等的token分词有什么区别? 回答:wordpiece可以通过算法基于词汇表进行构建,具体可以参考引文2中的说中的说明,wordpiece将单词分成subwords后,这些piece怎么转换成token的呢,Example: Original Text: “ChatGPT is fascinating.” WordPiece Tokens: [“Chat”, “##G”, “##PT”, “is”, “fascinating”, “.”],其中以##开头的即为subword(word piece).加上格式化后,整个句子的token将变为:Example: Original Text: “ChatGPT is fascinating.” Formatted Tokens: [“[CLS]”, “Chat”, “##G”, “##PT”, “is”, “fascinating”, “.”, “[SEP]”]。WordPiece是一种分词(Tokenizer)算法,和Byte Pair Encoding(BPE)分词算法有较大相似性,分词方法还有普通的用正则文法表示的分词,以及更高级的做了词根处理词源等复杂处理的分词,也有基于中文的特殊分词器,如jieba。WordPiece从单个字符开始,通过统计现有vocabulary中的词对的联合概率,将最大的进行合并,一直进行到达到词汇表容量停止。WordPiece和BPE算法类似,都支持未登录词OOV(out of vocabulary)词的处理。 问题5:Bert模型如何从头开始训练,如果利用已经训练好的模型在下游的细分任务和细分数据集上进行迁移学习微调参数? 从头训练Bert模型需要:1、准备大量的语料库,可以从互联网上搜集大量的未标记的语料库;2、通过wordpiece去构建输入的token;3、Bert的训练有两个任务,一个为MLM。Masked…

  • 基于Transformer的自编码器和seq2seq模型的工作原理简介-NLP模型系列1

    今天这篇文章向大家介绍Transformer网络架构在自然语言里边的基本应用,和以往的风格不同,今天的介绍以问答的形式展开,自己提出问题,自己给出解答,这样的形式也许也会引发读者在面对问题时先停下来尝试自己回答一下是否已经知晓答案,这样可能会触发更多的思考,从而会对问题有更加深入或全面的理解。 问题1:自然语言中的单词在网络的输入过程中以何种形式作为输入,以及这种表示方法的由来?怎么在输入中体现单词的位置信息? 回答:自然语言处理中,单词通过词嵌入向量进行表达(word embedding),词嵌入表达能够建模单词之间的语义信息,一般含义接近的单词其词向量之间的夹角更近,传统的词向量嵌入的方法有如Word2Vec、GloVe等(一般word embedding没有对向量进行归一化,但transformer中的LayerNorm层有归一化方法)。一般在word embedding的向量后面再拼接一个positional encoding来表示位置。具体的计算方法可以参考引文。参考引文5中(如Bert和GPT中用的词嵌入矩阵进行的转换,而且词嵌入矩阵在训练的起始可以随机初始化,然后训练过程作为整体参数的一部分参与训练更新参数学习词嵌入矩阵)。 问题2:针对K,Q,V的参数矩阵以及结果向量的计算方法是怎样的? 回答: 句子中的每个单词(word embedding+positional embedding)组成的矩阵和三个参数矩阵相乘后得出新的q,k,v三个矩阵,其中q和k的转置再实现矩阵相乘,得出单词之间的“相关性矩阵”(用softmax计算实现了相关性的大小的归一化计算?),将相关性矩阵和v矩阵相乘得出最后的结果z矩阵。如果是多头时,则会有多组参数矩阵,最终的多组z也会拼接起来并和一个新的参数矩阵相乘得出融合后的z‘。 问题3:基于Transformer的encoder,decoder模型怎么进行训练?transformer的自编码器和seq2seq的模型的区别在哪里? 回答:首先基于transformer的自编码器和seq2seq的模型的应用目标不同,自编码器的应用目标是表示学习和语言重构,而seq2seq模型的目标是机器翻译,任务转换等。如下图所示,自编码器的模型结构包含左边的编码器部分,在训练的时候一般也要包含右边的解码器部分(右边解码模块每个解码层需要接收左边部分的K,V特征数据),只是在训练时可以理解为解码器的输出是对编码器的输入的重构。而seq2seq模型即包含编码器也包含解码器,而且在训练时输入和输出一般对应着不同的内容,如机器翻译,输入为一种语言,输出为另一种语言。这里以训练一句翻译的样本为例子进行说明,假设我们的输入句子是“Hello, how are you?”,目标翻译句子是“Bonjour, comment ça va ?”。则编码器的输入即为“Hello, how are you?”的词向量嵌入+位置编码组成的输入矩阵,而解码器的输入则为”<sos>Bonjour, comment ça”词向量嵌入+位置编码组成的输入矩阵,输出也会是向量的batch组成,输出的size为目标语言的词汇量,通过softmax可以得出最大可能的输出单词,多个批量向量就组成目标输出句子的output,和ground truth去求loss就能实现反向传播更新参数。具体的loss定义可以参看引文3(输出的序列的t从0到完整序列的多个条件概率连乘的结果最大化,具体的优化计算方法和策略也可以参考引文中的说明)。 References