ChatGPT带动了全球大模型热潮,互联网公司陷入“百模大战”,甚至出现了“内卷”:各家公司发布的大模型一个比一个大,参数规模成了宣传噱头,几乎都在百亿、千亿甚至万亿以上。
然而,也有人提出这种现状并非可持续的发展方式。OpenAI创始人Sam Altman称GPT-4的开发成本突破了一亿美元,Analytics India Magazine发布的报告显示,OpenAI每天将花费约70万美元来运行其人工智能服务ChatGPT。同时,LLM 也会引起人们对电力消耗的担忧,谷歌报告称,培训 PaLM 在大约两个月内耗费了大约 3.4 千瓦时,相当于大约 300 个美国家庭每年的能源消耗量。
因此,随着模型规模的不断增大,HuggingFace首席布道师Julien Simon却说“Smaller is better”。事实上,在参数规模达到一定程度后,再增加参数往往对模型效果的提升并不明显,从实用性和经济性来考虑,模型“瘦身”是一项必然的选择,因为相对于庞大的参数规模所带来的递减边际效益,巨大的资源消耗成本往往不值得。而且,大模型因规模太大将在应用上产生诸多问题,比如无法部署在边缘设备上,只能以云的形式向用户提供服务,然而很多时候,我们需要将模型部署在边缘节点,以提供用户个性化服务。
如果要继续改进AI模型,开发者将需要解决如何以更少的资源实现更高性能的问题。无论是在学术界还是在工业界,大模型压缩一直是一个热门领域,目前也有很多技术在做。本文简单介绍四种常见的模型压缩手段:量化、剪枝、参数共享和知识蒸馏,帮助大家对模型压缩方法有一个直观的了解。
1、模型瘦身的理论基础:参数规模“边际递减”
如果我们把模型比作一个“水桶”,把数据比作“苹果”,把数据中含有的信息比作“苹果汁”,那么训练大模型的过程,就可以理解为用水桶装苹果汁的过程。苹果越多,苹果汁就越多,我们也需要更大的水桶来盛放苹果汁。大模型的出现就犹如我们造出了更大的水桶,从而有更大的能力装足够的苹果汁。
如果苹果太多,苹果汁太多,就会导致“溢出”,也就是模型规模太小,无法学习到数据集中所有的知识,我们称这种情况为“欠拟合”,即模型无法学习到真实的数据分布;如果苹果太少,苹果汁太少,就会导致“装不满”。如果通过增加模型训练时长来“强行榨汁”装满水桶,就会导致果汁中杂质增多,从而出现模型性能下降,我们称这种情况为“过拟合”,即模型过分学习数据导致的通用性下降。因此,模型规模与数据规模的匹配是非常重要的。
以上例子虽然形象,但容易产生一种误解:一升水桶能装一升苹果汁,两升水桶就能装两升(如①)。但实际上,参数所能容纳的信息并不随参数规模线性增加,而是趋于一种“边际递减”的增长(如②③)。
换句话说,大模型所表现出的超凡能力,是因为学到了很多“细节性知识”,而且花在“细节性知识”上的参数数量庞大。当我们已经学到数据中大部分知识的时候,再继续学习更多的细节知识,就需要增设更多的参数。如果我们肯牺牲一些精度,忽略掉部分细节性信息,或者将识别细节性信息的参数进行裁剪,就可以将参数规模降低很多,而这正是学术界和工业界模型瘦身的理论基础和核心思路。
2、量化——最“简单粗暴”的瘦身方法
在计算机中,数值的精度越高,需要的存储空间就越大。如果模型的参数精度非常高(直观理解就是小数点后位数很多),那么我们可以直接降低精度,从而实现模型压缩,这就是量化的核心思路。一般模型的参数为32bit,如果我们同意将模型的精度降为8bit,就能减少75%的存储空间。
这种方法的理论基础,是在量化派中存在的一个共识:复杂的、高精度的模型在训练时是必要的,因为我们需要在优化时捕捉微小的梯度变化,然而在推理时并没有必要,因此量化可以做到只降低模型占用空间而不过于降低推理能力。
3、剪枝——“外科手术式”的参数剔除法
大模型规模庞大,结构复杂,内部参杂着大量作用微小甚至无用的参数和结构。如果我们能尽可能精确锁定无用之处,将其剔除,那么也能够在保证功能的同时降低模型的规模。
在大多数神经网络中,通过对网络层(卷积层或者全连接层)权重数值进行直方图统计,可以发现,训练后的权重数值分布近似正态分布或多正态分布的混合,接近于0的权重相对较多,这就是“权重稀疏”现象。
权重数值的绝对值大小可以看作重要性的一种度量,权重数值越大对模型输出贡献也越大,反之则不重要,删去后对模型精度的影响也比较小。
同时,在深度网络中,存在着大量难以激活的神经元。论文《Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures》经过了一些简单的统计,发现无论输入什么样图像数据,CNN 中的许多神经元都具有非常低的激活。作者认为,零神经元很可能是冗余的,可以在不影响网络整体精度的情况下将其移除。我们称这种情况为“激活稀疏”。
因此,针对神经网络上述特点,我们可以针对不同的结构进行裁剪优化,从而减小模型的规模。
4、参数共享——寻找复杂模型的小型替代
神经网络是对现实数据分布的拟合,本质是一个函数。如果我们能找到相同性能但参数规模更小的函数,使得相同的输入能够有接近的输出,那么自然也就减小了参数规模。
在技术领域,我们通常用PCA算法进行降维,寻找高维数组在低维的映射。如果我们寻找到模型参数矩阵的低维映射,则可实现保证性能的同时降低参数量。
目前已经有多种参数共享的方法,比如对权重进行K-means聚类,以及采用哈希方法随机分类,然后对同一组的权值进行处理等。
5、知识蒸馏——学生代替老师
既然大模型蕴含着大量的知识,我们能否让大模型“教会”一个小模型,使得小模型拥有大模型的本领?这便是知识蒸馏的核心思路。
已经拥有的大模型,我们称之为Teacher模型。此时我们可以用Teacher模型对Student模型做监督学习,从而学到Teacher模型的知识。
前三种方法或多或少都改变了原有模型的参数或结构,而知识蒸馏则相当于重新训练了一个规模较小的模型,因此相比其他方法来讲更能保全原有模型的功能,只是损失了部分精度。
结语
模型压缩不存在统一的方法。针对不同的模型,一般会尝试多种压缩手段,从而做到规模与精度的平衡。如今,我们使用的大模型都部署在云端,我们只有调用权而不具有所有权,毕竟本地无法存储如此规模的模型,“人人都有大模型”似乎是一个遥不可及的梦。然而我们回顾历史,在上个世纪40年代计算机刚刚诞生的时候,人们看到如此庞大和耗电的“机器巨兽”,没人会猜到它在数十年后的今天居然会成为人人都有的日常工具。同样,随着模型压缩技术的进展、模型结构的优化以及硬件性能的飞跃,我们也期待在未来,大模型不再“大”,而是成为人人都能拥有的私人工具。
参考文献:
https://blog.csdn.net/shentanyue/article/details/83539359
https://zhuanlan.zhihu.com/p/102038521
https://arxiv.org/abs/1607.03250
https://arxiv.org/abs/1806.09228
https://arxiv.org/abs/1504.04788
版权声明:如需转载欢迎加小助理微信沟通,未经允许转载、洗稿、我方将保留追究法律责任的权利。
免责声明:市场有风险,投资需谨慎。请读者在考虑本文中的任何意见、观点或结论时严格遵守所在地法律法规,以上内容不构成任何投资建议。