1. 深度学习中的正则化技术概述
在深度学习模型训练过程中,过拟合(overfitting)是一个常见且棘手的问题。当模型在训练集上表现优异但在测试集上表现不佳时,我们就遇到了过拟合。正则化技术正是为了解决这一问题而诞生的利器。今天我将带大家深入探讨两种最常用的正则化方法:L2正则化和Dropout,并分享如何从零开始实现它们。
重要提示:理解正则化的核心在于掌握其如何影响模型的训练过程。L2正则化通过直接修改损失函数来工作,而Dropout则通过改变网络结构本身来发挥作用。
作为从业多年的深度学习工程师,我发现很多初学者对正则化的理解停留在表面。本文将带你从理论推导到代码实现,完整走一遍正则化的实践之路。我们不仅会使用PyTorch的现成接口,更重要的是会从最基础的"裸代码"开始实现,这对深入理解算法原理至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. L2正则化的原理与实现
2.1 L2正则化的数学原理
L2正则化,也称为权重衰减(Weight Decay),是在原始损失函数的基础上添加一个与权重平方成正比的惩罚项。其数学表达式为:
L' = L + λ/2 * ||w||²
其中:
- L是原始损失函数
- λ是正则化系数(超参数)
- ||w||²表示所有权重的平方和
这个简单的修改带来了深远的影响:
- 它惩罚过大的权重值,促使权重趋向于较小的绝对值
- 它提高了模型的泛化能力,减少了过拟合风险
- 它相当于在贝叶斯框架下对权重施加了高斯先验
在实际应用中,λ的选择至关重要。λ太小可能无法有效防止过拟合,λ太大又会导致模型欠拟合。根据我的经验,通常从0.001到0.1之间开始尝试比较合适。
2.2 从零实现L2正则化
让我们先用最基础的Python代码实现L2正则化,不依赖任何深度学习框架的高级功能。这种方式虽然原始,但对理解底层原理非常有帮助。
python复制%matplotlib inline
import torch
import numpy
from torch import nn
from d2l import torch as d2l
# 准备数据
n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)
# 初始化权重
def init_weights():
w = torch.normal(0, 0.1, true_w.shape, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
return w, b
# L2
