对深度学习而言,不论是学术研究还是落地应用都需要尽可能提升模型效果,这往往需要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) 效果存疑,反正我试了没啥效果,有人试过效果不错
重磅!
AI有道年度技术文章电子版PDF来啦!
扫描下方二维码,添加 AI有道小助手微信,可申请入群,并获得2020完整技术文章合集PDF(一定要备注:入群 + 地点 + 学校/公司。例如:入群+上海+复旦。
长按扫码,申请入群
(添加人数较多,请耐心等待)
感谢你的分享,点赞,在看三
连