多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

腾讯AI Lab NeurIPS 2018:模型压缩、机器学习与最优化算法深度解析

腾讯AI Lab NeurIPS 2018:模型压缩、机器学习与最优化算法深度解析 1. 一场学术顶会的含金量以及腾讯AI Lab为什么值得听先说个背景。NeurIPS神经信息处理系统大会在AI圈是什么地位不用我多废话——计算机视觉有CVPR、自然语言处理有ACL但论综合性和风向标意义NeurIPS基本是金字塔尖。2018年那届在加拿大蒙特利尔举办投稿量逼近5000篇录取率大概21%和CVPR动辄25%上下的接受率相比NeurIPS的筛选更苛刻。能在这种会议上发论文、做Tutorial、搞Workshop的团队基本代表当下学术界和工业界最前沿的那批人。腾讯AI Lab在NeurIPS 2018的参与放在当时的环境里很有意思。2018年正是国内大厂AI Lab风头最劲的时候微软亚洲研究院的老牌地位还在腾讯、阿里、字节的研究院都在疯狂招人、堆论文。腾讯AI Lab的方向覆盖游戏AI、NLP、计算机视觉还有一个容易被忽略的底层支撑——机器学习基础研究和优化算法。这次腾讯重点讲的三大块模型压缩、机器学习、最优化算法恰好对应了应用落地、理论框架、训练基建三个层次。之所以说这篇值得读是因为这三个方向不是平行并列的三个独立话题而是一条完整的逻辑链模型压缩解决模型太大跑不动的问题机器学习解决算法怎么设计才有效的问题最优化算法解决参数怎么训练才收敛的问题。放到今天的大模型时代回头看这三件事依然是绕不开的命门。你训一个百亿参数模型没有优化算法loss永远降不下去你想把它塞进手机或者边缘设备不压缩推理延迟直接爆炸你做一个新任务不掌握机器学习方法论连数据怎么处理、评估指标怎么设计都是懵的。这篇文章我不会只复述当年腾讯分享了什么而是把这三块拆开揉碎讲清楚里面的核心技术逻辑、当年的背景动机以及放到今天依然适用的实操经验。无论你是刚入门机器学习的学生还是在做模型部署的工程师都能找到对应自己阶段的东西。2. 模型压缩不是锦上添花是能不能用的分水岭2.1 为什么2018年大家突然都在谈模型压缩模型压缩在NeurIPS 2018被重点讨论背后有个很现实的产业驱动。2018年恰好是第一代移动端AI芯片和AI应用爆发的当口手机厂商开始推NPUIoT设备开始集成智能语音自动驾驶的感知模块要求在车载平台上跑实时模型。但学术界刷榜的模型——ResNet-152、VGG、各种大型GAN——动辄上百MB算力需求动辄每秒几十亿次浮点运算别说手机就是车机芯片都扛不住。当时的普遍困境是研究者在GPU集群上训出来的SOTA模型产品经理一句跑不到30帧就直接被打回。而模型压缩恰恰是解决训练出来但用不上这个尴尬局面的核心手段。所以NeurIPS 2018上剪枝、量化、蒸馏这三个方向都出现了大量高质量工作腾讯AI Lab讲这块本质上也是在回应工业界落地时的真实痛感。2.2 剪枝把干草垛修成雕塑剪枝的想法很直白——神经网络里大部分参数对最终结果的影响很小把它们干掉模型自然就小了。但干掉也有讲究。非结构化剪枝是把权重矩阵里接近零的值置零模型变成稀疏矩阵理论计算量下降但硬件如果不支持稀疏运算实际加速几乎为零。结构化剪枝是把整个channel、filter或者层剪掉直接改变网络结构虽然精度损失可能稍大但剪完之后的模型是密集矩阵在任何硬件上都能跑得快。2018年业界基本达成的共识是要落地尽量做结构化剪枝因为大多数推理引擎和芯片只对密集运算优化。实际操作中剪枝流程通常是这样的先训练一个基准模型确保精度达标。设定剪枝率比如剪掉30%的通道。逐层评估每个channel的重要性常用指标是权重绝对值和、BN层的缩放因子、或者基于梯度的影响估计。按重要性排序剪掉最不重要的部分。对剪完的模型做微调fine-tune恢复精度。这里有个容易踩的坑剪枝率不是均匀设置的。有些层冗余度高比如最后的全连接层或者浅层卷积可以多剪有些层敏感度极高比如第一个卷积层剪一点精度就崩。我见过不少团队一上来就给所有层设同样的剪枝率结果精度掉了5个点还找不到原因。正确做法是先做逐层敏感度分析画一张每层剪去x%后精度损失的曲线再按敏感度反比分配剪枝率。2.3 量化从FP32到INT8的性价比革命量化是另一个思路不减少参数数量而是降低每个参数的精度。模型默认用FP3232位浮点数存权重如果转成INT88位整数存储直接缩到四分之一推理速度因为硬件优化通常能提升2到4倍。这在2018年是极具诱惑力的事情——手机芯片的INT8算力普遍比FP32高一大截。量化的技术路线主要有两种训练后量化Post-training Quantization模型训练完直接转INT8不额外训练。优点是快缺点是精度损失不可控尤其对激活值分布特别不均匀的模型损失可能很大。量化感知训练Quantization-aware Training在训练过程中就模拟量化的效果让模型主动适应低精度带来的噪声。精度损失小很多但需要重新训练一轮成本高。腾讯当年分享的实操经验里有一个关键点不是所有层都适合INT8量化。比如检测模型里的bbox回归头、分割模型的边界部分对数值精度极其敏感全模型一刀切量化经常会出问题。稳妥方案是混合精度量化——敏感层保持FP16甚至FP32非敏感层用INT8精度和速度取一个平衡。另外量化的时候千万别忽略激活值的范围统计。权重分布通常比较稳定好处理但激活值会因为输入变化而波动如果掐不准范围量化误差会被放大。常见做法是在校准集上跑几百个batch统计激活值的min/max或者percentile再决定量化scale。2.4 知识蒸馏大模型当老师小模型当学生知识蒸馏的思路有点意思。Hinton在2015年提出蒸馏时有个洞察大模型学到的知识不只体现在最终预测标签上还体现在类别的软概率分布里。比如一个猫的图片模型认为87%是猫、10%是狗、3%是狐狸——这个分布比猫这个硬标签包含更多信息。小模型直接学软标签相当于老师在教学生时不仅告诉答案还讲了推导过程。2018年蒸馏的实践已经成熟到可以组合使用了。腾讯提到的一个工程化经验是蒸馏和剪枝、量化搭配效果往往比单一手段好。比如先拿一个大模型蒸馏出一个中等模型再对这个中等模型做剪枝和量化最后得到的模型比直接对原模型剪枝量化精度高不少。这个流程后来成了很多团队的标配。蒸馏本身的技巧也值得一提。温度参数T控制软标签的平滑程度T越高分布越平滑类间信息越容易被学到但也可能引入噪声。一般做法是T先设4左右试观察student模型的表现然后按验证集调。此外蒸馏不只是让student去匹配teacher的输出logits也可以匹配中间层特征图——这相当于让student模仿老师的思维方式而不只是答案。2.5 三种手段怎么选一个实用决策思路我把这三个手段的使用场景整理一下方便你对号入座手段核心原理优点注意点适用场景剪枝去除冗余参数/通道不损失太多精度对硬件友好需逐层敏感度分析微调成本高模型本身结构冗余如大卷积网络量化降低数值精度存储和推理加速显著敏感层精度易崩需校准集追求高吞吐、低延迟如端侧推理蒸馏大模型教小模型能拿到一个全新的小模型不依赖原结构需要一个高质量的teacher模型从零训练一个紧凑模型实际项目中三者的顺序通常是先蒸馏得到结构合理的student再剪枝去掉冗余最后量化压缩数值精度。每一步都要验证精度是否达标如果某一步掉点太多要回流调整前一步的超参。记住一个原则模型压缩不是做完就完每压一步都要有对应的精度回测和回归测试。3. 机器学习从调参玄学到工程方法论3.1 2018年机器学习正处在野路子与科学方法的交叉口说句实话2018年之前很长一段时间机器学习在工业界是被当成玄学来对待的。模型效果好不好很大程度上取决于那个负责调参的人有没有手感——learning rate设1e-3还是3e-4隐藏层宽度设256还是512正则项系数设0.1还是0.01都靠肉眼盯着loss曲线做决定。但到了NeurIPS 2018这个节点圈内对方法论本身的关注明显上升了。大家开始系统性地研究什么样的数据处理流程更可靠评估指标怎么选才能真实反映业务目标模型效果不佳时是数据问题、特征问题还是模型结构问题这种思维转变本质上是机器学习从实验室里的手工技艺转向可复现、可规模化的工程体系。腾讯AI Lab在这个议题上的分享据当时公开报道和业界流传的技术要点主要集中在深度学习与传统机器学习方法的融合应用以及模型组件如注意力机制在不同任务间的迁移复用。这些内容放到今天的视角来看其实指向一个底层问题机器学习项目的方法论远比某个具体模型的实现细节更重要。3.2 一个机器学习项目的标准动作拆解不管你是用XGBoost还是用Transformer一个完整的机器学习项目基本逃不开下面七个环节业务问题定义把预测用户流失翻译成二分类问题正样本是流失用户评估指标是召回率优先于精确率。这一步是最容易被忽略的但决定后面所有工作的方向。数据采集与清洗处理缺失值、去重、纠正数据类型。脏数据是模型效果差的第一大原因占比远超模型选型不当。特征工程把原始数据转换成模型能理解的表示。数值型要不要标准化类别型用one-hot还是label encode时间特征怎么抽特征之间有没有交叉组合的空间模型选择根据数据量、任务类型、可解释性要求选模型。小表格数据优先树模型图像文本用深度学习对解释性要求高的场景用线性模型或树模型。训练与调参划分训练集/验证集/测试集确定loss函数选优化器设learning rate和batch size。用验证集做早停用交叉验证评估稳定性。评估与迭代在测试集上计算准确率、精确率、召回率、F1、AUC等指标然后回到特征工程或模型选择环节继续优化。部署与监控把模型封装成服务设好输入输出格式上线后监控指标是否漂移、预测分布是否变化定期重训。这里面每一环都有坑。比如数据切分如果直接用sklearn的train_test_split而不考虑时间顺序会对未来数据做时空穿越线上表现远差于离线评估。再比如类别不平衡直接拿原始分布训练模型会倾向把所有样本都判成多数类准确率看着很高但毫无业务价值。3.3 深度学习与传统机器学习的边界在哪里聊机器学习就绕不开深度学习vs传统机器学习这个经典对比我看相关热搜词里也大量出现计算机视觉和机器学习区别机器学习线性回归例子这类问题说明很多读者对概念边界还没完全建立起来。这里我用尽量直白的方式讲清楚。传统机器学习树模型、线性模型、SVM、K近邻等擅长处理表格数据特征维度几百几千这种规模数据量在几万到几百万条之间。它的优势是训练成本低、结果可解释性强、在小数据上不容易过拟合。深度学习擅长处理高维非结构化数据比如图像、语音、文本这些数据没法手工设计有效特征而神经网络可以自动从原始信号中逐层提取特征。它的代价是需要大量数据和算力。两者不是非此即彼的关系。实际工程里常见组合是传统模型做第一层漏斗筛选深度学习模型做精排。比如推荐系统里先用GBDT或者逻辑回归从几千万商品里粗筛出几百个候选再用深度模型精排这几百个的点击率。这种分层漏斗的思路到今天依然是工业界的主流架构。3.4 从机器学习热词看入门者的共性问题从最近搜索热度里能看到大量机器学习入门机器学习期末复习吴恩达机器学习西瓜书李宏毅机器学习作业这类关键词说明这个领域的入门者数量非常庞大而且很多人卡在同一个阶段——资料看了一堆代码也跑了几个Demo但一到自己拿到一个新数据集就不知道从哪下手。我给入门者的建议很朴素不要一上来就啃理论推导也不要沉迷于换模型调参先找一个小而完整的数据集Titanic、Iris、房价预测这类经典数据集都行从头到尾走一遍上面说的七步流程。第一遍走的时候允许犯错哪怕结果很差也没关系第二遍再针对性地优化某一个环节。走完三个完整项目你对机器学习的感觉会和只看教程完全不一样。4. 最优化算法神经网络训练的底层基建也是争议最多的战场4.1 为什么模型效果不好要先查优化器很多刚入门的朋友会觉得优化算法离自己很远——反正PyTorch里一行optimizer torch.optim.Adam(model.parameters(), lr1e-3)就搞定了有什么好研究的但事实是优化算法决定了模型能不能收敛、收敛到多好的解、以及需要多长时间才能训完。同一套模型结构用SGD和用Adam最终精度可能差好几个点learning rate设大了直接发散设小了训到天荒地老还不收敛。腾讯AI Lab把最优化算法列为三大热点之一正是因为它是所有深度学习工作的地基。优化算法的本质是求解这样一个问题给定一个损失函数 L(θ)找到一组参数 θ 让 L 最小化。但由于神经网络的非凸性这个问题不存在解析解只能靠迭代逼近。每次迭代沿着某个方向迈一步步长和方向决定了整个训练的路径。所有优化器的区别本质上就是方向怎么算和步长怎么定的区别。4.2 优化器进化史从SGD到Adam再到AdamW和LAMB把优化器的演化脉络梳理一遍你会发现每次革新都是为了解决一个具体的痛点SGD随机梯度下降最朴素的做法。每次随机抽一批样本算梯度沿负梯度方向更新。优点是稳定但收敛慢而且在loss landscape的狭窄山谷里会来回震荡。Momentum动量引入历史梯度的指数滑动平均相当于让更新方向带有惯性穿越平坦区域和逃离局部极小值时更利索。Adagrad/RMSProp自适应调整每个参数的学习率对稀疏梯度友好解决了不同参数更新频率差异大的问题。AdamMomentum和RMSProp的结合体同时考虑梯度的一阶矩均值和二阶矩方差在绝大多数任务上开箱即用收敛速度快。AdamW把权重衰减Weight Decay从loss函数中解耦出来直接作用于参数更新。修复了Adam里L2正则与自适应学习率相互作用导致的泛化问题。到了2018年腾讯这类大厂在工业级训练里已经开始关注一个更工程化的问题——大batch下的优化。Adam虽然在很多任务上表现好但在超大batch几万甚至几十万训练时它的二阶矩估计容易失真导致收敛不稳定。后来Google提出的LAMB优化器就是针对这个场景做修正——逐层归一化更新步长让大batch训练效率和效果能同时兼顾。4.3 大白话理解Lipschitz常数和Adam的争议2018年NeurIPS上关于优化算法最有意思的讨论是Adam的收敛性理论证明及其反例。这个争论到现在还有余温但其中两个核心概念你得懂不然看论文和博客会很吃力。第一个是Lipschitz常数。简单理解它描述了一个函数的梯度变化有多剧烈——如果在一个区域内无论你怎么移动梯度的变化率都不会超过某个上限L那这个函数就是L-Lipschitz光滑的。对优化算法来说L越小说明梯度越温和用固定步长往下降就越安全L越大说明梯度变化越剧烈步长稍微大一点就可能跳过最优点甚至发散。很多自适应优化器的设计思路本质上是让步长能动态适应局部L的变化。第二个是Adam到底能不能保证收敛。2018年那篇著名的反例论文指出存在某个简单函数Adam在某些参数设置下会一直不收敛。这个发现当时让学术界炸了锅——因为大家都默认Adam是自适应魔法原来它也有失效的时候。后续的研究发现Adam不收敛的原因在于二阶矩估计可能偏小导致步长偏大在局部区域反复横跳。解决办法也不复杂加权重衰减就是AdamW干的事或者对二阶矩设一个下限类似AMSGrad的思路。我个人的经验是不要神化任何优化器也不要妖魔化任何优化器。默认情况下AdamW在Transformer类模型上表现稳定CNN模型SGDmomentum经常能推出更好的泛化精度小数据小模型用SGD即可。每换一个优化器都要重新做learning rate的搜索因为优化器改变后最优学习率是完全不同的量级。4.4 分布式训练和优化算法的配合腾讯AI Lab当年讲最优化算法时分布式训练是一个绕不开的应用场景。单卡训练一个模型可能要几天公司等不起分布式成了解药。但分布式训练引入了新的优化问题——数据并行下梯度的同步方式会直接影响模型的收敛速度和最终精度。常见方案有三种同步SGD每step要求所有worker算完梯度并同步再统一更新。优点是和单卡训练理论等价缺点是一台慢机器拖慢全体吞吐量受限。异步SGD每个worker算完梯度就立即更新共享参数不等其他人。优点是吞吐量大缺点是梯度是过期的——你拿到的参数可能已经被别人更新过好几轮这会让训练不稳定。梯度压缩与通信优化把梯度做量化或稀疏化只传大于阈值的梯度项降低通信开销。2018年前后兰登等人做的一系列梯度压缩工作就是在不损失太多精度的情况下把通信量降到原来的百分之一量级。做工程落地时我的建议是同步SGD优先如果同步受限于通信瓶颈再考虑梯度压缩和延迟同步的混合方案。异步SGD不是不能用但需要把learning rate调低、增加梯度裁剪阈值并且用更大的batch来抑制噪声。5. 从当时的三大热点看看这几年的技术演变5.1 模型压缩的今天从可选项变成必选项回到标题本身我们再看NeurIPS 2018腾讯AI Lab详解的这三个热点以及它们在这几年间的演变。模型压缩在2018年是让模型跑在端上的补救手段但今天的语境完全变了。大模型时代模型参数量动辄几十亿、上百亿单卡都装不下更别说端侧。模型压缩的优先级已经从有空再优化变成了从一开始就要考虑。现在的LLM部署几乎离不开量化——4bit、8bit量化已经成了推理引擎的默认配置剪枝在结构化稀疏和MoE稀疏两个方向上都有了新内涵蒸馏则变成了最热门的研究方向之一比如把大模型的能力蒸馏到小模型上让7B、13B的模型逼近70B的效果。可以看到当年腾讯分享的三大技术路线不但没过时反而成了今天基础设施级的存在。5.2 最优化算法在LLM时代的分量大模型训练的基础设施比2018年复杂了好几个数量级但最优化问题依然是核心瓶颈之一。LLM训练经常面临loss尖峰loss spike问题训练到某个step突然loss暴涨然后慢慢恢复这种不稳定通常与优化器的自适应步长、batch size太大、数据分布变化有关。现在业界普遍采用的策略包括用AdamW做base优化器配合warmup、cosine decay、gradient clipping、以及动态调整batch size。张量并行、流水线并行的分布式拓扑里同步策略的选择依然直接影响训练效率。说实话2018年那套关于Lipschitz光滑性、步长动态调整、梯度同步的底层认知今天一点都没过时反而更重要了。5.3 机器学习在AI Lab的位置应用研究与基础研究的跷跷板最后聊聊机器学习这个看似宽泛的方向在AI Lab里到底承担什么角色。AI Lab做机器学习研究和高校做机器学习研究有本质区别。高校可以为了一个理论问题争论三五年但企业的实验室必须同时回答一个问题这个研究能帮到公司什么业务所以腾讯AI Lab在NeurIPS上讲的机器学习往往不是纯粹的统计学习理论而是那些能把论文成果转化为技术能力的中间层——比如统一的训练框架、可复用的模型组件、跨任务的迁移方法。这也解释了为什么腾讯当时会同时押注模型压缩和最优化算法模型压缩对应着业务侧模型要落地最优化对应着平台侧训练效率要提升这两头一拉一推中间的机器学习研究就有了明确的着力点。国内其他大厂的AI Lab的布局逻辑也大同小异。理解了这个动机你就知道看AI Lab的论文时该关注什么——不只看理论创新更要看它有没有实际应用落地的可能性。6. 看完这篇文章你接下来该做什么内容聊得差不多了最后给不同阶段的读者一些具体建议。如果你还在入门阶段正在刷吴恩达或者李宏毅的课程、看西瓜书、备考期末那这篇文章里有几个词你不需要深究——Lipschitz常数可以先放一放分布式训练也暂时不用碰。你目前最该做的是把机器学习七步流程走一遍亲手完成一个线性回归或逻辑回归项目把数据清洗、特征处理、模型训练、评估这些基本动作练熟。优化器可以先记住一句话默认用Adam效果不好换SGD试试。如果你是已经在做项目的工程师我建议你从模型压缩入手把你手头正在跑的模型做一次量化至少能感知到推理速度的变化。然后找一个小模型做剪枝实验画一画各层的敏感度曲线这个动手过程比读十篇综述都管用。最优化算法这块花半天时间把你项目里的优化器、learning rate、weight decay、gradient clipping参数全部梳理一遍做一个简单的消融实验你会发现很多精度问题其实不是模型结构问题而是优化配置没调对。如果你是研究向的读者最优化领域的争议至今没有完全收敛Adam及其变体为什么在大模型上work得这么好理论解释还是开放的。模型压缩和知识蒸馏在生成式模型上的新形态也是好方向。最后分享一个我的个人习惯每年学术顶会放榜后不急着读全部论文先找几家有代表性的实验室或者公司的技术博客看看他们怎么解读自己录用的论文。这个动作比你自己盲扫几百篇论文的效率高得多。NeurIPS 2018的腾讯这篇算是比较典型的一次——三大热点每个都值得你花时间深挖下去。
返回列表