Skip to content

🌟 Open-source code from the rank 72 finalists of 2022WBDC

License

Notifications You must be signed in to change notification settings

aeeeeeep/2022WBDC-semi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

训练时间

预训练: 8h

微调: 8h

环境依赖

软件 软件要求
python 版本 3.8.10
CUDA 版本 11.4
PyTorch 版本 1.10.0

代码结构

.
├── Dockerfile                          # 复赛代码提交镜像的 Dockerfile 文件
├── inference.sh                        # 模型测试脚本
├── init.sh                             # 初始化脚本
├── opensource_models                   # 第三方开源预训练权重
│   ├── chinese-roberta-wwm-ext
│   └── swin_tiny_patch4_window7_224.pth
├── pretrain                            # 预训练权重
├── README.md
├── requirements.txt                    # pip 依赖包
├── save                                # 微调权重
├── src                                 # 源代码
│   ├── category_id_map.py
│   ├── config_bert.json                # 配置文件
│   ├── config.json                     # 配置文件
│   ├── config.py                       # 配置文件
│   ├── data_helper.py
│   ├── evaluate.py
│   ├── extract_feature.py
│   ├── inference.py                    # 生成提交文件的代码
│   ├── lxmert_main.py                  # 微调源代码
│   ├── lxmert_model_pretrain.py        # 预训练源代码
│   ├── lxmert_model.py                 # 微调模型源代码
│   ├── lxmert_pretrain.py              # 预训练模型源代码
│   └── utils                           # 功能函数目录
│       ├── ema.py
│       ├── fgm.py
│       ├── file_utils.py
│       ├── masklm.py
│       ├── modeling.py
│       ├── optimization.py
│       ├── pgd.py
│       ├── swin.py
│       └── util.py
└── train.sh                            # 模型训练脚本

运行流程说明

bash init.sh        # 安装需要的 python 包
bash train.sh       # 模型训练脚本
bash inference.sh   # 模型测试脚本

算法描述

简介

多模态模型结构参考自 LXMERT 模型的输入分为视频特征和文本特征, 视频特征是视频帧使用swin_tiny提取特征后, 再通过frame_dense降维为 768 维, 文本特征是将预处理后的文本信息经过embedding后得到文本信息处理部分与参数量和 Bert 一致 layer=12, hidden_size=768, num_attention_heads=12

最后将处理后的文本特征和视频特征经过5层Cross-Modality Encoder后得到三个多模态输出。

figure1

数据预处理

使用tdidftitle + osr + acr拼接后的字符串提取特征, 再与title相加后前后各取64, 得到tfidf_str_titleosr, acr前后各取64, 最后tfidf_str_title + osr + acr得到文本信息

由于模型性能优化不足, 在限制时间的前提下, 只能平均步长, 使用8帧训练

预训练

预训练采用了Mask language model, Image Text Matched 两个任务, bert 初始化权重来自于在中文语料预训练过的开源模型

(1) Mask language model 任务

与常见的自然语言处理mlm预训练方法相同, 对text随机 15% 进行 mask, 预测mask词。

多模态场景下, 结合视频的信息预测 mask 词, 可以有效融合多模态信息。

(2) Image Text Matching 任务

为了判断模型将文本信息与视觉信息的对齐效果, 训练阶段对于一个batch中的视频帧, 对后50%逆序, 模型中的分类器需要判断文本与视频帧是否匹配。

(3) 多任务联合训练

预训练任务的loss采用了上述两个任务loss的加权和

L = L(mlm) + L(itm) * 0.3

超参: batch_size=50, num_workers=15, learning_rate=5e-5, max_epochs=5

预训练更多的epoch对效果提升比较大, 对下游任务finetune效果提升显著, 但由于失误, 时间有限,固只训练一个epoch

微调

bert初始化权重来自于在中文语料预训练过的开源模型, 使用提供的unlabel数据集进行预训练。

https://huggingface.co/hfl/chinese-roberta-wwm-ext/tree/main

模型在训练了 3 epoch 后会有过拟合现象, 3 ~ 4 epoch 效果最佳。 微调使用的以下trick:

(1) Fast Gradient Method

为了使loss更小, 通过在embedding上添加对抗扰动, 生成对抗代码, 通过训练, 准确率提高了 0.7 个百分点。

(2) Exponential Moving Average

以指数式递减加权的移动平均, 衰减率为 0.999, 控制模型的更新速度。

(3) label smooth

使用 label smooth 正则化技巧, 提高模型的泛化性能和准确率, 设置 label_smoothing=0.1, 可以提高 0.5 个百分点。

(4) Resample

将200分类中类别数量少于 100 的样本 *5, 少于 500 的样本 *3, 少于 1000 的样本 *2, 可以提高 0.3 百分点。

超参: batch_size=26, num_workers=13, learning_rate=4e-5, max_epochs=5

模型复赛B榜在线结果

得分: 0.678031

排名: 72

开源预训练模型

swin_tiny_patch4_window7_224: 比赛方提供

chinese-roberta-wwm-ext: https://huggingface.co/hfl/chinese-roberta-wwm-ext/tree/main

About

🌟 Open-source code from the rank 72 finalists of 2022WBDC

Topics

Resources

License

Stars

Watchers

Forks

Languages