Tips and tricks for Neural Networks 深度学习训练神经网络的技巧总结(不定期更新)

文章目录

  • 本文说明
  • Debug 技巧
    • Overfit一个简单的Batch
    • 无法复现之前的结果
  • 数据处理
    • 平衡数据
    • 数据增强(Data Augmentation)
      • 图片增强
    • 使用Embedding数据压缩数据
    • 标准化(Normalization)
    • 标签平滑(LabelSmoothing)
    • Curriculum Learning
  • 超参数
    • 超参调节
    • Batch Size
    • Dropout
    • Learning Rate
    • Optimizer
  • 模型构建
    • 神经元数量
    • 卷积层
    • 循环层(Recurrent Layer)
    • 使用预训练模型(Pretrained Model)
    • 使用迁移学习(Transfer Learning)
    • 线性层
  • 模型训练
    • 提高模型泛化性
    • 内存不足(OOM问题)
  • 参考资料

本文说明

本文主要是记录一下深度学习过程中的遇到的一些技巧的总结,这样在训练模型时如果效果不好就过来看看有哪些可以用上。不定期更新(等学到了新知识就会更新一下)

Debug 技巧

Overfit一个简单的Batch

在实际训练之前,先找找一个简单的Batch,尝试训练它,使model可以overfit这个batch。如果模型不能成功的把loss降到接近0,说明模型有问题。

常见的错误有如下:

  1. loss逐渐变大:看看是哪个符号写反了
  2. loss暴增:可能是学习率太大了,导致发散
  3. loss上下波动(oscillate):可以尝试减小学习率,并且检查数据中的是不是有错误的Label,或者数据增强(Data Augmentation)的方式有问题
  4. loss后面降不动了(plateau):可以尝试减小学习率,如果不行,有可能是网络太深了,尝试减小网络深度。
  5. 盲目使用Warmup等学习率调整技巧:请先保证正常学习率的情况下可以收敛,然后再增加学习率调整代码。例如:我在写一个Transformer的demo时,上来就是使用了Warmup,但发现怎么都不收敛。最后把Warmup去掉后,就可以正常收敛了。

无法复现之前的结果

如果无法复现之前的结果,可能有以下原因(ChatGPT给出的答案):

  1. 随机种子:如果没固定随机种子,每次的初始化参数、训练数据的shuffle都不一样。
  2. 超参数不一样:超参数不一样,会影响最终的结果
  3. 数据预处理:采用了不同的预处理方式会造成最后结果不一样,例如使用了不同的normalization或数据增强等。
  4. 软件版本:不同版本的库也会影响,例如不同版本的pytorch、numpy等
  5. 硬件不同:不同型号的CPU、GPU也会影响最终结果,即使设置了随机种子,可能也会存在差异。

数据处理

平衡数据

数据不平衡:有些类别的数据太多,这些类别称为majority class;而有些类别数据又太少,这些类别称为minority class

常用处理方法:

  1. Undersample: 直接删除一些 majority class 的数据
  2. Oversample:自己造一些minority class的数据,例如,①使用SMOTE(Synthetic Minority Over-sampling Technique),②数据增强(Data Augmentation)
  3. 使用FocalLoss损失函数,该函数可以调节交叉熵正负样本损失的权重,并且还能条件难易样本的损失权重。

数据增强(Data Augmentation)

图片增强

  1. 采用Random image cropping and patching (RICAP) 方法。思路为:随机裁剪多个图片的中一部分,然后把它们拼接为一个图片,同时混合这些图片的标签。在这里插入图片描述

  2. Cutout:随机的把图片的一个区域遮挡起来(像素值全部设为0)。用于模拟真实图片的物体可能被其他物体遮挡住了在这里插入图片描述

  3. random erasing:类似cutout,区别在于,cutout是把图片中随机抽中的矩形区域的像素值置为0,相当于裁剪掉,random erasing是用随机数或者数据集中像素的平均值替换原来的像素值。而且,cutout每次裁剪掉的区域大小是固定的,Random erasing替换掉的区域大小是随机的。在这里插入图片描述

  4. AutoAugment:使用AutoAugment自动选择适合特定数据集的数据增强策略。

使用Embedding数据压缩数据

输入数据尽量不要使用 one-hot 编码,而是使用embedding压缩特征维度。

标准化(Normalization)

对于数值类型的数据,最好将其缩放到 [-1,1] 的范围中,目的是为了加快收敛。

标签平滑(LabelSmoothing)

对于分类问题,可以采用标签平滑(Label-smoothing regularization, LSR) 的方式避免过拟合。它的具体思想是降低我们对于标签的信任,例如我们可以将损失的目标值从1稍微降到0.9,或者将从0稍微升到0.1。

对标签进行平滑操作可以减小模型的overconfidence的情况,进而减小overfitting

例如:标签为[0, 0, 0, 1, 0],对标签平滑之后,标签变为 [0.05, 0.05, 0.05, 0.8, 0.05]。

Curriculum Learning

将样本从简到难的进行划分,先让网络学习简单的样本,然后再让网络学习难的样本,最后再把所有样本让网络整体学习一遍。类似人学习的思路,先简后难。

超参数

超参调节

最优先要考虑的超参数,或最重要的超参数是学习率(Learning Rate)

Batch Size

选择能被4整除的Batch Size, 或选择 2 n 2^n 2n

Dropout

  1. dropout最好控制在 20%-50%之间。因为太低影响不够,太高又容易让模型结果变差
  2. Use a larger network. You are likely to get better performance when dropout is used on a larger network, giving the model more of an opportunity to learn independent representations.(TODO,怎么理解这句话)
  3. Use dropout on incoming (visible) as well as hidden units. Application of dropout at each layer of the network has shown good results.(TODO,怎么理解这句话)
  4. 最后一层不要加dropout。如果这样的话,会使部分输出直接变为0.

Learning Rate

  1. Adam据说最好的学习率是 3e-4
  2. 根据训练情况调整学习率。例如:一开始学习率稍微大一点,当验证集效果变差时,减小学习率,每次可以减小4倍(×1/4)。cite1
  3. 尝试采用 Warmup 的方式来调节学习率,原理为:一开始模型不太稳定,所以学习率小一点,然后慢慢增大学习率,在一定epoches后,然后再慢慢降低学习率
  4. 学习率应该随着batch size进行变化。batch size越大,梯度中的噪声越小,所以当batch大的时候,学习率就可以大一点,而batch size小的时候,学习率就应该小一点。例如,batch size为256时选择的学习率是0.1,当我们把batch size变为一个较大的数b时,学习率应该变为 0.1 × b/256
  5. 采用AdaBound(可以试一下,作者说AdaBound会让你的训练过程像adam一样快,并且像SGD一样好)。

Optimizer

可以到 pytorch_optimizer项目 下找找有没有适合自己的Optimizer,这个项目扩展了Pytorch的optimizer,并提供了图例来表现这些Optimizer的情况。

模型构建

神经元数量

对于密集层(dense layer),输入神经元和输出神经元的数量最好都能被64整除

卷积层

  1. 对于卷积层,输入层和输出层的channel最好都是4的倍数,或是 2 n 2^n 2n

  2. 对于卷积层,输入和输出的数量最好可以被64整除

  3. pad image inputs from 3 (RGB) to 4 channels(TODO,不懂)

  4. 不同尺度的特征融合(例如 YOLOv3-SPP)。在这里插入图片描述例如,将上面卷积层的输出使用不同大小的maxpooling层进行下采样,并将各自的结果融合在一起送给接下来的网络。

  5. 低层特征与高层特征进行融合。即将前面卷积层的输出和后面卷积层的输出concat到一起,然后然后进行后续卷积

  6. 使用残差块(residual block)防止梯度消失。可参考ResNet

  7. 如果网络太大,可以尝试使用Depthwise Conv(DW)卷积 + Pointwise Conv(PW)卷积减小网络参数和计算量。可参考MobileV1

循环层(Recurrent Layer)

对于Recurrent Layer,Batch Size 和 Hidden Size 最好是4的整数,理想情况下,最好是64、128或256的倍数

对于Recurrent Layer,Batch Size最好大一些

使用预训练模型(Pretrained Model)

预训练模型:作为模型的“上游”模型,由牛逼的大厂预训练好,然后用这个模型的结果进行“下游”任务。例如:“BERT”是一个预训练模型,使用Bert可以将对Token(单词)进行Embedding,然后将其接到自己的“下游”模型上,进行特定任务的训练

计算机视觉:

  1. 使用ImageNet预训练的模型。
  2. 使用对比学习训练出的模型,例如Moco。(比使用ImageNet训练出的效果好)

NLP:

  1. 直接使用BERT
  2. 使用“利用对比学习微调后”的BERT模型。例如:使用SimCSE微调后的BERT模型。(比直接使用BERT效果好)
  3. 使用与自己任务比较契合的Bert变种,例如RoBERTa,MacBert,PERT等

使用迁移学习(Transfer Learning)

迁移学习:把别人训练好的“针对特定任务的”模型拿过来,然后把“任务”改成自己的特定任务,然后进行训练。

预训练模型和迁移学习的区别(个人理解):
预训练模型是不针对特定任务的,比如“Bert”,它针对NLP领域,但不针对具体任务,你可以拿Bert的输出再接模型进行“情感分析”、“词性标注”什么的都可以。;
但是迁移学习用的是特定任务的模型,比如张三训练了一个模型可以进行情感分析,然后你拿它这个训练好的模型,把最后几层改了,然后用于词性标注,这种是迁移学习。

迁移学习的时候,预训练模型的参数要么使用小的学习率调整,要么不调整。如果预训练模型和下游的预测模型使用同一个学习率的话,看似可以很快地拟合训练数据,但是泛化性会差很多。

线性层

  1. 据说把Softmax换成log_softmax会更好,详情可参考这个文章
  2. 多分类问题,如果类别过多,可以不使用Softmax,而是对每一个类别都使用Sigmoid。(YoloV3就是这么干的)

模型训练

  1. 定期保存:训练过程中,最好定期保存模型,防止训练过程中系统崩溃等问题导致模型丢失,哭都没地方哭,只能从头开始。如果定期保存,就可以从上一个保存点(Checkpoint)开始。
  2. 提前停止(EarlyStopping) :为了防止发生过拟合,可以提前终止训练。常用的终止策略是:使用验证数据集来验证模型性能,如果在 n n n 个step内,模型性能没有提升,就可以终止了。
  3. 知识蒸馏(Knowledge Distillation) :如果要训练一个较小的模型(例如要部署在移动设备上),使用一个较大且较高准确率的预训练模型的输出作为标签比使用真实标签效果更好。
  4. Model EMA(Model Exponentially weighted averages):模型的参数更新不仅会考虑本次的,也会考虑之前的,可以提高模型的性能。参考链接

提高模型泛化性

  1. 迁移学习的时候,预训练模型的参数要么使用小的学习率调整,要么不调整。如果预训练模型和下游的预测模型使用同一个学习率的话,看似可以很快地拟合训练数据,但是泛化性会差很多。
  2. 采用不同的网络参数初始化方式,例如:Xavier Initialization、He Initialization、Orthogonal Initialization等。具体哪一种好需要实验。
  3. 使用Dropout
  4. 优化器指定Weight Decay,通常用0.001。一般也就0.01,0.001,0.0001这三个选择。bias参数不要使用weight_decay。

内存不足(OOM问题)

  1. 可以使用**梯度累积(Accumulate Gradients)**来模拟大batch size。原理大概是:使用小的batch size,但在一个step后不更新参数,而是把梯度累加起来,多累计几个batch size的梯度后再一起更新。
  2. 使用 自动混合精度(Automatic mixed precision,AMP) 降低内存,加速训练。原理大概是:大部分深度学习框架默认使用32位的浮点数。而AMP混合了单精度(FP32)和半精度(FP16)。缺点是:训练会变得稍微不稳定,可能没之前好了





参考资料

Tips and tricks for Neural Networks: https://towardsdatascience.com/tips-and-tricks-for-neural-networks-63876e3aad1a

Tips For Using Dropout: https://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/

深度神经网络模型训练中的 tricks(原理与代码汇总):https://mp.weixin.qq.com/s/qw1mDd1Nt1kfU0Eh_0dPGQ

Pytorch Lightning effective training techniques: https://lightning.ai/docs/pytorch/stable/advanced/training_tricks.html#effective-training-techniques

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

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

相关文章

官方正品 | Ultralytics YOLOv8算法来啦(尖端SOTA模型)

&#x1f496;&#x1f496;>>>加勒比海带&#xff0c;QQ2479200884<<<&#x1f496;&#x1f496; &#x1f340;&#x1f340;>>>【YOLO魔法搭配&论文投稿咨询】<<<&#x1f340;&#x1f340; ✨✨>>>学习交流 | 温澜潮…

暑期学习杂记

7月6日 粗略复习51&#xff08;问了学长后&#xff0c;我打算直接看小车视频&#xff0c;遇到不会的再回去看江科大&#xff09; 51单片机 LED灯共阳 数码管共阴 7月7日 定时器时间计算 [参考(1条消息) 51单片机定时器使用与计算-----day3_单片机定时器定时时间计算_电子笔记…

Raki的读paper小记:Retentive Network: A Successor to Transformer for Large Language Models

Abstract&Introduction&Related Work 研究任务 语言模型的基础架构已有方法和相关工作 S4&#xff0c;H3&#xff0c;Hyena&#xff0c;Linear Transformer用核函数近似注意力&#xff0c;以便将自回归推理重写为循环形式回归到使用循环模型进行高效推理&#xff0c;但…

Coremail RSAC大会观察:在邮件安全领域AI既是矛也是盾

《Coremail RSAC大会观察&#xff1a;在邮件安全领域AI既是矛也是盾》 全球网络安全界的盛会——2023年RSAC大会于当地时间4月24日-27日在美国旧金山召开&#xff0c;大会以“Stronger Together&#xff08;一起变得更强大&#xff09;”为主题&#xff0c;议程主要包含安全研…

小红书软件,自动文案神器,爆文效率UP

小红书软件&#xff0c;自动文案神器&#xff0c;爆文效率UP&#xff01;#小红书推广#小红书营销#百收小红书 Hello大家好&#xff0c;我是百收&#xff0c;今天给大家分享的是小红书&#xff0c;三步快速打造爆款笔记可批量可复制。那话不多说先给大家看一下呃&#xff0c;学…

5个AI人工智能平台推荐,绘画、写作文案、文章一键生成

随着人工智能技术的快速发展&#xff0c;AI原创文章写作平台也愈加成熟和完善&#xff0c;让文章的创作变得更加便捷、高效、优质。下面介绍五个国内知名的AI原创文章写作平台&#xff0c;它们各有特色&#xff0c;可以满足您的不同需求。 5个AI人工智能平台推荐&#xff1a; …

沉浸式翻译

chrome沉浸式翻译插件 网页双语翻译&#xff0c;完全免费使用&#xff0c;支持Deepl/Google/Bing/腾讯/有道等。 一款免费、用户友好、简洁、革命性、广受好评的人工智能双语网络翻译扩展程序&#xff0c;可帮助您有效地弥合信息差距&#xff0c;也可在移动设备上使用&#xff…

ChatGPT新功能探索,沉浸式内容处理体验

ChatGPT已经正在广泛被企业接受&#xff0c;用来大幅提高效率。但传统的聊天模式在大篇幅文字处理时并不好用。因此新功能“沉浸内容处理模式”被推出&#xff0c;用来应对论文、邮件、文案的编写和优化。那我们就来体验一下这个新功能效果如何。以处理工作邮件为例。 一、从传…

大型语言模型 (LLM) 的两条发展路线:Finetune v.s. Prompt

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 在大型语言模型的研究中&#xff0c;研究者对其有两种不同的期待&#xff0c;也可以理解为是两种不同的路线&#xff0c;具…

违禁敏感词检测

很多站长和自媒体人都有这样的烦恼&#xff0c;因为不慎发布违禁、违规内容比如涉黄、恐怖暴力、赌博、低俗辱骂、政治敏感等&#xff0c;导致文章下架或者网站整改。 另外&#xff0c;自从新《广告法》出台后&#xff0c;作为广告、营销人等群体在写文案的过程中必须时时注意新…

ChatGPT神器Code Interpreter,用做数据分析如此丝滑!

前几天&#xff0c;OpenAI 宣布要在一周之内将官方插件 Code Interpreter 通过设置中的 Beta 面板向所有 ChatGPT Plus 用户提供。 这个消息让很多人激动了起来&#xff0c;毕竟此前 Code Interpreter 一直处于封闭测试阶段&#xff0c;只有一小部分用户真正使用过。这些内测用…

艾瑞巴蒂看过来!OSSChat 上线:融合 CVP,试用通道已开放

还在纠结于反复查找开源项目的技术文档&#xff1f; 团队常因频繁搜索开源项目主页导致效率低下&#xff1f; 每天都要问一遍【开源项目中那些“小白问题”究竟有没有更快的解决方法&#xff1f;】 对此&#xff0c;只想对你说&#xff1a;赶紧试试 OSSChat&#xff01;赶紧试…

AI生产力工具平台AI100.ai今日正式上线,ChatGPT API和Prompt机器人免费试用

上个月&#xff0c;AI100.ai开放注册&#xff0c;我们发出1000份免费测试邀请&#xff0c;得到了开发者的积极参与和反馈&#xff0c;加速了AI00.ai的功能优化。AI00.ai今日正式上线&#xff0c;为感谢广大开发者的支持&#xff0c;现面向开发者启动ChatGPT API免费试用活动&am…

免费、不用部署SD:AI二维码制作教程

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 最近&#xff0c;风格化的AI二维码&#xff0c;应该没少见吧。生成的原理大家大概也知道&#xff0c;主要通过stable diffusion和一些插件来完成&#xff0c;但对…

宠物店小程序功能有什么_分享宠物店小程序开发制作功能介绍

宠物店微信小程序主要功能有&#xff1a; 1、宠物寄养支持在线提交寄养预约&#xff0c;自主选择宠物寄养位。上门接送或自主接送。一键提交&#xff0c;摆脱繁琐流程。 2、线下买单线下店铺消费也可以使用会员余额。 3、宠物服务可以选择一键搜索或服务分类查询需要的宠物服务…

猫狗分类,猫狗大战

项目全部代码在文章末尾 1、任务描述 Cats vs. Dogs&#xff08;猫狗大战&#xff09;数据集下载地址为https://www.kaggle.com/c/dogs-vs-cats/data。这个数据集是Kaggle大数据竞赛某一年的一道赛题&#xff0c;利用给定的数据集&#xff0c;用算法实现猫和狗的识别。 其中包…

Cats vs. Dogs(猫狗大战)数据集处理

猫狗大战数据集 Cats vs. Dogs&#xff08;猫狗大战&#xff09;数据集下载地址为https://www.kaggle.com/c/dogs-vs-cats/data。这个数据集是Kaggle大数据竞赛某一年的一道赛题&#xff0c;利用给定的数据集&#xff0c;用算法实现猫和狗的识别。 其中包含了训练集和测试集&a…

宠物管理|养犬登记|宠物识别|智慧城市监控|城市犬类管理系统

关键词&#xff1a;宠物识别、宠物面部识别、宠物管理、宠物社交、宠物培训、宠物保险、鼻纹识别、宠物登记、宠物比赛、宠物走失、宠物用品、智慧宠物&#xff1b; “犬类管理”正日益成为城市治理的重要话题之一。 据最新数据&#xff0c;2020年全国犬数量为5222万只&#…

一文读懂物联网大数据产业链

原文地址 大数据开启了一个大规模生产、分享和应用数据的时代&#xff0c;它给技术和商业带来了巨大的变化。麦肯锡研究表明&#xff0c;在医疗、零售和制造业领域&#xff0c;大数据每年可以提高劳动生产率0.5-1个百分点。物联网时代&#xff0c;大数据在核心领域的渗透速度有…

专访智齿科技徐懿丨企服公司四要素:智能、融合、产品复杂度、客单价

关注52AI&#xff0c;做AI的行业领先者。QQ人工智能行业交流群&#xff1a;626784247. 01 徐懿认为&#xff1a;客服企业的两大核心要素是“融合”以及“智能”&#xff0c;围绕这两点&#xff0c;该领域所有公司将被划分为四个象限&#xff0c;而客服行业未来的趋势一定是向着…