李宏毅生成式AI
无论GPT展现出何种强大的能力,其本质的技术都是,
一个用于语言接龙的function,这个function非常大,有几千亿个参数,所以成为语言模型,或大模型
GPT是什么意思,
对于传统的机器学习都是监督学习,需要大量人类准备的资料,有限的资料就导致很难产生很好的模型
但对于语言模型,天然优势是他可以自督导学习,如下面的例子
自督导学习,一直到GPT3,因为他本质是文字接龙,所以如果直接用于和人对话,或其他目的,效果不会太好
但作为pre-train,基石模型
需要人来继续教,finetune,但是在基石模型之上,进一步学习所需要的资料不会太多
这样就产生了chatGPT,chatGPT是人基于chat场景对于GPT3进行finetune的结果,所以称为GPT3.5
最后一步是,增强学习,通过人的反馈
这张图显示出Pre train带来的帮助,在pre train的基础上,哪怕对于英文QA进行fine tune,居然在中文QA的test中也能得到不错的结果
对于机器学习,传统认为分成,回归和分类
其实还有一种是,结构化生成
生成式AI,分两种类型,逐个生成或一次生成
逐个生成,自回归AR,对于文字很容易理解,右边给出为何逐个生成的质量会更好,因为前面生成的内容可以作为后续生成的context
但对于图像,逐个生成像素效率过低,所以还是需要一次性生成
是否可以结合两者的优点,
有两者方法,
用逐个生成先生成sample向量,再作为一次生成的输入
多次使用一次生成,逐渐优化,即diffusion model
除了GPT,还有一种Newbing这样的模型
比如,WebGPT,Toolformer,他们是要检索网络或利用网络服务的
会将任务拆解成多种固定的步骤,通过类似接龙的方式来一步步执行
至于如何形成任务,比较生成搜索关键字,选择收藏哪一个结果等,是要通过人工的例子去训练的
现在正式来结束大模型
这里有两种,
专才,Bert,文字填空,无法直接生成完整的句子,对于特定任务需要改造
通才,GPT,文字接龙,可以直接用于各种任务
对于专才的改造,主要是通过外挂和Finetune
Adapter是特殊形态的Finetune,有点类似迁移学习,语言模型参数本身不变,实在tune后加上的adapter的参数
这样的好处自然就是不用保存很多大模型,只需要存很小的adapter
专才的tune还是类似传统的监督学习
通才的使用方法
GPT的思路已经和传统的监督学习不一样了,有点像魔法
他本身是语言模型,所有的东西完全黑盒,你无法确切知道他具有怎样的能力
所以将他用于一个场景,不是按传统的思路进行finetune,而是要明确让他知道你想干什么
模型能力本身是很强大的,但是你如何发掘出这样的能力是个问题
所以更重要的是,如何prompt,模型咏唱师,催眠师,这个太有趣了,超出传统认知。
其中两种方式,in-context learning和Instruction learning
in-context learning,说白了,就是给例子,让大模型学着做
比如情感分析, 注意这里不是训练集,只是告诉模型你要干什么
所以有研究表面,context例子中的正面和负面,哪怕给的不对不太会影响结果,但后续的研究表示,当模型足够大的时候,可以学习到context里面的错误的例子。
分为几种类型,指给例子的多少
可以看出这里是不会做gradient descent,即不会更新模型参数,所以不算训练
Instruction learning,用语言告诉模型,让他干啥。这个听着比给例子要难些
这个通过给出指令,和完成结果进行训练,这里仍然是告诉模型你想干什么,目的和in-context没有区别
只是交互方式不同
这样的理解有些问题,其实是可以用Instruction learning对模型进行fine tuning的,比如下面的图,
CoT,这个很神奇的是数学题,你直接问是错的,但你在in-context中给出步骤,再让系统做,系统也会给出步骤,这样正确率就会提升。
更神奇的是,你不用给例子,直接告诉机器,分步骤,也能大幅提升准确率。
右图给出,如何prompt可以使得准确率更高,最高的那个也是用模型生成的。
看着不可思议,几点,
- 分步骤,分而治之会将问题简化,提升准确率,这个和人一样
- 给例子和下指令的目标类似的,主要是让模型知道你想干什么,所以都会大幅提升准确率,
- 模型并没有真正的推理和计算,只是根据模型中学习到的大量结题过程,生成结题步骤,中等模型也许只能生成步骤,无法计算对,所以要到很大的模型时,结果才能对
对于复杂的问题,可以显示的训练模型拆分成多个子问题来求解,提升准确率
当大家都期望成为prompt工程师的时候,告诉你其实模型也可以产生prompt
比较有意思的最后一种,告诉模型结果,让模型抽象问题prompt,然后可以拿模型生成的prompt反过来进行验证,看看准确率,最终找出合适的prompt
大模型在几十billion的时候会发生顿悟,之前看着屁用没有,这也是大模型之前一直无法实用的原因
对于前面描述的CoT,Instruction tuning这些也一样,只有到这个规模才会有效果,中小规模的模型完全无效
一样,只有大模型,才能知道自己给出的回答的置信度是否够,中小模型都差不多,无法判定给出回答的置信度
再来看看pretraining资料集大小的影响
可以看出,1B token的量级可以学会语言知识,但是如果要具备common sense,需要30B token的量级
这个问题是,相同计算资源下,是让模型变大还是资料集变大
研究看出,这里是有balance的,以Gohper为例,他的模型是过大的,如果降低模型规模,增加资料集,会有更好的效果
右图给出,模型参数和资料集token数的比例关系
这里的数据给出,除了pretrain以外,instruction-tuning可以在很小的代价下(1800tasks,0.2%的代价),大幅提升模型的效果,这里的模型规模下限是8B,可能再小就不行了
现在大模型finetune的套路,pretrain -> 监督学习 -> 强化学习
参考instructGPT的数据,可以看出,人后期teaching可以取得很大的效果,
中小规模的模型在足够的teaching后甚至可以超过大模型的效果
继续看图片如何生成,比如midjourney,dalle这样的系统
肯定可以像文字这样,用AR的方式,但是效率太低了,前面也说过
像VAE,GAN这样的生成方式,前面都说过,这里重点介绍diffusion
diffusion原理是不断去噪声,像米开朗基罗说雕塑一样,只是把多余的部分去掉
所有的denoise部分是同一个模型,不断传入不同的参数,进行去噪,可以看到参数有两个,一个是输入图片,一个是step数,这个参数表示当前图片的去噪程度
为什么会有这个思路,因为生成算法的思路,一般是训练decoder,可以从一个高维分布中的一个向量decode成一个图像
所以diffusion希望模拟这样的过程
可以看到denoise的内部构造,也不是end to end的,他包含一个noise predicter,来生成噪声,然后用原图减去噪声得到目标图
为何这么麻烦?给出的解释是,生成噪声比直接生成目标图会更加简单一些
如何训练这个Denoise,
训练方法很直觉,给原图逐步加随机sample的noise,然后拿每个中间结果去训练这个predicter
这里记住,我们是要用文字生成图片,所以还是要加入文字进行训练的
训练Midjourney,Dalle这样的模型,需要的图片量在5B规模
Midjourney,Dalle的架构并不是直接训练一个denoise,而是会分成3个部分来训练
第一步,是将文本encoder成一个向量embedding,为什么要做这步,因为embedding所包含的信息量远大于文本本身,而文字到图片,本身就是个内容扩充的过程
第二步,diffusion模型,根据输入的embedding,将白噪声图,denoise成一个中间产物,可能是缩略图
第三步,将中间产物decode成目标图
一般而言,分步骤的模型效果要好于endtoend,并且也比较容易训练
比如这里的Decoder是用自编码去训练,是不需要标注数据的,可以使用极大的资料集来训练
那这里的diffusion模型的训练,会和之前有些不同,
训练的目标是denoise成中间产物缩略图
研究表面,第一步文本encoding至关重要,采用大模型会有更大的收益;而diffusion网络的大小对于结果影响不大
这个也好理解,从文本到embedding是信息量扩充的主要途径
这里衡量的两个指标,
FID, 用一个训练好的CNN的模型,用真实的图片和生成的图片通过该模型生成的向量之间的差异
CLIP,训练一个Text encoder和image encoder,让相关的文字和图片,encoding后所产生的向量也要相近;在实际生成中,只需要比较生成的图片的向量和文字向量的距离
这里再仔细分析一些diffusion算法
在某种意义上,VAE和DIffusion的过程很像
如果你把逐步加noise的过程看成是encoder,因为VAE encoder本身也是生成一个向量;把逐步denoise部分看出decoder
再看下diffusion算法的训练部分,
a参数,随着t变大会越来越小,所以t步骤大了以后,噪音的权重会越来越大,x0的权重会变小
实际的算法和想象中最大的不同是,noise不是一步步叠加的
而是每一步都是在x0的基础上去加noise,直接生成xt
gradient descent优化的目标,就是让生成的noise和目标noise尽可能接近
这个过程就是个denoise的过程,
其中比较奇怪的是,最后又加了层黄色noise,这是为何
这就要说到,为何生成算法往往都要加noise,sample,能不能每次都选概率最大了
研究发现人写的文章在模型下,只是并不是都是选择搞概率的词,
如果模型每次都选择高概率的词,会出现大量的重复,所以选择最大概率对于生成算法不是好的选择
最后的问题是,如何低成本复制ChatGPT
最简单的是用模型教模型,甚至连任务和问题都可以让,GPT去生成
比如Stanford Alpaca,就是用seed tasks,生成了52k的tasks,然后训练7B的LLaMA
而Vicuna,是通过sharegpt上面share出的人的真实交互来训练,13B的LLaMa
这里比较有意思的是,如何评价模型的效果
居然是用GPT4来给模型的回答打分,鬼才
LLaMA的license无法用于商业目的
Dolly是databricks出的模型,他的模型和数据都是可以用于商业目的的
LLMZoo有很多GPT的衍生模型,
模型的对比,这里是分别用chatGPT,和GPT4作为基准
可以看出Vicuna的效果非常的出色,是不是说明sharegpt上人类真实的case具有更高的学习价值
finetuning完,后续一步是RL,RL一般要基于用户的真实使用
这里的思路是可以用GPT4来模拟用户,是否有必要这样做
之前的思路都是用大模型,更强的模型来训练小模型
那么大模型自己怎么演进,这里的思路是Self-consistency,同一个问题问多次,选多数派作为正确答案
反过来,在用正确答案去训练大模型本身。