InstructGPT /ChatGPT

最近非常火的ChatGPT和今年年初公布的[1]是一对姐妹模型,是在GPT-4之前发布的预热模型,有时候也被叫做GPT3.5。ChatGPT和InstructGPT在模型结构,训练方式上都完全一致,即都使用了指示学习(Instruction Learning)和人工反馈的强化学习(Reinforcement Learning from Human Feedback,RLHF)来指导模型的训练,它们不同的仅仅是采集数据的方式上有所差异。所以要搞懂ChatGPT,我们必须要先读懂InstructGPT

https://arxiv.org/abs/2203.02155

Prompt是激发语言模型的补全能力,例如根据上半句生成下半句,或是完形填空等。Instruct(指令)是激发语言模型的理解能力,它通过给出更明显的指令,让模型去做出正确的行动。

  1. 提示学习:给女朋友买了这个项链,她很喜欢,这个项链太____了。
  2. 指示学习:判断这句话的情感:给女朋友买了这个项链,她很喜欢。选项:A=好;B=一般;C=差。

1. 背景知识

在介绍ChatGPT/InstructGPT之前,我们先介绍它们依赖的基础算法。

1.1 GPT系列

基于文本预训练的GPT-1[2],GPT-2[3],GPT-3[4]三代模型都是采用的以Transformer为核心结构的模型(图1),不同的是模型的层数和词向量长度等超参,它们具体的内容如表1。

图1:GPT系列的模型结构(其中Trm是一个Transformer结构)

表1:历代GPT的发布时间,参数量以及训练量

模型发布时间层数头数词向量长度参数量预训练数据量
GPT-12018 年 6 月12127681.17 亿约 5GB
GPT-22019 年 2 月48160015 亿40GB
GPT-32020 年 5 月9696128881,750 亿45TB

GPT-1比BERT诞生略早几个月。它们都是采用了Transformer为核心结构,不同的是GPT-1通过自左向右生成式的构建预训练任务,然后得到一个通用的预训练模型,这个模型和BERT一样都可用来做下游任务的微调。GPT-1当时在9个NLP任务上取得了SOTA的效果,但GPT-1使用的模型规模和数据量都比较小,这也就促使了GPT-2的诞生。

对比GPT-1,GPT-2并未在模型结构上大作文章,只是使用了更多参数的模型和更多的训练数据(表1)。GPT-2最重要的思想是提出了“所有的有监督学习都是无监督语言模型的一个子集”的思想,这个思想也是提示学习(Prompt Learning)的前身。GPT-2在诞生之初也引发了不少的轰动,它生成的新闻足以欺骗大多数人类,达到以假乱真的效果。甚至当时被称为“AI界最危险的武器”,很多门户网站也命令禁止使用GPT-2生成的新闻。

GPT-3被提出时,除了它远超GPT-2的效果外,引起更多讨论的是它1750亿的参数量。GPT-3除了能完成常见的NLP任务外,研究者意外的发现GPT-3在写SQL,JavaScript等语言的代码,进行简单的数学运算上也有不错的表现效果。GPT-3的训练使用了情境学习(In-context Learning),它是元学习(Meta-learning)的一种,元学习的核心思想在于通过少量的数据寻找一个合适的初始化范围,使得模型能够在有限的数据集上快速拟合,并获得不错的效果。

通过上面的分析我们可以看出从性能角度上讲,GPT有两个目标:

  1. 提升模型在常见NLP任务上的表现效果;
  2. 提升模型在其他非典型NLP任务(例如代码编写,数学运算)上的泛化能力。

另外,预训练模型自诞生之始,一个备受诟病的问题就是预训练模型的偏见性。因为预训练模型都是通过海量数据在超大参数量级的模型上训练出来的,对比完全由人工规则控制的专家系统来说,预训练模型就像一个黑盒子。没有人能够保证预训练模型不会生成一些包含种族歧视,性别歧视等危险内容,因为它的几十GB甚至几十TB的训练数据里几乎肯定包含类似的训练样本。这也就是InstructGPT和ChatGPT的提出动机,论文中用3H概括了它们的优化目标:

  • 有用的(Helpful);
  • 可信的(Honest);
  • 无害的(Harmless)。

OpenAI的GPT系列模型并没有开源,但是它们提供了模型的试用网站,有条件的同学可以自行试用。

1.2 指示学习(Instruct Learning)和提示(Prompt Learning)学习

指示学习是谷歌Deepmind的Quoc V.Le团队在2021年的一篇名为《Finetuned Language Models Are Zero-Shot Learners》[5]文章中提出的思想。指示学习和提示学习的目的都是去挖掘语言模型本身具备的知识。不同的是Prompt是激发语言模型的补全能力,例如根据上半句生成下半句,或是完形填空等。Instruct是激发语言模型的理解能力,它通过给出更明显的指令,让模型去做出正确的行动。我们可以通过下面的例子来理解这两个不同的学习方式:

  1. 提示学习:给女朋友买了这个项链,她很喜欢,这个项链太____了。
  2. 指示学习:判断这句话的情感:给女朋友买了这个项链,她很喜欢。选项:A=好;B=一般;C=差。

指示学习的优点是它经过多任务的微调后,也能够在其他任务上做zero-shot,而提示学习都是针对一个任务的。泛化能力不如指示学习。我们可以通过图2来理解微调,提示学习和指示学习。

图2:模型微调,提示学习,指示学习三者的异同

1.3 人工反馈的强化学习

因为训练得到的模型并不是非常可控的,模型可以看做对训练集分布的一个拟合。那么反馈到生成模型中,训练数据的分布便是影响生成内容的质量最重要的一个因素。有时候我们希望模型并不仅仅只受训练数据的影响,而是人为可控的,从而保证生成数据的有用性,真实性和无害性。论文中多次提到了对齐(Alignment)问题,我们可以理解为模型的输出内容和人类喜欢的输出内容的对齐,人类喜欢的不止包括生成内容的流畅性和语法的正确性,还包括生成内容的有用性、真实性和无害性。

我们知道强化学习通过奖励(Reward)机制来指导模型训练,奖励机制可以看做传统模训练机制的损失函数。奖励的计算要比损失函数更灵活和多样(AlphaGO的奖励是对局的胜负),这带来的代价是奖励的计算是不可导的,因此不能直接拿来做反向传播。强化学习的思路是通过对奖励的大量采样来拟合损失函数,从而实现模型的训练。同样人类反馈也是不可导的,那么我们也可以将人工反馈作为强化学习的奖励,基于人工反馈的强化学习便应运而生。

RLHF最早可以追溯到Google在2017年发表的《Deep Reinforcement Learning from Human Preferences》[6],它通过人工标注作为反馈,提升了强化学习在模拟机器人以及雅达利游戏上的表现效果。

图3:人工反馈的强化学习的基本原理

InstructGPT/ChatGPT中还用到了强化学习中一个经典的算法:OpenAI提出的最近策略优化(Proximal Policy Optimization,PPO)[7]。PPO算法是一种新型的Policy Gradient算法,Policy Gradient算法对步长十分敏感,但是又难以选择合适的步长,在训练过程中新旧策略的的变化差异如果过大则不利于学习。PPO提出了新的目标函数可以在多个训练步骤实现小批量的更新,解决了Policy Gradient算法中步长难以确定的问题。其实TRPO也是为了解决这个思想但是相比于TRPO算法PPO算法更容易求解。

2. InstructGPT/ChatGPT原理解读

有了上面这些基础知识,我们再去了解InstructGPT和ChatGPT就会简单很多。简单来说,InstructGPT/ChatGPT都是采用了GPT-3的网络结构,通过指示学习构建训练样本来训练一个反应预测内容效果的奖励模型(RM),最后通过这个奖励模型的打分来指导强化学习模型的训练。InstructGPT/ChatGPT的训练流程如图4所示。

图4:InstructGPT的计算流程:(1)有监督微调(SFT);(2)奖励模型(RM)训练;(3)通过PPO根据奖励模型进行强化学习。

从图4中我们可以看出,InstructGPT/ChatGPT的训练可以分成3步,其中第2步和第3步是的奖励模型和强化学习的SFT模型可以反复迭代优化。

  1. 根据采集的SFT数据集对GPT-3进行有监督的微调(Supervised FineTune,SFT);
  2. 收集人工标注的对比数据,训练奖励模型(Reword Model,RM);
  3. 使用RM作为强化学习的优化目标,利用PPO算法微调SFT模型。

根据图4,我们将分别介绍InstructGPT/ChatGPT的数据集采集和模型训练两个方面的内容。

2.1 数据集采集

如图4所示,InstructGPT/ChatGPT的训练分成3步,每一步需要的数据也有些许差异,下面我们分别介绍它们。

2.1.1 SFT数据集

SFT数据集是用来训练第1步有监督的模型,即使用采集的新数据,按照GPT-3的训练方式对GPT-3进行微调。因为GPT-3是一个基于提示学习的生成模型,因此SFT数据集也是由提示-答复对组成的样本。SFT数据一部分来自使用OpenAI的PlayGround的用户,另一部分来自OpenAI雇佣的40名标注工(labeler)。并且他们对labeler进行了培训。在这个数据集中,标注工的工作是根据内容自己编写指示,并且要求编写的指示满足下面三点:

  • 简单任务:labeler给出任意一个简单的任务,同时要确保任务的多样性;
  • Few-shot任务:labeler给出一个指示,以及该指示的多个查询-相应对;
  • 用户相关的:从接口中获取用例,然后让labeler根据这些用例编写指示。

2.1.2 RM数据集

RM数据集用来训练第2步的奖励模型,我们也需要为InstructGPT/ChatGPT的训练设置一个奖励目标。这个奖励目标不必可导,但是一定要尽可能全面且真实的对齐我们需要模型生成的内容。很自然的,我们可以通过人工标注的方式来提供这个奖励,通过人工对可以给那些涉及偏见的生成内容更低的分从而鼓励模型不去生成这些人类不喜欢的内容。InstructGPT/ChatGPT的做法是先让模型生成一批候选文本,让后通过labeler根据生成数据的质量对这些生成内容进行排序。

2.1.3 PPO数据集

InstructGPT的PPO数据没有进行标注,它均来自GPT-3的API的用户。既又不同用户提供的不同种类的生成任务,其中占比最高的包括生成任务(45.6%),QA(12.4%),头脑风暴(11.2%),对话(8.4%)等。

2.1.4 数据分析

因为InstructGPT/ChatGPT是在GPT-3基础上做的微调,而且因为涉及了人工标注,它们数据总量并不大,表2展示了三份数据的来源及其数据量。

表2:InstructGPT的数据分布

论文的附录A对数据的分布进行了更详细的讨论,这里我列出几个可能影响模型效果的几项:

  • 数据中96%以上是英文,其它20个语种例如中文,法语,西班牙语等加起来不到4%,这可能导致InstructGPT/ChatGPT能进行其它语种的生成,但效果应该远不如英文;
  • 提示种类共有9种,而且绝大多数是生成类任务,可能会导致模型有覆盖不到的任务类型;
  • 40名外包员工来自美国和东南亚,分布比较集中且人数较少, InstructGPT/ChatGPT的目标是训练一个价值观正确的预训练模型,它的价值观是由这40个外包员工的价值观组合而成。而这个比较窄的分布可能会生成一些其他地区比较在意的歧视,偏见问题。

此外,ChatGPT的博客中讲到ChatGPT和InstructGPT的训练方式相同,不同点仅仅是它们采集数据上有所不同,但是并没有更多的资料来讲数据采集上有哪些细节上的不同。考虑到ChatGPT仅仅被用在对话领域,这里我猜测ChatGPT在数据采集上有两个不同:1. 提高了对话类任务的占比;2. 将提示的方式转换Q&A的方式。当然这里也仅仅是猜测,更准确的描述要等到ChatGPT的论文、源码等更详细的资料公布我们才能知道。

2.2 训练任务

我们刚介绍到InstructGPT/ChatGPT有三步训练方式。这三步训练会涉及三个模型:SFT,RM以及PPO,下面我们详细介绍它们。

2.2.1 有监督微调(SFT)

这一步的训练和GPT-3一致,而且作者发现让模型适当过拟合有助于后面两步的训练。

2.2.2 奖励模型(RM)

因为训练RM的数据是一个labeler根据生成结果排序的形式,所以它可以看做一个回归模型。RM结构是将SFT训练后的模型的最后的嵌入层去掉后的模型。它的输入是prompt和Reponse,输出是奖励值。具体的讲,对弈每个prompt,InstructGPT/ChatGPT会随机生成 K 个输出( 4≤K≤9 ),然后它们向每个labeler成对的展示输出结果,也就是每个prompt共展示 CK2 个结果,然后用户从中选择效果更好的输出。在训练时,InstructGPT/ChatGPT将每个prompt的 CK2 个响应对作为一个batch,这种按prompt为batch的训练方式要比传统的按样本为batch的方式更不容易过拟合,因为这种方式每个prompt会且仅会输入到模型中一次。

奖励模型的损失函数表示为式(1)。这个损失函数的目标是最大化labeler更喜欢的响应和不喜欢的响应之间的差值。

2.2.3 强化学习模型(PPO)

强化学习和预训练模型是最近两年最为火热的AI方向之二,之前不少科研工作者说强化学习并不是一个非常适合应用到预训练模型中,因为很难通过模型的输出内容建立奖励机制。而InstructGPT/ChatGPT反直觉的做到了这点,它通过结合人工标注,将强化学习引入到预训练语言模型是这个算法最大的创新点。

如表2所示,PPO的训练集完全来自API。它通过第2步得到的奖励模型来指导SFT模型的继续训练。很多时候强化学习是非常难训练的,InstructGPT/ChatGPT在训练过程中就遇到了两个问题:

  1. 问题1:随着模型的更新,强化学习模型产生的数据和训练奖励模型的数据的差异会越来越大。作者的解决方案是在损失函数中加入KL惩罚项 βlog⁡(πϕRL(y∣x)/πSFT(y∣x)) 来确保PPO模型的输出和SFT的输出差距不会很大。
  2. 问题2:只用PPO模型进行训练的话,会导致模型在通用NLP任务上性能的大幅下降,作者的解决方案是在训练目标中加入了通用的语言模型目标 γEx∼Dpretrain [log⁡(πϕRL(x))] ,这个变量在论文中被叫做PPO-ptx。

综上,PPO的训练目标为式(2)。

3. InstructGPT/ChatGPT的性能分析

不可否认的是,InstructGPT/ChatGPT的效果是非常棒的,尤其是引入了人工标注之后,让模型的“价值观”和的正确程度和人类行为模式的“真实性”上都大幅的提升。那么,仅仅根据InstructGPT/ChatGPT的技术方案和训练方式,我们就可以分析出它可以带来哪些效果提升呢?

3.1 优点

  • InstructGPT/ChatGPT的效果比GPT-3更加真实:这个很好理解,因为GPT-3本身就具有非常强的泛化能力和生成能力,再加上InstructGPT/ChatGPT引入了不同的labeler进行提示编写和生成结果排序,而且还是在GPT-3之上进行的微调,这使得我们在训练奖励模型时对更加真实的数据会有更高的奖励。作者也在TruthfulQA数据集上对比了它们和GPT-3的效果,实验结果表明甚至13亿小尺寸的PPO-ptx的效果也要比GPT-3要好。
  • InstructGPT/ChatGPT在模型的无害性上比GPT-3效果要有些许提升:原理同上。但是作者发现InstructGPT在歧视、偏见等数据集上并没有明显的提升。这是因为GPT-3本身就是一个效果非常好的模型,它生成带有有害、歧视、偏见等情况的有问题样本的概率本身就会很低。仅仅通过40个labeler采集和标注的数据很可能无法对模型在这些方面进行充分的优化,所以会带来模型效果的提升很少或者无法察觉。
  • InstructGPT/ChatGPT具有很强的Coding能力:首先GPT-3就具有很强的Coding能力,基于GPT-3制作的API也积累了大量的Coding代码。而且也有部分OpenAI的内部员工参与了数据采集工作。通过Coding相关的大量数据以及人工标注,训练出来的InstructGPT/ChatGPT具有非常强的Coding能力也就不意外了。

3.2 缺点

  • InstructGPT/ChatGPT会降低模型在通用NLP任务上的效果:我们在PPO的训练的时候讨论了这点,虽然修改损失函数可以缓和,但这个问题并没有得到彻底解决。
  • 有时候InstructGPT/ChatGPT会给出一些荒谬的输出:虽然InstructGPT/ChatGPT使用了人类反馈,但限于人力资源有限。影响模型效果最大的还是有监督的语言模型任务,人类只是起到了纠正作用。所以很有可能受限于纠正数据的有限,或是有监督任务的误导(只考虑模型的输出,没考虑人类想要什么),导致它生成内容的不真实。就像一个学生,虽然有老师对他指导,但也不能确定学生可以学会所有知识点。
  • 模型对指示非常敏感:这个也可以归结为labeler标注的数据量不够,因为指示是模型产生输出的唯一线索,如果指示的数量和种类训练的不充分的话,就可能会让模型存在这个问题。
  • 模型对简单概念的过分解读:这可能是因为labeler在进行生成内容的比较时,倾向于给给长的输出内容更高的奖励。
  • 对有害的指示可能会输出有害的答复:例如InstructGPT/ChatGPT也会对用户提出的“AI毁灭人类计划书”给出行动方案(图5)。这个是因为InstructGPT/ChatGPT假设labeler编写的指示是合理且价值观正确的,并没有对用户给出的指示做更详细的判断,从而会导致模型会对任意输入都给出答复。虽然后面的奖励模型可能会给这类输出较低的奖励值,但模型在生成文本时,不仅要考虑模型的价值观,也要考虑生成内容和指示的匹配度,有时候生成一些价值观有问题的输出也是可能的。
图5:ChatGPT编写的毁灭人类计划书。

3.3 未来工作

我们已经分析了InstrcutGPT/ChatGPT的技术方案和它的问题,那么我们也可以看出InstrcutGPT/ChatGPT的优化角度有哪些了。

  • 人工标注的降本增效:InstrcutGPT/ChatGPT雇佣了40人的标注团队,但从模型的表现效果来看,这40人的团队是不够的。如何让人类能够提供更有效的反馈方式,将人类表现和模型表现有机和巧妙的结合起来是非常重要的。
  • 模型对指示的泛化/纠错等能力:指示作为模型产生输出的唯一线索,模型对他的依赖是非常严重的,如何提升模型对指示的泛化能力以及对错误指示示的纠错能力是提升模型体验的一个非常重要的工作。这不仅可以让模型能够拥有更广泛的应用场景,还可以让模型变得更“智能”。
  • 避免通用任务性能下降:这里可能需要设计一个更合理的人类反馈的使用方式,或是更前沿的模型结构。因为我们讨论了InstrcutGPT/ChatGPT的很多问题可以通过提供更多labeler标注的数据来解决,但这会导致通用NLP任务更严重的性能下降,所以需要方案来让生成结果的3H和通用NLP任务的性能达到平衡。

3.4 InstrcutGPT/ChatGPT的热点话题解答

  • ChatGPT的出现会不会导致底层程序员失业?从ChatGPT的原理和网上漏出的生成内容来看,ChatGPT生成的代码很多可以正确运行。但程序员的工作不止是写代码,更重要的是找到问题的解决方案。所以ChatGPT并不会取代程序员,尤其是高阶程序员。相反它会向现在很多的代码生成工具一样,成为程序员写代码非常有用的工具。
  • Stack Overflow 宣布临时规则:禁止 ChatGPT。ChatGPT本质上还是一个文本生成模型,对比生成代码,它更擅长生成以假乱真的文本。而且文本生成模型生成的代码或者解决方案并不能保证是可运行而且是可以解决问题的,但它以假乱真的文本又会迷惑很多查询这个问题的人。Stack Overflow为了维持论坛的质量,封禁ChatGPT也是清理之中。
  • 聊天机器人 ChatGPT 在诱导下写出「毁灭人类计划书」,并给出代码,AI 发展有哪些问题需关注?ChatGPT的「毁灭人类计划书」是它在不可遇见的指示下根据海量数据强行拟合出来的生成内容。虽然这些内容看起来很真实,表达也很流畅,这说明的只是ChatGPT具有非常强的生成效果,并不表示ChatGPT具备毁灭人类的思想。因为他仅仅是一个文本生成模型,并不是一个决策模型。

4. 总结

就像很多人们算法刚诞生时一样,ChatGPT凭借有用性,真实性,无害性的效果,引起了业内广泛的关注和人类对AI的思考。但是当我们看完它的算法原理之后,发现它并没有业内宣传的那么恐怖。反而我们可以从它的技术方案中学到很多有价值的东西。InstrcutGPT/ChatGPT在AI界最重要的贡献是将强化学习和预训练模型巧妙的结合起来。而且通过人工反馈提升了模型的有用性,真实性和无害性。ChatGPT也进一步提升大模型的成本,之前还只是比拼数据量和模型规模,现在甚至也引入了雇佣的外包这一支出,让个体工作者更加望而却步。

参考

  1. ^Ouyang, Long, et al. “Training language models to follow instructions with human feedback.” *arXiv preprint arXiv:2203.02155* (2022). https://arxiv.org/pdf/2203.02155.pdf
  2. ^Radford, A., Narasimhan, K., Salimans, T. and Sutskever, I., 2018. Improving language understanding by generative pre-training. https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf
  3. ^Radford, A., Wu, J., Child, R., Luan, D., Amodei, D. and Sutskever, I., 2019. Language models are unsupervised multitask learners. *OpenAI blog*, *1*(8), p.9. https://life-extension.github.io/2020/05/27/GPT%E6%8A%80%E6%9C%AF%E5%88%9D%E6%8E%A2/language-models.pdf
  4. ^Brown, Tom B., Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan et al. “Language models are few-shot learners.” *arXiv preprint arXiv:2005.14165* (2020). https://proceedings.neurips.cc/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf
  5. ^Wei, Jason, et al. “Finetuned language models are zero-shot learners.” *arXiv preprint arXiv:2109.01652* (2021). https://arxiv.org/pdf/2109.01652.pdf
  6. ^Christiano, Paul F., et al. “Deep reinforcement learning from human preferences.” *Advances in neural information processing systems* 30 (2017). https://arxiv.org/pdf/1706.03741.pdf
  7. ^Schulman, John, et al. “Proximal policy optimization algorithms.” *arXiv preprint arXiv:1707.06347* (2017). https://arxiv.org/pdf/1707.06347.pdf

OpenAI 代码生成模型 Codex: Evaluating Large Language Models Trained on Code

Codex

https://openai.com/blog/openai-codex/

Evaluating Large Language Models Trained on Code

Copilot的核心技术:给定函数名和功能描述,可以自动进行代码补全,或者给定代码,给出相关文档。作者团队收集了Github上所有的不重复的python代码,总计179GB,并进行了简单过滤(去掉了过大的文件(>1MB)和过长的代码(>100行或单行超过1000个字符)),在数据集上面训练了一个GPT3模型。

作者团队手动编写了164个函数(避免数据泄漏),每个函数包括代码、文档以及单元测试,平均每个问题包括7.7个测试样例,用于评估模型。Codex 12亿参数的模型能解决28.8%的问题,3亿参数的模型能解决13.2%的问题,作者团队又收集了一个跟测试集差不多的数据集用于模型微调,微调以后,得到Codex-S可以解决37.7%的问题。而使用 repeated sampling,即运行一百次模型,只要有一个输出解决了问题就算成功的话,那么Codex-S能解决77.5%的问题(CodeX能解决70.2%),而如果选择100个输出中概率最高的输出,则能解决44.5%的问题。

细节

1. 目标函数没有使用BLEU(困惑度),因为代码不同于自然语言,即使特别相似,但仍然可能不是一个合法的语句,作者使用:

来评估模型,即生成n个输出(n>k),从中随机抽取k个输出,这k个输出只要有一个能通过单元测试的概率.

代码近似计算pass@k(为什么要近似:如果k,n很大,计算很复杂)

2. 输出代码的测试在沙盒中进行(生成的代码可能是恶意的,会让你的机器出现问题)

3. 在GPT3原有模型上微调并不能取得更好的效果,但会加速收敛

4、代码里面的空格如果不做处理会带来很多不必要的词进去,对空格做特殊处理后会减少30%的词

5. 当模型输出‘\nclass’, ‘\ndef’, ‘\n#’, ‘\nif’, or‘\nprint’等语句时,模型会终止推理,输出结果

6. 使用nucleus sampling(核采样):选择概率总和p=95%的前k个输出用于评估模型

7. 对输出做softmax得到概率之前,会除以一个超参数Temperature,来调节不同输出之间的概率差距,当pass@k中的采样数k越大时,T越大效果越好

8. 收集了跟测试集类似的数据集用于微调,1)从各种比赛中收集赛题(大约一万个),2)从Continuous Integration中收集了约40000个函数和单元测试,并过滤(CodeX对每个问题生成一百个输出,如果能解决通过测试用例则保留该样本,反之则去掉(不能通过表示该问题太难或测试用例有问题)),在这个数据集上继续训练,训练方式相同,只是该数据集有“标准答案”,得到模型Code-S

9. 使用收集到的github数据集,重新训练一个GPT3模型用于反向生成文档,Codex-D,评测Codex-D模型好坏的方式是,一是人阅读文档评测模型好坏,二是使用生成的文档重新生成代码,看能否通过单元测试

模型局限性

1. 样本有效性不够,需要训练很多的代码,模型才能输出比较简单的实验

2. Prompt应该怎么写才能获得比较理想的代码,作者找了13 basic building block(对字符串做一些简单的操作:如改变大小写、变换位置等),将文档块任意串起来,发现文档越长,生成代码的质量越差,说明docstring不宜过长

3. 对于精确、复杂的数学问题很难生成正确的代码

模型潜在的影响

1. 过度依赖:人可能会过度依赖生成的代码,如果使用者不仔细审查代码,可能会给程序带来潜在的问题

2. Misalignment:模型足够复杂的时候,可能能输出期望的代码,但如果给定一个docstring,可能只能输出一个跟训练数据风格相似,看上去正确,但并不是期望的代码

3. github男性用户居多,所写的代码可能包含性别偏见

4. 市场和经济:很多程序员可能会失业?如果训练数据里的代码对于某些包使用较多,可能导致某些特别的工具使用率增多。

5. 安全:可能某些人用它写病毒和恶意软件

6. 训练这样一个模型需要使用很多资源

7. 法律:使用的是公开代码,fair use(对公共社会有好处的话并没有什么问题),但用于商业行为可能会有法律风险,生成的代码可能跟别人一模一样,可能存在抄袭别人具有版权或者专利保护的代码的风险。

总结

作者爬了很多github的代码,训练了一个GPT3的模型,为了评估模型的效果,准备了146到题用于测试,发现大概能解决大概30%的题,效果还不错,为了进一步提高分数,又收集了一个跟测试集相似的数据集,在上面微调。

GitHub Copilot

Copilot 相比论文codex中的区别:模型都是采用GPT3,但是 Copilot 使用的数据集不仅仅是python,还有其他语言的代码作为数据集。 GitHub 上公开可用存储库的数十亿行代码的训练 。

Copilot 作为一个辅助编程工具,GitHub Copilot 可以通过提供自动完成样式的建议来帮助你编写代码。GitHub Copilot 是一个 AI 配对程序员,可在编写代码时提供自动完成样式的建议。 可以从 GitHub Copilot 接收建议,方法是开始编写要使用的代码,或者编写描述代码要执行的操作的自然语言注释。 GitHub Copilot 会分析你正在编辑的文件以及相关文件中的上下文,并在文本编辑器中提供建议。 GitHub Copilot 由 OpenAI Codex 提供支持,OpenAI Codex 是一个由 OpenAI 创建的新 AI 系统。

不仅是关键字的自动补全,语法建议,调试建议等。而是帮助开发者更快速的完成业务代码编写。简而言之,GitHub Copilot 是一种 AI 工具,可根据命名或者正在编辑的代码上下文为开发者提供代码建议。

根据官方介绍,Copilot 已经接受了来自 GitHub 上公开可用存储库的数十亿行代码的训练,它支持大多数编程语言,但官方建议使用 Python、JavaScript、TypeScript、Ruby 和 Go。Copilot 是 GitHub 和OpenAI合作的结果, OpenAI得到了微软的大力支持。它由一个名为 Codex 的全新 AI 系统提供支持,该系统基于 GPT-3 模型

后续工作:

DeepMind AlphaCode 

DeepMind推出了自动写算法竞赛题的AI AlphaCode,宣称目前在Codeforces比赛中能排到中位数。Transformer + 超大数据集来做code generation。虽然现在也有很多工作用transformer做代码预训练,或者做代码翻译或者生成。但是从这么长的题面去生成竞赛的代码确实是头一次。

AlphaCode 参加的是一个名为 Codeforces 的在线编程平台。虽然我并不熟悉 Codeforces,但曾经为了准备面试刷过 LeetCode。如果说 LeetCode 就是为了程序员进互联网大厂刷题而生,主要考察程序员的算法和数据结构的能力的话,那 Codeforces 是一个竞赛版的 LeetCode,Codeforces 上的题目更像 ACM ICPC 或者信息学奥林匹克竞赛。

Codeforces 上的题目五花八门,但是都需要参赛者编程求解。每个题目有描述,有输入样例,有正确的输出样例,即test cases。如果提交的程序能够将所有test cases都跑出正确的结果,那么就算该题通过。一道题只有10次试错机会。

 AlphaCode 所求解的问题样例,深色的上半部分为编程问题描述,浅色的下半部分为 AlphaCode 生成的代码答案

Training:模型训练

AlphaCode 使用的经典的预训练+微调(Pretraining + Fine-tuning)范式。

预训练使用的是从 GitHub 爬下来的开源代码,经过了精细的预处理和清洗,大约有715GB。看到这个规模的训练数据,就知道只有屈指可数的几家巨无霸公司能够做这个预训练,实在是太大了,估计需要成千上万块GPU。预训练部分单纯就是让模型学习不同编程语言的套路,或者说学习编程语言中的语义和语法。

微调部分使用的是 CodeContests 数据集,这个数据集收集了很多类似 Codeforces 这样的编程平台上的编程题目、元数据以及人类正确和错误的代码提交结果。目的是针对 Codeforces 这样的编程竞赛,让模型学会如何生成对应的代码。这个数据集大约2GB。

AlphaCode 主要使用了编码器-解码器(Encoder-Decoder)的 seq2seq 方式建模。seq2seq 最经典的应用是机器翻译。给定源文本内容,Encoder 将自然语言编码为一些向量,Decoder 根据向量将自然语言解码为目标文本。那么对于AI自动写代码这个问题,就是输入编程题目,让模型生成目标代码。

Sampling & Evaluation:海量试错

图 AlphaCode架构图

上图为 AlphaCode 的架构,左侧(Data)为模型和数据部分,主要使用 Transformer 进行预训练和微调,右侧(Samping & Evaluation)是如何生成代码并参与 Codeforces 比赛。

AlphaCode 使用了经典的 Transformer 模型。有关 Transformer 的介绍,网络上已经有不少,我自己之前也写过一些 Transformer 和 BERT 的入门文章。关注深度学习的朋友都知道,Transfomer 作为当前大红大紫的AI模型,虽然在各个榜单上刷榜,但它并不具有人类基本的推理能力。

相比Transformer,我认为使得 AlphaCode 成功的主要在于这个 Sampling & Evaluation。这个 Sampling & Evaluation 系统有点类似搜索引擎或者推荐引擎。AI拥有存储和制作海量内容的能力,但无法知道人类真正需要什么。最关键的就是如何从海量内容中进行筛选。搜索或推荐引擎一般会对海量内容进行检索,最终呈现给用户的只有几条内容。海量的内容需要经过几大步骤:召回、粗排、精排、重排。其实就是先从海量的内容库中,先粗略筛选出一万篇的内容,再使用更精细的模型对一万篇进行一次次筛选,最终选择出与用户需求最相关的几篇内容。

AlphaCode 使用了一个 Transformer 模型,根据编程题目描述,生成百万份代码,这些生成的代码中99%可能根本跑不通。AlphaCode 使用编程题目中的test cases,验证这些生成的代码,这个过程会过滤掉99%的错误代码。

经过过滤之后,仍然可能有上千份代码能跑通,而且这些能跑通题目给出的测试样例的代码中很多非常相似。一个编程题目只有10次提交机会,每一次提交的机会都非常珍贵。不可能将上千份代码都提交上去。AlphaCode 这时候做了一个聚类(Clustering)。首先:AlphaCode 使用了第二个 Transformer 模型,根据编程题目中的文字描述,自动生成一些test cases。但是生成的test cases并不保证准确性,它是为了接下来的聚类用的。然后:将生成的test cases喂给那些代码,如果一些代码的生成结果近乎一样,说明这些代码背后的算法或逻辑相似,可被归为一类。文章称,经过聚类之后,从数目较大的类中选出代码去提交,更有胜算。

上图演示了这个过程,大致包括四步:

  1. 根据编程题目中的描述等信息,使用第一个Transformer模型,生成百万份代码。
  2. 使用编程题目中的测试样例test cases验证这百万份代码,把不能通过的过滤掉,剩下大约上千份代码。
  3. 使用第二个Transformer模型,生成一些test cases。
  4. 使用第3步生成的test cases,对第2步留下的代码进行验证并聚类,如果两份代码得到的结果相同,则分到同一类。经过聚类后,最终留下10类代码。

Capabilities & Limitations:能力和限制

深度学习是黑盒模型,我们不知道到底模型学到了什么,能否像人类一样认知和推理。论文花了很大精力和篇幅讨论了 AlphaCode 的能力和限制。

作者们提出了一个论点,即 AlphaCode 并不是单纯从训练数据中寻找相似解法,或者说 AlphaCode 并不是单纯从训练数据中拷贝代码。作者的验证方法是对比了生成的代码和训练集中的代码中的代码片段重合的情况,或者说检验 AlphaCode 是不是单纯从训练集里找一些核心代码片段并直接拷贝过来。因此,作者们认为,AlphaCode 具有解决新问题的能力,而不是照猫画虎地把训练数据拷贝搬运过来。知乎上有信息学竞赛选手感慨,有些题目对于人类专业选手来说都很难快速想出解法,但 AlphaCode 却能够得到答案。

作者们发现,模型生成的代码非常依赖编程题目中的描述。比如,同样一个解法,题目描述越冗长,AlphaCode 的求解准确度越低。但是对编程题目的一些其他改变对求解影响不大,比如更改变量名、同义词替换等。

总结

作者认为,AlphaCode 能够击败半数人类选手,主要原因在于:

  1. 训练数据足够大且质量高。
  2. Transformer 预训练模型能够将训练数据中涵盖的知识编码到模型中。
  3. Sampling & Evaluation 的海量试错机制,先生成海量可能的答案,再一步步缩小搜索空间。

阅读完论文和一些解读之后,我感觉至少短期内,离AI替代程序员应该还有一段距离。但是,未来,可真不好说…

不完全统计的Code预训练模型

微软亚洲研究院的CodeXGLEU,是近几年对代码智能任务整理最全的一个benchmark.

https://microsoft.github.io/CodeXGLUE/

GPT系列论文:生成式预训练与零样本学习

本文的主要参考是李沐老师关于 GPT 系列的解读:论文精读

GPT1: Improving Language Understanding by Generative Pre-Training (Generative Pre-Train Model 就是GPT模型的名字由来)

GPT2: Language Models are Unsupervised Multitask Learners

GPT3: Language Models are Few-Shot Learners

GPT3开发的demo: https://gpt3demo.com/

GPT-3: Demos, Use-cases, Implications

More concretely:

  • Language model performance scales as a power-law of model size, dataset size, and the amount of computation.
  • A language model trained on enough data can solve NLP tasks that it has never encountered. In other words, GPT-3 studies the model as a general solution for many downstream jobs without fine-tuning.

关于BERT和GPT

Transformer/BERT/GPT 时间线:Transformer —> GPT —> BERT —-> GPT2 —> GPT3。

如果去查 GPT 系列和 BERT 的引用数量,会发现 BERT 一篇的引用比 GPT 系列三篇加起来还多几倍,因此 BERT 在学界影响力更大是毋庸置疑的。但这并不能说明 BERT 的预训练任务就比 GPT 的更 “好”。首先,GPT 早于 BERT 提出在无监督的语料上进行大规模预训练,BERT 一定程度上也是受到 GPT 的启发。其次,GPT 的预训练任务是标准的语言模型(Language Model),即自回归式(auto-regressive)地预测句子中的下一个单词,相比于 BERT “完形填空” 式的预训练任务,无疑要难上许多。这使得 GPT 必须模型够大、数据够多才能训练起来,得到比较好的结果。这也是为什么 BERT 只有一篇论文,而 GPT 还有 GPT-2、GPT-3,通过不断扩增模型和数据的规模,最终使得 GPT-3 有如此惊艳的效果。对于这样困难的预训练任务和巨大的资源需求,一般的公司或个人根本玩不转。而 BERT 由于任务难度较小,相对并不需要那么多资源就可以进行预训练和微调,这也是为什么 BERT 的后续工作那么多(体现在引用量上)。但是,语言模型预测下一个单词的生成式任务,使得 GPT 的上限极高,GPT-3 通过写出足以以假乱真的文章,成为了最火出圈的 NLP 模型。另外,由于语言模型生成式任务的灵活性和巨大的预训练规模,GPT 甚至可以不需要(更新模型参数的)微调,而是通过文本 prompt 提示,就可以直接处理下游任务。

另外,很多人喜欢从从模型结构上来将 BERT 和 GPT 进行区分:BERT 使用了 Transformer 的编码器,适合于判别式任务;GPT 使用了 Transformer 的解码器,适合于生成式任务。然而,使用什么样的模型结构并不是 BERT 和 GPT 的本质区别。二者的本质区别在于选用了什么样的预训练目标函数,选用 Transformer 的编码器或解码器只是在确定了目标函数之后的必然选择。GPT 选用的是标准语言模型的目标函数,预测句子中的下一个单词,此时模型应该只能看到当前词和它之前的词,所以必须将当前词后面的词全部 mask 掉,故而选用带有 masked self-attention 的 Transfomer 解码器;而 BERT 是设计了一种 “完形填空” 式的预训练任务,根据当前词前后的内容还原当前词,此时模型应该可以看到整个序列的所有单词(当前词已被替换为特殊 token),故而选用了 Transformer 的编码器。当然,在讨论 BERT 与 GPT 时,将它们各自选用的架构作为直观的区分方式也是没有问题的。

GPT-1

Paper:Improving Language Understanding by Generative Pre-Training

前言

GPT 首先提出了在无监督的大规模预料上进行预训练,再在下游任务上进行微调的训练范式。至于为什么使用 Transformer 模型,而非 RNN,作者指出:Transformer 模型有更结构化的记忆(more structured memory),能够更好地处理文本中的长距离(long-term)依赖关系,从而能更好地抽取出句子层面和段落层面的语义信息,因此在迁移学习中,Tranformer 学习到的特征更加稳健。在迁移学习时,GPT 设计了各种任务相关(task-specific)的输入表示。

这里所谓的更结构化的记忆、长距离文本信息的论述,笔者是这样理解的:RNN(如 LSTM) 需要一步一步地处理序列内容,如果序列距离过长,可能走到后面时,前面的信息会有所丢失;而在 Transformer 中,自注意力机制的计算是完全并行的,序列的位置信息是通过位置嵌入来编码的,就不会有这个问题,即李宏毅老师所说的:“天涯若比邻”。

方法

原文方法部分分为三个小节,分别介绍如何在无标注的数据上进行自监督预训练、怎样进行微调、怎样对于不同的 NLP 下游任务构造输入。

预训练:

微调

方法部分的第二小节介绍了如何在预训练完成之后,在下游任务上进行微调。

假设有带标签数据集C ,其中每个样本是一个由一系列单词组成的句子和标签 y 组成。将句子输入到 GPT 模型中,取最后一个 transformer block 最后一个单词的输出特征,将它送入到线性层中进行预测:

不同任务的输出构造

介绍完如何微调之后,接下来就要介绍如何将 NLP 中不同的下游任务的输入表示成第二小节中句子+标签 的形式。如下图右侧所示,图中展示了几种不同类型的 NLP 下游任务适配 GPT 预训练模型的输入构造方法:

分类任务

  • 任务简介:任务给定一段文本,输出分类结果。例如:情感分类。
  • 构造方法:将给定的文本首尾各加上一个 token Start/Extract,然后送到 GPT 预训练模型中,将输出特征接一个线性层进行分类。分类任务与之前微调小节介绍的做法是完全一致的,

蕴含任务(非对称性句子关系任务)

  • 任务简介:给定两段文本,判断前者对后者关系。例如:蕴含任务,判断第一句对第二句的关系是蕴含/不蕴含/无关。
  • 构造方法:将两个句子中间添加一个分割 token Delim,然后将整个文本的首尾再加上 Start/Extract,送入 GPT 预训练模型,将输出特征送入线性层分类。

相似度任务(对称性句子关系任务)

  • 任务简介:给定两段文本,判断二者关系。例如:相似度任务,判断两个句子是否相似。
  • 构造方法:将两个句子分别作为前句或后句,构造两个完整文本,各自送入 GPT 预训练模型,提取出特征并进行融合,再送入线性层分类。

多选任务

  • 任务简介:给定一段文本和多个答案,判断哪个正确。
  • 构造方法:将给定文本和 N 个答案结合,构造 N 个完整文本,各自送入 GPT 预训练模型,提取出特征并送入线性层,取置信度最大者。

GPT模型结构(左)与微调下游任务输入构造方式(右)

注意图中的开始符(Start)、分隔符(Delim)、结束符(Extract)不是这几个单词本身,而是三个特殊的符号。

GPT-2

Paper:Language Models are Unsupervised Multitask Learners

前言

GPT 出现后不久,BERT 就提出了。通过新型的 MLM(Masked Language Model)任务和更大的模型、更大的训练数据量,在多项指标上超越了 GPT。GPT 的作者想要再次反超,首先肯定要扩大模型和数据的规模。但是除此之外,GPT-2 还有一个惊人的设定:zero-shot(零样本)。顾名思义,在 zero-shot 设定下,模型在预训练完成之后不需要任何下游任务的标注数据来进行微调,而是直接进行预测。

GPT-2 在研究思路上带给我们的启示是:有时候做研究不一定要在一个既定指标上死磕。在方法没有大创新的情况下,通过 “大力出奇迹” ,即使能够比之前方法有所提升,文章也会显得有些无聊。这时可以思考一些设定上的创新,如本文的 zero-shot,这时即使指标上提升不多甚至持平,也会有更有新意、更有趣。

方法

GPT2还是做语言模型,但是在做到下游任务的时候,会用一个叫做zero-shot的设定,zero-shot是说,在做到下游任务的时候,不需要下游任务的任何标注信息,那么也不需要去重新训练已经预训练好的模型。这样子的好处是我只要训练好一个模型,在任何地方都可以用。
如果作者就是在GPT1的基础上用一个更大的数据集训练一个更大的模型,说我的结果比Bert好一些,可能也就好那么一点点,不是好那么多的情况下,大家会觉得gpt2这篇文章就没什么意思了,工程味特别重。那么我换一个角度,选择一个更难的问题,我说做zero-shot。虽然结果可能没那么厉害了,没那么有优势,但是新意度一下就来了。

GPT-2 的模型跟 GPT-1 一样,这里就不再过多介绍。本节主要来说一下 zero-shot 要怎么做。

在 GPT-1 中,模型预训练完成之后会在下游任务上微调,在构造不同任务的对应输入时,我们会引入开始符(Start)、分隔符(Delim)、结束符(Extract)。虽然模型在预训练阶段从未见过这些特殊符号,但是毕竟有微调阶段的参数调整,模型会学着慢慢理解这些符号的意思。现在,在 GPT-2 中,要做的是 zero-shot,也就是没有任何调整的过程了。这时我们在构造输入时就不能用那些在预训练时没有出现过的特殊符号了。所幸自然语言处理的灵活性很强,我们只要把想要模型做的任务 “告诉” 模型即可,如果有足够量预训练文本支撑,模型想必是能理解我们的要求的。

举个机器翻译的例子,要用 GPT-2 做 zero-shot 的机器翻译,只要将输入给模型的文本构造成 translate english to chinese, [englist text], [chinese text] 就好了。比如:translate english to chinese, [machine learning], [机器学习] 。这种做法就是日后鼎鼎大名的 prompt。

在训练数据的收集部分,作者提到他们没有使用 Common Crawl 的公开网页爬取数据,因为这些数据噪声太多,太多无意义的内容。他们是去 Reddit 爬取了大量有意义的文本。作者还指出,在 Reddit 的高质量文本中,很可能已经有类似 zero-shot 构造方式的样本供模型学习。一个机器翻译的例子如下所示。

In a now-deleted post from Aug. 16, Soheil Eid, Tory candidate in the riding of Joliette, wrote in French: ”Mentez mentez, il en restera toujours quelque chose,” which translates as, ”Lie lie and something will always remain.

实验

在与同样为 zero-shot 模型的对比上,肯定是吊打了之前的 SOTA,这里就不展示了。可以关注一下下面 GPT-2 模型 zero-shot 性能关于模型规模的曲线。在有些任务上已经接近、超过之前某些有监督的方法;在比较困难的任务上,比如开放域问答,完全还看不到别人的影子。然而,看看曲线末端性能随模型规模提升的趋势,完全没有收敛的意思,这最后一段翘起的曲线,昭示着 GPT-3 继续大力出奇迹,从量变到质变的希望。

GPT-3

Paper:Language Models are Few-Shot Learners

前言

根据沐神关于论文价值给出的公式:论文价值 = 有效性 * 新意度 * 问题的大小。GPT-2 虽然通过 zero-shot 的设定,将自己的新意度凸显了出来,但是有效性(绝对性能)还是不太令人满意。GPT-3 ,众所周知的 “大力出奇迹” 式的文章,通过海量数据训练了一个 175 Billion 参数的预训练语言模型,性能直接拉满。甚至有点从量变到质变的意思,GPT-3 通过自回归式语言模型的生成能力,可以生成一些像模像样的文章,有时人类都很难读出这些文章是出自于 AI 模型生成,这也是为什么 GPT-3 能够成为 NLP 领域最火出圈的模型,文本生成能力使得它玩法众多。在任务设定上,GPT-3 没有固守于 GPT-2 的 zero-shot 方式。因为即使对于人类来说,要完成一个新任务,如果一个示例也不给的话,也有点强人所难了。如标题所示,GPT-3 采用了 few-shot 的任务设定,即给出下游任务的一两个例子,然后要求模型对该任务的新问题给出预测。当然,如此大规模的模型,即使是一两个样本,用梯度下降法微调模型权重也很费劲。因此,GPT-3 中所谓的 “few-shot”,与一般的根据支持集(下游任务示例)进行梯度下降更新参数的 few-shot 方法不同,它是利用自然语言的灵活性,将支持集示例放到 prompt 里,让模型自己理解示例,完成下游任务 few-shot 预测。

下图展示了 GPT-3 在不同的 NLP 任务上的性能随模型规模的变化,橙、绿、蓝分别代表 few-/one-/zero shot 方式,淡化的曲线是在不同任务上各自的准确率。实线是平均准确率。可以看到,随着模型规模的增大,性能还是有一定提升的。

方法

GPT-3 的预训练方式和之前还是一样的,模型结构也改动不大。还是在 Transformer 解码器上做标准语言模型的预训练,但是模型规模和数据规模大了几个数量级。这里我们还是主要来看一下 GPT-3 中所谓的 few-/one-/zero- shot 方式分别是什么意思。

下图展示了 GPT-3 中的 few-/one-/zero- shot 方式与常规的微调方式。

  • 微调方式的小样本学习,需要根据给出的下游任务样本和标注,构造损失函数,方向传播梯度,更新模型权重,然后进行预测。GPT-3 中完全没有采取这种方式。
  • Zero-shot,给定任务描述,如 Translate English to French,然后直接给出问题,要求模型给出答案。这种方式与 GPT-2 一致。
  • One-shot,给定任务描述,然后给一个例子,包括问题和答案,如 sea otter => loutre de mer,之后再给出问题,将上述整一段文本作为输入,要求模型给出答案。这种方式期望模型利用预训练阶段海量的文本数据积累和 Tranformer 的自注意力机制,理解问题和示例,然后仿照示例给出预测。
    笔者认为这种方式可行的根本原因是自然语言的灵活性和生成式模型的创造性,使得我们能够直接跟模型进行交互,把要做什么任务、任务示例直接 “打字告诉它”。在计算机视觉领域,好像很难做到类似的事情。
  • Few-shot,与 One-shot 类似,只是给的示例更多。

GPT-3 中的任务设定很惊艳,但是细想之下,也是无奈之举并且也有缺点。一方面,模型规模实在太大,微调来更新权重参数不可行,只好采用 few-shot 的方式。另一方面,模型权重不能更新,每次理解下游任务之后不能保存下来,也就是说每次做同一个下游任务都要给同样的例子。还有,下游任务的示例也不能太多,因为模型可能无法处理过长的输入序列。如果在我们的实际下游任务中确实有不少可供学习的样本,GPT-3 恐怕不是一个好的选择。所以,虽然 GPT-3 能做到的事情似乎听起来更接近 “人工智能”,但是相关的跟进工作并不多。

这应该是作者们充分挖掘模型能力,规避模型缺点,扬长避短设计出的任务设定,这种思路值得学习。

关于大规模预训练的调参、数据准备与清洗、工程实践等,GPT-3 论文中也有讨论,这里就不提了,有兴趣可以参考原文。

再后面关于实验、GPT-3 的不足以及可能的社会影响作者写了很多,本文主要关注算法部分,后面就不一一介绍了,同样请参考原文。

Ref

OpenAI 开源语音识别模型 Whisper & 相关应用

Robust Speech Recognition via Large-Scale Weak Supervision

https://github.com/openai/whisper

Blog:https://openai.com/blog/whisper/

论文精度

OpenAI Whisper 

拥有 GTP-3 语言模型,并为 GitHub Copilot 提供技术支持的人工智能公司 OpenAI 近日开源了 Whisper 自动语音识别系统,Open AI 强调 Whisper 的语音识别能力已达到人类水准。

Whisper 是一个自动语音识别(ASR,Automatic Speech Recognition)系统(transformer模型),OpenAI 通过从网络上收集了 68 万小时的多语言(98 种语言)和多任务(multitask)监督数据对 Whisper 进行了训练。OpenAI 认为使用这样一个庞大而多样的数据集,可以提高对口音、背景噪音和技术术语的识别能力。除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。OpenAI 开放模型和推理代码,希望开发者可以将 Whisper 作为建立有用的应用程序和进一步研究语音处理技术的基础。

Overview of our approach. A sequence-to-sequence Transformer model is trained on many different speech processing tasks,
including multilingual speech recognition, speech translation, spoken language identification, and voice activity detection

Whisper 执行操作的大致过程:

输入的音频被分割成 30 秒的小段、转换为 log-Mel 频谱图,然后传递到编码器。解码器经过训练以预测相应的文字说明,并与特殊的标记进行混合,这些标记指导单一模型执行诸如语言识别、短语级别的时间戳、多语言语音转录和语音翻译等任务。

相比目前市面上的其他现有方法,它们通常使用较小的、更紧密配对的「音频 – 文本」训练数据集,或使用广泛但无监督的音频预训练集。因为 Whisper 是在一个大型和多样化的数据集上训练的,而没有针对任何特定的数据集进行微调,虽然它没有击败专攻 LibriSpeech 性能的模型(著名的语音识别基准测试),然而在许多不同的数据集上测量 Whisper 的 Zero-shot(不需要对新数据集重新训练,就能得到很好的结果)性能时,研究人员发现它比那些模型要稳健得多,犯的错误要少 50%。

目前 Whisper 有 9 种模型(分为纯英文和多语言),其中四种只有英文版本,开发者可以根据需求在速度和准确性之间进行权衡,以下是现有模型的大小,及其内存要求和相对速度:

Whisper的表现因语言而异。下图显示了使用largeV2模型使用Fleurs数据集的语言进行细分。

论文:稳健的语音识别通过大规模的弱监督

弱监督的意思是指我们的语音数据是有标号的,但是标号的可行度不是那么高,质量一般这也是,这也是作者能够采集到近70万h的数据的原因。(在样本数量和质量之间做权衡)

摘要

我们研究了互联网上的大量的训练好的的语音处理系统的功能。当把我们的数据集扩大到680,000小时,且是一个多语言和多任务监督训练时,最终的模型可以与在标准数据集训练好的其他模型相比具有相同的效果,但whisper无需进行任何微调,在面对新数据集时候无需微调。与人类相比,模型具有准确性和鲁棒性。我们正在发布模型和推理代码,以作为在强大语音处理上进一步工作的基础。

引言

目前主流的语音识别方法是先进行大规模的无监督预训练(Wav2Vec 2.0),比如, Wav2Vec 采集了1000000h的无标签训练数据,先用这些数据进行预训练一个编码器(使用对比学习 or 字训练),encoder能够对语音数据做一个很好的编码,然后在面向下游任务时,可以在标准训练集中做微调(只需要几十小时的数据就可),这样比只在标准数据集上训练的结果好很多。

这些预训练好的语音编码器能够学习到语音的一个高质量表示,但是用无监督方法训练的编码器仍然需要训练一个解码器,需要用带标签的数据来微调,微调是一个很复杂的过程,如果不需要微调就好了,这也是本文要做的工作。此外,过去的工作缺乏一个很好的解码器,这是一个巨大的缺陷,而语音识别系统就是应该是“out of box”,也就是拿来即用。

有监督学习很多方法是把多个有监督的数据集合并成一个大的数据集,这样确实保证比在单个数据集上的准确性和泛化性都要好,但是之前的工作最多也就是5000h的数据集,跟之前的100万h的无监督数据集相比差的太多。

顺着这个思路,如果我们把数据集的标号放松一下,就会获得个更多的数据集。在数量和质量之间做权衡是一个不错的选择,比如在yutube上采集视频和字幕作为数据集,为了追求样本的多样性和数量,稍微降低一点质量也是可以的。因此本文就是把弱监督数据集扩展到了68万h,并将模型取名whisper.

方法

数据处理:不需要对标号做任何后处理。从互联网中采集到的数据多种多样,比如声音的环境、录制的设备、说话的人、语言。这样让模型更加稳健,但是对应的我们希望标号质量应该要一致,因此需要做一个过滤系统,把一些质量差的文本删除(一般是一些机器自动生成的文本,如果使用其作为标号,那训练出来的模型效果也不会很好)、去重等等。训练数据30s以及对应的标号作为一个样本。

数据部分是本文最核心的贡献。由于数据够多,模型够强,本文模型直接预测原始文本,而不经过任何标准化(standardization)。从而模型的输出就是最终识别结果,而无需经过反向的文本归一化(inverse text normalization)后处理。所谓文本归一化包括如将所有单词变小写,所有简写展开,所有标点去掉等操作,而反向文本归一化就是上述操作的反过程。在 Whisper 中,这些操作统统不用,因为数据足够多,可以覆盖所有的情况。

在本文收集的语音数据中,包含了不同环境、不同语言、不同说话人等多样的数据,这有助于训练出文件的语音识别系统。然而,文本标签的多样性对模型的学习是一种阻碍。为了解决这个问题,本文使用了几种自动过滤方法,来提高文本标签的质量。

  • 首先,收集自互联网的语音识别数据,很有可能文本标签就是来自现有的语音识别系统的识别结果。之前有研究工作表明,在训练数据中混有机器生成的标签数据会损害模型的性能。为此,本文根据机器识别结果的一些特点,过滤掉了这些数据
  • 另外,本文对数据中语音所属语言和文本所属语言进行检测。如果文本是非英语的其他语言,则要求语音也必须是同种语言;如果文本是英语,则语音可以是任何语言(因为本文方法中有一个其他语言到英语的翻译任务)。
  • 本文用一个语音识别模型在收集的数据上进行测试,发现在一些错误率极高的数据中,存在音频信息不完整、字幕声音不匹配等低质量数据,这些数据同样会被过滤掉。

另外,可能在收集的数据中含有标准语音识别数据集中的内容,为了避免对测试结果产生影响,这部分数据同样需要去掉。

最后,将音频切分为 30s 的片段,配上对应文本,得到训练数据。

2、模型

由于我们的工作重点是研究大规模监督预训练的语音识别能力,因此我们使用现成的架构来避免将我们的发现与模型改进混淆。具体来说就是使用最原始的encoder-decoder Transformer (Vaswani et al., 2017)模型作为网络。将所有音频重新采样至16,000 Hz,80通道的Mel频谱图表示,其步幅为10毫秒。对于特征归一化,我们将输入归一化到-1和1之间,整个训练数据集的平均值约为零。

输入(80*3000)在送入transformer之前先经过卷积层(kernel=3),主要是考虑卷积具有局部相关性,输出80*1500,降低维度。剩下的部分就是一个经典 transformer 架构。

Whisper 使用的模型改动不大,就是 Transformer 第一次提出时的 encoder-decoder 架构。Whisper 的入出侧是声音信号,声音信号的预处理是将音频文件重采样到 16000 Hz,并计算出 80 通道的梅尔频谱,计算时窗口大小为 25ms,步长为 10ms。然后将数值归一化到 -1 到 1 之间,作为输入数据。可以认为是对于每一个时间点,提取了一个 80 维的特征。之前数据处理部分提到每个音频悲切氛围 30s 的片段,这里步长为 10,所以每 30 秒有 3000 个时间点。综上,对于一个 30 秒的音频数据,我们提取到形状为 3000×80 的特征。对应到 NLP 中,可以理解为句子长度为 3000,每个词的词嵌入维度为 80

3000×80 的输入数据首先通过两个 1D 卷积层,得到 1500×80 的特征。后面的处理就是标准的 Transformer encoder-decoder结构了。将这个特征送入到 Transformer encoder 中,提取处的特征作为交叉注意力输入送给 decoder。decoder 每次预测下一个 token,其输入是对应多任务学习的一些预设 token 和 prompt。

3、核心:多任务训练

虽然语音系统主要的任务是给一段话,把里面说的词识别出来,但是实际上大部分语言识别系统来说,还需要进行其他的后处理:检测是否有人说话(VAD)、谁在说话、识别的语音文本添加标点等等。作者希望一个模型可以同时做转录、VAD、时间戳、检测等等任务

all in one的方法会带来两个问题:比如要做VAD,可能我只需要一个小模型就可以完成,但现在必须要用这个超大模型。另外,假如我这个模型在某个任务表现不好,那么我需要多添加该任务数据继续训练,但继续训练,其他任务的效果是否会受影响。

具体任务如下:

一是给定英文语音,转录成英文文本;二是给定其他语言语音,转录并翻译成英文文本;三是给定其他语言语音,转录成该语言文本;四是给定只有背景音乐的音频,识别出无人说话。

所有这些任务都由解码器预测的 token 序列表示,从而使得一个模型能够处理多个任务。这几个任务及模型输出 token 的关系可以从图中下方的图示中的 token 序列看出:在 START OF TRANSCRIPT token 之后,如果当前无人说话,则识别为 NO SPEECH 。如果有人说话,则识别出当前语音所属的语言 LANGUAGE TAG 。然后有两种可能的任务 TRANSCRIBE 还是翻译任务 TRANSLATE ,这两种任务又分为两种形式:带时间戳的和不带时间戳的,分别穿插或不穿插时间戳 token ,预测出文本 token。最后到达 EOT token,整个流程结束。

那么如何训练这些任务呢?使用的是一个prompt格式,不同的任务通过不同的tokens组合来区别的,三种:特殊控制token、文本token、时间戳token

从起点开始,有一定概率走prev这个,表示前面一段我已经转录的内容(包括文本和时间戳),也有一定概率直接走到start token,然后学习语言类别token(包括99种语言+空白),接下来分两个token(转录还是翻译),然后有分两中(是否预测时间戳),有时间戳token则需要预测这句话的开始结束时间+内容,没有时间戳的话,直接预测这三十秒的文字,最后EOT结束。这样相比bert使用不同的输出头,对应不同的损失来说。whisper多任务只需要一个输出头,一个损失函数就可以,通过控制输入的流来控制不同的任务。但这样设计也有缺陷:某个任务表现不好,需要模型完全训练,这样对其他任务来说也会有影响,牵一发动全身。

实验

作者实验的数据集是模型训练集没有使用过的,认为是zero-shot。验证标准:WER

结论

Whisper 说明在语音识别领域,对于把大规模的弱监督训练的认识还是不够,我们的模型结果说明不需要做自监督 或者自训练,只要在大规模数据集上训练好模型,推理时无需任何微调,只需要zero-shot就可以。

基于Whisper开发应用工具:

AutoCut: 通过字幕来剪切视频

github: https://github.com/mli/autocut

AutoCut 使用 Whisper 来对你的视频自动生成字幕。然后在字幕文件中你选择需要保留的句子,AutoCut 将对你视频中对应的片段裁切并保存。你无需使用视频编辑软件,只需要编辑文本文件即可完成视频剪切。

假如你录制的视频放在 2022-11-04/ 这个文件夹里。那么运行

autocut -d 2022-11-04

提示:如果你使用 OBS 录屏,可以在 设置->高级->录像->文件名格式 中将空格改成 /,即 %CCYY-%MM-%DD/%hh-%mm-%ss。那么视频文件将放在日期命名的文件夹里。

AutoCut 将持续对这个文件夹里视频进行字幕抽取和剪切。例如,你刚完成一个视频录制,保存在 11-28-18.mp4。AutoCut 将生成 11-28-18.md。你在里面选择需要保留的句子后,AutoCut 将剪切出 11-28-18_cut.mp4,并生成 11-28-18_cut.md 来预览结果。

你可以使用任何的 Markdown 编辑器。例如我常用 VS Code 和 Typora。下图是通过 Typora 来对 11-28-18.md 编辑。

全部完成后在 autocut.md 里选择需要拼接的视频后,AutoCut 将输出 autocut_merged.mp4 和对应的字幕文件。

转录某个视频生成 .srt 和 .md 结果。

autocut -t 22-52-00.mp4
  1. 如果对转录质量不满意,可以使用更大的模型,例如autocut -t 22-52-00.mp4 –whisper-model large默认是 small。更好的模型是 medium 和 large,但推荐使用 GPU 获得更好的速度。也可以使用更快的 tiny 和 base,但转录质量会下降。

剪切某个视频

autocut -c 22-52-00.mp4 22-52-00.srt 22-52-00.md
  1. 默认视频比特率是 --bitrate 10m,你可以根据需要调大调小。
  2. 如果不习惯 Markdown 格式文件,你也可以直接在 srt 文件里删除不要的句子,在剪切时不传入 md 文件名即可。就是 autocut -c 22-52-00.mp4 22-52-00.srt
  3. 如果仅有 srt 文件,编辑不方便可以使用如下命令生成 md 文件,然后编辑 md 文件即可,但此时会完全对照 srt 生成,不会出现 no speech 等提示文本。autocut -m test.srt test.mp4 autocut -m test.mp4 test.srt # 支持视频和字幕乱序传入 autocut -m test.srt # 也可以只传入字幕文件

一些小提示

  1. 讲得流利的视频的转录质量会高一些,这因为是 Whisper 训练数据分布的缘故。对一个视频,你可以先粗选一下句子,然后在剪出来的视频上再剪一次。
  2. 最终视频生成的字幕通常还需要做一些小编辑。你可以直接编辑md文件(比srt文件更紧凑,且嵌入了视频)。然后使用 autocut -s 22-52-00.md 22-52-00.srt 来生成更新的字幕 22-52-00_edited.srt。注意这里会无视句子是不是被选中,而是全部转换成 srt
  3. 最终视频生成的字幕通常还需要做一些小编辑。但 srt 里面空行太多。你可以使用 autocut -s 22-52-00.srt 来生成一个紧凑些的版本 22-52-00_compact.srt 方便编辑(这个格式不合法,但编辑器,例如 VS Code,还是会进行语法高亮)。编辑完成后,autocut -s 22-52-00_compact.srt 转回正常格式。
  4. 用 Typora 和 VS Code 编辑 Markdown 都很方便。他们都有对应的快捷键 mark 一行或者多行。但 VS Code 视频预览似乎有点问题。
  5. 视频是通过 ffmpeg 导出。在 Apple M1 芯片上它用不了 GPU,导致导出速度不如专业视频软件。

Novelty in Science–A guide for reviewers

作者:Michael J. Black

迈克尔·布莱克(Michael J. Black)是出生在美国的计算机科学家,在德国图宾根工作。他是马克斯·普朗克智能系统研究所的创始理事,负责领导感知系统部门的计算机视觉,机器学习和计算机图形研究。他还是图宾根大学的名誉教授。

研究价值 = 新意度 x 有效性 x 问题大小 ,这篇博客的标题叫做科学中的新意度,来看看大佬是如何解释 论文新意度的(Novelty)。

审稿人对怎样才能使一篇论文被 CVPR 这样的顶级会议所接受有着强烈的想法。他们知道,要进入这样的会议是很难的,而且得到一篇论文是很有声望的。
因此,被录用的论文必须是非常特别的。这是事实,但什么使一篇论文特别呢?许多审稿人关注的一个重点是新颖性。但什么是科学中的新颖性?

我看到评审员经常把复杂性、难度和技术性误认为是新颖性。在科学评审中,新颖性似乎意味着这些东西。我们最好把 “新颖性 “这个词从审查说明中去掉,用来代替。

美感消除了 “技术性 “和 “复杂性 “的概念,并更多地涉及到科学新颖性的核心。 一幅画可以是美丽的,即使它很简单,技术复杂度很低。一张纸也可以。毕加索的一个小插曲可以和伦勃朗的复杂画作一样美丽。考虑到美,让我们看看审查员对新颖性的一些常见误解。

Reviewers have strong ideas about what makes a paper acceptable in top conferences like CVPR. They know that getting into such conferences is hard and that getting a paper in is prestigious. So, the papers that get in must be really special. This is true, but what makes a paper special? A key focus of many reviewers is novelty. But what is novelty in science?

I see reviewers regularly mistake complexity, difficulty, and technicality for novelty. In science reviewing, novelty seems to imply these things. We might be better served by removing the word “novelty” from the review instructions and replacing it with beauty

Beauty removes the notions of “technical” and “complex” and gets more to the heart of scientific novelty.  A painting can be beautiful even if it is simple and the technical complexity is low. So can a paper. A little squiggle of paint by Picasso can be as beautiful as an intricate painting by Rembrandt.  

Keeping beauty in mind, let’s look at some common reviewer misunderstandings about novelty.

Novelty as complexity

The simplicity of an idea is often confused with a lack of novelty when exactly the opposite is often true.  A common review critique is

The idea is very simple. It just changes one term in the loss and everything else is the same as prior work.

If nobody thought to change that one term, then it is ipso facto novel. The inventive insight is to realize that a small change could have a big effect and to formulate the new loss.  

Such reviews lead my students to say that we should make an idea appear more complex so that reviewers will find it of higher value.  I value simplicity over unnecessary complexity; the simpler the better. Taking an existing network and replacing one thing is better science than concocting a whole new network just to make it look more complex.

Novelty as difficulty

It’s hard to get a paper into a top conference, therefore reviewers often feel that the ideas and technical details must be difficult.  The authors have to shed blood, sweat, and tears to deserve a paper. Inexperienced reviewers, in particular, like to see that the authors have really worked hard. 

Formulating a simple idea means stripping away the unnecessary to reveal the core of something. This is one of the most useful things that a scientist can do. 

A simple idea can be important. But it can also be trivial. This is where reviewers struggle. A trivial idea is an unimportant idea. If a paper has a simple idea that works better than the state of the art, then it is most likely not trivial.  The authors are onto something and the field will be interested.

Novelty as surprise

Novelty and surprise are closely related. A novel idea is a surprising one by definition — it’s one that nobody in the field thought of.  But there is a flip side to this as surprise is a fleeting emotion. If you hear a good idea, there is a moment of surprise and then, the better it is, the more obvious it may seem. A common review:

The idea is obvious because the authors just combined two well known ideas.

Obvious is the opposite of novelty. So, if an idea is obvious after you’ve heard it, reviewers quickly assume it isn’t novel.  The novelty, however, must be evaluated before the idea existed. The inventive novelty was to have the idea in the first place.  If it is easy to explain and obvious in hindsight, this in no way diminishes the creativity (and novelty) of the idea.

Novelty as technical novelty

The most common misconception of reviewers is that novelty pertains to technical details. Novelty (and value) come in many forms in papers. A new dataset can be novel if it does something no other dataset has done, even if all the methods used to generate the dataset are well known. A new use of an old method can be novel if nobody ever thought to use it this way. Replacing a complex algorithm with a simple one provides insight. 

Novelty reveals itself in as many ways as beauty. Before critiquing a paper for a lack to technical novelty ask yourself if the true novelty lies elsewhere.

Novelty as usefulness or value

Not all novel ideas are useful. Just the property of being new does not connote value.  We want new ideas that lead us somewhere.  Here, reviewers need to be very careful.  It’s very hard to know where a new idea will take the field because any predictions that we make are based on the field as it is today.

A common review I get is

The authors describe a new method but I don’t know why anyone needs this.

Lack of utility is indeed an issue but it is very hard to assess with a new idea. Reviewers should be careful here and aware that we all have limited imagination. 

A personal note

My early career was built on seeing and formalizing connections between two established fields: robust statistics and Markov random fields. The novelty arose from the fact that nobody had put these ideas together before. It turned out to be a fertile space with many surprising connections that led to new theory. Fortunately, these connections also turned out to be valuable, resulting in practical algorithms that were state of the art. 

With hindsight, the connection between robust statistics and outliers in computer vision seems obvious. Today, the use of robust estimators in vision is the norm and seems no more novel than breathing air. But to see the connections for the first time, before others saw them, was like breathing for the first time. 

There is little in life more exciting than that spark of realization in science when you glimpse a new way of seeing.  You feel as if you were the first to stand on a mountain peak. You are seeing the world for a moment the way nobody before you has ever seen it. This is novelty and it happens in an instant but is enabled by all of one’s experience. 

The resulting paper embodies the translation of the idea into code, experiments, and text. In this translation, the beauty of the spark may be only dimly glimpsed.  My request of reviewers is to try to imagine the darkness before the spark. 

总结:

1、新意度 !=复杂度、困难度、惊讶度、技术新意度、有效性

2、新意度 ~=优美 (要懂得欣赏)

多模态预训练 | ViLT

paper: https://arxiv.org/abs/2102.03334 ICML 2021

code: https://github.com/dandelin/ViLT

图1 Visual comparison of conventional VLP architectures
and our proposed ViLT.

视觉文本多模态任务,极其简单的多模态结构。模态的特征抽取做到了极小化,主要的计算量放在后边的模态融合上,提高了推理速度。多模态领域里程碑式工作。将区域特征,region 从多模态框架中移除。

Vision and Language Pre-training(VLP)已经已经在视觉语言的多模态下游任务中发展的很好。然而,当前VLP的工作主要集中在图像特征抽取上,一般来讲,图像特征抽取的越好,下游任务中的表现就越好。但是,现在主要有两个问题,一是效率太低,速度太慢,抽取图像特征花费大量时间,比多模态融合都多。我们应该花费更多时间在融合上。第二个是,你用一个预训练好的模型去抽取特征,表达能力受限。目标检测数据集不够大,规模不够大。如果模型不是端到端学习,只是从预训练模型抽取特征,大概率来说不是最优解。

Motivation

目前参数量最小的多模态Transformer方法。ViLT使用预训练的ViT来初始化交互的transformer,这样就可以直接利用交互层来处理视觉特征,不需要额外增加一个视觉encoder(如Faster-RCNN)。

Contribution

  1. 第一个基于patch projection的多模态预训练模型,其是首个使用patch projection来做visual embedding的方法。
  2. 证明了可以将BERT的方法和Vison Transformer结合起来用于多模态transformer
  3. 体现了全词掩码在预训练时以及图像增强在微调时的重要性。

Method

现有的视觉语言模型的三种结构类别:

VE = Vision Embedding

TE = Text Embedding

MI = Modality Interaction

上图是4种不同类型的VLP模型示意图。其中每个矩形的高表示相对计算量大小,VE、TE和MI分别是visual embedding、text embedding和modality interaction的简写。

作者提出这4种类型的主要依据有两点:

1.在参数或者计算上,两种模态是否保持平衡。

2.在网络深层中,两种模态是否相互作用。

VSE、VSE++和SCAN属于(a)类型。对图像和文本独立使用encoder,图像的更重,文本的更轻,使用简单的点积或者浅层attention层来表示两种模态特征的相似性。

CLIP属于(b)类型。每个模态单独使用重的transformer encoder,使用池化后的图像特征点积计算特征相似性。

ViLBERT、UNTER和Pixel-BERT属于(c)类型。这些方法使用深层transformer进行交互作用,但是由于VE仍然使用重的卷积网络进行特征抽取,导致计算量依然很大。

作者提出的ViLT属于(d)类型。ViLT是首个将VE设计的如TE一样轻量的方法,该方法的主要计算量都集中在模态交互上。

Modality Interaction Schema

模态交互部分可以分成两种方式:一种是single-stream(如BERT和UNITER),另一种是dual-stream(如ViLBERT和LXMERT)。其中single-stream是对图像和文本concate然后进行交互操作,而dual-stream是不对图像和文本concate然后进行交互操作。ViLT延用single-stream的交互方式,因为dual-stream会引入额外的计算量。

现有的VLP模型的text embedding基本上都使用类BERT结构(图1),但是visual embedding存在着差异。在大多数情况下,visual embedding是现有VLP模型的瓶颈。visual embedding的方法总共有三大类,其中region feature方法通常采用Faster R-CNN二阶段检测器提取region的特征,grid feature方法直接使用CNN提取grid的特征,patch projection方法将输入图片切片投影提取特征。ViLT是首个使用patch projection来做visual embedding的方法。

网络结构ViLT

作者提出的ViLT可以认为是目前最简单的多模态Transformer方法。ViLT使用预训练的ViT来初始化交互的transformer,这样就可以直接利用交互层来处理视觉特征,不需要额外增加一个视觉encoder。

文本特征输入部分,将文本看成一个词序列,通过word embedding matrix转化成word embedding,然后和position embedding进行相加,最后和modal-type embedding进行concate。

图像特征输入部分,将图像切块看成一个图像块序列,通过linear projection转化成visual embedding,然后和postion embedding进行相加,最后和modal-type embedding进行concate。

其中word embedding和visual embedding通过可学习的modal-type embedding标志位来区分,其中0标志位表示word embedding部分,1标志位表示visual embedding部分。

wrod embedding和visual embedding分别都嵌入了一个额外的可学习[class] embedding,方便和下游任务对接。

Pretraining Objectives

ViLT预训练的优化目标有两个:一个是image text matching(ITM),另一个是masked language modeling(MLM)

ImageText Matching:随机以0.5的概率将文本对应的图片替换成不同的图片,然后对文本标志位对应输出使用一个线性的ITM head将输出feature映射成一个二值logits,用来判断图像文本是否匹配。另外ViLT还设计了一个word patch alignment (WPA)来计算teextual subset和visual subset的对齐分数。

Masked Language Modeling:MLM的目标是通过文本的上下文信息去预测masked的文本tokens。随机以0.15的概率mask掉tokens,然后文本输出接两层MLP与车mask掉的tokens。

Whole Word Masking:另外ViLT还使用了whole word masking技巧。whole word masking是将连续的子词tokens进行mask的技巧,避免了只通过单词上下文进行预测。比如将“giraffe”词tokenized成3个部分[“gi”, “##raf”, “##fe”],可以mask成[“gi”, “[MASK]”, “##fe”],模型会通过mask的上下文信息[“gi”,“##fe”]来预测mask的“##raf”,就会导致不利用图像信息。

Experiment

本文提出的方法在效率上大大提升且表现出相似的性能,相比于region feature的方法速度快了60倍,相比于grid feature的方法快了4倍,而且下游任务表现出相似甚至更好的性能。

如图所示,ViLT相比于region feature的方法速度快了60倍,相比于grid feature的方法快了4倍,而且下游任务表现出相似甚至更好的性能。

缺点:

1、性能不够高,在一些数据集上得表现比不过C类方法,有可能因为对于现有的任务来说,因为数据集的bias,或者这个任务需要更多的视觉信息,因此需要更多得视觉部分,最后的效果才能好。

2、虽然推理时间快,但是训练速度很慢。只是结构上简化了多模态学习,但一般人还是玩不起。

CCF(中国计算机学会)推荐国际学术会议和期刊目录(2022年拟定)

CCF(中国计算机学会)推荐国际学术会议和期刊目录(2022年拟定)终于来了!较前一版本(2019)拟新增期刊4个,会议6个;升级期刊18个,会议19个;移除期刊1个。值得注意的是:当前的目录正在公示期,并非2022最终版本,所以后面会再次发布最终版本

https://www.ccf.org.cn/Academic_Evaluation/By_category/

本文将重点关注 AI 领域,特别是计算机视觉方向的会议/期刊变动情况

【重点总结—拟定】

  • MICCAI 首次被收录,空降B类会议
  • PRCV 首次被收录,空降C类会议
  • NAACL 从C类升级到B类会议
  • ICLR 继续陪跑,没有被收录推荐目录
  • AI和图形学/多媒体两大领域的A类会议/期刊均没有变化(无新增/无降级/无移除)
  • WINE(Conference on Web and Internet Economics)空降A类期刊(属于交叉/综合/新兴领域)
  • SCIS(Science China Information Sciences)从B类期刊升级到A类期刊(属于交叉/综合/新兴领域)

仅以当前目录(拟定)来看,Amusi猜测:MICCAI、PRCV 的投稿量一定会爆炸增长。

Amusi侃侃:2019-2022这几年里,关于CCF 人工智能会议中争议最多的应该就是:建议ICLR新增到A类,而这次ICLR居然还是连目录(拟定)都没有进,A类/B类/C类中都没有;如果最终版确定没有,那不知道CCF目录下次更新是何时了…

下面完整罗列了推荐目录(拟定)中的【人工智能】和【计算机图形学与多媒体】两大领域的会议和期刊:

人工智能会议

A类不变,仍是7个会议:AAAI、NeurIPS、ACL、CVPR、ICCV、ICML和IJCAI,如下图所示:

B类有13个会议,新增一个NAACL(NAACL从C类升级到B类),如下图所示:

C类有20个会议,减少一个NAACL(NAACL从C类升级到B类),如下图所示:

人工智能期刊

A类不变,仍是4个期刊:AI、TPAMI、IJCV、JMLR,如下图所示:

B类有22个期刊,新增(空降)TACL 期刊,如下图所示:

C类有37个期刊,新增(空降)TIIS 期刊,如下图所示:

计算机图形学与多媒体会议

A类不变,仍是4个会议:ACM MM、SIGGRAPH、VR和IEEE VIS,如下图所示:

B类有14个会议,新增(空降)MICCAI,如下图所示:

C类有15个会议,新增(空降)PRCV、ICVRV和CVM,如下图所示:

计算机图形学与多媒体期刊

A类不变,仍是3个期刊:TOG、TIP和TCVG,如下图所示:

B类不变,仍是10个期刊,如下图所示:

C类有13个期刊,新增(空降)CVMJ,如下图所示:

基于扩散模型的语义分割

论文标题:LABEL-EFFICIENT SEMANTIC SEGMENTATION WITH DIFFUSION MODELS

论文地址:https://arxiv.org/pdf/2112.03126.pdf

论文代码:https://github.com/yandex-research/ddpm-segmentation

摘要

  1. 背景介绍: 去噪扩散概率模型DDPM最近受到了很多研究关注,因为它们优于其他方法,如GAN,并且目前提供了最先进的生成性能。差分融合模型的优异性能使其在修复、超分辨率和语义编辑等应用中成为一个很有吸引力的工具。
  2. 研究方法: 作者为了证明扩散模型也可以作为语义分割的工具,特别是在标记数据稀缺的情况下。对于几个预先训练的扩散模型,作者研究了网络中执行逆扩散过程马尔可夫步骤的中间激活。结果表明这些激活有效地从输入图像中捕获语义信息,并且似乎是分割问题的出色像素级表示。基于这些观察结果,作者描述了一种简单的分割方法,即使只提供了少量的训练图像也可以使用。
  3. 实验结果: 提出的算法在多个数据集上显着优于现有的替代方法。

图像生成模型 Stable Diffusion|CVPR ’22 Oral

项目地址:https://ommer-lab.com/research/latent-diffusion-models/

试玩: https://huggingface.co/spaces/stabilityai/stable-diffusion

High-Resolution Image Synthesis with Latent Diffusion Models

Stable Diffusion 是一个“文本到图像”的人工智能模型。近日,Stable AI 公司向公众开放了它的预训练模型权重。当输入一个文字描述时,Stable Diffusion 可以生成 512×512 像素的图像,这些图像如相片般真实,反映了文字描述的场景。

这个项目先是经历了早期的代码发布,而后又向研究界有限制地发布了模型权重,现在模型权重已经向公众开放。对于最新版本,任何人都可以在为普通消费者设计的硬件上下载和使用 Stable Diffusion。该模型不仅支持文本到图像的生成,而且还支持图像到图像的风格转换和放大。与之一同发布的还有 DreamStudio 测试版,这是一个用于该模型的 API 和 Web 用户界面。

Stable AI 公司表示:

“Stable Diffusion 是一个文本到图像的模型,它将使数十亿人在几秒钟内创造出令人惊叹的艺术。它在速度和质量上的突破意味着它可以在消费者级的 GPU 上运行。这将允许研究人员和公众在一系列条件下运行它,并使图像生成普及化。我们期待着有围绕这个模型和其他模型的开放生态系统出现,以真正探索潜伏空间的边界。”

Latent Diffusion 模型(LDM)是 Stable Diffusion 模型建立的一种图像生成方法。LDM 通过在潜伏表示空间(latent representation space)中迭代“去噪”输入来创建图像,然后将表示解码为完整的图像,这与其他著名的图像合成技术,如生成对抗网络(GAN)和 DALL-E 采用的自动回归方法不同。最近的 IEEE/CVF 计算机视觉和模式识别会议(CVPR)上有一篇关于 LDM 的论文,它是由慕尼黑路德维希-马克西米利安大学的机器视觉和学习研究小组创建的。今年早些时候,InfoQ 也报道的另一个基于扩散的图片生成 AI 是谷歌的 Imagen 模型。

Stable Diffusion 可以支持众多的操作。与 DALL-E 类似,它可以生成一个高质量的图像,并使其完全符合所需图像的文字描述。我们也可以使用一个直观的草图和所需图像的文字描述,从而创建一个看起来很真实的图像。类似的“图像到图像”的能力可以在 Meta AI 的 Make-A-Scene 模型中找到,该模型刚发布不久。

一些人公开分享了 Stable Diffusion 创建的照片的例子,Stable AI 的首席开发人员 Katherine Crowson 也在 Twitter 上分享了许多照片。毫无疑问,基于人工智能的图片合成技术将对艺术家和艺术界产生影响,这令一些观察家感到担忧。值得注意的是,在 Stable Diffusion 发布的同一周,一幅由人工智能生成的作品在科罗拉多州博览会的艺术竞赛中获得了最高荣誉。

Stable Diffusion 的源代码可以在 GitHub 上查阅。

试玩地址: https://huggingface.co/spaces/stabilityai/stable-diffusion

Contribution

  • Diffusion model是一种likelihood-based的模型,相比GAN可以取得更好的生成效果。然而该模型是一种自回归模型,需要反复迭代计算,因而训练和推理都十分昂贵。本文提出一种diffusion的过程改为在latent space上做的方法,从而大大减少计算复杂度,同时也能达到十分不错的生成效果。( “democratizing” research on DMs),在unconditional image synthesis, inpainting, super-resolution都能表现不错~
  • 相比于其它进行压缩的方法,本文的方法可以生成更细致的图像,并且在高分辨率(风景图之类的,最高达10242px都无压力)的生成也表现得很好。
  • 提出了cross-attention的方法来实现多模态训练,使得class-condition, text-to-image, layout-to-image也可以实现。
方法We condition LDMs either via concatenation or by a
more general cross-attention mechanism.

整体框架如图,先训练好一个AutoEncoder(包括一个encoder和decoder)。因此,我们可以利用encoder压缩后的数据做diffusion操作,再用decoder恢复即可。

  • Autoencoder训练: L1/L2loss来作为重建损失,用GAN来做对抗攻击?,用KL loss来把latent space拉到正态分布,防止搜索空间过大
  • 用了encoder降维后,就可以使用latent space diffusion了~ 具体扩散过程其实没有变,只不过现在扩散和重建的目标为latent space的向量了。Diffusion model具体实现为 time-conditional UNet。

为了引入conditioning的信息,提出了domain specific encoder τθ(y)不同模态的(比如text, class, image…)转成中间表达(intermediate representation),再利用cross-attention来嵌入到UNet中去。

Experiments

展示一些可用的任务:

  • layout-to-image 输入bounding box输出图像。
  • text-to-image输入文本,输出图像。
  • 输入bounding box输出图像。
  • 输入文本,输出图像
    • 输入landscape输出高分辨率的风景图。
    • 超分辨率
    • inpainting (图像修复/编辑)

    效率对比。大概时间上缩短为1/3~ 并且,FID的值更小。

    ICCV2021|极大似然法做点云降噪

    论文标题:Score-Based Point Cloud Denoising

    论文链接:https://arxiv.org/abs/2107.10981

    作者单位:北京大学

    本文提出了一种新的点云去噪范式,利用噪声点云的分布模型并利用分布的分数,表现SOTA!性能优于DMR、GPDNet等网络。

    从扫描设备获取的点云通常会受到噪声的干扰,这会影响表面重建和分析等下游任务。噪声点云的分布可以看作是一组无噪声样本 p(x) 与某个噪声模型 n 卷积的分布,导致 (p∗n)(x) 的模式是底层清洁表面。为了对嘈杂的点云去噪,我们建议通过梯度上升从 p∗n 增加每个点的对数似然——迭代更新每个点的位置。由于 p∗n 在测试时是未知的,我们只需要分数(即对数概率函数的梯度)来执行梯度上升,我们提出了一种神经网络架构来估计 p∗n 的分数只给定嘈杂的点云作为输入。我们推导出用于训练网络的目标函数,并利用估计的分数开发去噪算法。实验表明,所提出的模型在各种噪声模型下优于最先进的方法,并显示出应用于其他任务(如点云上采样)的潜力。