网易首页 > 网易号 > 正文 申请入驻

在Pytorch中为不同层设置不同学习率提升性能,优化深度学习模型

0
分享至


在深度学习模型的训练过程中,学习率作为一个关键的超参数,对模型的收敛速度和最终性能有着重大影响。传统方法通常采用统一的学习率,但随着研究的深入,我们发现为网络的不同层设置不同的学习率可能会带来显著的性能提升。本文将详细探讨这一策略的实施方法及其在PyTorch框架中的具体应用。

层级学习率的理论基础

深度神经网络的不同层次在特征提取和信息处理上扮演着不同的角色。基于这一认知,我们可以合理推断对不同层采用差异化的学习策略可能会更有效:

  1. 底层特征提取:网络的前几层通常负责捕获通用的低级特征,如边缘、纹理等。这些特征往往具有较强的通用性和可迁移性。
  2. 高层语义理解:网络的后几层则倾向于提取更为抽象和任务相关的高级特征。
  3. 任务特定层:如全连接分类层,直接与特定任务相关。

基于上述观察我们可以制定相应的学习率策略:

  • 对于预训练的底层,使用较小的学习率以保持其已学到的通用特征。
  • 对于中间层,可以采用适中的学习率。
  • 对于任务特定的顶层,则可以使用较大的学习率以快速适应新任务。

PyTorch实现:以ResNet为例

下面我们将以ResNet18为例,演示如何在PyTorch中实现层级学习率设置。

1、模型定义

首先,我们加载预训练的ResNet18模型,并修改其最后一层以适应新的分类任务:

import torch
import torch.nn as nn
import torchvision.models as models
# 加载预训练的ResNet18模型
model = models.resnet18(pretrained=True)
# 修改最后的全连接层以适应新的分类任务
num_classes = 10 # 假设新任务有10个类别
model.fc = nn.Linear(model.fc.in_features, num_classes)

2、参数分组

接下来,我们将模型参数分组,为不同的层设置不同的学习率:

# 定义不同组的学习率
backbone_lr = 1e-4 # 较小的学习率用于预训练的主干网络
classifier_lr = 1e-3 # 较大的学习率用于新的分类器层
# 创建参数组
params = [
{'params': model.conv1.parameters(), 'lr': backbone_lr},
{'params': model.bn1.parameters(), 'lr': backbone_lr},
{'params': model.layer1.parameters(), 'lr': backbone_lr},
{'params': model.layer2.parameters(), 'lr': backbone_lr},
{'params': model.layer3.parameters(), 'lr': backbone_lr},
{'params': model.layer4.parameters(), 'lr': backbone_lr},
{'params': model.fc.parameters(), 'lr': classifier_lr}
]

此处我们对ResNet的各个组件进行了更细致的划分,为不同的层组设置了相应的学习率。这种方法允许我们对模型的学习过程进行更精细的控制。

优化器配置与训练过程

3、优化器设置

在确定了参数分组后,我们需要选择合适的优化器并进行配置。这里我们简单的选用Adam优化器。

optimizer = torch.optim.Adam(params)

这种分组策略同样适用于其他PyTorch支持的优化器,PyTorch的优化器会自动识别并应用在参数分组中定义的不同学习率。这种设计使得实现层级学习率变得相对简单。

4、训练循环

实现了层级学习率后的训练循环保持不变。PyTorch会在后台自动处理不同参数组的学习率:

# 定义损失函数
criterion = nn.CrossEntropyLoss()
# 训练循环
for epoch in range(num_epochs):
model.train()
for inputs, labels in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 在每个epoch结束后进行验证
model.eval()
# ... [验证代码]

5、学习率调度

除了设置初始的层级学习率,我们还可以结合学习率调度器来动态调整学习率。PyTorch提供了多种学习率调度器,如StepLR、ReduceLROnPlateau等。以下是一个使用StepLR的示例:

from torch.optim.lr_scheduler import StepLR
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
# 在训练循环中更新学习率
for epoch in range(num_epochs):
# ... [训练代码]
scheduler.step()

这将每30个epoch将所有参数组的学习率降低为原来的0.1倍。

高级学习率优化技巧

1、渐进式解冻

在微调预训练模型时,一种有效的策略是渐进式解冻。我们可以先锁定底层,只训练顶层,然后逐步解冻更多的层:

# 初始阶段:只训练分类器
for param in model.parameters():
param.requires_grad = False
model.fc.requires_grad = True
# 训练几个epoch后
model.layer4.requires_grad = True
# 再过几个epoch
model.layer3.requires_grad = True

以此类推,冻结其实意味着学习率为0,也就是不对任何参数进行更新。

2、层适应学习率

我们上面已经介绍了手动指定固定的学习率,其实我们还可以通过自定义优化器来实现,不同的层的不同的学习率范围。我们可以实现一个自定义的优化器来自动调整每一层的学习率:

class LayerAdaptiveLR(torch.optim.Adam):
def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_decay=0):
super().__init__(params, lr, betas, eps, weight_decay)
self.param_groups = sorted(self.param_groups, key=lambda x: id(x['params'][0]))
def step(self, closure=None):
loss = None
if closure is not None:
loss = closure()
for group in self.param_groups:
for p in group['params']:
if p.grad is None:
continue
grad = p.grad.data
state = self.state[p]
# 根据梯度统计调整学习率
if len(state) == 0:
state['step'] = 0
state['exp_avg'] = torch.zeros_like(p.data)
state['exp_avg_sq'] = torch.zeros_like(p.data)
exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
beta1, beta2 = group['betas']
state['step'] += 1
exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
denom = exp_avg_sq.sqrt().add_(group['eps'])
# 动态调整学习率
step_size = group['lr'] * (exp_avg.abs() / denom).mean().item()
p.data.add_(exp_avg, alpha=-step_size)
return loss
# 使用示例
optimizer = LayerAdaptiveLR(model.parameters(), lr=1e-3)

可以看到,上面我们继承自Adam优化器,这里我们不用实现优化过程只针对于针对层的学习率变化即可。

总结

层级学习率设置是一种强大的优化技术,特别适用于迁移学习和微调预训练模型的场景。通过精心设计的学习率策略,可以在保留预训练模型通用特征的同时有效地适应新任务。结合其他高级技巧,如渐进式解冻、层适应学习率,可以进一步提升模型的训练效率和性能。

在实际应用中,最佳的学习率配置往往需要通过实验来确定。建议研究者根据具体任务和模型架构进行适当的调整和实验,以获得最佳的训练效果。

https://avoid.overfit.cn/post/c13411d085974b02bad98504f3ae3fc1

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
国防部:与柬泰边境冲突无关,不要主观臆测

国防部:与柬泰边境冲突无关,不要主观臆测

观察者网
2025-12-18 19:24:05
财务自由最笨的方法:每月雷打不动3000块,买入“这两个”东西

财务自由最笨的方法:每月雷打不动3000块,买入“这两个”东西

真实人物采访
2025-12-18 15:00:09
切尔西庆幸放走他:11场0球!巅峰身价8000万欧,如今仅剩3500万

切尔西庆幸放走他:11场0球!巅峰身价8000万欧,如今仅剩3500万

小火箭爱体育
2025-12-19 11:33:11
国家出手封杀东北雨姐才一周,令人恶心一幕发生,网友:吃相难看

国家出手封杀东北雨姐才一周,令人恶心一幕发生,网友:吃相难看

素衣读史
2025-12-19 16:34:52
比高市早苗还猖狂,菲律宾防长“下战书”,不许解放军做两件事

比高市早苗还猖狂,菲律宾防长“下战书”,不许解放军做两件事

知法而形
2025-12-19 16:58:08
Shams:加内特以全新身份重返森林狼,21号球衣也将举行退役仪式

Shams:加内特以全新身份重返森林狼,21号球衣也将举行退役仪式

懂球帝
2025-12-18 23:20:23
柬埔寨士兵吃着糟糕的食物,豪富的洪家却不愿给他们稍微吃好点

柬埔寨士兵吃着糟糕的食物,豪富的洪家却不愿给他们稍微吃好点

老马拉车莫少装
2025-12-16 03:01:51
耐克股价盘后跌幅扩大至10%

耐克股价盘后跌幅扩大至10%

每日经济新闻
2025-12-19 06:41:06
游客大理租车当晚车身被恶意划伤,赔偿600元后监控曝光:竟是租车行员工所为!警方:行拘

游客大理租车当晚车身被恶意划伤,赔偿600元后监控曝光:竟是租车行员工所为!警方:行拘

封面新闻
2025-12-18 19:17:32
民怨沸腾!台媒:岛内超百万人联署“弹劾赖清德”,参与人数多到一度瘫痪网站

民怨沸腾!台媒:岛内超百万人联署“弹劾赖清德”,参与人数多到一度瘫痪网站

环球网资讯
2025-12-19 09:18:07
震惊!南博最大的受害者不是庞叔令后人,而是前博物馆馆长姚迁…

震惊!南博最大的受害者不是庞叔令后人,而是前博物馆馆长姚迁…

火山詩话
2025-12-19 06:05:11
高市早苗的反击计划已全面出炉!动手前,日方当众问中国一个问题

高市早苗的反击计划已全面出炉!动手前,日方当众问中国一个问题

博览历史
2025-12-18 18:25:30
这都赢不了?开拓者2分28秒领先15分遭国王一波流抹平分差进加时

这都赢不了?开拓者2分28秒领先15分遭国王一波流抹平分差进加时

懂球帝
2025-12-19 14:05:11
玩火自焚!美囤铜想卡脖,不料铝价狂飙,中国坐庄,他们急着求饶

玩火自焚!美囤铜想卡脖,不料铝价狂飙,中国坐庄,他们急着求饶

近史博览
2025-12-18 18:12:03
韩国海警举旗冲锋苏岩礁!强拆中方设施反被围,中方贴脸开大了

韩国海警举旗冲锋苏岩礁!强拆中方设施反被围,中方贴脸开大了

观察者小海风
2025-12-18 19:48:04
海南全岛封关,这群外籍主播为何扎堆涌入?

海南全岛封关,这群外籍主播为何扎堆涌入?

环球网资讯
2025-12-18 20:34:47
孙颖莎不是因伤退赛,WTT给出答案,和其他选手退赛不同

孙颖莎不是因伤退赛,WTT给出答案,和其他选手退赛不同

子水体娱
2025-12-18 16:30:27
贾静雯没想到,当年赔2600万争回的女儿,今用50亿遗产替她争光​

贾静雯没想到,当年赔2600万争回的女儿,今用50亿遗产替她争光​

丰谭笔录
2025-12-17 09:53:46
重庆江北区蓝天救援队队员李舟因病离世,年仅36岁,队友追忆:他率直爽朗,出任务时总是冲在前面

重庆江北区蓝天救援队队员李舟因病离世,年仅36岁,队友追忆:他率直爽朗,出任务时总是冲在前面

极目新闻
2025-12-18 22:07:09
克林顿不是男人?要用雪茄助兴!莱温斯基:他把我当成“自助餐”

克林顿不是男人?要用雪茄助兴!莱温斯基:他把我当成“自助餐”

梁岱爱玩车
2025-12-19 12:52:28
2025-12-19 17:47:00
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1863文章数 1440关注度
往期回顾 全部

科技要闻

2025新一代人工智能创业大赛总决赛收官

头条要闻

日媒披露:日本请求派代表团访华 未获中方回复

头条要闻

日媒披露:日本请求派代表团访华 未获中方回复

体育要闻

“恶龙”埃托奥,正在毁灭喀麦隆足球

娱乐要闻

曲协表态仅6天,郭德纲担心的事还是发生

财经要闻

非法集资911亿!"金融大鳄"终审被判无期

汽车要闻

“一体压铸”再引热议 一旦受损真的修不起吗?

态度原创

教育
亲子
家居
手机
公开课

教育要闻

饭碗VS理想:志愿填报价值观正在被重塑

亲子要闻

7岁的丁玉杺小朋友三顾戏楼,成功拜师!

家居要闻

高端私宅 理想隐居圣地

手机要闻

荣耀MagicOS十二月功能上新:一句话P图、全品牌互联等

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版