正则化应加在损失函数还是神经网络层?Keras中最终损失如何计算
正则化使用位置与多层不同正则下的损失计算疑问
- 理论认知:正则化项需要与损失函数结合,共同构成模型的优化目标,参考示意图:

- 代码实现差异:使用Keras搭建网络时,正则化通常是直接配置在具体网络层上的,示例代码如下:
from keras import regularizers model.add(Dense(64, input_dim=64, kernel_regularizer=regularizers.l2(0.01))) model.add(Dense(28, input_dim=64, kernel_regularizer=regularizers.l1(0.05)))
- 核心疑问:不同网络层分别配置L1、L2正则化时,模型最终的损失函数是如何计算的?
解答
两种表述没有本质矛盾,Keras把正则化配置在层上只是工程实现上的便捷封装,最终训练用的总损失依然是「任务本身的损失 + 所有正则项惩罚值」的和,计算逻辑非常清晰:
- 第一步计算任务基础损失:也就是你在
model.compile()阶段指定的损失函数(比如分类任务的交叉熵、回归任务的MSE)在当前batch上的计算结果,这部分和正则化配置无关。 - 第二步逐层计算正则惩罚值:每一层配置的正则化器只会针对当前层的对应参数计算惩罚,你代码中使用的
kernel_regularizer默认只惩罚层的权重矩阵,不包含偏置参数:- 第一个64单元Dense层配置了系数0.01的L2正则,对应惩罚值为
0.01 * 该层权重矩阵所有元素的平方和 - 第二个28单元Dense层配置了系数0.05的L1正则,对应惩罚值为
0.05 * 该层权重矩阵所有元素的绝对值之和
- 第一个64单元Dense层配置了系数0.01的L2正则,对应惩罚值为
- 第三步加和得到总损失:把所有层计算得到的正则惩罚值全部累加,再和第一步得到的任务基础损失相加,最终结果就是反向传播时用来更新参数的优化目标。
举个直观的计算示例:如果某个训练batch上计算得到的交叉熵基础损失是0.8,第一层L2正则的惩罚值是0.03,第二层L1正则的惩罚值是0.07,那当前步模型用来优化的总损失就是 0.8 + 0.03 + 0.07 = 0.9。
这种层级别配置正则的设计纯粹是为了使用灵活:你可以随意给不同层设置不同类型、不同惩罚系数的正则,甚至可以单独给偏置、层输出值加正则,不需要手动在总损失函数里拼接大量正则项,底层逻辑和理论学习中“正则项加在损失函数上”的定义完全一致。
内容的提问来源于stack exchange,提问作者kowser66
相关产品推荐
相关产品推荐

