可学习标量的设计哲学:结构如何赋予参数以语义¶
Part I · 立论¶
§1 一个被忽视的设计原则¶
读深度学习论文时,作者常常说"参数 \(\sigma_k\) 表示任务的不确定性"、"\(\gamma\) 表示可学习的尺度"、"\(\alpha_{ij}\) 表示 token 间的注意力权重"。这些说法我们往往不加质疑地接受。但如果认真追问一句——"凭什么它表示这个?"——会发现答案并不显然。
一个可学习参数在计算图里就是一个浮点数,神经网络不认识它叫什么名字,优化器也不在乎它的语义。它会沿着梯度下降的方向一路往前走,走到哪里停下来,完全取决于它出现在损失函数/架构中的位置。
这篇专题的核心论点是:
可学习参数的语义不是它内在拥有的,而是被损失函数与架构的结构强制赋予的。
这个观察看似朴素,却是深度学习方法设计的底层原理。理解了它,读一篇新方法的论文时就不再只是"记住作者的叙事",而是能直接看穿"这个结构为什么能让参数获得作者说的语义"。
§2 三个子命题¶
命题 A:命名不等于语义。 给参数起名为 \(\sigma\) 或 \(\mu\),并不会让它自动成为方差或均值。没有结构支撑的命名只是文字游戏。
命题 B:结构决定稳态。 参数会停在哪里,完全由它在损失函数中出现的位置决定。"对这个参数求导为零"这个方程的解,就是它的归宿。
命题 C:约束防止作弊。 如果一个可学习参数没有反向约束,它会自动朝让损失变小的极端值漂移(通常是 \(\pm \infty\) 或 \(0\)),彻底破坏预设的语义。好的设计一定要在两个方向上都有力量把它拽回来。
§3 通用的四步设计法¶
把"想让某参数表达某语义"的愿望落地为一个可训练的设计,可以归纳为四步:
第一步,设定目标语义。 例如"希望参数 \(p\) 代表任务的噪声水平"。
第二步,翻译成数学稳态方程。 把"\(p\) 是噪声"精确化为"\(p\) 的稳态值等于某个可计算量"。
第三步,设计损失结构。 构造一个损失项或架构位置,使得"对 \(p\) 求导为零"的解恰好是第二步的稳态方程。
第四步,检查两端的漂移。 审视 \(p \to 0\) 和 \(p \to \infty\) 两种极端情况下损失的行为。如果两端都被惩罚,参数会被夹在中间的稳态值上;如果只有一端被惩罚,参数会朝未被惩罚的那端漂移,语义就垮了。
下面用四个经典案例走一遍这个设计法。每个案例都严格按"想要什么 → 怎么结构化 → 稳态是什么 → 作弊怎么被堵住"四拍推进。
Part II · 四个经典案例¶
§4 LASSO:最早、最纯、最干净的范式¶
文献来源: Tibshirani, R. (1996). Regression Shrinkage and Selection via the Lasso. Journal of the Royal Statistical Society, Series B, 58(1): 267–288.
① 想要什么语义
希望回归系数向量 \(w \in \mathbb{R}^d\) 中的每一个 \(w_j\) 表示"第 \(j\) 个特征的重要性",并且不重要的特征对应的 \(w_j\) 自动变成严格的 \(0\)(稀疏性)。
② 怎么结构化
在最小二乘损失上加一个 \(L_1\) 正则项:
其中 \(\lambda > 0\) 是正则强度。
③ 稳态推导
\(L_1\) 范数在 \(w_j = 0\) 处不可导,需要用次梯度分析。对 \(w_j\) 求偏导,令其为零:
其中次微分 \(\partial |w_j| = \text{sign}(w_j)\)(当 \(w_j \ne 0\)),或 \(\in [-1, 1]\)(当 \(w_j = 0\))。
为简化,考虑特征已标准化(即 \(X_j^\top X_j = 1\))、其他分量固定时对 \(w_j\) 求解。设 \(z_j = X_j^\top (y - X_{-j} w_{-j})\) 为其他特征残差与 \(X_j\) 的相关度,稳态条件化简为:
这正是软阈值算子 \(\mathcal{S}_\lambda(z_j)\)。
这个稳态的含义非常精确:只要特征 \(j\) 与残差的相关度绝对值不超过 \(\lambda\),它的系数就被严格压到 \(0\);只有相关度足够显著,\(w_j\) 才非零,且非零幅度被 \(\lambda\) 削减一截。"特征重要性"和"稀疏性"两个语义同时由这个稳态方程实现。
④ 作弊怎么被堵住
如果去掉 \(L_1\) 正则,单靠主 loss,\(w\) 只会朝"拟合残差最好"的方向走,没人逼它变稀疏,所谓"特征重要性"就没有机制保证。如果反过来只留 \(L_1\)、去掉主 loss,\(w\) 会直接塌缩到 \(0\),语义也垮了。
正是"主 loss 拉它起来,\(L_1\) 压它归零"这对力量的拉扯,把 \(w_j\) 夹在软阈值的稳态上。LASSO 是"结构赋予语义"这个原理最纯粹的例子——没有概率模型,没有贝叶斯叙事,就是两个损失项互相拉扯的结果。
§5 Batch Normalization 的 \(\gamma, \beta\):反向设计范式¶
文献来源: Ioffe, S., & Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML 2015. arXiv:1502.03167.
① 想要什么语义
这个案例有意思的地方在于它反着来。作者先做了一件"破坏表达能力"的事——把每层激活归一化成零均值、单位方差——然后引入两个可学习标量来"选择性恢复"这个能力。希望 \(\gamma\) 代表"可学习的尺度",\(\beta\) 代表"可学习的偏移"。
② 怎么结构化
对每个神经元(或每个通道)的激活 \(x\),先在 mini-batch 内标准化:
然后过一个仿射变换:
\(\gamma\) 和 \(\beta\) 是每个通道独立的可学习标量,随网络权重一起被主 loss 更新。
③ 稳态推导
注意此处没有正则项直接作用在 \(\gamma, \beta\) 上,稳态也不是一个闭式解,而是一种表达能力的恢复性质。原论文的关键论证是:
如果最优策略是让 \(y = x\)(即不需要归一化),模型可以通过令 \(\gamma = \sqrt{\text{Var}[x] + \epsilon}\)、\(\beta = \mathbb{E}[x]\) 精确实现这一点。因此 BN 引入的归一化不会损失任何表达能力,最坏情况下模型可以"学回原来"。
这个论证的数学意义是:可学习仿射 \((\gamma, \beta)\) 把"归一化层"的假设空间从"被锁死的零均值单位方差"扩展回"任意仿射分布",两端的极限都被覆盖。梯度下降会根据数据自动决定——是让 \(y\) 保持近似归一化(\(\gamma \approx 1, \beta \approx 0\)),还是让它恢复到某个非归一化分布(其他值)。
④ 作弊怎么被堵住
这个案例里,"约束"不以正则项的形式出现,而是以架构位置的形式出现——\(\gamma, \beta\) 只作为最后一层仿射系数出现一次,既不会独立控制损失的大小,也不存在让主 loss 趋于无穷的作弊路径。它们的更新完全由"这个通道当前激活应该长什么样才对下游任务最有利"驱动。
这个案例对应命题 B 的一个深刻推论:结构位置本身就可以充当约束。不需要显式的正则项,只要参数出现的位置不允许它独立决定损失大小,它就不会漂移到极端值。
§6 VAE 的 \(\mu, \sigma\):概率推导范式¶
文献来源: Kingma, D. P., & Welling, M. (2014). Auto-Encoding Variational Bayes. ICLR 2014. arXiv:1312.6114.
① 想要什么语义
希望编码器输出的两个向量 \(\mu(x) \in \mathbb{R}^d\) 和 \(\sigma(x) \in \mathbb{R}^d_{>0}\) 真正成为后验分布 \(q_\phi(z|x) = \mathcal{N}(\mu, \text{diag}(\sigma^2))\) 的均值和标准差。
② 怎么结构化
VAE 的损失是证据下界(ELBO)的负值:
先验取标准高斯 \(p(z) = \mathcal{N}(0, I)\)。采样 \(z\) 时用重参数化技巧 \(z = \mu + \sigma \odot \epsilon\),\(\epsilon \sim \mathcal{N}(0, I)\),保证梯度可以流过。
③ 稳态推导
两个高斯之间的 KL 散度有闭式:
只看 KL 项对 \(\sigma_j\) 求导:
如果仅有 KL 项,稳态是 \(\sigma_j = 1\)(先验的标准差);对 \(\mu_j\) 求导得 \(\mu_j\),稳态是 \(\mu_j = 0\)。也就是说,KL 项单独想把后验压回先验。
但重建项会反向拉扯。重建项希望 \(\mu\) 和 \(\sigma\) 携带关于 \(x\) 的充分信息,尤其希望 \(\sigma\) 尽量小,让采样噪声不干扰重建。对 \(\sigma_j\) 的梯度方向与 KL 项相反。
最终稳态是两个力量的平衡:
在这个平衡点上,\((\mu, \sigma)\) 恰好就是"在重建质量与后验平滑性之间最优权衡的高斯后验参数"。这个解对应真实后验 \(p(z|x)\) 在高斯族内的最优变分近似——严格的贝叶斯最优。
④ 作弊怎么被堵住
\(\sigma \to 0\):KL 项中的 \(-\log \sigma^2\) 爆炸,阻止后验崩塌到 delta 分布。 \(\sigma \to \infty\):KL 项中的 \(\sigma^2\) 爆炸,阻止后验无限扩散。 \(\mu \to \infty\):KL 项中的 \(\mu^2\) 爆炸,阻止均值漂移。
三个方向的作弊路径都被 KL 项堵死,\((\mu, \sigma)\) 被牢牢锁在有意义的后验参数空间里。
VAE 是"由概率模型严格推出损失结构"的典范。\((\mu, \sigma)\) 获得后验语义不是任何近似或启发,而是变分推断数学结构的必然结果。
§7 Uncertainty Weighting 的 \(\sigma_k\):自适应加权范式¶
文献来源: Kendall, A., Gal, Y., & Cipolla, R. (2018). Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics. CVPR 2018. arXiv:1705.07115.
① 想要什么语义
希望每个任务 \(k\) 对应一个可学习标量 \(\sigma_k\),它反映该任务标签的同方差噪声水平,并据此自动对任务损失加权。噪声越大的任务权重越小,避免它主导训练。
② 怎么结构化
对每个任务引入一个可学习的 \(\sigma_k\)(实践中参数化为 \(s_k = \log \sigma_k\) 以保证正值),总损失写作:
这个形式来自回归任务的高斯最大似然推导:若假设 \(y_k \sim \mathcal{N}(f_k(x), \sigma_k^2)\),则 \(-\log p(y_k|x) = \frac{1}{2\sigma_k^2}\|y_k - f_k(x)\|^2 + \log \sigma_k + \text{const}\),累加即得上式。
③ 稳态推导
固定其他参数,对 \(\sigma_k\) 求导:
令其为零:
稳态意义非常具体:\(\sigma_k^2\) 追踪任务 \(k\) 的当前 loss 值。训练收敛时 \(\mathcal{L}_k\) 趋近其不可约减下限(即标签噪声水平),\(\sigma_k^2\) 也同步稳定在这个值上。
代入稳态,每个任务在总损失中的加权贡献是:
所有任务对总梯度的加权贡献都被拉到 \(\frac{1}{2}\),与原始 loss 量级无关。这就是"自动均衡"的数学本质。
④ 作弊怎么被堵住
\(\sigma_k \to \infty\):\(\log \sigma_k\) 趋向正无穷,惩罚无限大。 \(\sigma_k \to 0\):\(\frac{1}{2\sigma_k^2}\mathcal{L}_k\) 趋向正无穷。
两端都被堵住,\(\sigma_k\) 被夹在 \(\sqrt{\mathcal{L}_k}\) 附近。
UW 的设计哲学与 VAE 异曲同工——都是从概率模型推出损失结构、让参数自然获得概率意义上的语义。不同的是 VAE 的 \(\sigma\) 是数据依赖的(异方差),UW 的 \(\sigma\) 是任务级的常数(同方差)。
Part III · 对照与反思¶
§8 UW vs GradNorm:同一目标的两种设计哲学¶
文献来源: Chen, Z., Badrinarayanan, V., Lee, C.-Y., & Rabinovich, A. (2018). GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks. ICML 2018. arXiv:1711.02257.
UW 和 GradNorm 要解决的都是"多任务损失自动加权",两者都引入了可学习的任务权重,但设计思路完全不同。这组对照非常能说明"结构决定稳态"。
UW 的权重参数 \(\sigma_k\) 藏在主损失里,是主 loss 结构自然推出来的副产品。它追踪的是任务标签噪声——稳态值反映的是"这个任务再也学不下去的底"。
GradNorm 把权重 \(w_i\) 显式地摆在主损失前,并额外设计一个独立的辅助损失 \(\mathcal{L}_{\text{grad}}\) 来训练这些 \(w_i\)。\(\mathcal{L}_{\text{grad}}\) 的设计目标是让每个任务在共享参数上的梯度范数满足:
其中 \(\bar{G}(t)\) 是所有任务的平均梯度范数,\(r_i(t)\) 是任务 \(i\) 相对于整体的"训练速度"(用当前 loss 与初始 loss 的比值衡量),\(\alpha\) 是唯一的超参。直观地说,GradNorm 让训练得慢的任务获得更大的梯度范数,从而追上其他任务的训练速度。
两者的本质差异可以用一张表说清楚:
| 维度 | UW | GradNorm |
|---|---|---|
| 语义来源 | 贝叶斯噪声假设 | 梯度动态匹配 |
| 权重稳态 | \(\sigma_k^2 = \mathcal{L}_k\)(任务损失底) | \(\|g_i\| \propto \bar{G} \cdot r_i^\alpha\)(梯度范数平衡) |
| 损失结构 | 主损失内嵌权重 | 主损失 + 独立辅助损失 |
| 需要的信息 | 仅任务 loss 值 | 每任务对共享参数的梯度范数 |
| 超参 | 无 | 一个 \(\alpha\) |
| 计算开销 | 几乎为零 | 每步额外反向传播 |
关键洞察:"任务权重"这个概念在两种设计下获得了不同的语义。在 UW 中,"权重大"意味着"任务噪声小";在 GradNorm 中,"权重大"意味着"任务学得慢、需要加速"。两者并不等价——一个噪声小的任务可能已经学得很快(此时 UW 会给它大权重,GradNorm 反而会给它小权重)。
这正好验证命题 B:同一个可学习量在不同结构下会稳定到不同的值,获得不同的语义。所谓"方法的本质差异",往往不在参数本身,而在参数周围的结构。
§9 反例:失败的"可学习标量"设计¶
看过了成功的设计,对比几个会失败的设计更有助于内化命题 C。
反例一:无约束的加权求和。 把多任务损失写成 \(\mathcal{L} = \omega_1 \mathcal{L}_1 + \omega_2 \mathcal{L}_2\),让 \(\omega_1, \omega_2\) 可学习。\(\frac{\partial \mathcal{L}}{\partial \omega_1} = \mathcal{L}_1 > 0\),优化器会一路把 \(\omega_1\) 推向 \(-\infty\),总 loss 也跟着趋向 \(-\infty\)。两个"权重"变成了两个作弊通道。
反例二:正则太弱。 如果把 UW 的损失改写为 \(\frac{1}{2\sigma^2}\mathcal{L} + 0.01 \log \sigma\),正则项被缩到 1%。对 \(\sigma\) 求导得到 \(-\frac{\mathcal{L}}{\sigma^3} + \frac{0.01}{\sigma}\),稳态变成 \(\sigma^2 = 100\mathcal{L}\)。正则太弱时 \(\sigma\) 会显著偏离 \(\mathcal{L}\),"噪声估计"的语义失真。
反例三:同向的正则。 设计一个损失 \(\mathcal{L} = \sigma \cdot \text{MSE} + \sigma\),希望 \(\sigma\) 代表某种重要性。但 \(\frac{\partial \mathcal{L}}{\partial \sigma} = \text{MSE} + 1 > 0\),\(\sigma\) 会一路被推向 \(-\infty\)。两项对 \(\sigma\) 的梯度方向一致,没有相互拉扯的力,所谓"重要性"就无从实现。
这三个反例都指向同一个教训:可学习参数必须同时面对"两端的惩罚"。只有一端被堵住,参数就会朝未被堵住的方向漂移。这是设计任何含可学习标量的方法时的基本检查项。
合上全篇¶
回到开头的论点:可学习参数的语义不是内在的,而是被结构赋予的。走过这几个案例会发现,深度学习里那些看起来精巧的设计,本质上都在做同一件事——
构造一个损失/架构结构,让某个可学习参数在优化过程中被自动逼向一个具有明确语义的稳态,同时在两个极端方向上都堵死它的作弊路径。
LASSO 用 \(L_1\) 正则的次梯度把 \(w\) 夹在软阈值上,让它获得"稀疏重要性"的语义。BatchNorm 用架构位置约束 \(\gamma, \beta\) 的作用范围,让它们获得"可学习尺度与偏移"的语义。VAE 用 KL 项的闭式结构把 \((\mu, \sigma)\) 夹在变分后验上,让它们获得严格的贝叶斯语义。UW 用 \(\frac{1}{2\sigma^2}\mathcal{L} + \log \sigma\) 把 \(\sigma\) 夹在 \(\sqrt{\mathcal{L}}\) 上,让它获得"任务噪声估计"的语义。
看穿这一层之后,读任何一篇带可学习参数的新方法,都可以先问四个问题:它想表达什么语义?结构怎么放?稳态在哪里?两端怎么堵? 这四个问题问完,方法就真正属于你,而不是停留在对作者叙事的转述上。
附录 · 权威文献¶
| 案例 | 作者 | 会议 / 期刊 | 年份 | arXiv |
|---|---|---|---|---|
| LASSO | Tibshirani | JRSS-B | 1996 | — |
| Batch Normalization | Ioffe, Szegedy | ICML | 2015 | 1502.03167 |
| VAE | Kingma, Welling | ICLR | 2014 | 1312.6114 |
| Uncertainty Weighting | Kendall, Gal, Cipolla | CVPR | 2018 | 1705.07115 |
| GradNorm | Chen, Badrinarayanan, Lee, Rabinovich | ICML | 2018 | 1711.02257 |