上周微信大数据挑战赛的决赛结束了,自己之前也投入了不少的时间来做,所以还是需要好好学习一下决赛的方案 # 赛题介绍
- 赛题名称:多模态短视频分类
- 赛题链接:微信大数据挑战赛
- 数据
- 10w有标注数据(包含视频类别)
- 100w无标注数据
- 每条数据包含短视频的:标题/OCR/ASR文本,32帧视频图像(初赛为抽取的特征,复赛为原始视频图像)
预测任务:预测每个视频所属的子类别,一共200类
评价指标:一二级分类F1的micro和macro平均值
决赛回放:2022中国高校计算机大赛——微信大数据挑战赛决赛-CSDN直播 # 1st 苟进决赛 ## 模型架构 采用三种模型架构进行融合:
模型一:单流架构,文本过embedding层,视频过clip的vit,然后拼接起来送入bert,最后mean pooing后接分类层
模型二,双流架构,文本过bert,视频过clip,然后将视频向量和文本向量拼接起来,再过一个transformer,mean pooing后接分类层
模型三,双流架构,文本过bert,视频过clip,得到视频向量和文本向量,然后做cross attention,即对于视频向量,用文本向量作为Q进行注意力加权,而对于文本向量,用视频向量作为Q进行注意力加权,最后mean pooing后接分类层
其他选手的模型架构基本也都是这三种的一种,之后就不详细展开 ## 预训练任务
MLM(Mask languge model):输入时随机mask掉一个文本,预测被mask掉的文本
VTM (Video text match):输入时以50%概率随机采样替换掉一个视频,然后预测这个视频是不是原来的视频,即输入的文本是否与视频匹配
ICT (Inverse Cloze Task):文本包含标题、OCR,ASR,随机取一段作为query,其余的作为condidate,做对比学习
知识蒸馏
这部分应该是整个方案的核心亮点了,也是拉开和后面几位差距的关键点。
具体步骤应该是:
在标注数据上,训练更长(32帧)的帧和更大(CLIP-Large)更多(ensemble)的模型
使用1得到的模型为无标注数据打伪标签,得到一份带伪标签的无标注数据
在2得到的这份数据上进行预训练,预训练任务包含伪标签预测以及之前提到的那4个,预训练时随机使用5/32帧的视频,以缓解预训练和微调过程的不一致性
重复2和3步骤,将最后得到的模型用来做下一步微调模型的初始化
伪标签知识蒸馏,直接提了两个百分点,还是很厉害的 # 2nd 冲冲冲 ## 模型架构 就是一个普通的单流架构,不过引入了Memory Bank来缓解batchsize过小导致预训练效果差的问题
## 预训练任务MLM
MMA(Multi-modal Alignment):最特色的地方,在对比学习时引入了三类共六个的任务,使得模态间信息更加对齐,并且在训练时随机丢弃一个模态,以缓解模态缺失的问题,并加快训练
- EMA
- Label smoothing
- Rdrop
- Class Balanced Loss
模型加速
- 图片解码加速,GPU预处理加速
- TensorRT + 数据并行 + 共享内存
- FP16推理 + 分桶预测 + 多进程模型并行
伪标签:用10万有标记样本,训练DML模型并提取特征,然后用无标记数据检索有标记数据,用Top10样本进行类目投票,这里生成伪标签跟其他选手用的方案不一样,不是直接预测,而是用检索的方式来生成,也算一大特色 ## 亮点
预训练的MMA任务
伪标签用检索的方式生成 # 3rd 抱朴子 ## 模型架构 这组一共用了5个模型,双流的三个模型共用编码器,编码器采用中文预训练的R2D2的Roberta-base和VIT-large,具体每个模型的架构也都和第一名提到的三个没太大差别
单流架构的Alpro应该是先把文本过6层的transformer后再和视频特征拼起来送入后6层
双流架构一个使用cross-encoder的方式,另外两个用了cross-attention,这两个的差别在于处理视频向量时一个采用视频patch聚合另一个采用视频帧之间平均
## 预训练任务MLM
VTM
EMA, FGM等
文本和视频编码器用的中文预训练模型R2D2 # 3rd 机器不学习啦 ## 模型架构 使用双流的ALBEF架构,视频过clip,文本过六层的bert,最后在后六层的bert做交互。
## 预训练任务MLM
MFM
VTA: 输出层前的视频向量和文本向量mean pool后用infoCSE做对比学习
- 多任务finetune
这个队伍finetune时还用了多任务,除了正常的分类头,还给视觉编码器后面添加了一个分类头,还有加了一个对比学习的任务:
具体loss形式为:
训练技巧:EMA, R-drop
针对长尾问题,单独训练更强的尾部类别分类器,并进行集成
模型加速:TensorRT-FP16加速ViT-B/16 + Torch-FP16加速其他模块,多模型共用视觉特征,并行 ## 亮点
多任务finetune,这个居然能取得不错的结果
针对长尾问题单独训练分类器 # 5th warriors ## 模型架构 单流架构,不过针对视频特征和文本特征单独进行mean pooling后再进行一次mean pooling
## 预训练任务MLM
MFM
VTA
使用词粒度的分词方案使得序列变短,处理速度更快,并且和字粒度的方案融合
针对类别不均衡对小于200个类别重采样, 对无标签数据打伪标签,根据类别数量进行不均衡采样,加入训练集
训练技巧:FGM, label smoothing
分别对视频和文本进行mean pooing
使用了词粒度的分词方案 # 6th 蜜度信息 ## 模型架构 一个单流模型,不过最后时生成了四个pooling送入线性分类层
一个双流模型:
这里双流模型和别的选手不同的地方是他们做了很多手工的特征拼接进来,具体包括:
- 视频第一帧的embedding
- Nextvlad特征
- Netvlad特征
- Netrvlad特征
- Softdbow特征
- Netfv特征
- Bottleneck fusion融合特征
- 帧相似度(shift 1 frame)
- 帧相似度(shift 2 frame)
- 帧相似度(shift 3 frame) ## 预训练任务
MLM(单流、双流)
VTM(单流)
VTA(单流)
MFM(双流)
First Image Prediction(双流): 这个是其他选手没有的,他们认为第一张图片很重要,于是加了一个这样的任务,让模型能够还原出第一帧的图片
单模态-交叉模态 CLIP(双流):在交叉模态融合前与融合后,分别做CLIP loss
Caption(双流): 使用融合过的多模态hidden当做encoder output, 来对拼接后的text inputs做解码预测 ## 其他技巧
训练技巧:对抗训练(预训练和finetune阶段都用了)
概率后处理:具体做法是 1/value_count,每个类别得到一个放大的概率值,大类是1,小类>1
模型加速:BF16加速训练,FP16加速推理
加入了很多手工特征,拼接到模型中
设计了多种独特的预训练任务
模型架构上:单流、双流的各种架构都可以,融合起来更好
模型backbone:文本编码器用macbert或roberta,视觉编码器用clip的vit(这个尤为重要,因为是多模态的预训练模型,据说比swin高两个百分点,而且最好用large,冻结训练)
预训练任务:MLM、MFM、VTM、VTA等
训练技巧:FGM、EMA、Rdrop、label smoothing
类别不平衡处理:这个处理方式就多种多样,可以改CE loss的权重,也可以对类别少的样本过采样,从伪标签中生成,也可以后处理类别少的概率、训练单独分类器等
伪标签,可以将微调好的模型直接预测作为伪标签加入训练(蜜度信息),也可以用检索的方式投票(冲冲冲),也可以把伪标签当成一种预训练的方式(苟进决赛)
加速:tensor RT, FP16推理,并行等