前言
学习深度学习这一年,我一直默认一个常识:模型越大,参数越多,训练越重,效果越好;从小模型到大模型,我们似乎都在这条"堆参数、堆算力"的路上狂奔;直到我看到一篇论文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% 的准确率,我觉得这个方向本身是对的;