L2正则化使得权值不至于过大,减小方差,减轻过拟合现象。weight decay是能减小方差,防止过拟合现象
Weight decay(权重衰减)是一种用于减小模型方差(variance)的正则化技术,它有助于改善模型的泛化能力,减小过拟合的风险。Weight decay通过在损失函数中添加一个额外的项来实现,这个额外项会惩罚模型的权重参数的大小,使它们趋向于较小的值。具体来说,权重衰减的实现方法如下:
-
修改损失函数: 在原始的损失函数基础上,加上一个正则化项,通常是L2正则化(也称为权重衰减),其形式为:
损失函数 = 原始损失 + λ * Σ(weight^2)
其中,λ(lambda)是一个控制正则化程度的超参数,Σ(weight^2) 表示所有权重参数的平方和。
-
梯度更新: 在模型的训练过程中,梯度下降算法将会对权重参数进行更新。当使用了权重衰减时,梯度更新的步骤会变成:
新权重 = 旧权重 - 学习率 * (梯度 + 2 * λ * 旧权重)
上述公式中,2 * λ * 旧权重是权重衰减的梯度惩罚项。这个项会使权重朝着减小的方向移动,以降低权重的大小,从而减小模型的复杂性。
权重衰减有助于减小模型的方差,因为它约束了权重的取值范围,使其更加接近于零。这有助于防止模型在训练数据上过拟合,提高了模型在未见过的数据上的泛化能力。但需要小心设置λ的值,过大的λ可能会导致欠拟合,而过小的λ可能无法有效减小方差。通常,λ的值需要通过交叉验证等技术来选择
知识点补充:模型的权值(weights)是指模型中用来表示特征之间关系的参数。这些权值是模型训练过程中学到的,用于对输入数据进行转换和预测。
以下是模型获取权重的代码实现
import tensorflow as tf
from tensorflow.keras.models import load_model
# 加载已经训练好的模型
model = load_model('trained_model.h5') # 请替换为你的模型文件路径
# 获取模型的权值
weights = model.get_weights()
# 打印每一层的权值
for i, layer in enumerate(model.layers):
layer_name = layer.name
layer_weights = weights[i]
print(f"Layer: {layer_name}")
for j, w in enumerate(layer_weights):
print(f"Weight {j} shape: {w.shape}")
import torch
import torchvision.models as models
# 1. 加载一个已经训练好的模型,或者根据你的需求创建一个模型
model = models.resnet18(pretrained=True)
# 2. 获取模型的权值和偏置参数
weights = model.state_dict()
# 3. 打印每一层的权值
for layer_name, weight_tensor in weights.items():
print(f"Layer: {layer_name}")
print(f"Weight shape: {weight_tensor.shape}")