深度学习刷新SOTA的tricks大盘点

对深度学习而言,不论是学术研究还是落地应用都需要尽可能提升模型效果,这往往需要trick进行支撑。这些trick有的是广泛适用的,有的是任务特定的。这些trick有的能够提升网络精度,有的能够加速收敛,有的甚至比模型提升更加显著。“本文总结了三位知乎答主的优质回答,分享了他们所收藏积累的一些tricks总结

回答一:李国趸

https://www.zhihu.com/question/540433389/answer/2549775065

R-Drop:两次前向+KL loss约束

MLM: 在领域语料上用mlm进一步预训练 (Post-training)

EFL: 少样本下,把分类问题转为匹配问题,把输入构造为NSP任务形式.

混合精度fp16: 加快训练速度,提高训练精度

多卡ddp训练的时候,用到梯度累积时,可以使用no_sync减少不必要的梯度同步,加快速度

对于验证集或者测试集特别大的情况,可以尝试多卡inference,需要用的就是dist.all_gather,对于非张量的话也可以用all_gather_object

PET: 少样本下,把分类转为mask位置预测,并构造verbalizer,参考EACL2021. PET

ArcFaceLoss:双塔句子匹配的loss把NT-Xent loss改成arccos的形式,参考ACL2022. ArcCSE

数据增强在zero shot x-lingual transfer:code switch,machine translation…记得最后加一致性loss,参考consistency regularization for cross lingual finetuning

SimCSE:继续在领域语料上做simcse的预训练

Focal loss: 不平衡的处理

双塔迟交互:maxsim操作:query和doc的每个token表征算相似度,取最大相似度再求和。速度和精度都有一个很好的平衡,参考colbert

持续学习减轻遗忘:EWC方法+一个很强的预训练模型效果很不错。就是加一个正则让重要参数遗忘不太多,重要性用fisher信息度量。

对抗训练:FGM,PGD,能提点,就是训练慢,

memory bank增大bsz,虽然我感觉有时候有点鸡肋

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: 经过了噪音数据删除、数据增强等数据精度还是差强人意的话可以考虑

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武器库的一些数据增强方法

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

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只是点缀的一些技巧罢了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛码Memmat

欢迎支持,随缘打赏 ~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值