我最早训练卷积网络的时候,遇到过一个让我困惑了很久的现象:把每层的卷积核数量从32加到256,训练loss肉眼可见地往下掉,但验证集准确率几乎没变;反过来,把网络层数从3层加到18层,loss一开始根本不动,费了很大力气调学习率才勉强降下去。那时候我一度觉得:深模型就是个骗局,宽模型才是王道。

后来读了 Wide Residual Networks 这篇论文,我才意识到,宽和深根本不是同一个维度的东西。宽度决定了模型的优化难易,深度决定了模型的表达上限。
万能逼近定理没什么用?它说的是另一件事
很多人知道单层隐藏层网络可以逼近任意连续函数——这是 万能逼近定理。我最早听说时第一反应是:那还要深度学习干嘛?一个足够宽的隐藏层不是就够了吗?
问题出在“足够宽”三个字上。这个定理只说了存在一个宽度有限的网络能逼近目标函数,它没有告诉你这个宽度需要多大,也完全没有保证梯度下降能找到那个网络的参数。事实上,你随机初始化然后训练,几乎不可能落进那个理想的参数区域。
宽模型“容易训”不是错觉:在参数空间里,宽网络的损失曲面通常更平滑,梯度下降更容易找到可行的下降路径。
为什么宽模型更容易训练?因为损失曲面更平
Wide Residual Networks 的作者做了一个关键实验:在 CIFAR-10 上,固定参数量,把网络做宽(减少层数、增大卷积核数量)比做深(增加层数)收敛得更快,最终准确率也更高。他们发现,宽网络的 损失曲面更平滑,而深网络的损失曲面更崎岖。
为什么宽了就更平滑?你可以想象一下:宽度增加,相当于每个隐藏层里有更多神经元同时处理输入。这些神经元各自提取不同特征,它们之间的耦合较弱,梯度在反向传播时可以绕开某个梯度接近零的神经元,从其他分支继续传播。而深度增加,梯度必须依次穿过每一层的矩阵乘法。每个矩阵乘法的奇异值都可能小于1,层数一多,梯度就像被反复打折的钱,越传越少,最后前面几乎学不到东西。
用一个步骤看清梯度是怎么消失的(以深层网络为例):
- 损失函数对最后一层输出求梯度。
- 梯度要依次乘以前面每一层的权重矩阵和激活函数的导数。
- 激活函数导数通常小于1(比如sigmoid最大只有0.25),反复乘30次就是0.25^30,直接变成天文数字级别的小数。
- 前面层的参数更新量接近零,训练几乎停滞。
这就是为什么原始深度网络很难训,直到 ResNet 用残差连接把梯度“抄近道”传回去,深度才终于变得可行。
那还要深度干什么?表达能力是数学上的指数差距
如果你认为宽模型又容易训、效果又好,那为什么今天最强模型仍然很深?答案在于:参数量相同的情况下,深度可以指数级提升网络的表达能力。
On the Expressive Power of Deep Neural Networks 这篇论文证明了一个有点反直觉的结论:要表示某些函数,宽度有限的深度网络需要的参数,是指数级多于一个适度深度的网络。换句话说,深度网络可以把复杂函数分解成一层层的简单变换,宽度网络只能把所有变换塞进一层里,导致每个神经元要承载的信息太多,参数效率极低。
更直观地说,深模型的每一层是在学习不同抽象层次的特征。拿图像识别举例:第一层只能看到边缘和颜色,中间层能组合出纹理和局部形状,最后阶段才拼出“眼睛”或“轮子”这样的高层概念。单层宽网络无论如何宽,都只能做一步从像素到类别的映射,中间过程完全被压缩掉了。
这也是为什么同样参数量下,深模型在复杂任务上的泛化往往更好——它学到的特征结构更像人类理解的层级关系,而不是一张巨大的查表。
一张表看清宽与深的所有区别
| 维度 | 宽模型(增加每层神经元) | 深模型(增加层数) |
|---|---|---|
| 训练难度 | 低,损失曲面光滑,梯度容易找到方向 | 高,梯度消失/爆炸,需要残差连接、归一化等技巧 |
| 参数效率 | 低,需要更多参数才能表达等价函数 | 高,同样参数下可以表达更复杂的函数 |
| 表达能力 | 有限,缺乏特征层次的组合 | 强,可以逐层抽象,指数级更高效 |
| 泛化能力 | 容易过拟合,但配合正则也能做 | 通常更好,因为特征结构更合理 |
| 硬件利用 | 容易并行化,训练速度快 | 串行依赖,难以充分并行,但推理时开销较小 |
平坦极小值:宽模型的隐形buff
深度学习里有个经典争论:尖锐的极小值容易过拟合,而平坦的极小值泛化更好。宽模型的损失曲面平坦,因此不仅容易训,而且泛化未必差。这其实是一个反直觉的结论——我们总以为参数越多越容易过拟合,但平坦性改变了这件事。
你可以把泛化想象成在地图上找目标:窄而尖的极小值像针尖,稍微偏一点就从“山顶”掉下去,测试时一偏移就失效。宽的极小值像高原,即使有扰动,也能停留在低损失区域。宽模型倾向于收敛到这样的高原,因为它的参数量多,各个方向上的冗余使得损失面被“压平”了。
我踩过的一个坑:以为宽模型一定过拟合
我最开始总觉得,把网络做宽等于加参数,加参数就会过拟合。直到 WRN 论文里做了大量实验,宽模型在加了一定的 dropout 之后,不仅不过拟合,错误率甚至低于窄而深的网络。他们在 CIFAR-10 上的结果很惊人:一个 16 层的宽残差网络,错误率 4.27%,超过了当时 1001 层残差网络的 4.62%,而且训练时间缩短了一个量级。
这个经历让我想通了一件事:模型的表达能力不等于它的优化难度。宽度是给优化器“修路”,深度是给模型“建楼”。你光建楼不修路,工人到不了高层;你光修路不建楼,只能盖平房。
如果你想自己验证,可以这样设计实验
- 固定一个总参数预算,比如100万参数。
- 设计一组宽模型:层数=3,每层神经元数从100到1000不等;设计一组深模型:每层神经元数=100,层数从3到30不等。
- 在同一个数据集上训练,记录同一步数的训练loss和验证loss。
- 观察宽模型的loss下降更快,但最终验证loss可能略差;深模型需要更多调参(学习率、初始化)才能掉loss。
这个实验我做过,结论和WRN论文一致:宽模型是“好调好用,上限有限”,深模型是“难调难用,上限更高”。
Transformer:宽与深的新战场
如果你觉得卷积网络里宽和深的问题已经够复杂了,那看看 Transformer。Transformer 的宽度就是 d_model,深度就是层数。在GPT等模型中,通常把宽度控制在1024、深度12层等。人们发现,宽度增加带来更大的表达空间,深度增加带来更长的上下文推理。两者都会增加计算量,但计算量的增长方式不同:宽度是矩阵乘法,可以高度并行(GPU友好);深度有串行依赖,只能顺序计算。因此,在GPU集群上,加宽往往比加深更容易扩大规模。
这解释了为什么早期Transformer模型倾向于“又宽又浅”,而到了GPT-4这类模型则变得“宽而深”——因为硬件的并行能力和训练技巧都在进步,深度的训练难度被缓解了。
FAQ:几个容易混淆的问题
是不是宽模型只需要随机初始化就够了?
不是。虽然宽模型的损失曲面更平滑,但它依然需要合适的初始化。而且宽度过大会导致大量神经元在早期输出相似,形成冗余。实际上WRN论文也用了合适的初始化和dropout技巧。
深模型能不能通过加宽来弥补深度不足?
可以,但代价是参数量指数级上升。实验表明,加宽能更快提升训练速度,但到达一定程度后,继续加宽的收益递减。深度仍决定最终性能的上限。
为什么 Transformer 的宽度叫 d_model?
因为它是每个 token 的表示维度,相当于隐藏层宽度。在 Transformer 里,加宽 d_model 和加深层数都能提升效果,但加宽会更直接地增加并行计算量,加深则需要更细致的梯度管理。
我的最终判断
宽和深不是二选一。在资源有限时,我的建议是:先确保优化能跑通,再追求表达能力。具体来说,如果任务比较结构化(图像、语言),深度带来的层次抽象更重要,但一定要配合残差连接、层归一化这些“修路”手段。如果任务比较简单或数据量有限,一个适当宽的网络可能更快达到可用效果,堆深度可能浪费时间。
现代最有效的架构,比如 ResNet、Transformer,本质上都是宽深结合:宽度负责捕捉丰富的低层特征,深度负责把特征组织成高层语义。如果只能选一个,宽模型更容易训出结果,但天花板更低;深模型需要更多技巧,但上限更高。理解这一点,你在设计网络时就不会再盲目堆层数了。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/611.html