深度学习:CNN卷积神经网络调整学习率方法以及迁移学习

时间:2024-09-29 13:15:34

1.调整学习率(三种库函数调整方法)

1.有序调整

  1. 等间隔调整(Step Decay)

    • 这种方法会在训练过程中的预定的epoch后降低学习率,例如每30个epochs学习率就乘以0.1。
    • 优点是简单易实现。
    • 缺点是不够灵活,可能无法适应训练过程中的动态变化。
    • 完整参数
      torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1)
      参数:
      optimizer: 神经网络训练中使用的优化器,如optimizer=torch.optim.Adam(…)
      step_size(int): 学习率下降间隔数,单位是epoch,而不是iteration.
      gamma(float):学习率调整倍数,默认为0.1
      每训练step_size个epoch,学习率调整为lr=lr*gamma.
      
  2. 多间隔调整(MultiStep)

    • 与Step Decay类似,但允许在多个不同的epoch降低学习率。
    • 可以设置一个milestones列表,当训练进度达到这些milestones时,学习率会按照预设的因子衰减。
    • 完整参数
      torch.optim.lr_shceduler.MultiStepLR(optimizer, milestones, gamma=0.1)
      参数:
      milestone(list): 一个列表参数,表示多个学习率需要调整的epoch值,如milestones=[10, 30, 80].
      
  3. 指数衰减(Exponential Decay)

    • 学习率按照指数函数进行衰减,即每个epoch后学习率乘以一个小于1的固定衰减率。
    • 优点是学习率逐渐减小,训练过程更加平滑。
    • 缺点是可能需要更多的epoch来达到收敛。
    • 完整参数
      torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma)
      参数:
      gamma(float):学习率调整倍数的底数,指数为epoch,初始值我lr, 倍数为γepoch
      
  4. 余弦退火(Cosine Annealing)

    • 学习率按照余弦函数的形式进行调整,模拟周期性的变化。
    • 这种方法可以在训练过程中使学习率有规律地波动,有助于模型跳出局部最优解,寻找到全局最优解。
    • 完整参数
      torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0)
      参数:
      Tmax(int):学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,当epoch>T_max时,学习率将增大;
      etamin: 学习率调整的最小值,即epoch=Tmax时,lrmin=etamin, 默认为0.
      

2.自适应调整

        依训练状况伺机而变,通过监测某个指标的变化情况(loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机(ReduceLROnPlateau);

完整参数

torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1,
patience=10,verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
  1. AdaGrad:为每个参数定制不同的学习率,通过累积所有过往梯度的平方来调整学习率,适用于稀疏数据但可能导致学习率过小 。

  2. RMSprop:解决了AdaGrad学习率过度衰减的问题,通过使用衰减平均的平方梯度来调整学习率,使学习率更加稳定 。

  3. Adam:结合了Momentum和RMSprop的优点,计算梯度的一阶矩估计(均值)和二阶矩估计(方差),并以此来调整每个参数的学习率,是目前非常流行的自适应学习率方法 。

  4. AdaDelta:是另一种自适应学习率的方法,它类似于RMSprop,但不使用固定的学习率衰减因子,而是通过计算历史梯度的平方根来调整学习率 。

  5. ReduceLROnPlateau:当监控的指标停止改善时,降低学习率,这种方法可以与任何优化器一起使用,并且会在验证集的性能停止提升时减少学习率 。

  6. AdamW:是Adam的变种,考虑了权重衰减,解决了Adam在带有权重衰减时可能存在的问题 。

  7. AMSGrad:是对Adam算法的改进,保证了更新是单调的,从而解决了Adam在某些情况下可能不收敛的问题 。

  8. Nadam:在Adam的基础上加入了牛顿方法的思想,使用一阶和二阶矩估计,并在计算学习率时考虑了过去梯度的累积 。

3.自定义调整

        通过自定义关于epoch的lambda函数调整学习率(LambdaLR)。

完整参数

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
参数:
lr_lambda(function or list): 自定义计算学习率调整倍数的函数,通常时epoch的函数,当有多个参数组时,设为list.
  1. 分段常数衰减

    • 在训练的不同阶段使用不同的学习率。例如,可以在训练初期使用较高的学习率,然后在训练后期降低学习率以细化模型。
  2. 指数衰减

    • 学习率按照指数函数递减,即每个epoch后,学习率乘以一个小于1的固定衰减率。
  3. 余弦退火

    • 学习率根据余弦函数的形状进行调整,这可以帮助模型在训练后期以较小的步长探索参数空间。
  4. 自定义衰减函数

    • 可以设计特定的数学函数来调整学习率,例如使用多项式衰减、对数衰减或其他非标准衰减函数。
  5. 基于验证集性能的调整

    • 根据验证集上的性能来调整学习率。如果验证损失在几个epoch内没有改善,则降低学习率。
  6. 循环学习率

    • 学习率在设定的最小值和最大值之间循环变化,这有助于模型在训练过程中跳出局部最优。
  7. warmup

    • 在训练的初始阶段,逐渐增加学习率,这有助于稳定训练过程并减少初始阶段的震荡。
  8. 使用学习率查找器

    • 使用学习率查找器(如学习率范围测试)来确定一个合适的学习率范围,然后在这个范围内进行调整。
  9. LambdaLR

    • 使用Lambda函数动态调整学习率,LambdaLR允许用户定义一个函数,该函数根据epoch数来计算学习率的调整因子。
  10. 自定义调度器

    • 在深度学习框架中,可以编写自定义的调度器来实现特定的学习率调整逻辑。

2.迁移学习

        迁移学习(Transfer Learning)是机器学习中的一种方法,它允许一个预训练的模型被调整或者微调,以便它可以在一个新的、但相关的任务上使用。这种方法的核心思想是,在一个大型数据集(通常是通用数据集)上训练好的模型已经学习到了一些通用的特征,这些特征可以被迁移到新的、数据量可能较少的任务上。

迁移学习在深度学习领域尤其流行,因为深度学习模型通常需要大量的数据来训练。通过迁移学习,我们可以利用在大型数据集(如ImageNet)上预训练的模型,来提升在特定领域数据集上的性能,即使这个领域数据集的样本数量有限。

迁移学习步骤

  1. 选择预训练模型

    • 确定一个已经在相关任务上训练过的模型作为起点。这个模型可以是在一个大型数据集(如ImageNet、COCO、Visual Genome等)上预训练的深度学习模型。
  2. 收集目标任务数据

    • 准备目标任务的数据集。这个数据集可能比预训练模型使用的数据集小得多。
  3. 特征提取

    • 使用预训练模型作为特征提取器,提取目标任务数据的特征。在这个阶段,通常不修改预训练模型的权重。
  4. 迁移策略

    • 根据目标任务的需求选择合适的迁移策略。这可能包括:
      • 直接迁移:直接使用预训练模型的输出作为特征,输入到新的分类器或回归器中。
      • 微调:在目标任务的数据集上继续训练预训练模型,可能涉及到冻结某些层的权重,或者对所有层进行微调。
      • 增量迁移:逐步将新任务的数据整合到模型中,可能涉及到增量学习策略。
  5. 调整模型结构

    • 根据目标任务的需求,可能需要对预训练模型进行调整,比如添加、删除或修改某些层。
  6. 训练/微调模型

    • 在目标任务的数据集上训练模型。这可能涉及到端到端的训练,或者只训练模型的某些层(通常是靠近输出层的层)。
  7. 验证和测试

    • 使用验证集评估模型的性能,并进行必要的调整。在训练过程中,要监控过拟合现象,并使用适当的正则化技术。
  8. 评估

    • 在目标任务的测试集上评估模型的最终性能。
  9. 迭代优化

    • 根据评估结果,可能需要回到前面的步骤进行调整,比如更换预训练模型、调整迁移策略、修改模型结构等。
  10. 部署

    • 一旦模型在目标任务上表现良好,就可以将其部署到实际应用中。