speechbrain.nnet.schedulers 模块
用于更新超参数(如学习率)的调度器。
- 作者
Mirco Ravanelli 2020
Peter Plantinga 2020
Loren Lugosch 2020
Shucong Zhang 2023
摘要
类
这是带有预热 (warmup) 的 Cyclic-Cosine 学习率调度器的实现。 |
|
这实现了循环学习率策略 (CLR)。 |
|
一个简单的调度器实现,在达到特定步数后将学习率设置为特定值。 |
|
Inverse Square Root 调度器,定义见 T5 论文 https://arxiv.org/pdf/1910.10683.pdf |
|
这是 Squeezeformer 论文中扩展 Noam 调度器的实现。 |
|
采用线性退火技术的调度器。 |
|
创建一个调度器,其学习率在预热期(在此期间学习率从 0 线性增加到优化器中设置的初始学习率)结束后,从优化器中设置的初始学习率线性下降到 0。 |
|
采用 new-bob 技术的调度器,用于 LR 退火。 |
|
Noam 调度器和 Interval 调度器的组合。 |
|
这是 transformer 学习率调度器(带有预热)的实现。参考文献: https://arxiv.org/abs/1706.03762 |
|
学习率调度器,如果在高原期目标损失函数停滞不前或开始增加,则降低学习率。 |
|
一个方便的类,用于按计划切换到不同的损失函数 |
|
采用步进退火技术的学习率调度器。 |
|
线性预热,然后非常缓慢地衰减,并在训练结束时再次线性冷却。 |
|
线性预热,然后在 'total_steps' 步内指数衰减到 ('lr' / 'decay_factor')。 |
|
线性预热,然后非常缓慢地衰减,并在训练结束时再次线性冷却。 |
函数
更改优化器中的学习率值。 |
参考
- speechbrain.nnet.schedulers.update_learning_rate(optimizer, new_lr, param_group=None)[源码]
更改优化器中的学习率值。
- 参数:
示例
>>> from torch.optim import SGD >>> from speechbrain.nnet.linear import Linear >>> model = Linear(n_neurons=10, input_size=10) >>> optimizer = SGD(model.parameters(), lr=0.1) >>> update_learning_rate(optimizer, 0.2) >>> optimizer.param_groups[0]["lr"] 0.2
- class speechbrain.nnet.schedulers.WarmAndExpDecayLRSchedule(lr, n_warmup_steps, total_steps, decay_factor=0.1)[源码]
基类:
object
线性预热,然后在 ‘total_steps’ 步内指数衰减到 (‘lr’ / ‘decay_factor’)。
- 参数:
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler = WarmAndExpDecayLRSchedule(lr=1, n_warmup_steps=2, decay_factor=0.01, total_steps=6) >>> scheduler(optim) >>> optim.param_groups[0]["lr"] 0.0 >>> scheduler(optim) >>> optim.param_groups[0]["lr"] 0.5 >>> scheduler(optim) >>> optim.param_groups[0]["lr"] 1 >>> scheduler(optim) >>> optim.param_groups[0]["lr"] 0.31622776601683794
- class speechbrain.nnet.schedulers.NewBobScheduler(initial_value, annealing_factor=0.5, improvement_threshold=0.0025, patient=0)[源码]
基类:
object
采用 new-bob 技术的调度器,用于 LR 退火。
学习率根据验证性能进行退火。具体来说:如果 (past_loss-current_loss)/past_loss < impr_threshold: lr = lr * annealing_factor。
- 参数:
示例
>>> scheduler = NewBobScheduler(initial_value=1.0) >>> scheduler(metric_value=10.0) (1.0, 1.0) >>> scheduler(metric_value=2.0) (1.0, 1.0) >>> scheduler(metric_value=2.5) (1.0, 0.5)
- class speechbrain.nnet.schedulers.LinearScheduler(initial_value, final_value, epoch_count)[源码]
基类:
object
采用线性退火技术的调度器。
学习率在指定数量的 epoch 内线性衰减。
- 参数:
示例
>>> scheduler = LinearScheduler(1.0, 0.0, 4) >>> scheduler(current_epoch=1) (1.0, 0.666...) >>> scheduler(current_epoch=2) (0.666..., 0.333...) >>> scheduler(current_epoch=3) (0.333..., 0.0) >>> scheduler(current_epoch=4) (0.0, 0.0)
- class speechbrain.nnet.schedulers.LinearWarmupScheduler(initial_value, num_warmup_steps, num_training_steps)[源码]
基类:
object
创建一个调度器,其学习率在预热期(在此期间学习率从 0 线性增加到优化器中设置的初始学习率)结束后,从优化器中设置的初始学习率线性下降到 0。* Ge Li 2022
- 参数:
示例
>>> scheduler = LinearWarmupScheduler(1.0, 2, 4) >>> scheduler.get_next_value() 0.0 >>> scheduler.get_next_value() 0.5 >>> scheduler.get_next_value() 1.0 >>> scheduler.get_next_value() 0.5 >>> scheduler.get_next_value() 0.0
- class speechbrain.nnet.schedulers.StepScheduler(initial_value, decay_factor=None, decay_drop=None, half_life=None)[源码]
基类:
object
采用步进退火技术的学习率调度器。
超参数的值会随着 epoch 以选定的
epoch_decay
因子衰减。value = init_value * decay_factor ^ floor((1 + epoch) / decay_drop)
- 参数:
示例
>>> scheduler = StepScheduler(initial_value=1.0) >>> scheduler(current_epoch=1) (1.0, 0.5) >>> scheduler(current_epoch=2) (0.5, 0.5) >>> scheduler(current_epoch=3) (0.5, 0.25)
- DEFAULT_DECAY_FACTOR = 0.5
- DEFAULT_DECAY_DROP = 2
- class speechbrain.nnet.schedulers.NoamScheduler(lr_initial, n_warmup_steps, model_size=None)[源码]
基类:
object
这是 transformer 学习率调度器(带有预热)的实现。参考文献: https://arxiv.org/abs/1706.03762
注意: 此调度器在模型权重每次更新时都会退火学习率,并且必须保存
n_steps
以供重新启动。- 参数:
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler =NoamScheduler(optim.param_groups[0]["lr"], 3) >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 0.3333333333333333 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 0.6666666666666666 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 0.9999999999999999
- class speechbrain.nnet.schedulers.NoamIntervalScheduler(lr_initial, n_warmup_steps, anneal_steps, anneal_rates, model_size=None)[源码]
基类:
object
Noam 调度器和 Interval 调度器的组合。此调度器行为类似于 Noam 调度器,并在设计的步数以设计的衰减率进行学习率退火。
注意: 此调度器在模型权重每次更新时都会退火学习率,并且必须保存
n_steps
以供重新启动。- 参数:
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler = NoamIntervalScheduler( ... lr_initial=optim.param_groups[0]["lr"], ... n_warmup_steps=3, ... anneal_steps=[6, 9], ... anneal_rates=[0.5, 0.1], ... ) >>> for _ in range(10): ... curr_lr,next_lr=scheduler(optim) ... print(optim.param_groups[0]["lr"]) 0.3333333333333333 0.6666666666666666 0.9999999999999999 0.8660254037844386 0.7745966692414833 0.7071067811865475 0.3273268353539886 0.3061862178478973 0.28867513459481287 0.027386127875258306
- class speechbrain.nnet.schedulers.LinearNoamScheduler(lr_initial, n_warmup_steps, n_keep_steps)[源码]
基类:
object
这是 Squeezeformer 论文中扩展 Noam 调度器的实现。参考文献: https://arxiv.org/pdf/2206.00888.pdf
注意: 此调度器在模型权重每次更新时都会退火学习率,并且必须保存
n_steps
以供重新启动。- 参数:
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler =LinearNoamScheduler(optim.param_groups[0]["lr"], 2, 2) >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 0.5 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 1.0 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 1.0 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 1.0 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 0.6666666666666666
- class speechbrain.nnet.schedulers.CyclicCosineScheduler(n_warmup_steps, lr_initial=None, total_steps=100000)[源码]
基类:
object
这是带有预热 (warmup) 的 Cyclic-Cosine 学习率调度器的实现。
参考文献: https://openreview.net/pdf?id=BJYwwY9ll
注意: 此调度器在模型权重每次更新时都会退火学习率,并且必须保存
n_steps
以供重新启动。- 参数:
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler =CyclicCosineScheduler(3, optim.param_groups[0]["lr"]) >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 0.9999999990130395 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 0.9999999997532598 >>> curr_lr,next_lr=scheduler(optim) >>> optim.param_groups[0]["lr"] 1.0
- class speechbrain.nnet.schedulers.ReduceLROnPlateau(lr_min=1e-08, factor=0.5, patience=2, dont_halve_until_epoch=65)[源码]
基类:
object
学习率调度器,如果在高原期目标损失函数停滞不前或开始增加,则降低学习率。与 NewBobLRScheduler 的不同之处在于,此调度器会记录未观察到改进的最后一步,并与该特定损失值进行比较,而不是与最近的损失进行比较。
- 参数:
示例
>>> from torch.optim import Adam >>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(n_neurons=10, input_size=3) >>> optim = Adam(lr=1.0, params=model.parameters()) >>> output = model(inp_tensor) >>> scheduler = ReduceLROnPlateau(0.25, 0.5, 2, 1) >>> curr_lr,next_lr=scheduler([optim],current_epoch=1, current_loss=10.0) >>> curr_lr,next_lr=scheduler([optim],current_epoch=2, current_loss=11.0) >>> curr_lr,next_lr=scheduler([optim],current_epoch=3, current_loss=13.0) >>> curr_lr,next_lr=scheduler([optim],current_epoch=4, current_loss=14.0) >>> next_lr 0.5
- class speechbrain.nnet.schedulers.CyclicLRScheduler(base_lr=0.001, max_lr=0.006, step_size=2000.0, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle')[源码]
基类:
object
这实现了循环学习率策略 (CLR)。该方法以固定的频率在两个边界之间循环学习率,详细信息参见这篇论文 (https://arxiv.org/abs/1506.01186)。循环的幅度可以按每次迭代或每个循环进行缩放。
该类有三种内置策略,如论文所述。“triangular”
基本三角形循环,无幅度缩放。
- “triangular2”
基本三角形循环,每个循环将初始幅度减半。
- “exp_range”
一个循环,在每次循环迭代时按
gamma**(循环迭代次数)
缩放初始幅度。
更多详情,请参阅参考文献。
- 参数:
base_lr (float) – 初始学习率,即循环中的下界。
max_lr (float) – 循环中的上界。功能上,它定义了循环幅度 (
max_lr - base_lr
)。任何循环的学习率是base_lr
和幅度的一些缩放的总和;因此,实际可能无法达到max_lr
,具体取决于缩放函数。step_size (int) – 每半个循环的训练迭代次数。作者建议将
step_size
设置为 epoch 训练迭代次数的 2-8 倍。模式 (str) – {triangular, triangular2, exp_range} 之一。 默认值 ‘triangular’。 值对应于上面详述的策略。如果 scale_fn 不是 None,则忽略此参数。
gamma (float) – ‘exp_range’ 缩放函数中的常数:gamma**(cycle iterations)
scale_fn (lambda 函数) – 由一个单参数 lambda 函数定义的自定义缩放策略,其中对于所有 x >= 0,都有 0 <= scale_fn(x) <= 1。忽略 mode 参数。
scale_mode (str) – {‘cycle’, ‘iterations’}。 定义 scale_fn 是根据周期数还是周期迭代次数(自周期开始以来的训练迭代次数)进行评估。 默认值是 ‘cycle’。
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler = CyclicLRScheduler(base_lr=0.1, max_lr=0.3, step_size=2) >>> scheduler.on_batch_end(optim) >>> optim.param_groups[0]["lr"] 0.2 >>> scheduler.on_batch_end(optim) >>> optim.param_groups[0]["lr"] 0.3 >>> scheduler.on_batch_end(optim) >>> optim.param_groups[0]["lr"] 0.2
- class speechbrain.nnet.schedulers.IntervalScheduler(intervals)[source]
基类:
object
一个简单的调度器实现,在达到特定步数后将学习率设置为特定值。
- 参数:
intervals (list) – 字典列表: {“steps”: <步数>, “lr”: 学习率} ‘steps’ 表示应用给定学习率时的全局步数。
示例
>>> import torch >>> from speechbrain.nnet.schedulers import IntervalScheduler >>> from speechbrain.nnet.linear import Linear >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> scheduler = IntervalScheduler( ... intervals=[ ... {"steps": 2, "lr": 0.01}, ... {"steps": 5, "lr": 0.005}, ... {"steps": 9, "lr": 0.001} ... ] ... ) >>> optim.param_groups[0]["lr"] 1 >>> for _ in range(10): ... pre, post = scheduler(optim) ... print(f"{pre} -> {post}") 1 -> 1 1 -> 0.01 0.01 -> 0.01 0.01 -> 0.01 0.01 -> 0.005 0.005 -> 0.005 0.005 -> 0.005 0.005 -> 0.005 0.005 -> 0.001 0.001 -> 0.001
- class speechbrain.nnet.schedulers.InverseSquareRootScheduler(warmup_steps)[source]
基类:
object
Inverse Square Root 调度器,定义见 T5 论文 https://arxiv.org/pdf/1910.10683.pdf
- 参数:
warmup_steps (int) – 学习率保持常数的步数。
- class speechbrain.nnet.schedulers.WarmCoolDecayLRSchedule(lr, warmup, cooldown, total_steps, decay_factor=0.75, decay_every=100000)[source]
基类:
object
线性预热,非常缓慢地衰减,并在训练结束时再次线性冷却。这是一个三步调度器。
参考
Scaling Vision Transformers arxiv.org/abs/2106.04560
- 参数 lr:
预热后达到的最大学习率。
- 类型 lr:
float
- 参数 warmup:
预热步数(呈线性增加)。
- 类型 warmup:
int
- 参数 cooldown:
冷却步数(呈线性减少)。
- 类型 cooldown:
int
- 参数 total_steps:
总步数(用于衰减)。
- 类型 total_steps:
int
- 参数 decay_factor:
每隔 decay_every 步应用的衰减因子。
- 类型 decay_factor:
float
- 参数 decay_every:
每隔 decay_every 步将衰减因子应用于学习率。
- 类型 decay_every:
int
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler = WarmCoolDecayLRSchedule(lr=1, warmup=2, total_steps=6, decay_factor=0.5, decay_every=1, cooldown=1) >>> optim.param_groups[0]["lr"] 1 >>> scheduler(optim, 1) >>> optim.param_groups[0]["lr"] 0.5 >>> scheduler(optim, 2) >>> optim.param_groups[0]["lr"] 1.0 >>> scheduler(optim, 3) >>> optim.param_groups[0]["lr"] 0.5 >>> scheduler(optim, 4) >>> optim.param_groups[0]["lr"] 0.25 >>> scheduler(optim, 5) >>> optim.param_groups[0]["lr"] 0.12500000000000003 >>> scheduler(optim, 6) >>> optim.param_groups[0]["lr"] 0.0
- class speechbrain.nnet.schedulers.ScheduledLoss(schedule)[source]
基类:
Module
一个方便的类,用于按计划切换到不同的损失函数
- 参数:
schedule (list) – 包含以下键的字典列表
- loss_fn: 要使用的损失函数 steps: 在切换到下一个损失函数之前应用的步数
(这是对前一行的补充)
到下一个
示例
>>> loss_fn = ScheduledLoss( ... schedule=[ ... {"steps": 3, "loss_fn": nn.MSELoss()}, ... {"steps": 2, "loss_fn": nn.L1Loss()}, ... {"loss_fn": nn.SmoothL1Loss()} ... ] ... ) >>> x = torch.tensor([1., 2.]) >>> y = torch.tensor([1.5, 2.5]) >>> for idx in range(10): ... loss = loss_fn(x, y) ... print(loss.item()) 0.25 0.25 0.25 0.5 0.5 0.125 0.125 0.125 0.125 0.125
- class speechbrain.nnet.schedulers.TriStageLRSchedule(lr, warmup_steps, hold_steps, decay_steps, total_steps, init_lr_scale=0.01, final_lr_scale=0.05)[source]
基类:
object
在训练结束时线性预热,非常缓慢地衰减,然后再次线性冷却。这是一个三阶段调度器。参考 https://arxiv.org/pdf/1904.08779.pdf
- 参数:
示例
>>> from speechbrain.nnet.linear import Linear >>> inp_tensor = torch.rand([1,660,3]) >>> model = Linear(input_size=3, n_neurons=4) >>> optim = torch.optim.Adam(model.parameters(), lr=1) >>> output = model(inp_tensor) >>> scheduler = TriStageLRSchedule(lr=1, warmup_steps=2, hold_steps=2, decay_steps=2, total_steps=6, init_lr_scale=0.01, final_lr_scale=0.05) >>> optim.param_groups[0]["lr"] 1 >>> scheduler(optim, 1) >>> optim.param_groups[0]["lr"] 0.505 >>> scheduler(optim, 2) >>> optim.param_groups[0]["lr"] 1 >>> scheduler(optim, 3) >>> optim.param_groups[0]["lr"] 1 >>> scheduler(optim, 4) >>> optim.param_groups[0]["lr"] 1.0 >>> scheduler(optim, 5) >>> optim.param_groups[0]["lr"] 0.223606797749979 >>> scheduler(optim, 6) >>> optim.param_groups[0]["lr"] 0.05000000000000001