关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
torch.optim的灵活使用详解 1. 基本用法: 要构建一个优化器Optimizer,必须给它一个包含参数的迭代器来优化,然后,我们可以指定特定的优化选项, 例如学习速率,重量衰减值等。 注:如果要把model放在GPU中,需要在构建一个Optimizer之前就执行model.cuda(),确保优化器里面的参数也是在GPU中。 例子: optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9) 2. 灵活的设置各层的学习率 将model中需要进行BP的层的参数送到torch.optim中,这些层不一定是连续的。 在PyTorch中,`torch.optim`是一个非常重要的模块,用于实现各种优化算法,如随机梯度下降(SGD)、Adam、Adagrad等。它提供了便捷的方式来进行模型参数的更新,以最小化损失函数。在本文中,我们将深入探讨如何灵活地使用`torch.optim`,包括自定义学习率策略、分层设置学习率以及添加L1正则化。 创建一个优化器的基本步骤是传入模型的参数和选择优化算法。例如,如果我们选择SGD(随机梯度下降)作为优化器,可以这样做: ```python import torch.optim as optim model = ... # 初始化模型 optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) ``` 这里,`model.parameters()`返回一个可迭代的参数列表,优化器会根据这些参数计算梯度并更新权重。如果模型的参数在GPU上,需要在构建优化器前调用`model.cuda()`确保所有参数都在GPU上。 对于不同的层,我们可以灵活设置学习率。这在处理不同层可能需要不同学习率的情况时非常有用。我们可以通过提供一个字典列表来实现这一点,其中每个字典代表一个参数组,并可以自定义其学习率和其他优化选项: ```python optimizer = optim.SGD([ {'params': model.features12.parameters(), 'lr': 1e-2}, {'params': model.features22.parameters()}, {'params': model.features32.parameters()}, {'params': model.features42.parameters()}, {'params': model.features52.parameters()}, ], weight_decay=5e-4, lr=1e-1, momentum=0.9) ``` 在这个例子中,`features12`层的参数具有单独的学习率1e-2,而其他层使用默认的学习率1e-1。 为了在训练过程中动态调整学习率,可以访问`optimizer.param_groups`。这是一个包含所有参数组的列表,其中每个组都是一个字典,包含了该组的配置。例如,可以定义一个函数来按照某种衰减策略调整学习率: ```python def adjust_learning_rate(optimizer, decay_rate=0.9): for para_group in optimizer.param_groups: para_group['lr'] = para_group['lr'] * decay_rate ``` 接下来,我们讨论如何添加L1正则化。默认情况下,`torch.optim`的优化器不直接支持L1正则化。但可以通过修改优化器的源代码或创建自定义优化器来实现。L1正则化的梯度是: \[ \nabla L + \lambda \cdot sign(\theta) \] 其中,\( L \) 是损失函数,\( \lambda \) 是正则化系数,\( \theta \) 是参数,而 \( sign(\theta) \) 是参数的符号函数。要添加L1正则,可以修改SGD优化器的`step`方法,仿照L2正则化(权重衰减)的处理方式。然而,这种方法需要直接修改库的源代码,可能不是最佳实践。更推荐的方法是,在损失函数中直接加入L1正则项,然后使用标准的优化器: ```python l1_regularizer = lambda params: torch.tensor(0.).to(params.device) for param in params: l1_regularizer += torch.abs(param).sum() total_loss = loss_fn(model(input)) + l1_lambda * l1_regularizer ``` 在这个例子中,`l1_regularizer`计算了所有参数的绝对值之和,然后乘以L1正则化的系数`l1_lambda`,最后加到损失函数中。这样,优化器只需最小化总损失即可实现L1正则化的效果。 `torch.optim`提供了许多灵活性,允许我们定制优化过程以适应不同任务的需求。通过理解其工作原理和参数,可以更有效地调整模型的训练。同时,自定义优化器或在损失函数中添加正则化项是实现特定优化策略的有效途径。
- Asama浅间2023-07-25: 作者不仅介绍了常见的SGD优化算法,还讲解了如何添加L1正则化,真是干货满满。
- yiyi分析亲密关系2023-07-25: 这篇文章详细介绍了torch.optim的灵活使用,让人收益匪浅。
- 王者丶君临天下2023-07-25: 对于想要深入了解torch.optim的人来说,这篇文章是必读的。
- 傅融2023-07-25: 读完这篇文章,我对于优化算法的应用有了更多的想法,向作者致敬!
- 高工-老罗2023-07-25: 文章语言通俗易懂,即使不是专业人士也能轻松理解。
- 粉丝: 17
- 资源: 924
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助