深度学习篇---模型参数调优


文章目录


前言

本文简单介绍了深度学习中的epoch、batch、learning-rate参数大小对模型训练的影响,以及怎样进行适当调优。


一、Adam学习(lr)

Adam(Adaptive Moment Estimation)是一种常用的优化算法 ,结合了 Adagrad 和 RMSProp 的优点,能自适应地调整每个参数的学习率。在使用 Adam 优化器时,学习率的设置对模型的训练效果有着重要影响。以下是一些常见的学习率设置情况:

1. 默认学习率

在大多数深度学习框架中,Adam 优化器的默认学习率通常设置为 0.001。例如在 PyTorch 中:

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
# 假设 model 是你的模型
model = nn.Linear(10, 1)
optimizer = optim.Adam(model.parameters(), lr=0.001)
这个默认值在很多情况下表现良好,是一个不错的初始尝试值。它在许多不同类型的任务(如分类、回归等)和不同的模型架构(如神经网络、卷积神经网络等)中都能取得较好的效果。

2. 较小的学习率

当遇到以下情况时,可能需要使用较小的学习率:

模型复杂

模型复杂:如果模型的参数数量非常多,结构复杂,过大的学习率可能会导致模型在训练过程中跳过最优解,无法收敛到较好的结果。此时可以尝试将学习率设置为 0.0001 甚至更小,如 0.00001

python 复制代码
optimizer = optim.Adam(model.parameters(), lr=0.0001)

数据集规模小

数据集规模小:数据集较小时,模型容易过拟合,使用较小的学习率可以使模型在训练过程中更加稳定,避免过度调整参数。

3. 较大的学习率

在某些情况下,也可以尝试使用较大的学习率:

模型简单

模型简单:当模型结构比较简单,参数数量较少时,较大的学习率可以使模型更快地收敛到一个较好的解。可以尝试将学习率设置为 0.01 或 0.1。

python 复制代码
optimizer = optim.Adam(model.parameters(), lr=0.01)

训练初期

训练初期:在训练的开始阶段,可以使用较大的学习率让模型快速地朝着最优解的方向前进,然后在训练过程中逐渐降低学习率,这种方法称为学习率衰减

4. 学习率衰减策略

为了在训练过程中更好地平衡收敛速度和收敛精度,可以采用学习率衰减策略。常见的策略有:

固定步长衰减

固定步长衰减:每隔一定的训练轮数(epoch),将学习率乘以一个固定的衰减因子。例如,每 10 个 epoch 将学习率乘以 0.1。

python 复制代码
from torch.optim.lr_scheduler import StepLR

optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = StepLR(optimizer, step_size=10, gamma=0.1)

for epoch in range(num_epochs):
    # 训练代码
    optimizer.step()
    scheduler.step()

指数衰减

指数衰减:学习率按照指数函数的形式进行衰减。

python 复制代码
from torch.optim.lr_scheduler import ExponentialLR

optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = ExponentialLR(optimizer, gamma=0.9)

for epoch in range(num_epochs):
    # 训练代码
    optimizer.step()
    scheduler.step()

总之,学习率的设置需要根据具体的任务、模型和数据集进行调整,通常需要通过多次实验来找到最优的学习率。

二、训练轮数(epoch)

训练轮数(epoch)指的是将整个训练数据集完整地过一遍模型的次数 。合理设计训练轮数对模型训练效果至关重要,轮数太少模型可能欠拟合,轮数太多则可能导致过拟合。以下是常见的训练轮数设计方法:

1. 经验值设定

小数据集与简单模型

小型数据集与简单模型:

当处理的数据集规模较小,且模型结构相对简单时,训练轮数通常不用太多。例如,对于手写数字识别这类简单任务,若使用全连接神经网络,训练轮数设置在 10 - 50 之间可能就足够了。

大数据集和复杂模型

大型数据集与复杂模型:

在处理大型数据集,如 ImageNet 这样的大规模图像数据集,并且使用像 ResNet、VGG 这类复杂的卷积神经网络时,训练轮数可能需要设置为几十甚至上百,常见的是 50 - 200 轮。

2. 监控指标变化

损失函数与准确率:

在训练过程中,可以监控损失函数值和准确率 等指标的变化。当损失函数值不再显著下降,或者准确率不再提升时,就可以停止训练。在代码里,可以添加相应的逻辑来实现早停策略。以下是一个简单的早停示例:

python 复制代码
# 假设 patience 是容忍训练轮数没有提升的最大次数
patience = 10
best_loss = float('inf')
no_improvement_count = 0

for epoch in range(num_epochs):
    loss = train(model, train_loader, criterion, optimizer, device)
    
    if loss < best_loss:
        best_loss = loss
        no_improvement_count = 0
    else:
        no_improvement_count += 1
    
    if no_improvement_count >= patience:
        print(f"Early stopping at epoch {epoch + 1}")
        break

验证集表现:

将数据集划分为训练集和验证集,在每个 epoch 结束后,在验证集上评估模型的性能**。当验证集上的性能开始下降时,停止训练**。

3. 学习率衰减结合

在训练过程中采用学习率衰减策略时 ,训练轮数的设计要和学习率衰减的步数相配合。例如,每 10 个 epoch 衰减一次学习率,那么总的训练轮数可以设置为衰减步数的整数倍

4. 逐步增加

在模型训练的初始阶段,可以先设置较少的训练轮数进行快速实验,观察模型的训练情况,如损失函数的下降趋势、准确率的变化等。根据初步实验的结果,逐步增加训练轮数,直到达到理想的训练效果。

三、批次大小(batch)

在深度学习中,batch(批次)指的是在一次前向 / 反向传播过程 中使用的样本数量。合理设计 batch 大小对模型的训练效率、泛化能力和收敛速度都有重要影响。以下是常见的 batch 设计方法及相关考虑因素:

1. 较小的 batch 大小

优点

更好的泛化能力

更好的泛化能力:较小的 batch 会引入更多的噪声,这可以被看作是一种正则化手段,有助于模型学习到更鲁棒的特征,提高泛化能力。

更快逃离局部最优

更快逃离局部最优:噪声的存在使得模型在优化过程中更容易跳出局部最优解,从而有可能找到更优的全局最优解。

缺点

训练速度慢

训练速度慢:由于每次处理的样本数量少,参数更新的频率会更高,这会增加训练时间,尤其是在 GPU 等并行计算设备上,小 batch 无法充分利用设备的计算资源。

梯度估计不稳定

梯度估计不稳定:小 batch 计算得到的梯度可能会有较大的波动,导致训练过程不稳定。

适用场景

数据集规模较小 的情况,小 batch 可以模拟更多的训练步骤,让模型有更多机会学习数据特征。

模型容易过拟合 时,小 batch 带来的噪声可以作为一种正则化方法

常见取值:通常可以从 1、2、4、8、16 等开始尝试。在你的代码里,batch_size 设置为 32,如果想尝试小 batch,可以将其改为 8 或 16。

python 复制代码
train_loader = DataLoader(dataset, batch_size=8, shuffle=True)

2. 较大的 batch 大小

优点

训练速度快

训练速度快:大 batch 可以充分利用计算设备(如 GPU)的并行计算能力,减少参数更新的次数,从而加快训练速度。

梯度估计更稳定

梯度估计更稳定:由于使用了更多的样本计算梯度,梯度的估计会更加准确和稳定,有助于模型更快收敛。

缺点

泛化能力下降

泛化能力下降:大 batch 可能会使模型陷入局部最优解,导致泛化能力变差。

内存需求高

内存需求高:需要更多的内存来存储和处理大量的样本,可能会受到硬件资源的限制。

适用场景

数据集规模非常大 的情况,大 batch 可以提高训练效率。
模型结构简单,不太容易过拟合 时,可以使用大 batch 加速训练。

常见取值:常见的大 batch 大小有 64、128、256、512 等。你可以将代码中的 batch_size 调整为 64 进行尝试:

python 复制代码
train_loader = DataLoader(dataset, batch_size=64, shuffle=True)

3. 动态调整 batch 大小

在训练过程中,可以根据训练的不同阶段动态调整 batch 大小。例如,在训练初期使用较大的 batch 快速收敛到一个较好的解 ,然后在训练后期使用较小的 batch 进行精细调整,提高模型的泛化能力。

4. 考虑硬件资源

在设计 batch 大小时,需要考虑硬件资源的限制 。如果 GPU 内 存有限,使用过大的 batch 可能会导致内存溢出错误。可以通过逐步增加 batch 大小,直到出现内存问题,然后选择一个稍小的 batch 大小作为合适的值。

5. 结合学习率调整

batch 大小和学习率通常需要一起调整 。一般来说,大 batch 可以使用较大的学习率,小 batch 则需要使用较小的学习率。在调整 batch 大小后,可能需要相应地调整学习率,以保证模型的收敛性

综上所述,选择合适的 batch 大小需要综合考虑数据集规模、模型复杂度、硬件资源等因素,通常需要通过多次实验来找到最优的 batch 大小。


相关推荐
橘猫云计算机设计7 分钟前
基于django优秀少儿图书推荐网(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·小程序·django·毕业设计
互联网杂货铺14 分钟前
如何用Postman实现自动化测试?
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
予安灵21 分钟前
一文详细讲解Python(详细版一篇学会Python基础和网络安全)
开发语言·python
神马行空1 小时前
一文解读DeepSeek大模型在政府工作中具体的场景应用
人工智能·大模型·数字化转型·deepseek·政务应用
合合技术团队1 小时前
实测对比|法国 AI 独角兽公司发布的“最强 OCR”,实测效果如何?
大数据·人工智能·图像识别
冷月半明1 小时前
Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案
python·selenium
冷月半明1 小时前
《Pandas 性能优化:向量化操作 vs. Swifter 加速,谁才是大数据处理的救星?》
python·数据分析·pandas
蒹葭苍苍8731 小时前
LoRA、QLoRA微调与Lama Factory
人工智能·笔记
蹦蹦跳跳真可爱5891 小时前
Python----机器学习(基于PyTorch的线性回归)
人工智能·pytorch·python·机器学习·线性回归
Json_1 小时前
Vue 构造器 Vue.extend
前端·vue.js·深度学习