PyTorch 正则化,读写模型

PyTorch 正则化,读写模型

1. 正则化

1.1 权重衰减 Weight Decay

权重衰减(Weight Decay)在每次参数更新时,引入一个衰减系数。

\[\theta_{t} \leftarrow(1-\beta) \theta_{t-1}-\alpha g_{t} \]

其中,\(g_{t}\) 为第 \(t\) 步更新时的梯度,\(\alpha\) 为学习率,\(\beta\) 为权重衰减系数,一般取值比较小,比如0.0005。对于随机梯度下降法(SGD),Weight Decay 方法与 L2 正则化方法等价,但是,对于较为复杂的优化方法(比如 Adam)中,二者不完全等价(邱锡鹏,神经网络与深度学习)。

在 PyTorch 中,优化器 torch.optim.Optimizer 类可以通过传入参数 weight_decay 实现。

1.2 L1 和 L2 正则化

L1 和 L2 正则化的作用:

  • L1 正则化使参数稀疏化

  • L2 正则化使参数趋向于零

  • 一般只对乘子项 weight 添加正则化惩罚,而不建议对偏置项 bias 正则化

  • 在浅层机器学习模型中效果较好(邱锡鹏,2020)

PyTorch 没有提供 L1 和 L2 正则化的方法,定义正则化损失函数。也可定义一个正则化损失函数,这样可以参看正则化项中参数的具体信息。

# 定义正则化损失函数
def regularization_loss(model, factor, p=2):
    '''
    regularization_loss,只惩罚含有 weight 的参数
    model: 传入模型
    factor: 正则化惩罚系数
    p: p-范数
    '''
    reg_loss = torch.tensor(0.,)
    for name, w in model.named_parameters():
        if 'weight' in name:    # 只对 参数名 含有 weight 的参数 正则化
            reg_loss = reg_loss + torch.norm(w, p)
    reg_loss = factor * reg_loss
    return reg_loss

在训练的过程中,可以加上正则化损失:

fun_loss = loss_func(out, Y_batch, reduction='sum')     # 函数损失
reg_loss = regularization_loss(model, factor=0.1, p=2)  # 正则化损失
print(reg_loss.requires_grad) # 由于传入的 model 的参数开启了梯度,则 reg_loss 也开启了提取
train_loss = fun_loss + reg_loss # 总损失

2. 读写模型

参考资料

文中代码:ColabGithub

邱锡鹏, 第7.7节 网络正则化, 神经网络与深度学习, 机械工业出版社, 2020, Github

CSDN,pytorch实现L2和L1正则化regularization的方法,site

Regularization and Optimization strategies in Deep Convolutional Neural Network, arxiv

posted @ 2022-05-27 00:13  veager  阅读(705)  评论(0)    收藏  举报