Batch 、Batch_Size、weight decay、momentum、normalization和正则化的一些理解和借鉴

本文深入探讨了深度学习中Batch_Size的影响,指出全数据集训练与批梯度下降法的优缺点。增大Batch_Size可以提高效率但可能导致收敛速度变慢。此外,文章还讨论了weight decay、momentum和normalization的作用,以及L1和L2正则化在防止过拟合中的应用。通过对不同正则化方法的比较,如岭回归和Lasso回归,阐述了它们如何调整模型复杂度,提高模型的泛化能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理一下之前看过的内容,方便后面忘记时查询。

谈谈深度学习中的 Batch_Size

Batch_Size(批尺寸)是机器学习中一个重要参数,涉及诸多矛盾,下面逐一展开

首先,为什么需要有 Batch_Size 这个参数?
Batch 的选择,首先决定的是下降的方向。如果数据集比较小,完全可以采用全数据集 (Full Batch Learning )的形式,这样做至少有 2 个好处:其一,由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。其二,由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用Rprop 只基于梯度符号并且针对性单独更新各权值。

对于更大的数据集,以上 2 个好处又变成了 2 个坏处:其一,随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。其二,以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来RMSProp 的妥协方案。

既然 Full Batch Learning 并不适用大数据集,那么走向另一个极端怎么样?
所谓另一个极端,就是每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(Online Learning)。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。 

 

可不可以选择一个适中的 Batch_Size 值呢?
当然可以,这就是批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。

批训练引入最大的好处是针对非凸损失函数(凸函数就是U型函数)来做的,毕竟非凸的情况下,全样本就算工程上的动,也会卡在局部最优上,批表示了全样本的部分抽样实现,相当于认为引入修正梯度上的采样噪声,使“一路不通找别路”更有可能的搜索最优值。

 

在合理范围内,增大 Batch_Size 有何好处?

  • 内存利用率提高了,大矩阵乘法的并行化效率提高。
  • 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
  • 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。


盲目增大 Batch_Size 有何坏处?

  • 内存利用率提高了,但是内存容量可能撑不住了。
  • 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
  • Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

训练:

若全集有502张图片,参数batch_size=30,则训练一次全集需要跑502/32=15次,epoch是训练全集的次数,epoch=100即训练100次全集。

调节 Batch_Size 对训练效果影响到底如何?
这里跑一个 LeNet 在 MNIST 数据集上的效果。MNIST 是一个手写体标准库,我使用的是 Theano 框架。这是一个 Python 的深度学习库。安装方便(几行命令而已),调试简单(自带 Profile),GPU / CPU 通吃,官方教程相当完备,支持模块十分丰富(除了 CNNs,更是支持 RBM / DBN / LSTM / RBM-RNN / SdA / MLPs)。在其上层有 Keras 封装,支持 GRU / JZS1, JZS2, JZS3 等较新结构,支持 Adagrad / Adadelta / RMSprop / Adam 等优化算法。 

运行结果如上图所示,其中绝对时间做了标幺化处理。运行结果与上文分析相印证:

  • Batch_Size 太小,算法在 200 epoches 内不收敛。
  • 随着 Batch_Size 增大,处理相同数据量的速度越快。
  • 随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
  • 由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
  • 由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

       深度神经网络的优化是个nonconvex problem.所以基于SGD的训练batch size不能取过大。过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。。具体的batch size的选取和训练集的样本数目相关。。举个例子,比如在3小时的语音识别库(大约108万个样本)训练DNN,通常batch 取128..而在300小时的库上会取1024.

 

对weight decay、momentum和normalization的一些理解

一、weight decay(权值衰减)的使用既不是为了提高收敛精确度也不是为了提高收敛速度,其最终目的

num_classes: 30 project_path: "D:/pychj/pythorch" train_data_path: "DataSet/final/train" val_data_path: "DataSet/final/valid" test_data_path: "DataSet/final/test" #图片可视化分析源路径 img_path: "DataSet/final/test/0002_人参/人参31.jpg" #训练伦次 epochs: 30 #选用设备 device: 'cuda:0' #训练批次大小,防止显存溢出 batch_size: 16 #加载的权重路径 weights_path: '' #迁移学习 fine_tuning: True #优化器的选择 opt_name: 'AdamW' #线程加载 nw: 2 #模型保存路径 #vgg模型 Model_VGG: 'Model/Model_VGG/weights/VGG16_43481362425_best_model.pt' Model_AlexNet: 'Model/Model_AlexNet/weights/AlexNet_43491884900_best_model.pt' Model_MobileNet: 'Model/Model_MobileNet/weights/MobileNet_V3_Small_43544276625_best_model.pt' Model_ResNet: 'Model/Model_ResNet/weights/ResNet50_43544327450_best_model.pt' #可视化测验调用模型路径 Web_Model: 'Model/Model_VGG/weights/VGG16_43481362425_best_model.pt' #端口号 Web_Port: 8017 #不同类别的名称列表 display_labels: - '三七' - '乌梅' - '人参' - '何首乌' - '党参' - '决明子' - '小茴香' - '板蓝根' - '枸杞子' - '柴胡' - '桑葚' - '槐花' - '沉香' - '灵芝' - '甘草' - '白芍' - '白花蛇舌草' - '百合' - '穿心莲' - '红花' - '罗汉果' - '艾叶' - '茯苓' - '莲子心' - '葛根' - '虫草' - '蝉蜕' - '金银花' - '阿胶' - '陈皮' #混淆矩阵显示具数值 show_figure: false #混淆矩阵结果归一化 normalization: true 找出这里面的超参数
03-15
<think>好的,我需要帮用户提取深度学习模型训练中的超参数列表。首先,得回顾常见的超参数有哪些。用户提到了num_classes、epochs、batch_size、fine_tuning、opt_name、nw等,我需要扩展更多的相关参数。 基础超参数方面,学习率(learning_rate)肯定是核心的,还有训练轮数(num_train_epochs),批量大小(per_device_train_batch_size),权重衰减(weight_decay),这些在引用[1]的TrainingArguments里都有出现。优化器类型(opt_name)比如Adam、SGD,动量(momentum优化器参数如beta1、beta2也是重要的。 模型结构相关的参数,像num_classes是分类任务的类别数,预训练模型选择(pretrained_model_name)比如ResNet-18在引用[4]中提到。输入尺寸(input_size数据增强参数如随机裁剪、翻转等也需要考虑。 训练策略方面,微调(fine_tuning)迁移学习相关参数,比如是否冻结层(freeze_layers)、解冻层数(unfreeze_layers)在引用[2][4]中涉及。早停(early_stopping_patience)、学习率调度器(lr_scheduler_type)比如余弦退火,以及混合精度训练(fp16)在引用[1]的示例里也有设置。 正则化相关的参数,除了权重衰减,还有丢弃率(dropout_rate)、标签平滑(label_smoothing)、L1/L2正则化系数。硬件相关的如设备类型(device)、并行策略(distributed_strategy)、GPU数量(nproc_per_node)也会影响训练。 验证日志方面,评估频率(evaluation_strategy)、保存策略(save_strategy)、日志目录(output_dir)实验名称(run_name)在引用[1][5]中出现。数据相关的如训练集比例(train_split_ratio)、数据路径(data_dir)、工作线程数(num_workers即nw)也是关键。 需要确保覆盖用户提到的参数,同时补充其他常用超参数。注意引用中的例子,比如引用[1]里的TrainingArguments包含多个参数,引用[2]讨论迁移学习的调整,引用[4]使用预训练模型。整理这些信息,分门别类列出,确保每个参数有简要说明,并正确标注引用来源。</think>深度学习模型训练中常见的超参数可分为以下几类,结合代码示例引用资料进行说明: ### 一、基础训练参数 1. `num_classes`:输出层神经元数量(分类任务) ```python model = nn.Linear(512, num_classes) # 全连接层输出维度 ``` 2. `epochs`/`num_train_epochs`:训练轮次 ```python training_args = TrainingArguments(num_train_epochs=2) # [^1] ``` 3. `batch_size`:单批次样本数量 ```python training_args = TrainingArguments(per_device_train_batch_size=32) # [^1] ``` 4. `learning_rate`:学习率(控制参数更新步长) ```python training_args = TrainingArguments(learning_rate=1e-3) # [^1] ``` ### 二、优化器参数 5. `opt_name`:优化器类型(adam/sgd/rmsprop等) ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 6. `weight_decay`:权重衰减(L2正则化系数) ```python training_args = TrainingArguments(weight_decay=0.01) # [^1] ``` 7. `momentum`:动量参数(SGD优化器专用) ```python optimizer = torch.optim.SGD(params, momentum=0.9) ``` ### 三、模型结构参数 8. `pretrained`:是否使用预训练模型 ```python pretrained_net = models.resnet18(pretrained=True) # [^4] ``` 9. `fine_tuning`:微调模式开关(True=微调全层,False=冻结部分层) ```python if not fine_tuning: for param in pretrained_net.parameters(): param.requires_grad = False # [^2] ``` ### 四、数据与硬件参数 10. `nw`/`num_workers`:数据加载线程数 ```python dataloader = DataLoader(dataset, num_workers=4) ``` 11. `device`:训练设备(cpu/cuda/mps) ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") ``` ### 五、进阶训练策略 12. `warmup_steps`:学习率预热步数 13. `gradient_accumulation_steps`:梯度累积步数 ```python training_args = TrainingArguments( gradient_accumulation_steps=2) # 模拟更大batch_size ``` 14. `fp16`:混合精度训练开关 ```python training_args = TrainingArguments(fp16=True) ``` ### 六、验证与保存参数 15. `evaluation_strategy`:验证频率(epoch/steps/no) ```python training_args = TrainingArguments(evaluation_strategy="epoch") # ``` 16. `save_strategy`:模型保存策略 ```python training_args = TrainingArguments(save_strategy="epoch") # ``` 完整参数示例(基于HuggingFace格式): ```python training_args = TrainingArguments( output_dir="./train_output", # [^5] num_train_epochs=5, per_device_train_batch_size=32, learning_rate=2e-5, weight_decay=0.01, evaluation_strategy="epoch", save_strategy="epoch", load_best_model_at_end=True, metric_for_best_model="accuracy", fp16=True, num_workers=4 # nw参数 ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值