微调是对特定能力的追求,对通用能力的妥协。
一、最简模型原理
经过充分训练的语言模型,在通用能力方面已经训练得很好了,比如语法、语序和语义理解等方面,示意图如下:
- 黑点部分为模型的能力
- 红色直线表示"已经充分训练后的LLM":
如果我们追求"编码"能力,想微调一个模型,那么微调之后的LLM示意图如下:
一些通用能力,比如:语法能力、语序能力、语义能力,必将受到影响。 但最令人无法接受的是: 微调之后,我们无法确定哪些能力受到了影响。
我将从5个微调带来的问题来说明为什么不要微调,并给出了如何合理使用模型的最佳方案。
二、微调模型的5个问题
2.1、微调是对模型通用能力的妥协
对某些特定能力的加强,也是对某些通用能力的减弱,微调必然影响了通用能力。 一个充分训练的模型,因为训练语料都是用了普通话和叙事表达逻辑,所以一个训练完成的模型必定有的通用能力大致有: 语法、语序、语义、推理、叙事、逻辑、总结、思考等能力。
当我们微调模型去增加模型特定的能力时,这些通用能力必然受到影响,更严重的是:我们无法知道到底影响了什么通用能力。
比如: 你想在一个基础LLM模型下,微调出一个医学模型,这个医学模型的目的是给患者诊断和开药方。 为了提高医学模型能力,你给他很多"问诊开方"的预料案例,给LLM进行微调。 结果是:微调之后的模型,当你输入给它一些患者病症描述,它就可以开药方了。 但你无法确定的是它的通用能力,比如总结思考能力,是否是受到影响。 而且还有一个问题是:它的药方开的真的合理吗? 也许它只学到了"医生开药方的语言语调"。
所以有两个最恐怖的致命缺点: 1.你不知道微调的过程中,你降低了哪些通用能力 2.无法确定你真的想微调的能力是否真的提高了。
2.2、微调能力的未知
你不能评估一个系统,你就无法改良它。
想知道微调是否成功了,如果只通过一两个案例进行测试,未免太过草率了。 你需要建立评估标准,来确定两个事情:
- 通用能力没有收到影响
- 特定的微调能力确定有所提高
从第一个开始,如果你没有一个通用能力的衡量标准,比如你要微调llama3.2 1B,你需要重跑标准测评Benchmark[1][2],如下:
保证这些指标与LLM微调之前变化不是太多。 这些通用能力的指标很多,如果个人或公司来测试需要花费很长很长的时间,所以,一般要找第三方来评测,但同样,最大的问题仍然是时间太长、成本太高。
第二个方面,如果你真想知道你的微调是否真的成功了,你需要构建你专属的测试集,比如你收集了5k个资料做成微调,起码要保留1k(20%)的数据进行评估,这部分可以使用更大一些的LLM(比如GPT)来进行评审。 但最大的问题是:那4k训练数据和1k的测评数据到底怎么挑选呢? 对于刚才说到的"医生开药方"的案例,假设你找到了5k的数据,留出来1k数据用于评测,4k数据用于微调。 案例中有治疗糖尿病的问诊开药方数据,有治疗高血压的问诊开药方数据,有治疗头疼的问诊开药方数据,起码你微调数据中要包含者3类数,测评集也包含这三类数据,这个数据划分又是个难题,最起码要做到微调数据与测试数据包含的3类数据的百分比是大致一样的吧。 假设以上问题你都解决了,分类后你发现,建立的类别居然有10种,那就稀释了微调数据集的数量,因为每个类别只有400条(4k除以10),你也许要收集更多的测试,或者还有一个方案:构建多个微调模型 比如:糖尿病问诊模型,高血压问诊模型,头疼问诊模型等。。
这样就导致了下一个问题,微调后部署模型的成本。
2.3、微调费用非常高
比如微调Qwen 70b的模型后,用于推理的资源是:2台顶配100GB内存的A100
我在阿里云找到了80G内容的A100,价格在17w一年。
如果两台一年就是34w一年,如果你想构建三个微调模型:糖尿病问诊模型,高血压问诊模型,头疼问诊模型,费用就是:3*34w=102w/年
你确定要为一个"无法确定影响了哪些能力的模型"花这么多钱吗?
2.4、微调不能实时更新知识
微调模型还有一种错误想法:使用最新的数据对模型进行微调,希望它可以从中学到新的知识。 正如上边第二点我们提到的,首先你不能确定确定模型到底学习没学到你想让他学习的知识。更重要的是:即使学习到了你想让他学习到的知识, 你也很难让它保持实时知识的更新。
举例: 比如你在微调一个医学模型,微调的目标是可以解决关注糖尿病机制相关知识的模型。 假设一切顺利,你通过层层难过,花了很长时间终于微调出来一个模型。 突然发现有一个糖尿病的病例知识的逻辑被推翻了,有了新的理论,你现在要做的是重新训练模型,因为它现在"学习"到的知识是错误的。 你要重新梳理补充微调资料,重新构建新知识的测评集,然后新的一轮微调又要开始了。。
除了这些,还有一个问题:有些能力你无法通过微调来改变的
2.5、有些能力你无法通过微调来改变的
我们可以把训练充分的LLM模型比做一条直线。
在训练过程中,假定这条直线与x轴平衡时,我们认为它训练完成。模型的能力则在这条直线的上下摆动,最终确定下来。
就像我们之前提到的,微调模型是让LLM在追求特定能力时,对通用能力的妥协。表现在图上,则是将曲线进行倾斜。
假设我们要微调一个编码模型:这里我们给了它更多的编码预料,它在提高编码能力的同时,必然降低了它的通用能力(比如语言理解能力),那么很可能它编码能力提升了,但是看不懂你要表达的意思了。这样的的模型依然是不可用的。
所以,我们更希望编码语料就在模型训练时一起进行训练,那么编码能力则会同其他能力一起提升:
这就是为什么包含优质编码(比如github)训练出来的LLM一定比任何微调出来的编码模型能力都更强的原因。
三、解决方案
1、使用模型的通用能力,比如思考能力和推理推理能力 2、让模型帮你选择可以调用的用工具(api方式),去解决你的实际问题:比如最新的知识信息 3、选择合适的模型,去微调提示语,而不是模型
对,你猜对了,最终的方案是去构建智能体(Agent)。
Agent一定为未来。而未来已来。
[1]ollam-llama3.2:ollama.com/library/lla... [2]测评指标的说明:cloud.tencent.com/developer/a... [3]阿里GPU费用:developer.aliyun.com/article/127...