社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

深度学习刷 SOTA 的 trick 盘点

AI有道 • 1 年前 • 379 次点击  

转载自 | 极市平台
作者丨战斗系牧师、李国趸、OpenMMLab
来源丨https://www.zhihu.com/question/540433389

回答一-作者:战斗系牧师

来源链接:https://www.zhihu.com/question/540433389/answer/2551517886


首先是数据增广的tricks:


0、Flip、RandomFlip(随机翻转)
翻转,是最实在的,最基础的数据增广方法,简单,但是最有效。
1、cutout(裁剪)
随机删除图像中的一个矩形区域,可以得到较好的训练结果,其实类似于dropout的操作
2、mixup (混合提升)
mixup的作用是使得对数据的理解更具有线性化,破除由于数据分布不均匀,带来的误差。
3、mosaic(随机马赛克增强)
极大丰富了检测物体的背景,一张顶几张!
还有类似于cutmix,还有很多tricks,还有代码这些就不细致的展开了,大家可以参考一下,以上方法有的是可以组合使用
这里是mmdet武器库中的一些数据增强方法
这里是mmseg武器库的一些数据增强方法
传送门,如果大家觉得好用,别忘了给个star
https://github.com/open-mmlab/mmdetection/blob/ca11860f4f3c3ca2ce8340e2686eeaec05b29111/mmdet/datasets/pipelines/transforms.py


然后是使用在模型训练的技巧!


4、Backbone 和 Heads 的不同学习率 (LR)
因为Backbone和Heads在结构上的差异,使用不同的学习率是可以有效的使得网络整理达到更好,更稳定的收敛效果。
5、多loss加权混合
一般会用在分割比较多,常见的有focal loss+Dice loss这类的,主要解决的问题也是类内不平衡叠加上样本数量不平衡等一系列问题。但是要注意的是,loss函数的组合的权重是需要自己去摸索的,目前我还不能找到一种普遍适用的自动化寻参方法,所以我建议大家仔细分析,保证组合后的损失函数下降不平衡导致的损失函数的倾斜化。
6、带权重CEloss,类平衡损失(多类别问题)
对于不同数量的类别,我们会选择对损失函数加权的方法进行处理,让样本数量少的类别也能得到足够的重视。
传送门,如果大家觉得好用,别忘了给个star:https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/tutorials/training_tricks.md


训练过程中的优化器调节方法


7、余弦退火算法
经典,有实验结果表明,效果挺好的。
8、SWA
SWA是一种通过随机梯度下降改善深度学习模型泛化能力的方法,而且这种方法不会为训练增加额外的消耗,这种方法可以嵌入到Pytorch中的任何优化器类中。主要还是用于稳定模型的训练。
9、seed(42)
随机种子数42,为啥是42,如同为啥一个星期有7天,而我要上7天班一样,没啥道理,但是就是要这样干。


测试常用技能


10、推理过程中的TTA增强
TTA主要在测试时,对于测试数据集进行不同方向的预测后将预测的模型进行组合,在不改变模型内部参数的情况下,对效果进行提升,有点费推理时间,但是好用。


总结


我记得在kaggle上有种方法是叫call back,也就是自己给自己的测试集打个label放进训练,非常不讲武德。我还记得有一次有人用这种方法在一个分类比赛中,别人ACC:94,他们直接干上了98,非常离谱。其实还有个比较常用的一个技巧是多模融合,通常会跑几个模型,然后加在一起融合,在不计算和要求推理时间的条件下。他要模型多大,就做大概多少个模型,你就会发现,你们在单模,我多模,完全就是三个臭皮匠顶一个诸葛亮。大家对于tricks其实可以用,但是论文里面,如果是用tricks,work的话,是不能发的,所以大家多回到模型研究,tricks只是点缀的一些技巧罢了。

回答二-作者:李国趸-浙江大学硕士生

来源链接:https://www.zhihu.com/question/540433389/answer/2549775065
抛砖引玉:
  1. R-Drop:两次前向+KL loss约束
  2. MLM: 在领域语料上用mlm进一步预训练 (Post-training)
  3. EFL: 少样本下,把分类问题转为匹配问题,把输入构造为NSP任务形式.
  4. 混合精度fp16: 加快训练速度,提高训练精度
  5. 多卡ddp训练的时候,用到梯度累积时,可以使用no_sync减少不必要的梯度同步,加快速度
  6. 对于验证集或者测试集特别大的情况,可以尝试多卡inference,需要用的就是dist.all_gather,对于非张量的话也可以用all_gather_object
  7. PET: 少样本下,把分类转为mask位置预测,并构造verbalizer,参考EACL2021. PET
  8. ArcFaceLoss:双塔句子匹配的loss把NT-Xent loss改成arccos的形式,参考ACL2022. ArcCSE
  9. 数据增强在zero shot x-lingual transfer:code switch,machine translation..记得最后加一致性loss,参考consistency regularization for cross lingual finetuning
  10. SimCSE:继续在领域语料上做simcse的预训练
  11. Focal loss: 不平衡的处理
  12. 双塔迟交互:maxsim操作:query和doc的每个token表征算相似度,取最大相似度再求和。速度和精度都有一个很好的平衡,参考colbert
  13. 持续学习减轻遗忘:EWC方法+一个很强的预训练模型效果很不错。就是加一个正则让重要参数遗忘不太多,重要性用fisher信息度量。
  14. 对抗训练:FGM,PGD,能提点,就是训练慢,
  15. memory bank增大bsz,虽然我感觉有时候有点鸡肋
  16. PolyLoss: -logpt + eps * (1-pt) 效果存疑,反正我试了没啥效果,有人试过效果不错

回答三-作者:OpenMMLab

来源链接:https://www.zhihu.com/question/540433389/answer/2629056736
对于图像分类任务,让我们以 Swin-Transformer 中使用到的 trick 为例,简单梳理一下目前深度学习中常用的一些 trick:

1. Stochastic Depth

这一方法最早在 Deep Networks with Stochastic Depth 一文中被提出,原文中被称为 stochastic depth。在 EfficientNet 的实现中被 Google 称为 drop connect。因为和 DropConnect 撞名,在 timm 的实现中又被改名为 drop path(但是这个名字也和 DropPath 撞名了,尴尬)。因此大家听到这几个名词的时候最好注意区分一下到底是哪个。
stochastic depth 类似于 dropout,但又有所不同。简单来说 dropout 在训练时随机地抛弃了一部分激活值,而 stochastic depth 则直接抛弃了一部分样本,即将这些样本的值设为零。因此这一方法一般只能放在残差结构中,将网络输出中的一部分样本直接抛弃,再与 shortcut 相加,从而实现部分样本 “跳过” 这一残差结构的效果。
通过跳过部分残差结构,实际上起到了多种深度网络组合的效果,类似集成学习,从而提高网络的性能。

2. Mixup & CutMix

二者都是图像混合增强手段,即在训练时,我们将两个样本按照某种方式进行混合,并相应地混合它们的标签。其中 Mixup 和 CutMix 的区别就在于按照什么方式对图像进行混合。
这种图像混合增强的目的是使图像经过神经网络映射后嵌入的低维流形变得平滑,从而提高网络的泛化能力。关于图像混合增强手段的详细介绍参见 https://zhuanlan.zhihu.com/p/436238223

3.RandAugment

这是一种组合数据增强手段,相比传统数据增强的随机裁剪、随机翻转,这种方法设置了一个包含各种数据增强变换的集合,并对每个样本随机应用其中若干个增强,大大扩展了增强后的图像空间。
关于 RandAugment 的详细介绍参见 https://zhuanlan.zhihu.com/p/436238223

4. RandomErasing

这一方法出自 Random Erasing Data Augmentation,其核心思想十分简单,随机选择并填充图像中的一块区域。它模拟了实际任务中需要识别的目标可能被物体遮挡的情况,从而提高模型的泛化能力。

5. CosineAnnealingLR

Cosine 学习率衰减,在近期的图像分类任务中是最主流的学习率衰减方法。大家都知道衰减学习率可能让网络在前期以较高的学习率帮助网络找到最优解,在后期以较低的学习率使网络最终收敛于最优解。虽然现在的优化器,如 Adam 拥有参数自适应学习率的能力,但通过衰减学习率限制优化器的优化步幅往往仍然是必要的。
而 cosine 学习率衰减提供了一种平滑的学习率衰减曲线,其公式如下:

6. Weight decay

Weight decay 是一种正则化方法,它通过将网络参数的 L2 范数加入 loss 的一部分,限制了网络中部分参数的范围。过大的个别参数可能会导致网络仅依赖这些参数,从而使网络 “变窄”,影响其泛化能力。



推荐阅读

(点击标题可跳转阅读)

《机器学习 100 天》视频讲解

公众号历史文章精选

我的深度学习入门路线


重磅

AI有道年度技术文章电子版PDF来啦!



扫描下方二维码,添加 AI有道小助手微信,可申请入群,并获得公众号完整技术文章合集PDF(一定要备注:入群 + 地点 + 学校/公司。例如:入群+上海+复旦。 


长按扫码,申请入群

(添加人数较多,请耐心等待)



感谢你的分享,点赞,在看三  

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/152249
 
379 次点击