参数压缩 500 倍还能涨点?Mapping Networks 让我重新思考“训练“的定义 前言学习深度学习这一年我一直默认一个常识模型越大参数越多训练越重效果越好从小模型到大模型我们似乎都在这条堆参数、堆算力的路上狂奔直到我看到一篇论文Mapping Networks核心思想是与其直接优化神经网络的数百万参数不如只优化一个低维潜向量 z让固定的 Mapping Network 去生成目标网络的全部权重实验的结果也确实是给力他们在 ImageNet-1K 上把 ResNet-50 的待训练参数从 25.6M 压到0.05M压缩近 500 倍Top-1 精度不仅没掉反而比原版全参数训练还高了 0.3%在 CIFAR-100 上ResNet-18 压缩 200 倍后精度反超基线 1.2%这让我开始重新思考一个问题我们过去所谓的训练到底是在训练什么抱着这个疑问我想复现一遍论文的内容虽然这篇论文没有开源代码但是论文的内容也是比较的详细所以我花了几天尝试复现其中几个指标的内容【叠甲声明】博主还在学习阶段若有错误请大家在评论区指出喜欢的本文章的可以点赞关注支持博主前人的痛点我们到底在训练什么传统神经网络训练是这样的输入 x → 神经网络 fθ → 输出 y训练时直接更新 θ(θ 就是网络里的所有参数比如卷积核、线性层权重、bias 等)现在有一个问题θ 很大假设一个模型有 1 亿参数那么训练时就是在一个 1 亿维的空间里找最优解那么一定会带来以下的问题痛点一可训练参数太多训练成本高参数越多训练时需要保存的梯度、优化器状态、显存、计算量都会变大像那种不只是保存参数本身还要保存动量的优化器例如Adam训练显存压力会更大痛点二参数空间太大容易过拟合参数越多模型表达能力越强但也更容易把训练集里的噪声、偶然规律记住这个也就是我们常说的过拟合痛点三直接在高维权重空间里搜索可能很浪费传统训练相当于在完整参数空间里搜索但作者提出一个假设训练好的网络参数其实不一定散布在整个高维空间里而可能落在一个更低维、更平滑的“参数流形”上举个例子就是表面上模型有 100 万个参数但真正有用的变化自由度可能远远小于 100 万论文定位Mapping Network 站在哪论文的第一张图片作者把所有压缩参数的所有方法分为4大类左上角是训练完再压缩比如剪枝、量化先完整的训练完百万参数再删除没有用的参数训练阶段的算力是一点都没有省右上角是训练中加约束比如低秩分解还是直接操作原始的高维权重只是给权重增加了限制右下角是外部生成全权重比如超网络用一个小网络去生成一个大网络的权重但是问题是两个网络要同时训练还是绕不开高维的参数优化而Mapping networks是站在一个独一无二的位置目标的大网络全程是不参与任何的训练从头到尾只是优化一个维度及低的隐向量网络的架构图整一个网络只有最左部分长度为d的隐向量可以训练d的大小通常是几百到几千维度所有梯度和反向传播最后只会更新这个部分的维度目标大网络的权重是完全固定的这个就是与传统的超网络最大的区别映射网络本身的权重是正交初始化的全程固定且不训练那如何让他有表达能力用隐向量z做加性调制给映射网络的每一个权重添加一点隐向量对应维度的一些数值那么实际上会有一个疑问这样的话为什么不直接训练映射网络后面的消融实验最后发现这样做不行不仅参数量爆炸还会有严重的过拟合接着经过一层激活就能输出一长串的扁平化权重再按目标网络各层的尺寸切分变形就能还原出大网络的卷积层全连接参数推理的时候目前网络用这些参数进行一个前向传播就行核心思想一个向量 z画出整个网络核心思路接训练目标网络的全部参数而是训练一个很小的 latent vector再用一个 Mapping Network 把这个小向量映射成完整网络权重从以前直接训练 θ到训练 z 让 z → Mapping Network → 生成 θ潜空间到底是什么?对于许多生成式ai算法我们都可以看见潜空间一词官方定义是一个低维向量它编码了生成某个高维对象所需的所有关键信息那么作用也就很明显是把庞大且冗余的高维信息压缩到紧凑且结构化的低维空间在 Mapping Networks 里z 是怎么画出整个网络的整个系统可以拆成三个模块但真正被梯度更新的只有一个。z 是一个可训练的低维向量在 MNIST 上只有64 维在 CIFAR-100 上也只有128 维。它是整个系统唯一携带梯度的参数其余所有模块——Mapping Network 和目标网络——都不直接参与训练z 进入 Mapping Network 后首先触发的是加性调制。Mapping Network 的权重 W 是正交初始化且全程固定的但 z 会对这些固定权重做微调每个 zᵢ 按一个微小比例 α加到 W 的对应维度上即 wᵢⱼ ← wᵢⱼ α·zᵢ。z 变一点Mapping Network 的加工方式就变一点但 W 本身从不积累梯度经过调制后的 Mapping Network 输出一个高维向量 θ̂其维度等于目标网络的总参数量。θ̂ 被 reshape 为目标网络各层的卷积核和偏置然后目标网络用这些临时生成的权重执行一次完整的前向传播输出预测 ŷ 并计算损失。反向传播时梯度从损失回流经过目标网络、经过 Mapping Network最终只落到 z 上。θ̂ 本轮用完即弃下一轮用更新后的 z 重新生成为什么只训练 z效果反而更好这就回到了论文的立论之本权重流形假设作者做了一个实验追踪 MNIST 训练过程中网络各层参数的更新轨迹用 PCA 降维后发现——参数并不是在 6 万维空间里乱逛而是沿着一条光滑、低维的曲线在走 这就好比一只蚂蚁在一张纸上爬虽然纸是三维的卷起来但蚂蚁的轨迹其实是一维的这意味着能正确分类 MNIST 的好权重其实全部躺在某个低维流形上。我们以前的做法是在整个 6 万维空间里大海捞针而 Mapping Networks 的做法是直接学会在这个蚂蚁轨迹上定位——z 就是这个低维流形上的坐标训练策略针对不同大小的网络作者设计两种不同的训练方式左边是单隐向量训练一个隐向量生成整个网络的所有参数小网络用起来非常方便简介本质上就是共享全局z但是在大网络中由于固定映射矩阵的内存占用大因此用分层训练方式每一层单独配一个更小的隐向量内存的开销减少了近10倍论文中最好的结果基本上使用这个方式跑出来的本质上就是分层独立z隐射损失函数只靠任务的损失训练很容易把隐空间训练得乱七八糟不符合流形得光滑性因此作者设计了一个四项结合的映射损失内容复现为了验证 Mapping Networks 的核心思想我们尝试复现Mnist数据集的指标这个结论可以看出在只训练约1% 参数量的情况下模型仍然达到了普通 CNN 的接近效果在复现的过程中一开始单纯使用 frozen mapping 的效果并不高 后续通过加入权重调制、分块低秩生成和训练策略优化准确率逐步提升不同参数下的实验结果可以看到随着可训练 latent 参数量增加准确率整体上升。这说明复现实验中的 scaling trend 和原论文是一致的低维 latent 参数越多能够表达的目标网络参数空间越丰富最终分类性能越好山月小总结以前学深度学习我总觉得参数越多越好模型越大越强 但复现完这篇论文我越来越觉得不是所有参数都值得你去练。你想一个网络几十万个参数真的每个数字都有用吗Mapping Networks 的实验告诉我——可能真正起决定作用的只是其中很少很少的一部分以前的做法是把所有参数摊开一个一个调但它的思路是先找到那一小撮真正管用的参数只练它们剩下的让规则自动生成所以我现在对训练的理解变了不是练得越多越好而是练得越对越好找到真正有用的那一小部分直接优化它们剩下的交给生成规则——这可能才是更正确的方向虽然复现得不算完美和论文还有接近 2% 的差距但只用 1% 的参数就能干到 97% 的准确率我觉得这个方向本身是对的