架构演化考点:经典卷积网络的代际突破、小卷积核堆叠的等价换算、残差连接的数学作用。通关标准:报出每代架构的关键创新,并用参数量与梯度两条线索解释"为什么这样设计"。上一关算清了单层卷积的账,本关把层与层串成整部演化史。
关卡一(单选):某代架构把大卷积核换成多层小卷积核堆叠,核心动机是:
A. 感受野不变的前提下参数更少、非线性更强 B. 计算速度一定更快 C. 不再需要池化层 D. 彻底避免过拟合
关卡二(计算):输入输出通道都是 C 的前提下,用两层三乘三卷积替代一层五乘五卷积,感受野与参数量各怎么变?
关卡三(简答):残差连接解决什么问题?用梯度语言解释它为什么有效。
关卡四(多选):某代架构在大赛上带火的训练技术包括:
A. 用修正线性单元替换饱和激活,缓解梯度消失 B. 随机失活抑制全连接层过拟合 C. 用图形处理器做大批量并行训练 D. 把损失函数改成绝对值损失
关卡一选 A。 两层三乘三堆叠的感受野与一层五乘五相同(都是看五乘五区域),但参数从二十五倍 C 平方降到十八倍 C 平方,且中途多过一次非线性激活——表达能力强了、参数反而省了。B 错在实际运行速度还要看显存访问与实现优化,层数加深不一定更快;C 错在池化与卷积核尺寸是两码事;D 错在过拟合靠正则化与数据手段控制,换核尺寸不是解药。
关卡二:感受野持平——两层三乘三逐层外扩后恰好覆盖五乘五;参数量从二十五 C 平方降到十八 C 平方,降幅近三成。算式:一层五乘五为 C 乘 C 乘五乘五 = 二十五 C 平方;两层三乘三为 C 乘 C 乘三乘三乘二 = 十八 C 平方。用代码把这笔账连同多通道情形一起算实:
# 小核堆叠的参数账:通道相同前提下对比(可笔算复核) def conv_params(cin, cout, k): return cin * cout * k * k C = 64 one_5x5 = conv_params(C, C, 5) two_3x3 = conv_params(C, C, 3) + conv_params(C, C, 3) print(f"一层 5x5: {one_5x5} 参数") # 输出: 一层 5x5: 102400 参数 print(f"两层 3x3: {two_3x3} 参数") # 输出: 两层 3x3: 73728 参数 print(f"省了 {(1 - two_3x3 / one_5x5) * 100:.1f}%") # 输出: 省了 28.0% # 换算到通道不同时的提醒:堆叠层若先降维再升维,参数还能再压 bottle = conv_params(C, C // 4, 1) + conv_params(C // 4, C, 3) + conv_params(C, C, 1) print(f"瓶颈结构(1x1-3x3-1x1): {bottle} 参数") # 输出: 瓶颈结构(1x1-3x3-1x1): 41216 参数
结果解读:同样的视野,参数账从十万级压到七万级,瓶颈结构再压到四万级——"降维再卷再升维"是后续所有重型骨干的标准省法。变式:三层三乘三的感受野是多少?答案是七乘七,外扩规律为每加一层视区单侧各外伸核半径,动手画格点图验证。
关卡三:残差连接解决"退化问题"——网络加深后训练误差不降反升,且这不是过拟合(训练集上就差),也不是梯度消失一种原因能完全解释的。残差块把层的学习目标从"拟合目标映射"改成"拟合残差":输出等于输入加上若干层的加工量。梯度语言看:输出对输入的导数里恒有一条数值为一的直通项,无论中间层学得多差,梯度都能原路直达浅层——深层网络至少退化成恒等映射,不会比浅层更差,加深从"赌博"变成"稳赚"。
# 残差直通项的梯度实验:有残差与无残差的单步梯度对比 import math # 设块函数 f(x) = 0.1 * x^2,其导数为 0.2x def grad_no_res(x): # 无残差:h = f(x),梯度只有 f 的导数 return 0.2 * x def grad_res(x): # 有残差:h = x + f(x),梯度 = 1 + f 的导数 return 1 + 0.2 * x print("x 无残差梯度 有残差梯度") for x in [3.0, 1.0, 0.3, 0.1, 0.01]: print(f"{x:<6} {grad_no_res(x):<12.4f} {grad_res(x):.4f}") # 输出: # x 无残差梯度 有残差梯度 # 3.0 0.6000 1.6000 # 1.0 0.2000 1.2000 # 0.3 0.0600 1.0600 # 0.1 0.0200 1.0200 # 0.01 0.0020 1.0020
结果解读:块函数学得越"平"(导数趋零),无残差的梯度越小、深层越学不动;有残差时梯度被直通项托底在一附近,深处的信号照样传得动。这条"常数底座"就是深层网络能堆到上百层的数学底气。变式:把块函数换成导数恒大于一的函数重跑,观察残差反而放大梯度——说明残差不是万能稳压器,它保证的是"下限",不是"恒定"。
关卡四选 A、B、C。 修正线性单元在正区导数恒为一,深层梯度不再被饱和区吞掉;随机失活训练时按概率暂时掐掉神经元,逼网络不依赖单一通路;图形处理器把卷积的大规模并行算力兑现成可训的深度。D 错在绝对值损失不是那次变革的内容,分类用的仍是交叉熵。
时间线读法:每一步都是"上一代的短板被下一代的某个具体设计化解"——深度渴望被算力与激活函数化解,参数浪费被小核堆叠化解,加深失效被残差直通化解。面试问"架构为什么这样演化",就按短板对设计的配对来答。
易错点一:把残差说成"解决梯度消失的唯一手段"。激活函数替换、归一化层、合理初始化都在对抗训练不稳定,残差的独特贡献是"恒等映射保底 + 梯度直通项",答题时把手段分层说清才显功力。
易错点二:以为残差分支增加大量参数。恒等分支是一条纯加法捷径,零参数零权重;多出来的只是主分支里的常规层。残差是罕见的"加深几乎不加账"的设计。
易错点三:以为大卷积核一定更强。同视野下大核参数更多、非线性更少,已被小核堆叠全面替代;但要注意后来的大核回潮发生在步幅与膨胀卷积配合的新语境下,机械套用"小核永远优"也会翻车。
变式一:问"随机失活在推理时要做什么"。答:推理时关闭随机失活,并对权重按训练时的保留概率缩放(或训练时就按反概率缩放),保证输出期望一致——只记得训练规则、不记得推理补偿,是高频扣分点。
变式二:问"归一化层为什么放在卷积后、激活前"。答:先把卷积输出的分布拉回稳定区间,再进非线性,避免激活过早饱和;顺序颠倒在多数场景可用但理论动机就散了。
复盘产出:决策卡"架构演化"一栏补齐:小核堆叠省参数、残差直通保梯度,两张底牌记牢。下一关进入任务层:骨干之上怎么定位目标、怎么用指标给自己验收,把视觉编队的大账算清。