很遗憾,砂糖一年前的预言又一次印证了——力大砖飞的满血超大杯模型正在逐渐失宠。用户们逐渐认识到小型模型结合合理的优化策略(例如CoT、深度思考),能够在某种程度上以更低的算力消耗,达到全参数满血大尺寸模型同级别的输出质量。
那么,如何在不牺牲性能的前提下,精简模型以实现成本与质量的平衡呢?另外,“671B“的Deepseek-v3/r1,就一定是所谓的”满血版“吗?
认识模型
我们所谓的“模型”,其实储存的是模型各个节点的参数,包括权重和偏置。通常来说,参数量越大的模型能够存储的信息越多,理论上可以处理更加复杂的任务。每个参数也的确就是一个数,与计算机中的其他数一样,它也具有位数和精度——32位浮点(fp32),16位浮点(fp16),8位整型(int8)等等。更高的精度,以及更大的参数量,都会提升模型的性能需求,也能提升模型的输出质量,但同时也会消耗更多的计算资源。
模型的阉割技术,目的就是在可容忍的范围内,牺牲部分输出质量,换取更大的性能提升。
当然,如果一味地进行阉割,降本增效,以次充好,那么上面这句话也可以说成——模型的阉割,本质上是为了节约成本,牺牲掉输出质量。
模型阉割大法
蒸馏
将一个大型的、性能卓越的模型作为教师模型,另一个参数量较小的基底模型作为学生,让老师教学生,使基底模型学习到教师模型输出的分布特征,以及获取教师模型的部分知识。
当然,需要强调的是,蒸馏后的模型仍然是基底模型,它依赖于教师模型的知识,但仍与之有别。基底模型较小的参数量决定了其固有的上限所在。
我之前开玩笑地举了个例子,虽然不太雅观,但很形象:
把一个馒头往厕所里放两天,馒头会有一股屎味,但你不能说它就是屎——屎味的馒头说到底还是馒头。
量化
量化,就是将模型的参数由高精度缩减为低精度。就像做物理题时那样,c=299792458m/s 能让你猪脑过载,但令 c=3*10^9m/s 你就豁然开朗——当然这么做的后果就是你的计算结果并不那么准确。
当我们将FP32,或者FP16的参数修约到FP8,INT4,甚至二元量化或三元量化(三进制重出人间),能够带来数倍的模型体量缩减与性能提升——当然代价同时是损失输出质量,精度压缩得越激进,损失越明显。
好在与其他神经网络相比,多数的大型语言模型对量化具有一定的鲁棒性,即使进行一定程度量化,输出质量的损失也并不那么显著。这是因为LLM模型通常局部不变性更好,即使某一层出现偏差,也会在后续层中得到修复。
剪枝
果农为了收获品质更好的水果,会将一些发育不良的枝条减去,使有限的营养专注供给健康的果子。神经网络也是同理。偌大的神经网络中,存在着大量看起来不那么重要的神经元或者连接。由于这些连接对于模型的输出贡献极小,但实实在在地消耗了计算性能,通过重要性排序和相关性分析,删去一些”不重要“的参数,就能减小模型体积,提升运行时的性能。
剪枝是缩减模型体积,提升运行时性能的有效手段,结合微调手段重建冗余,合理利用剪枝,可以获得非常好的效果。但是过于激进的剪枝策略会删去大量非0权重,会实实在在地影响模型的泛化能力。
总结
模型的阉割大法不仅只有蒸馏一种,量化和剪枝都是重要的手段,并且都具有便捷性,可以在部署时进行。因此,“671b”参数的deepseek,未必就是满血版,它只声称了671b的参数量,但是参数的精度如何,加载模型时是否离线剪枝,又删去了多少参数,这些问题都会影响模型最终的表现。
阉割大法是双刃剑。各种事实已经证明了阉割模型是时代发展趋势,我们是时候摒弃猛堆参数量和精度的思维了。但同时也必须拒绝一种行为,那就是使用阉割的模型以次充好。下一次,当有商家再宣传自己提供671b”满血“大模型时,你就应当多留个心眼,这真的是满血的模型吗?
当然,我更希望将来能够有更加规范的行业要求——对于自部署的开源模型,商家不能仅仅公布模型的代号和原始参数规模,而应当披露具体的模型哈希、量化位数、剪枝比率和激活参数规模,以保障消费者的知情权。或者,应当允许消费者设定Temperature=0,以自行检查模型的一致性。
就当是我的下一个预言吧,不过我估计这个行业规范至少需要一年的等待时间。
看完觉得有收获,记得点点认可。虽然不知道有啥用但是搞一个玩玩(