一. 为何有这篇文档
- 记录原因:2022年8月5日13:00比赛提交结束后,各队伍均在微信群中进行了高参考价值的赛题相关方法讨论,现予以总结以备后期学习,同时也分享给初赛至今努力比赛的大家作为参考。
- 整理结构:将以信息流的结构对提出和回答问题的相关情况进行整理。
- 备注信息:各位大佬的讨论可能会因为上下文信息不能完整呈现,建议参考的时候自己检索具体知识点。记录的顺序是以讨论的时间顺序为准。大佬排名不分先后。另外各位大佬在讨论细节上存在的不同意见,可能存在不完整的展示。
- 受限于记录者水平不足,括号内的内容一般为文档撰写者的理解或者猜测。可能存在记录错误,恳请阅读者谅解。
二. 这篇文档具体内容
- 关于比赛后处理方案?
- 陪跑:我们的后处理的思路是把少类别的概率强行放大,这样初赛复赛都有比较稳定的提升(3k)左右.具体做法是 1/value_count,每个类别得到一个放大的概率值,大类是1,小类>1, 具体的值设置是通过初赛的线下五折调出来的参数。
- mixup 是否有效?
- 辉:初赛尝试了mixup,复赛并没有用上,模型抖的厉害。
- 陪跑:我这里尝试了很多次mixup,但是没啥用。
- 伪标签是否有效?
- 陪跑:有效果,但取决于生成的标签的精度。在损失函数上的选择,可以考虑使用kd loss,也可以使用交叉熵。
- 郭大:这题的关键其实还是伪标签,提升是2个百分点,0.720–0.741.伪标签不是为了利用数据,而是为了利用大模型(估计是为了使用clip large)。在训练伪标签上,是否使用soft label或者使用hard label,区别并不大。如果soft 和hard 分别都用,融合还能提升分数。本赛题受限于规则上进行限时,所以需要伪标签,不限时的话,都不需要伪标签(猜测是直接用多个large融合)。
- chizhu:伪标签在我们这里提升是2个百。0.689–0.710,限于挥霍的stacking细节,可能也影响了模型效果。具体使用了8帧的单折。我们采用了两阶段训练小模型,先用100万无标签数据训练第一阶段,然后第二阶段用9万真实标签修正,(可不可以描述的更细致一点呢?)。
- 挥霍的人生:受限于我们组的打伪标签的base模型精度太低问题,导致我们后期运用伪标签提升未达到预期(主要是上班太忙,没时间做题才是真相)。
- UA:伪标签在本题中可以理解为蒸馏的思路,伪标签可以套娃,训练出好的模型,再去标注,再训练,再标注,形成一个循环过程。评估的标注是测试集上无法再次上分为止。当出现大量的unlabel数据的时候,就可以考虑使用伪标签,例如本赛题,特征均出现对齐的情况,唯一的区别是缺失label。如果使用kl loss做软标签,就可以看做是知识蒸馏。
- Lawliet:我们一开始用的swin-base上分,后来看到大家都在传clip,就产生了敏锐的洞察力。
- 虚着点和气:关于chizhu描述先用100万无标签数据训练第一阶段,然后第二阶段用9万真实标签修正这部分,完全可以边打标,边修正。
- 本赛题限时的原因?
- ★★★★★官方解答: 复赛限制QPS的原因–>主要是更贴近实际工业应用场景,虽然内容理解不需要做到实时性,但机器是有很高成本的,大家可以考虑一下如果每天有数百万数千万的视频发表,而且有峰值低谷,需要多少台机器?如果QPS低,那么就需要更多的机器。实际上,工业应用要求的QPS会比这里高很多,inference的GPU也最多用T4。
- 特征提取的backbone用谁好?
-
各队伍都使用各种类型的视频特征预训练模型作为提取的主要方法,例如swin, tiny, clip, vit等,但从本赛题来看,最有效的方法仍然是clip。具体可以参考的代码地址如下:
-
具体采用的预训练模型文件之一参考如下:
```shell
{“ViT-B/32”: “https://openaipublic.azureedge.net/clip/models/40d365715913c9da98579312b702a82c18be219cc2a73407c4526f58eba950af/ViT-B-32.pt”} -
Lawliet, 陪跑:几乎所有的论文都是用clip的,这一点可以作为选择backbone有更好效果的一种指导方向。
-
高等数学:初赛我们就在使用clip,由于初赛已经明确了视频特征提取结果,因此是在文本上用clip提取的文本信息。(这一点的使用方法没有理解到)。
-
lawliet: 2022年7月29日clip开始上线了中文clip模型。
- 伪标签使用后是否会导致训练结果leak?
- UA:伪标签确实会存在leak,这时候验证集可能存在无法作为线上预期分数的参考的问题。
- Tibur:为了评估自己的模型效果,当出现leak的时候,可以通过提交线上来查看是否自己的整体流程是有效的。
- clip的学习率要设置成多少?
- 陪跑:bert的1/10作为参考,例如bert的学习率为1e-4,那么clip的学习率就是1e-5. 在这里需要配置分层学习率。
- clip是否要冻结不参与微调训练?
- Tibur: 需要冻结,这里应该是指只需要做推理得到特征。
- 陈佳烁(两面包夹芝士): 可以一起参与训练,提升是0.7个百分点。在学习率设置上是5e-6.具体的学习率设置如下参考:
shell -- other_learning_rate 5e-4 -- bert_learning_rate 5e-5 -- clip_learning_rate 5e-6
- 哪些预训练任务是有效的?
- Tibur: ita, itm 在我这边是最有效的。这是通过初赛消融得到的结论,复赛没时间。我的双流就是图片过backbone, 文本过bert,然后两个做cross_attentiony以后直接输出.
- 陪跑:我这边clip模型最重要,双流里,算text vision的相似度可以明显上分。我们的双流就是UniVL(3个transformer 编码器) + LOUPE.在双流里用UniVL,具体操作上使用clip替代了itm任务.在双流里,是文本过tfs,图片embedding过tfs,合并起来继续tfs.相当于是三个独立的tfs.这样的模型比单流要慢一点。我使用ALBEF的模型,如果用中间分层的话会出现过拟合,而且会预训练的时候没法在微调上产生效果,暂时未排查到原因。在设计MLM任务的时候,可以考虑使用ngram mask,也比普通的MLM任务有明显提升。
- 一只大海龟:ALBEF在这个场景下预训练不上分。
- 融合阶段使用logits融合好还是使用prob? prob在此处应该是指对logits做softmax后的结果。
- 陪跑:使用prob融合出现掉分。考虑单流和双流模型如果差异大的话,Logits不一定在一个向量空间内。融合方法上就是直接加权。
- 陈佳烁(两面包夹芝士):初赛上融合logits不如prob,复赛默认使用prob。
- Tibur:我们对两种方法都做了尝试,但是没有区别。我的理解是应该融prob。
- UA: 如果模型中存在很多的Norm,不同模型的预测结果的值域应该不会差太远。
- 数据上特别是asr ocr存在很多脏数据,是否可以做特征工程清洗呢?(玄学,清洗更可能的是掉分)
- Lawliet:初赛做了清洗,掉分。
- Tibur:清洗文本有用,我洗了涨了3k。但是预训练后反而没用了。
- 还有哪些数据EDA存在很高的价值呢?
- 陪跑:top1的预测准确率acc是0.8左右,但是top5的hit就有0.95,这表明一般ground truth就在top5内。所以对小类乘以权重,变大一点,就可以让top2的到top1了。初赛上涨了3k,复赛更多上分5-6k。具体代码如下:
from collections import Counter a = pd.DataFrame(Counter(train_data["category_id"].map(CATEGORY_ID_TO_LV2ID)), index=[0]).T.sort_index() a[0] = (10 / a[0] + 1)
- swa 应该在全量数据训练中如何参与做提升?
- 陪跑:我们swa了top5个。开着ema训练,最后再手动swa.(代码也非常简单,就是把字典里的参数的weight和bias提取出来加权)。
- 2021QQ浏览器比赛由于和本场比赛非常类似,第一名开源方案,在本场比赛中的预训练是否仍然有重要参考价值呢?
- Tilbur(队伍名:一拳超人):我们的单流参考了他们的方案,提升非常大,微调加上预训练可以直接到0.72。
- 虚着点和气:在具体参考和使用上,应该还是有一定区别,照搬过来应该效果不会很理想(应该是表达知识应该活学活用)。
- 复赛阶段非常讲究推理效率,有哪些方法可以提升推理效率呢?onnx,tensorRT,EFFT,half如何组合运用?
- 郭大:个人建议,如果不是真正到了瓶颈,由于TensorRT相对而言工程上比较复杂,在有限的比赛时间内,可以先不考虑调试成功这个,微调阶段仍然使用float32执行训练,简单的在推理阶段使用half()做推理就能加速很多。(当使用了half以后,TensorRT的效率二次提升效果并不太大)。在抽取视频帧的使用上,基于base的模型half以后可以支持28帧,追加上TensorRT可以使用32帧全量推理,而如果仅仅使用float32推理只能支持8帧。在half以后,实际上推理的结果基本上和float32区别不大,结果基本一致。(这个可以使用训练数据划分一折做验证,个人估计郭大这个在比赛期间分享的点应该是让很多团队受益了)。
- UA:如果比赛使用的图像侧是Swin Transformer,可以参考使用EFFT做加速,可能比TensorRT更快。