一、AIGC 背景介绍
AIGC 的成功开始于 OpenAI 提出的 GPT-3。之前没有预训练的生成模型效果和现在有差距,即使用监督学习 + fine-tune 的方式可以在某些 task 得到不错的效果,但是它的泛化能力比较差,因此当时的 AIGC 并没有被大家关注。所以当 OpenAI 提出的 GPT-3 可以根据 Prompt 提示词或者 instruction 指令去生成代码以及各种各样的文本时,大家才开始更多去关注和探索 AIGC 方向。另外,除了文本生成以外,DALL-E 和 DALL-E2 在图片生成方面的进展也是推动 AIGC 发展的重要因素。
二、AliceMind 纯文本生成大小模型协同
1、AI 文本生成的三个阶段
本次分享主要关注文本生成,下面回顾一下文本生成发展的过程。
最早的生成是 Encoder-Decoder 架构,没有预训练,只是做一些任务上的 fine-tune 工作,当时效果比较差。随着 GPT-1 预训练的提出才开始有不错的效果,之后 BART 和 T5 这两个模型提出之后发现,用一个生成模型可以做很多 task,而且这些 task 其实效果都可以比较好。比如 T5 可以把各种不同的 NLP 任务都转化成生成的方式。AliceMind 在 20 年的时候自研了一个 PALM(Pre-training an Autoencoding & Autoregressive Language Model)的生成预训练模型,后面会介绍。
第二阶段的发展从大规模 Language Model 开始。大家发现 GPT-3 有很强的 few-shot 生成和泛化能力,所以也开始广泛地去做一些大规模的预训练。包括我们自研中文 PLUG 模型、M6、以及 Google 提出的 PaLM(Pathways Language Model,注意如果忽略大小写和上面的模型缩写都是 PALM,这俩模型全称不一样,不是一回事),这几个都是大规模预训练模型。相比于 GPT-3,后面的模型更偏重于 Prompt,instruct 的生成。我们的 PLUG 也是基于 Prompt,区别在于它是 Encoder-Ddecoder 架构,这个架构和 Decoder-only 不一样的地方在于,它会更偏理解类的一些生成任务。Google 的PaLM,走的是推理的路线,更能体现模型的智能。
第三阶段想要解决的问题是,无监督的大规模预训练模型在指令方面生成效果比较差。因为它是通过无监督训练 Language Model 任务去训练得到的,所以更多偏向续写的模型。当用户有一些指令输入进来,让模型去做什么事,模型会根据用户输入的最后一个词做续写,而不是按照指令去回复问题或者回复指令。所以 OpenAI 在 2022 年一月份的时候提出了 Instruct GPT。
Instruct GPT 通过人工标注的指令和 Label 数据训练,使得模型可以按照指令去生成这个数据,比如我要模型帮我用某种语言写一个算法。论文中写到用了 13K Prompt,在无监督训练得到的 GPT-3 基础上去做 Supervise 的 fine-tune。这样模型获得了对指令的理解能力。同时它因为经过了大量无监督训练,指令还可以泛化到更多相似的指令。这就是现在 ChatGPT 能在很多场景上都有不错效果的原因。之后的进一步升级是利用人工标注数据的答案质量高低,再用 Reinforcement Learning 去学习排序,这样可以提升模型生成的句子。
2、AliceMind 文本生成模型的发展
接下来主要介绍 AliceMind 在文本生成大模型上的一些探索。AliceMind 整体是个预训练模型体系,它包含了很多预训练模型,今天主要介绍其中的三个。
第一个是生成式预训练模型 PALM,第二个是我们自研的超大规模中文预训练的 PLUG,以及我们基于 GPT-3 架构在中文大量无监督数据上去训练的一个中文 GPT-3。以上是纯文本的大模型,还有一个是在图像多模态上的大模型 mPLUG,它做的是图文场景、多模态场景的文本生成。
首先介绍纯文本的这几个模型。对比一下前面介绍过的大小模型,它们各自适用于文本生成哪些场景。
小模型更偏向资源有限,同时又有一些数据集,而且要求精度和 RT 比较高的一些下游场景。这也可以用预训练生成小模型,比如 GPT-1,BART 以及 T5,还有我们的 PALM 模型。这些都是参数规模比较小一些的模型,比如这几个模型的 base、large 规模分别为 1 亿、3 亿参数。
大模型主要是适用于多生成任务场景。比如我有很多生成任务,但同时我又没有数据,或者只有很少量数据的情况下,我可以用大模型的一些 few-shot 的泛化能力去实现很多能力。比如现在大模型其实有很多通用能力,比如小说续写、诗词生成,对联生成,还有 QA 问答这些。相比于小模型 fine-tune 之后的效果肯定会差一些,但是可以兼容更多场景。
这里看一下文本生成任务里面几种重要的形式。
AliceMind 走了一条先做小模型,取得成果再迁移到大模型,最后再从文本迁移到多模态这样的道路。下面先从 20 年提出的小模型 PALM 讲起。
(1)PALM
当时的生成预训练模型,在预训练任务上都是更偏生成类的,比如 GPT 是 Language Model,把所有的文本去预测下一个词。BART是把输入端去做一些 mask,再 decoder 去做一些还原。
我们认为有一类生成类任务,比如文本摘要,有输入序列长,输出序列短的特点,这种场景很依赖 encoder 的理解能力。motivation 是看到 EMNLP 上有一篇 paper ,把 BERT encoder 直接拿过来,再加一个随机 decoder,fine-tune 训练摘要任务,都得可以得到很好的效果,这说明了 encoder 的重要性。所以我们在做 PALM 的时候结合了自编码和自回归的预训练。
① 自回归类似于 Language Model 这种去做生成,只不过我们这里会把一个 document 随机从中间切开,切成两部分,一部分输入到 encoder 里面,让 decoder 去预测后半部分。
② 自编码预训练就是在 encoder 侧加一个任务,让模型去提升模型的理解能力。encoder 任务我们采用的是 maskLM,类似于 BERT 的,经过验证有效的方式去做 mask,直接在 encoder 去做预测。
联合自编码自回归的预训练它既有 encoder 的理解能力,同时 decoder 也有很好的生成能力。
下面来看实验的结果。从右侧的表可以看出,把自编码和自回归任务单独去掉之后,模型的效果都会下降一个点。另外还对比了几个生成预训练模型在大部分数据集上都有提升。
PALM 2.0 在 1.0 版本上主要是针对中文场景的升级,我们发现通过多阶段多任务渐进式预训练可以进一步提升模型效果。采用课程学习(curriculum learning)的思想,从易到难的学习思路。因为之前的词编码这种词级别的 mask,对于生成有点太简单了。所以我们这里采用了一个 text infilling,同时也对句子做一些 Shuffle。类似于 BART 的这种方式,只不过它会 mask 更多的词,同时也会把句子打断,这样会使模型生成起来难度更高。相当于从最简单的这种 maskLM 任务到中间第二阶段 text infilling任务。第三阶段是延续 PALM 1.0 的自回归任务。
我们对比了模型在预训练过程中的这几个任务的 Accuracy,从 Accuracy 指标的结果可以看出,这几个任务确实是从易到难的。第一个任务,我们训练过程中 Accuracy 可以达到 90% 多。第二阶段 text infilling & Shuffle 任务,可以达到 80% 的结果。第三阶段模型最多能够达到 40% 以上。毕竟是一个开放性的生成任务,即使人去写也是比较难的。
下面看一下多阶段渐进式预训练的实验结果。开始的词级别的 mask 作为 Baseline,在此之上加入 text Infilling 对片段 mask 之后,可以看到比较显著的提升。第三阶段再加入自回归生成之后,模型除了在 ADGEN 数据以外,都有进一步的提升。ADGEN 数据集效果下降是一个比较有趣的现象,原因可能是因为预训练的任务,如果和下游任务贴合,就会得到不错的效果。这时候如果进一步进行三阶段训练,效果反而会下降。
PALM 2.0 在几个中文数据集上面的实验效果,base/large 均高于其他的 SOTA 模型。
PALM 2.0 模型以及预训练的 backbone 都已经上传到 ModelScope 社区中,可以获取到 modelcard 以及 checkpoint。
下面介绍下游和训练场景的应用。下游场景以前面介绍的摘要任务为例,只需要写几行代码调用 Pipeline 即可直接做摘要任务的预测。
训练场景中,用户只需构造自己的数据集,配置超参就可以做训练了,也可以更换其中的模型和 backbone。另外训练过程中会对常用的评价指标进行自动评估,最后保存最好的 checkpoint 模型。之后调用 Pipeline 即可对训练好的模型做 inference。如果没有 GPU 机器,也可以用我们提供的一些免费时长,使用在线 notebook 体验。
(2)中文 GPT-3
上面讲的主要是针对小模型,对预训练的 backbone 做 fine-tune,下面讲两个大模型,中文 GPT 和我们自研的 PLUG。中文 GPT 延续了英文 GPT Decoder-only 的架构,数据方面用的更多的是中文的无监督语料。因为没有 Instruct GPT 那么多的标注数据,所以模型的泛化能力差一些。在推理上我们基于 allSpark 做了一些优化,13B 模型生成128 个 tokens 只需要 1 秒。考虑到不同开发者的硬件条件不同,我们目前开放了 6 种不同大小的模型,大家可以根据自己的机器条件选择。
我们也提供了在线体验版本供大家测试。诗词生成场景,模型可以预测诗词的下半句。小说续写场景,模型可以根据小说的前半部分续写。代码生成场景,可以根据用户要求的功能以及编程语言生成相应的代码。
下面展示一个 GPT-3 的训练体验样例。原本的模型不支持诗词生成(生成的结果并不是一句五个字),对模型使用 Pipeline 重新训练之后就可以生成诗词了。
(3)PLUG
PLUG 中文大模型延续的是 PALM 的思路,结合 NLU 和 NLG 的任务,得到一个理解和生成同时做的模型。NLU 任务是我们自研的 StructBERT 模型,在 BERT的基础上引入三分类以及对词级别打乱。NLG 是 PALM 的自编码自回归结合。训练分为两个阶段,第一阶段是 StructBERT 的思路,把模型大小提升。第二阶段延续 PALM 的思路,用 encoder 做初始化,加上 decoder 之后做生成的训练。这样可以得到一个 Encoder-Decoder 统一理解生成模型。做理解相关任务,比如分类/预测时,只需要把 encoder 部分拿出来,沿用 BERT 的方法。做生成相关任务时,再使用全部的 Encoder-Decoder 架构。这里也做了一些推理加速的工作,和中文 GPT 是相同的技术,获得了 10x 加速的效果。
PLUG 模型在 GLUE 榜单上测试,理解和生成任务都取得了很好的效果。
270 亿参数的 PLUG 模型已经在 ModelScope 上开放,大家可以按照流程申请获取下载链接,然后使用 Pipeline 做部署推理。
三、多模态统一生成预训练模型 mPLUG
下面介绍多模态场景的工作,主要是针对输入图+文,输出文字的情况。
多模态相关主要的任务有两种。一个是 VQA,输入图片和针对图片的问题,模型预测答案。另一个是 COCO Caption,输入图片,模型预测图片的描述。
我们提出了多模态统一生成的预训练模型 mPLUG,主要解决的是多模态融合时,视觉特征序列过长导致的低效性和信息淹没问题。Vit 结构的问题是,在切 patch 的过程中,如果切的比较小且图片分辨率高,切下来序列就会很长,序列长会带来训练低效的问题。另外在和文本模态融合的过程中,如果图片数据过长,会淹没一部分文本的信息。
mPLUG 结构的底层还是先分别对文本和图片做编码,之后用对比学习把两个维度的特征拉到同一空间,再传入我们提出的 skip-connection 网络。之前的 co-attention 或者图文拼接的方式会存在信息淹没问题,我们的核心点在于只做非对称的 attention,即只将视觉特征 cross 到文本侧。因为训练速度慢主要在视觉,这样可以极大提升模型训练速度。但是如果只采用这种方式,因为文本序列比较短,会带来视觉信息的丢失。所以我们在 skip-connection 网络里面,先通过一个多层的非对称的 co-attention 网络,之后把视觉信息拼接进来,然后再过一层的 connected attention。这样既可以保证视觉信息不丢失,同时防止文本信息被视觉信息淹没。
以上就是图片和文本信息融合的 encoder,之后再加上 decoder 做生成的预训练。这就是我们整体的架构了。这种架构的优势在,一方面通过这种模块化多流的 Transformer 结构,可以统一理解和生成。同时它又可以灵活地拆拔不同模块进行微调。比如做图文检索任务,可以不要 decoder,只把 vision 和 text encoder 拆出来做向量检索,也可以用 ITM 图文匹配 Score。如果是 caption 任务,则不需要 text encoder,只需要 vision encoder 直接 cross 到 decoder 做图片描述的生成。如果做开放域的视觉问答,则全部的模块都会用到。
在 VQA 任务中,只用了 1400 万数据就超过了很多用更多数据的模型。在 caption 任务中,我们通过模型的 fine-tune 和加 theta 的优化可以达到很好的效果。图文检索中我们用向量和 ITM 的两个 Score 得到了很好的效果。
在训练时间方面,skip-connection 相比于之前的几种方式会减少一些。非对称 attention 节省的时间更多,但是效果差一些。效果差的原因是,如果只是视觉信息 cross 到文本,文本信息序列太短,不足以承载整个视觉和文本的表示。
展示几个 VQA 在开放域上的样例。
mPLUG 模型同样放在 ModelScope上。
同样也有快速体验和调用,以及针对用户个性化场景的训练优化。
四、总结
五、问答环节
Q1:中文 GPT-3 代码生成是怎么做的,用的什么数据?
A1:第一阶段预训练数据的 common crawl 中包含一些代码数据。第二阶段还专门加了一些代码数据,另外做了一些 Prompt 整理,优化和标注。
Q2:PLUG 2 万亿是 Dense 的吗?
A2:不是。开始想尝试 Dense,但是训练难度大,所以其实是 MOE 的模型。我们也做一些测试,它在性能上等价于百亿千亿这种级别。
Q3:中文 GPT-3 开源了吗?
A3:开源在 ModelScope 社区了。
Q4:海量数据做预训练,如何加速?
A4:和 NVIDIA 做了一些合作,使用 Megatron 框架做了一些算子,并行上的优化。
Q5:训练用了多少资源?
A5:base/large 级别的模型,用了 8 卡 A100 的机器训练了 4-5 天完成的。1.3B/2.7B,用 32 卡的 A100 训练一两周的时间。更大的模型,比如 13B/30B 要上百卡级别,接近一个月时间训练。
Q6:一个是 GPT-3,用于理解类下游任务效果不好?
A6:Decoder-only 结构,不是双向理解。构建 Prompt 的方式去生成,不如用 encoder 的方式效果好。
Q7:中文 GPT 和 ChatGPT 的区别?
A7:中文 GPT 的架构和 GPT3,ChatGPT 差不多。差别主要在训练数据上,ChatGPT 使用了有 Label 的 instruction 数据集,效果确实好一些。
今天的分享就到这里,谢谢大家。