CIKM-QQ浏览器 联合举办的 2021AI算法大赛,赛道一,多模态视频相似度,赛后top分享会笔记。
赛题介绍
赛题一:
信息流场景下,短视频消费引来爆发式增长,视频的语义理解对于提升用户消费效率至关重要。视频Embedding采用稠密向量能够很好的表达出视频的语义,在推荐场景下对视频去重、相似召回、排序和多样性打散等场景都有重要的作用。本赛题从视频推荐角度出发,提供真实业务的百万量级标签数据(脱敏),以及万量级视频相似度数据(人工标注),用于训练embedding模型,最终根据embedding计算视频之间的余弦相似度,采用Spearman’s rank correlation与人工标注相似度计算相关性,并最终排名。
开源方案汇总
Top1方案
分三个阶段
pretrain
(1) Video tag classify 任务
tag 为人工标注的视频标签,pointwise 和 pairwise 数据集合中提供。
和官方提供的 baseline 一致,我们采用了出现频率前1w 的tag 做多标签分类任务。
Bert 最后一层的 [CLS] -> fc 得到 tag 的预测标签,与真实标签计算 BCE loss
(2) Mask language model 任务
与常见的自然语言处理 mlm 预训练方法相同,对 text 随机 15% 进行 mask,预测 mask 词。
多模态场景下,结合视频的信息预测 mask 词,可以有效融合多模态信息。
(3) Mask frame model 任务
对 frame 的随机 15% 进行 mask,mask 采用了全 0 的向量填充。
考虑到 frame 为连续的向量,难以类似于 mlm 做分类任务。
借鉴了对比学习思路,希望 mask 的预测帧在整个 batch 内的所有帧范围内与被 mask 的帧尽可能相似。
采用了 Nce loss,最大化 mask 帧和预测帧的互信息
(4) 多任务联合训练
预训练任务的 loss 采用了上述三个任务 loss 的加权和,
L = L(tag) * 1250 / 3 + L(mlm) / 3.75 + L(mfm) / 9
tag 梯度量级比较小,因此乘以了较大的权重。
注:各任务合适的权重对下游 finetune 的效果影响比较大。
(5) 预训练 Setting
初始化:bert 初始化权重来自于在中文语料预训练过的开源模型 https://huggingface.co/hfl/chinese-roberta-wwm-ext-large
数据集:预训练使用了 pointwise 和 pairwise 集合,部分融合模型中加上了 test 集合(只有 mlm 和 mfm 任务)
超参:batch_size=128, epoch=40, learning_rate=5e-5, scheduler=warmup_with_cos_decay, warum_ratio=0.06
注:预训练更多的 epoch 对效果提升比较大,从10 epoch 提升至 20 epoch 对下游任务 finetune 效果提升显著。
finetune
(1) 下游任务
视频 pair 分别通过 model 得到 256维 embedding,两个 embedding 的 cos 相似度与人工标注标签计算 mse
(2) Finetune header
实验中发现相似度任务中,使用 mean_pooling 或者 attention_pooling 聚合最后一层 emb 接 fc 层降维效果较好。
(3) Label normalize
评估指标为 spearman,考查预测值和实际值 rank 之间的相关性,因此对人工标注 label 做了 rank 归一化。
即 target = scipy.stats.rankdata(target, ‘average’)
(4) Finetune Setting
数据集:训练集使用了 pairwise 中 (id1%5!=0) | (id2%5 !=0) 的部分约 6.5w,验证集使用了(id1%5==0) & (id2%5==0) 的部分约 2.5k
超参:batch_size=32, epoch=10, learning_rate=1e-5, scheduler=warmup_with_cos_decay, warum_ratio=0.06
ensemble
(1) 融合的方法
采用了 weighted concat -> svd 降维 方法进行融合,发现这种方法降维效果折损较小。
concat_vec = [np.sqrt(w1) * emb1, np.sqrt(w2) * emb2, np.sqrt(w3) * emb3 …]
svd_vec = SVD(concat_vec, 256)
(2) 融合的模型
最终的提交融合了六个模型。 模型都使用了 bert-large 这种结构,均为迭代过程中产出的模型,各模型之间只有微小的 diff,各个模型加权权重均为 1/6。
下面表格中列出了各模型的diff部分,验证集mse,验证集spearman
(3) 单模型的效果与融合的效果
单模的测试集成绩约在 0.836
融合两个模型在 0.845
融合三个模型在 0.849
融合五个模型在 0.852
QA
- 如何处理ASR?没有处理ASR,因为计算量会大很多,但是倾向于加入ASR
- label normalize怎么做的?把pairwise的label按照数值排序,然后均匀归一化到0-1之内。因为是spearman rank,所以想看label和rank之间的关系
- 融合的模型区别?在于模型是否加了某个预训练任务,比如MLM,或者是模型是30个epoch还是100个epoch,这样一些模型进行融合。
- 是否用了K折?没有,因为一折和五折没啥差别
- tag标签是否处理?没有,直接follow官方的top 1w
- tag是1w分类?不是,是1w个二分类
- svd降维提升多少?千分之一
- mask frame是怎么构造正负样例?用NCEloss,batch中的其他所有帧都是负例,只有和它自己是正例
- loss叠加的时候,怎么设计那个权重的?主要是看到tag的loss比较低,所以觉得应该乘以比较大的权重,这个权重的值是试出来的。
Top2
四个pretrained task:MLM(1.5%),Inverse Close Task(1.5%), 对比学习SimCSE(0.5%)Match(0.5%)融合模型(1.2%)
剩下的都在做
QA
- ensemble? 五折,然后svd降维到256
- inverse close task?用输入的三个部分,video,title,speech,用其中一个部分作为query,然后去query其他的,就是去检索。用检索的loss,就是用dot product,然后做一个softmax
- pretrain task 消融的结果?四个pretrained task:MLM(1.5%),Inverse Close Task(1.5%), 对比学习(0.5%)Match(0.5%)融合模型(1.2%)
- 没有用tag?因为感觉tag没有用,用了tag会掉点
- 对比学习?SimCSE,在batch里面其他的是负样本,然后正样本构造是用同一个样本做两次dropout。
Top3
overview
language model pretrain
pointwise training
pairwise wise
offline evaluation strategy
Ablation
QA
- 会用两个nextvlad,分别处理bert和vision,然后用fc把他们维度变成一致的????
- 激活函数,relu会有很多0,配合layer norm会好很多。relu’直接换成dice也会好很多
- layernorm是在输出之前
- ensemble,模型输出的space不对齐的话,会有比较大的影响。如果模型的cos相似度,在0.5+,就比较好哦,如果都是0相似度,就没意义
- pairwise的label adjust,和第一名的思路差不多,但是都是把label的分布调整下。
Top4
Analysis
Model
base model
data augmentation and spatiotemporal constrastive
pretrain improve
Spatiotemporal Contrastive
SimCSE
Text improve (ASR clean)
Ablation
QA
- clean asr?用统计语言模型,先对每个标点分句,然后对每个句子算n-gram,然后用同一个视频的title和它算一个混淆度
- 没做category的分类?因为category对subject的贡献不高,同category的存在subject不一样的,所以相对来说,tag信息对subject贡献高。
- ensemble分类模型输出的向量长度?都是256