深度学习自然语言处理 分享
知乎:黄文灏
职位:北京智源AI研究院技术负责人
看到了 @Naiyan Wang[1] 和 @刘聪NLP[2] 的两篇文章,都提到了对行业大模型的一些看法,有很多相同的想法。正好身边有很多人在讨论行业大模型,想要以行业大模型为切入点开始创业。我自己在现阶段是比较坚定地支持通用大模型的,觉得行业大模型的前景堪忧,也比较坚决地拒绝了几个行业大模型的创业邀请,写个文章记录了自己对行业大模型的思考。注意,由于大模型方向发展太快,认知在不断更新迭代,这篇文章只能作为在当下的思考逻辑,随时可能有新的变化。先附上两位大佬的文章,做个背景。
进NLP群—>加入NLP交流群
什么是行业大模型?
行业大模型,垂直大模型,领域大模型,这几个词最近被反复提到。但其实他们是缺乏准确定义的,很多人甚至迷失在了这个名字上。个人认为,行业大模型的准确说法应该是通用大模型在行业领域内应用,为解决行业问题利用行业数据训练模型。这里有两个关键点,一是通用大模型;二是行业领域数据。
通用大模型指的是模型训练的时候是用了大量的通用数据的。很多人认为行业大模型是用一个7B/13B的模型架构完全用领域数据训练一个模型,因为参数量达到了“大”的标准,数据完全用的是行业数据,就称作行业大模型了。我是很反对这个做法的,大模型(foundation model其实是更准确的说法)的过人之处不是因为参数量大,而是因为通用(跨领域的通用)以及追求通用的过程中涌现出来的能力,完全用领域数据只是之前模型训练方法的改变,和大模型的核心“通用”没有任何关系。这类做法只是对大模型的生搬硬套,对解决领域问题和传统方法比没有很大的帮助。
行业领域数据,有两类用法,第一类是用行业数据对通用模型进行继续训练、微调等一系列改变模型权重的方法;第二类是不改变通用大模型的权重,用in context learning的能力通过prompt注入领域知识,或者利用外挂数据库的方式。前者由于改变了模型的权重,可以称作是训练(微调)了一个行业大模型,后者则基本只能认为是通用大模型的应用了,因为模型还是还个模型。
所以,行业大模型可以先简单定义为用行业数据重新训练、微调了一个通用大模型,来解决行业问题。用这个定义,很多现在的pr的行业大模型可能都不属于这个范畴之内。
大模型解决行业问题的几种做法
前面其实也提到了一些,这里做个总结
使用通用数据和领域数据混合,from scratch(从头开始)训练了一个大模型,最典型的代表就是BloombergGPT。
在一个通用模型的基础上做continue pretraining(继续预训练,二次预训练),像LawGPT就是做了二次预训练的。身边有很多人尝试过这个方案,但普遍反应效果一般(没有SFT来得直接),很有可能是数据配比的问题。
在一个通用模型的基础上做instruction tuning(sft),这也是现在开源社区最普遍的做法,有大量的工作比如Huatuo,ChatLaw等等。这种做法的优势是可以快速看到不错的结果,但会发现要提高上限比较困难。
领域知识库加上通用大模型,针对通用大模型见过的知识比较少的问题,利用向量数据库等方式根据问题在领域知识库中找到相关内容,再利用通用大模型强大的summarization和qa的能力生成回复。
直接用in context learning的方法,通过构造和领域相关的prompt,由通用大模型直接生成回复。随着业界把context window越做越大,prompt中可以放下越来越多的领域知识,直接用通用大模型也可以对领域问题有很好的回复。
这几种做法并不是孤立存在的,通常需要组合使用,才能最好的解决行业问题。
上面这五种做法里面,1不需要通用大模型作为基础,但需要重新训练一个size和通用大模型相当的模型,2和3都是在通用大模型的基础上或多或少对权重进行了调整,都可以认为是重新训练了一个行业大模型。4和5就只是使用了通用大模型来解决行业问题,很难称之为训练了行业大模型。可见,训练行业大模型是一个variance特别大的事情,可以像1一样几乎重新训练一遍模型,需要几百张卡,也可以像3一样用几百条数据做做sft,可能几张卡就够了。下次听到xxx宣传自己做了行业大模型的时候,一定要仔细看看用了什么做法,用了多少数据,用了多少卡,工作量有多少。不然,容易把工程量完全不同的工作放一起比较。通常来看,除了极少数的工作,现在号称自己在做行业大模型的,都只是一些微调性质的工作,工作量和成本都跟训练通用大模型差距极大。
行业大模型 vs 通用大模型
前面也提到了,我们是沿着通用大模型的思路来分析行业大模型的,即使是BloombergGPT的做法也是用大量的行业数据混上大量的通用数据来训练模型,而不是只用行业数据训练一个超大的模型。通用大模型的核心能力可以从两方面来看:知识和能力。
首先,从能力角度看,用简单的比喻可以把能力理解成智商。通用大模型很厉害的一点就是通过对大量通用知识的压缩,训练了一个智商超高的模型,正是因为模型智商超高,才能对大量不同的任务通过in context learning的方式一学就会。
拿下棋举个例子。可以把通用模型看作是一个学习了大量知识的智商超群的人,可以通过告诉他规则(用prompt),不看棋谱他就能下棋了(zero-shot learning),或者给他看少量棋谱(few-shot learning),他就能下的很好。而行业大模型就相当于给一个人看大量的棋谱。如果两个人智商是有差距的(通用大模型能力差距,比如GPT4和llama,或者GPT4和国内的一众模型,又或者GPT4和GPT3.5),智商高的即使棋谱看的少,最后能力也会比较强。因为下棋在解释清楚规则后主要就是对智商的考验,智商高的对智商低的基本就是降维打击,比如柯洁去参加斗地主比赛也能很轻松夺冠一样。如果两个人的智商是接近的,当智商都很一般的时候,可能看棋谱多的那个会比较厉害;但当智商都很高的时候,棋谱可能是负作用的,可以看AlphaGo发展到后期就会发现看人类的棋谱是自己水平不能提高的主要因素。所以对智商超群的人来说,定义清楚规则以后,zero-shot才是最厉害的。可能现在的各个通用大模型(包括GPT4)还处在智商比较一般的阶段,所以我们用大量的行业知识进行训练是有收益的,还有可能用行业知识训练一个普通的通用大模型(llama)能超过顶尖的通用大模型(GPT4)在某些行业上的表现。但随着通用大模型的能力越来越强,智商的降维打击会让通用大模型对行业大模型也产生降维打击。
然后,从知识角度看,通用大模型看过多少数据就能压缩多少知识,对于没看过的领域数据,通用大模型没有这方面的知识是肯定的。所以,当你问大模型,XX棋局的第135手棋下在了哪儿时,它如果没见过就只能胡说八道。即使模型能力超强,也很难幻想出历史上两个人怎么下棋的完全过程。如果模型在使用行业数据微调(重新)训练时见过这方面的知识,就有可能回答出这样的问题。但我们需要通用大模型做的是知识查询类的事情吗?如果是的话,用外挂知识库的方法是不是更容易解决。而对于外延性知识,比如对未来的预测,根据事实进行判断,逻辑推理等,有没有相关知识可能就不是最重要的因素了(类似上面关于看棋谱多了不一定有用的比喻),更重要的还是模型的能力。
因此,行业大模型可能是通用大模型能力不足时的阶段性产物。在我们追求AGI的目标下,通用大模型是解决行业问题最根本的方法。
短期来看,行业大模型对于解决行业问题是有帮助的:
有大量对行业知识进行历史性查询的任务,比如知识问答,知识检索等;
通用模型的能力往往不足以很好地根据行业问题的定义进行泛化,做到举一反三,触类旁通,通用模型不能自己演化行业发展的过程
ChatLaw就是个很好的例子,一方面大家需要对一些不常见的法规进行查询,另一方面通用模型对法律问题的处理能力不强需要大量的法律数据进行微调。
但长期来看,通用大模型可能是更本质的解决行业问题的方案,可以将行业知识以知识库的方式输入给通用模型,可以是外挂知识库也可以直接就在context里面描述了(行业知识是行业内比较本质的东西,通常不应该特别复杂;比如物理或数学,只要几个公式讲清楚基本逻辑就行了),通用大模型强大的能力可以根据知识进行演化(OpenAI的一个愿景是将人类几百年的科学发展让模型用1天复现出来),最后通用大模型在行业问题上会比行业大模型表现地跟好。在这种前提下,只需要告诉模型基本的法规,就可以解决所有法律问题,所有的历史案件对模型来说都没有正收益。
当然,这个过程可能很长,但如果我们相信通用大模型是相信AGI的话,这应该是一条更正确的路。
训练行业大模型的坑
最后,写一个和行业大模型相关的重要问题:数据配比。经常会被问到的问题是,用了大量的行业数据,模型怎么反而变弱了。比如,对一个回答问题能力不错的模型,用大量的金融指令做指令微调以后,模型变得不会回答问题了。对这个问题,正好做了不少实验,也和周边很多有实践的人讨论了这方面的问题。得到的最宝贵的经验就是:数据配比!数据配比!数据配比!
如果有人仔细研究过BloombergerGPT,就会发现模型的能力其实很差,比通用大模型会差很多。这里面犯的最大的错误就是数据配比,他们应该是用1:1的比例混合通用数据和金融数据。首先,不知道他们对金融数据是如何清洗和保证数据质量的,个人觉得他们500B的金融数据质量可能是低于500B的通用数据的质量的,这个对模型最后能力的局限有比较大的影响,通用数据和金融数据必须是用同样的标准做了高质量清洗和质量控制的。其次,1:1的数据比例大概率是一个很差的选择。对于复现chatgpt3.5来说,数据配比应该是OpenAI最核心的秘密和比别人领先最后的地方。和很多OpenAI的人员交流下来,他们在这块做了大量的实验并积累了大量的经验(当然,他们的资源可以支撑他们做这个事情,每个实验都是代价不菲的)。
由于没有大量的资源做from scratch的通用数据和领域数据配比的实验,个人的经验完全来自于continue pretraining和sft。对continue pretraining来说,如果要让模型不丢失通用能力,比如summarization,qa等,领域数据的比例要在15%以下,一旦超过这个阈值,模型的通用能力会下降很明显。所以,在做领域数据continue pretraining的时候,一定更要混大量的通用数据。而且,这个阈值和不同的预训练模型是相关的,有些模型比如llama需要控制的阈值更低。这个阈值其实是个经验主义的结论,我也不能保证是适用于所有人的,但和不少同行交流下来,感觉大家的范围都在10%-15%左右。而且,该阈值和预训练模型的大小,预训练时原始数据的比例等条件都息息相关,需要在实践中反复修正(这个时候就能看出scaling law的重要性了)。这个结果其实和ChatGPT大概用不到10%的中文数据就能得到一个很不错的中文模型的结果还挺相似的。所以,我猜测BloombergerGPT如果把金融数据质量控制做的更好一点,清洗出大概200B的数据,混上1.4T左右的通用数据,可能会得到一个比较强大的金融领域模型。不过,这个经验也告诉我们不要轻易用continue pretraing或者from scratch pretraining的方法做行业大模型,每100B的领域数据,需要配上700B-1000B的通用数据,这比直接训练通用大模型要困难多了。
对sft来说,这个比例就可以提高不少,大概领域数据和通用数据比例在1:1的时候还是有不错的效果的。当然,如果sft的数据量少,混不混数据的差别就不太大了。所以说,做pretraining不仅耗资源,需要大量的卡和数据,还需要大量的实验去调数据配比。每次有人和我说通过pretraining的方法做了行业大模型的时候,我通常是不信的。做sft不是香多了吗?
所以,个人对解决行业问题的建议是,看要解决什么问题。简单的问题,写写prompt就行了,prompt写好了很多时候比sft还管用,再配上向量数据库,其实70%能解决的行业问题用这个方法就解决了;稍微复杂点的问题,做一下sft,稍微混点通用数据,别全用领域数据做指令了,剩下的30%能解决的行业问题就考这个方法了;更复杂的问题,再等等吧,通用大模型还没发展到那一步,别期望太高了。
截取部分留言:
原文链接:https://zhuanlan.zhihu.com/p/643805698
进NLP群—>加入NLP交流群
参考资料
[1]
关于大模型和自动驾驶的几个迷思: https://zhuanlan.zhihu.com/p/642846310
[2]垂直领域大模型的一些思考及开源模型汇总: https://zhuanlan.zhihu.com/p/642611747