深度学习调参大法

目录

  • trick 1:深度学习调参核心点
  • trick 2:关于 深度学习Model选型问题
  • trick 3:关于数据
  • trick 4:关于调参
    • 4.1 关于 Loss function 调参策略
    • 4.2 关于 Learning rate 和 batch size 调参策略
    • 4.3 关于 Epoch number 和 early stopping 调参策略
    • 4.4 关于 Optimizer 调参策略
    • 4.5 关于 Activation function 调参策略
    • 4.6 关于 Weights initialization 调参策略
    • 4.7 关于 Regularization 调参策略
    • 4.8 关于 Validation 调参策略
  • trick 5:模型训练过拟合和欠拟合问题?
    • 5.1 欠拟合(Underfitting)
    • 5.2 过拟合(Overfitting)
  • trick 6:模型参数初始化方法
  • trick 7:Normalization 选择问题
  • 模型输出层选择问题
  • trick 8:随机数种子设定问题
  • trick 9:cross validation问题
  • trick 10:新模型开发前期问题
  • trick 11:badcase 分析问题

1. trick 1:深度学习调参核心点

首先需要牢记一个点:模型选型和数据质量决定了任务的底线,而调参只是锦上添花的工作

先overfit 再trade off,首先保证你的模型capacity能够过拟合,再尝试减小模型,各种正则化方法;

2. trick 2:关于 深度学习Model选型问题

深度学习Model选型是一个综合考虑多个因素的过程,旨在找到最适合特定任务和数据集的模型。以下是一些关键步骤和考虑因素:

  • 理解任务需求
  1. 任务类型:首先要明确任务是分类、回归、生成、排序还是其他,比如文本相似度计算、图像识别、自然语言处理等。
  2. 数据特性:考虑数据的维度、规模、结构(如图像、文本、时序数据等)和质量。
  • 模型容量
  1. 选择一个与数据复杂度相匹配的模型大小。模型过于简单可能导致欠拟合,而过于复杂则可能过拟合。
  2. 考虑模型的参数数量和可调整范围。
  • 数据复杂度
  1. 样本数量和特征维度会影响模型选择。大数据集通常能支持更复杂的模型。
  2. 数据的时间或空间结构,以及多样性,也是选择模型时的重要考量。
  • 先验知识与预训练模型
  1. 利用领域知识选择合适的模型结构,例如在NLP任务中,预训练的Transformer模型(如BERT, Sentence-BERT)常被用于文本相似度计算。
  2. 预训练模型可以在特定任务上提供强大的初始化,加速训练过程并提高性能。
  • 计算资源
  1. 考虑可用的GPU、内存和计算时间。复杂模型往往需要更多资源。
  2. 在资源有限的情况下,轻量级模型或模型压缩技术可能是更好的选择。
  • 模型可解释性

对于某些应用,模型的可解释性至关重要。决策树、线性模型相对容易解释,而深度神经网络可能较难解释。

  • 评估与验证
  1. 设计合适的评价指标,如准确率、F1分数、AUC-ROC等,确保模型性能可量化。
  2. 使用交叉验证来可靠地估计模型泛化能力,并避免过拟合或欠拟合。
  3. 实施正则化技术(如权重衰减、dropout)以控制模型复杂度。
  • 实验与调优
  1. 初始可尝试几个不同的模型架构,进行快速原型设计。
  2. 根据初步实验结果,逐步精细化调优选定的模型,包括调整超参数、网络结构等。
  • 框架与工具

选择合适的深度学习框架(如TensorFlow、PyTorch、Keras等),考虑其易用性、社区支持、生态系统等因素。

所以说深度学习模型选型是一个迭代且实践驱动的过程,需要不断地实验、评估与调整,直至找到满足特定需求的最佳模型。

3. trick 3:关于数据

  • 数据量太大时,可以采取以下几种策略来有效管理和处理数据,确保模型训练的可行性:
  1. 数据采样
    1. 随机采样:从整个数据集中随机抽取一部分作为训练数据,可以是无放回或有放回采样。
    2. 分层采样:确保每个类别或重要属性在采样数据中都有代表性,适用于分类任务。
  1. Mini-Batch训练:将数据集分成多个小批量(mini-batches),每次仅使用一个小批量数据来更新模型参数,减少了内存需求并加速了训练过程。
  2. 在线学习或流式学习:不一次性加载所有数据,而是让数据一批批地通过模型,适合处理不断增长或内存限制严格的场景。
  3. 硬盘/外部存储读取:只加载当前需要训练的数据到内存,其余数据存储在硬盘上,按需读取。例如,使用tf.data.Dataset(TensorFlow)或PyTorch的DataLoader实现。
  4. 数据集划分与分布式训练:将数据集分割并在多个GPU或计算节点上并行训练,利用分布式训练框架如Horovod、PyTorch的torch.nn.parallel.DistributedDataParallel或TensorFlow的tf.distribute.Strategy。
  5. 数据压缩与降维:对数据进行压缩处理,如图像的量化、特征选择或降维(PCA、t-SNE等),减少内存占用。
  6. 增量学习或持续学习:模型不是一次性训练完成,而是逐步学习新数据,每次迭代只添加或更新部分数据,适用于数据流持续到来的情况。
  7. 使用TFRecords或其他高效的文件格式:将数据序列化为高效的二进制格式,如TensorFlow的TFRecords,这有助于减少读取时间和内存使用。
  8. 近似方法和算法优化:对于特定类型的模型(如推荐系统中的矩阵分解),使用近似算法减少计算复杂度和内存需求。
  9. 硬件升级与云服务:如果条件允许,增加物理内存或使用高性能计算资源,甚至迁移到云服务,如Google Cloud、AWS或Azure,它们提供了灵活的计算和存储资源。

  • 数据量太小时,可以采取以下几种策略来有效管理和处理数据,确保模型训练的可行性:
  1. 数据增强
    1. 对现有数据进行变换以生成新的样本,如图像旋转、翻转、缩放、裁剪、色彩调整等,适用于计算机视觉任务。
    2. 文本数据可以通过同义词替换、句式转换、文本摘要等方式增强。
    3. 语音数据可以通过改变速度、音调、添加背景噪音等方法增加多样性。
  1. 迁移学习
    1. 使用预训练模型作为起点,这些模型在大型数据集上已经学习到了通用特征,然后在自己的小数据集上进行微调。
    2. 只对模型的最后一层或几层进行训练,保留前面的层不变,这样可以利用预训练模型的强大表示能力。
  1. 集成学习:训练多个模型并将它们的预测结果结合起来,可以是bagging、boosting等方法,这有助于减少方差,提高模型稳健性。
  2. 正则化:使用L1、L2正则化或Dropout等技术防止模型过拟合,使模型在小数据集上表现更好。
  3. 半监督学习或自监督学习:半监督学习利用少量有标签数据和大量无标签数据进行训练;自监督学习则让模型从无标签数据中自我生成监督信号,减少对大量标注数据的依赖。
  4. 生成模型:利用GANs(生成对抗网络)、VAEs(变分自编码器)等生成模型来合成新的数据样本,尤其是图像或文本数据。
  5. 主动学习:一种迭代方法,模型在训练过程中主动选择最有价值的样本请求人工标注,从而高效增加数据质量和数量。
  6. 模型精简:选择小型网络结构或进行模型剪枝,减少模型复杂度,使得小数据集也足以训练。
  7. 重采样技术:对于类别不平衡的数据集,可以通过过采样少数类或欠采样多数类来平衡数据,提高训练效率。
  8. 仿真数据生成:根据业务逻辑或领域知识创建仿真数据,尤其是对于难以收集真实数据的情况。
  • 一定要进行数据预处理,把数据分布分散到均值为0,方差为1的区间,利于训练模型

注:数据增强要结合任务本身来设计

4. trick 4:关于调参

调参一定要做好笔记,每次只调1个参数。有哪些参数可以调呢?

4.1. 关于 Loss function 调参策略

是Model和数据之外,第三重要的参数。具体使用MSE、Cross entropy、Focal还是其他自定义,需要具体问题具体分析。

4.2. 关于 Learning rate 和 batch size 调参策略
  1. Learningrate和batch size是两个重要的参数,而且二者也是相互影响的,在反向传播时直接影响梯度。一般情况下,先调batchsize,再调learning rate。
  2. batch size不能太大,也不能太小,一般设置为16的倍数。
    1. 太小会浪费计算资源,
    2. 太大则会浪费内存;
    3. 特殊情况:batch size 在表示学习,对比学习领域一般越大越好,显存不够上累计梯度,否则模型可能不收敛… 其他领域看情况;
  1. 如果使用微调,则learningrate设置:
    1. 一般nlp bert类模型在1e-5级别附近,warmup,衰减;
    2. cv类模型在1e-3级别附近,衰减;具体需要多尝试一下。
  1. learningrate设置上有很多trick,包括cosing learning rate,warmup,衰减等。
4.3. 关于 Epoch number 和 early stopping 调参策略
  1. Epoch number和Early stopping是息息相关的,需要输出loss看一下,到底是什么epoch时效果最好,及时early stopping;
  2. Epoch越大,会浪费计算资源;epoch太小,则训练模型提取特征没到极致;
  3. 此外,也要明自Epoch、lteration、batchsize的关系。

注:

  1. 不要过早的early stopping,有时候收敛平台在后段
  2. 对于数据量巨大的推荐系统的模型来说一个epoch足矣,再多就会过拟合。
4.4. 关于 Optimizer 调参策略
  1. Adam和SGDM是最常用的两个,前者能快速收敛,后者收敛慢但最终精度更高。现在大家会先使用Adam快速收敛,后面再用SGDM提升精度。
  2. 如果必须二选一的话,我会推荐Adam。

注:nlp,抽象层次较高或目标函数非常不平滑的任务优先使用adam,其他可以尝试下sgd(一般需要的迭代次数高于sgd)

4.5. 关于 Activation function 调参策略
  1. ReLu、Sigmoid、Softmax、Tanh是最常用的4个激活函数。
  2. 对于输出层,常用sigmoid和softMax激活函数,中间层Q常用ReLu激活函数,RNN常用Tanh激活函数。
4.6. 关于 Weights initialization 调参策略
  1. 预训练参数是最好的参数初始化方式,其次是Xavir。
4.7. 关于 Regularization 调参策略

Dropout虽然思想很简单,但效果出奇的好,现在大部分任务都需要使用预训练型,要注意型内部dropout ratio是一个很重要的参数,首选0.5,使用默认值不一定最优,有时候dropoutreset到0有奇效;

4.8. 关于 Validation 调参策略
  1. 在 Validation 筛选模型参数时,可以除loss函数外,设置某种规则引导模型向某个想要的方向去更新参数。

5. trick 5:模型训练过拟合和欠拟合问题?

模型训练过程中的过拟合(Overfitting)和欠拟合(Underfitting)是两个常见的问题,它们影响模型的泛化能力,即模型在未见过的新数据上的表现。

5.1. 欠拟合(Underfitting)
  • 欠拟合(Underfitting)判断:欠拟合发生时,模型无法捕捉数据中的底层模式,导致模型在训练数据上表现不佳,同时在测试数据上的表现也会较差
  • 欠拟合(Underfitting)发生原因:其主要原因是模型过于简单,不足以表达数据集中的复杂关系。欠拟合的迹象包括训练误差和验证误差都很高,且两者接近。
  • 解决欠拟合的方法包括:
  1. 增加模型复杂度:通过增加网络层数、节点数或使用更复杂的模型结构来提高模型的表达能力。
  2. 增加特征:引入更多相关特征,帮助模型更好地理解数据。
  3. 调整模型参数:优化模型参数设置,如学习率、批次大小等,以促进更好的学习。
  4. 减少正则化强度:如果使用了正则化但模型依然欠拟合,可能需要减小正则化参数。
5.2. 过拟合(Overfitting)
  • 过拟合(Overfitting)危害:过拟合的特征是训练误差很低,而验证或测试误差较高
  • 过拟合(Overfitting)发生原因:过拟合则是模型在训练数据上表现过于优秀,以至于它学习到了训练数据中的噪声和偶然特性,而不是数据的真实分布。这导致模型在未见过的测试数据上的表现显著下降。
  • 解决过拟合(Overfitting)的方法包括:
  1. 增加训练数据:更多的数据可以帮助模型更好地泛化。
  2. 正则化:通过在损失函数中加入正则项(如L1、L2正则化),限制模型参数的大小,避免参数过度优化训练数据中的细节。
  3. 早停法(Early Stopping):在验证集上的性能不再提升时停止训练。
  4. 交叉验证:使用K折交叉验证等方法更准确地评估模型性能,避免过拟合。
  5. Dropout:随机“丢弃”一部分神经元,减少模型对特定训练样本的依赖。
  6. 数据增强:通过变换原始数据生成额外的训练样本,增加模型的泛化能力。
  7. 简化模型:减少模型复杂度,如减少神经网络的层数或节点数,避免不必要的复杂性。

个人经验:如果过拟合,首先是dropout,然后batchnorm,过拟合越严重dropout+bn加的地方就越多,有些直接对embedding层加,有奇效。

6. trick 6:模型参数初始化方法

linear/cnn一般选用kaiminguniform 或者normalize,embedding一般选择截断normalize,论文很多,可以去看看。

7. trick 7

7.1. Normalization 选择问题

GN,BN和LN都是在神经网络训练时的归一化方法,BN即Batch Normalization,LN即Layer Normalization。

  • BatchNorm:batch方向做归一化,计算NHW的均值
  • LayerNorm:channel方向做归一化,计算CHW的均值
  • InstanceNorm:一个channel内做归一化,计算H*W的均值
  • GroupNorm:先将channel方向分group,然后每个group内做归一化,计算(C//G)HW的均值

GN与LN和IN有关,这两种标准化方法在训练循环(RNN / LSTM)或生成(GAN)模型方面特别成功。

  • 如何选择:序列输入上LN,非序列上BN
7.2. 模型输出层选择问题

基于banckbone 构建层次化的neck一般都比直接使用最后一层输出要好,reduce function一般attention 优于简单pooling,多任务需要构建不同的qkv

8. trick 8:随机数种子设定问题

随机数种子设定好,否则很多对比实验结论不一定准确

9. trick 9:cross validation问题

cross validation方式要结合任务设计,数据标签设计,其中时序数据要避免未来信息泄漏

10. trick 10:新模型开发前期问题

做新模型的时候,最开始不要加激活函数,不要加batchnorm,不要加dropout,先就纯模型。然后再一步一步的实验,不要过于信赖经典的模型结构(除非它是预训练的),比如加了dropout一定会有效果,或者加了batchnorm一定会有提升所以先加上,首先你要确定你的模型处于什么阶段,到底是欠拟合还是过拟合,然后再确定解决手段。

11. trick 11:badcase 分析问题

对于图像和nlp,效果一直不提高,可以尝试自己标注一些模型经常分错的case,然后加入训练会有奇效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为ensp静态路由,浮动路由,缺省路由讲解及配置

🏡作者主页:点击! 🤖网络通信基础TCP/IP专栏:点击! ENSP专栏:点击! ⏰️创作时间:2024年10月24日0点15分 祝大家程序员节快乐~ 路由的选择与管理至关重要。静态路由…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应…

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML:详解与示例 在 Web 开发和数据分析中,解析 HTML 是一个常见的任务,尤其是当你需要从网页中提取数据时。Python 提供了多个库来处理 HTML,其中最受欢迎的就…

ElasticSearch备考 -- index rollover

一、题目 给索引my-index-000001,创建别名my-index,并设置rollover,满足以下三个条件的 The index was created 7 or more days ago.The index contains 5 or more documents.The index’s largest primary shard is 1GB or larger. 二、思考…

vue3当中vscode给ref定义的变量使用时自动加上.value

vue3当中vscode给ref定义的变量使用时自动加上.value 1.在扩展中找到vue-office进行安装 2.安装完成后点击设置找到“dot value”勾起即可

Flutter 状态管理框架Get

状态管理框架 Get的使用 目录 状态管理框架 Get的使用 GetMaterialApp 路由的注册 路由的跳转 middlewares的使用 组件使用 defaultDialog bottomSheet snackbar 状态刷新有很多种方式 ValueBuilder Obx 基础使用 是时候引入GetxController, 也是Get里面的常用的 G…

远程IO控制器ZLAN6808-3 使用JSON定时下发执行DO通断

一.使用场景 对于数据采集控制点是按照线性分布的场景,比如智慧园区的路灯、桥梁、路灯、数字化工厂、停车场车位监测、智慧停车场、智能停车架、楼宇自动控制系统等场景,采用以太网/4G远程I0模块要比采用PLC节省更多的成本。远程IO控制器在很多场景中作…

【无人机设计与控制】基于Astar算法无人机路径规划,优化路径平滑

摘要 本文提出了一种基于A算法的无人机路径规划方法,并通过路径平滑优化提升路径的可行性和安全性。传统A算法在生成路径时,常因路径节点分布不规则导致路径不平滑,影响无人机的飞行效率和安全性。本文通过引入贝塞尔曲线对A*算法生成的路径…

【自动化测试之oracle数据库】MacOs如何安装oracle- client

操作系统为Mac OS,本地在pycharm上跑自动化脚本时,因为有操作oracle数据库的部分,所以需要安装oracle数据库的客户端,并install cx_oracle,本文主要介绍如何在macOS上完成安装,并在python自动化测试代码中配置&#xf…

哥德巴赫猜想渐行渐远

我现在的工作,表明经典分析可能出了问题,如此则连Vinogradov的三素数定理都不成立了,更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立,由于我指出Siegel定理不成立,陈景润和张益唐的工作就不成立。…

使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画 在计算机图形学和动画领域,模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型,创建一个动态的3D海浪动画。通过叠加多个波浪,我们可以生成复…

【Fargo】14: sockaddr_in 、 sockaddr 、sockaddr_storage 区别及转换

sockaddr_in 和 sockaddr struct recv_addr_; uv_ip4_addr(ip.c_str(), port, &recv_addr); 这里libuv用的是sockaddr_in ,mediasoup用的是sockaddr,二者有什么区别,可以直接转换么sockaddr 看起来更为通用 差异和特定的用途 在网络编程中,sockaddr_in 和 sockaddr 是…

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换,在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS,也提供了C语言的支持,对于一些能力&#xff…

react mackDowan 渲染文本,图片,视频

需要安装:react-markdown;remark-gfm "react-markdown": "^9.0.1", "remark-gfm": "^4.0.0", import { useEffect, useState } from react; import ReactMarkdown, { Components } from react-markdown;functio…

iOS_响应者链 Responder Chain

文章目录 简述Hit-Test 机制 (找到最佳响应者)响应者链 Responder chain应用获取当前View的控制器对象:手势穿透: 简述 传递链: 系统向离用户最近的view传递。 UIKit –> active app’s event queue –> window …

【设计模式系列】迭代器模式(七)

一、什么是迭代器模式 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供一种方法来顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中,这样…

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示:我们分享的文章是给需要的人,不需要的人请绕过,文明浏览,误恶语伤人! 前言 在软件开发中遇到使用流媒体音视频的行业比较多,如安防监控系统、无人机巡逻视频上云处理、直播平台、教育与企业培训…

如何快速使用Cesium完成项目

要快速使用Cesium完成项目,可以按照以下步骤进行: 学习基础知识: 首先,了解Cesium的基本概念和功能。可以通过阅读Cesium的官方文档和一些入门教程来掌握基础知识。例如,可以参考“Cesium速成教程:一小时入…

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上判断两个节点是否在…

阿里云物联网的通信方式

阿里云物联网通信的两种方式,一个是物模型(分为服务,事件,属性),一个是自定义topic(要另外设置数据流转) 1.使用产品内的功能定义,(其实也就是Topic中定义好的…