Py学习  »  机器学习算法

深度学习刷 SOTA 有哪些 trick?

AI有道 • 1 年前 • 222 次点击  
来源丨知乎
编辑丨极市平台
本文仅作为学术分享,侵删

对深度学习而言,不论是学术研究还是落地应用都需要尽可能提升模型效果,这往往需要trick进行支撑。这些trick有的是广泛适用的(如循环学习率、BN等等),有的是任务特定的(比如cv里的数据增强,nlp里的mask,推荐里的降采样)这些trick有的能够提升网络精度,有的能够加速收敛,有的甚至比模型提升更加显著。在同学们各自的领域中,有哪些常遇到的、易实践的、易推广的trick呢?

作者:昆特Alex
https://www.zhihu.com/question/540433389/answer/2576569581
来源:知乎

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

一、Data Augmentation


1、噪音数据删除:(最大熵删除法、cleanlab等)

2、错误标注数据修改:交叉验证训练多个模型,取模型预测结果一致且prob比threshold大的数据(或者topN)。多个模型可以采用不同的see,不同的训练集测试机,或者不同的模型结果(bert与textcn等),找出覆盖部分模型预测与标柱数据不一致的标注错误数据进行修改。

3、数据增强

  • 同义词替换(Synonym Replacement):从句子中随机选取n个不属于停用词集的单词,并随机选择其同义词替换它们;

  • 随机插入(Random Insertion):随机的找出句中某个不属于停用词集的词,并求出其随机的同义词,将该同义词插入句子的一个随机位置。重复n次;

  • 随机交换(Random Swap):随机的选择句中两个单词并交换它们的位置。重复n次;

  • 随机删除(Random Deletion):以 p的概率,随机的移除句中的每个单词;

  • 反向翻译(back translation):将源语言翻译成中间语言,再翻译回原语言 。


二、Model backbone

Transformer已经随着bert而大杀四方了,不同的预训练模型backbone有着不同的应用场景。领域数据充足且条件允许的话可以考虑用行业预料进行预训练,次之进行领域再训练,最后才考虑用公开的模型进行finetune。各个公开的backbone选择小trick如下:

  • robert_wwm_ext: 文本分类、NER等任务单句自然语言理解(NLU)任务上性能较好

  • simbert:句子相似度计算、句子对关系判断等任务上效果较好

  • GPT系列:文本翻译、文本摘要等自然语言生成(NLG)任务上性能效果较好。


三、训练loss等其他trick 

  • 样本不均衡问题:除了前面介绍的数据增强,过采样等方法外,还可以试试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才是最核心的景色。

作者:Gordon Lee
https://www.zhihu.com/question/540433389/answer/2549775065
来源:知乎

抛砖引玉(卑微求一个秋招内推求私信):

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

2. MLM: 在领域语料上用ml进一步预训练 (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增大bs,虽然我感觉有时候有点鸡肋

16. PolyLoss: -logpt + eps * (1-pt) 效果存疑,反正我试了没啥效果,有人试过效果不错

作者:Gordon Lee
https://www.zhihu.com/question/540433389/answer/2549775065
来源:知乎

抛砖引玉(卑微求一个秋招内推求私信):

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

2. MLM: 在领域语料上用 ml进一步预训练 (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增大bs,虽然我感觉有时候有点鸡肋

16. PolyLoss: -logpt + eps * (1-pt) 效果存疑,反正我试了没啥效果,有人试过效果不错



推荐阅读

(点击标题可跳转阅读)

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

公众号历史文章精选

我的深度学习入门路线


重磅

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



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


长按扫码,申请入群

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



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

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