Py学习  »  机器学习算法

深度学习刷SOTA的trick大盘点

计算机视觉life • 1 年前 • 177 次点击  

作者 | 李国趸、昆特Alex、战斗系牧师  编辑 | 汽车人

原文链接:https://www.zhihu.com/question/540433389

点击上方“计算机视觉life”,选择“星标”

快速获得最新干货

本文转载自自动驾驶之心

导读

 

“对深度学习而言,不论是学术研究还是落地应用都需要尽可能提升模型效果,这往往需要trick进行支撑。这些trick有的是广泛适用的,有的是任务特定的。这些trick有的能够提升网络精度,有的能够加速收敛,有的甚至比模型提升更加显著。“本文总结了三位知乎答主的优质回答,分享了他们所收藏积累的一些搞笑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) 效果存疑,反正我试了没啥效果,有人试过效果不错


# 回答二

作者:昆特Alex

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

一句话原则:AI performance = data(70%) + model(CNN、RNN、Transformer、Bert、GPT 20%) + trick(loss、warmup、optimizer、attack-training etc 10%) 记住:数据决定了AI的上线,模型和trick只是去逼近这个上线,还是那句老话:garbage in, garbage out。下面具体分享在NLP领域的一些具体trick:

一、Data Augmentation

1、噪音数据删除:(最大熵删除法、cleanlab等)
2、错误标注数据修改:交叉验证训练多个模型,取模型预测结果一致且prob比threshold大的数据(或者topN)。多个模型可以采用不同的seed,不同的训练集测试机,或者不同的模型结果(bert与textcnn等),找出覆盖部分模型预测与标柱数据不一致的标注错误数据进行修改。
3、数据增强
  • 同义词替换(Synonym Replacement):从句子中随机选取n个不属于停用词集的单词,并随机选择其同义词替换它们;
  • 随机插入(Random Insertion):随机的找出句中某个不属于停用词集的词,并求出其随机的同义词,将该同义词插入句子的一个随机位置。重复n次;
  • 随机交换(Random Swap):随机的选择句中两个单词并交换它们的位置。重复n次;
  • 随机删除(Random Deletion):以 ppp 的概率,随机的移除句中的每个单词;
  • 反向翻译(back translation):将源语言翻译成中间语言,再翻译回原语言

二、Model backbone

Transformer已经随着bert而大杀四方了,不同的预训练模型backbone有着不同的应用场景。领域数据充足且条件允许的话可以考虑用行业预料进行预训练,次之进行领域再训练,最后才考虑用公开的模型进行finetune。各个公开的backbone选择小trick如下:
  • robert_wwm_ext: 文本分类、NER等任务单句自然语言理解(NLU)任务上性能较好
  • simbert:句子相似度计算、句子对关系判断等任务上效果较好
  • GPT系列:文本翻译、文本摘要等自然语言生成(NLG)任务上性能效果较好。

三、tricks

  • 样本不均衡问题:除了前面介绍的数据增强,过采样等方法外,还可以试试facalloss、loss加权等方式处理。
  • optimizer、lr、warmup、batch_size等配合的好也能能够神奇提点(比如通常batch_size较大时lr也可以同步提升)。
  • 训练trick:进行对抗训练(FGM、PGD)等
  • 多任务学习:增加auxiliary loss
  • label smoothing: 经过了噪音数据删除、数据增强等数据精度还是差强人意的话可以考虑
  • etc···
last but not least:AI performance = data(70%) + model(20%) +other trick(10%),请把时间花在最能提升模型性能的事情上面,而不是追求各种花式trick叠buff,trick只是用来景上添花,而数据以及选择的模型backbone才是最核心的景色。

# 回答三

作者:战斗系牧师

来源链接: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

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

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

文章仅用于学术分享,如有侵权,请联系删除。

独家重磅课程官网:cvlife.net

全国最大的机器人SLAM开发者社区


技术交流群



—   版权声明  —

本公众号原创内容版权属计算机视觉life所有;从公开渠道收集、整理及授权转载的非原创文字、图片和音视频资料,版权属原作者。如果侵权,请联系我们,会及时删除。

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