深度学习:Pytorch最全面学习率调整策略lr_scheduler
发布人:shili8
发布时间:2025-02-27 14:19
阅读次数:0
**深度学习:PyTorch 最全面的学习率调整策略(lr_scheduler)**
在深度学习中,学习率(learning rate)的选择是训练模型的关键因素之一。一个合适的学习率可以帮助模型快速收敛到最优解,而过高或过低的学习率可能导致模型收敛速度太慢或无法收敛。PyTorch 提供了多种学习率调整策略(lr_scheduler),以帮助我们选择合适的学习率。
**1.余弦退火(CosineAnnealing)**
余弦退火是一种常见的学习率调整策略,通过将学习率与余弦函数相关联来实现。余弦函数的值在某个范围内会随着时间的推移而变化,从而导致学习率的变化。
import torchclass CosineAnnealingLR(torch.optim.lr_scheduler._LRScheduler): def __init__(self, optimizer, T_max, eta_min=0, last_epoch=-1): self.T_max = T_max self.eta_min = eta_min super(CosineAnnealingLR, self).__init__(optimizer, last_epoch) def get_lr(self): return [self.eta_min + (base_lr - self.eta_min) *0.5 * (1 + math.cos(math.pi * self.last_epoch / self.T_max)) for base_lr in self.base_lrs]
**2. 多步学习率调整(MultiStepLR)**
多步学习率调整策略通过在训练过程中根据一定的条件改变学习率。例如,在每个epoch结束时,学习率会乘以一个因子。
class MultiStepLR(torch.optim.lr_scheduler._LRScheduler): def __init__(self, optimizer, milestones, gamma=1, last_epoch=-1): self.milestones = milestones self.gamma = gamma super(MultiStepLR, self).__init__(optimizer, last_epoch) def get_lr(self): return [base_lr * self.gamma ** bisect.bisect_right(self.milestones, self.last_epoch) for base_lr in self.base_lrs]
**3. 指数退火(ExponentialAnnealing)**
指数退火是一种学习率调整策略,通过将学习率与指数函数相关联来实现。指数函数的值在某个范围内会随着时间的推移而变化,从而导致学习率的变化。
class ExponentialAnnealingLR(torch.optim.lr_scheduler._LRScheduler): def __init__(self, optimizer, gamma=1, last_epoch=-1): self.gamma = gamma super(ExponentialAnnealingLR, self).__init__(optimizer, last_epoch) def get_lr(self): return [base_lr * self.gamma ** self.last_epoch for base_lr in self.base_lrs]
**4.余弦退火多步(CosineAnnealingMultiStep)**
余弦退火多步是一种学习率调整策略,通过将余弦函数与多步函数相关联来实现。这种策略可以结合两者的优点。
class CosineAnnealingMultiStepLR(torch.optim.lr_scheduler._LRScheduler): def __init__(self, optimizer, milestones, T_max, eta_min=0, last_epoch=-1): self.milestones = milestones self.T_max = T_max self.eta_min = eta_min super(CosineAnnealingMultiStepLR, self).__init__(optimizer, last_epoch) def get_lr(self): return [self.eta_min + (base_lr - self.eta_min) *0.5 * (1 + math.cos(math.pi * bisect.bisect_right(self.milestones, self.last_epoch) / self.T_max)) for base_lr in self.base_lrs]
**5. 自适应学习率(AdaptiveLR)**
自适应学习率是一种学习率调整策略,通过根据模型的收敛情况动态改变学习率来实现。
class AdaptiveLR(torch.optim.lr_scheduler._LRScheduler): def __init__(self, optimizer, patience=10, min_lr=1e-6, last_epoch=-1): self.patience = patience self.min_lr = min_lr super(AdaptiveLR, self).__init__(optimizer, last_epoch) def get_lr(self): if self.last_epoch < self.patience: return [base_lr for base_lr in self.base_lrs] else: return [min(base_lr, self.min_lr) for base_lr in self.base_lrs]
这些学习率调整策略可以根据具体的任务和模型选择合适的策略。例如,在训练过程中,余弦退火策略可能更适合,而在测试阶段,多步策略可能更合适。
**使用示例**
import torchfrom torchvision import datasets, transforms#1.余弦退火model = torch.nn.Sequential( torch.nn.Linear(784,128), torch.nn.ReLU(), torch.nn.Linear(128,10) ) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) scheduler = CosineAnnealingLR(optimizer, T_max=100) for epoch in range(100): scheduler.step() # ... #2. 多步学习率调整model = torch.nn.Sequential( torch.nn.Linear(784,128), torch.nn.ReLU(), torch.nn.Linear(128,10) ) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) scheduler = MultiStepLR(optimizer, milestones=[50,75]) for epoch in range(100): scheduler.step() # ... #3. 指数退火model = torch.nn.Sequential( torch.nn.Linear(784,128), torch.nn.ReLU(), torch.nn.Linear(128,10) ) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) scheduler = ExponentialAnnealingLR(optimizer, gamma=0.1) for epoch in range(100): scheduler.step() # ... #4.余弦退火多步model = torch.nn.Sequential( torch.nn.Linear(784,128), torch.nn.ReLU(), torch.nn.Linear(128,10) ) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) scheduler = CosineAnnealingMultiStepLR(optimizer, milestones=[50,75], T_max=100) for epoch in range(100): scheduler.step() # ... #5. 自适应学习率model = torch.nn.Sequential( torch.nn.Linear(784,128), torch.nn.ReLU(), torch.nn.Linear(128,10) ) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) scheduler = AdaptiveLR(optimizer, patience=50) for epoch in range(100): scheduler.step() # ...
这些示例展示了如何使用不同的学习率调整策略来训练模型。