/GAIIC2022_track1_rank8

2022人工智能技术创新大赛-赛道1-电商关键属性匹配

Primary LanguagePython

GAIIC2022_track1_rank8

2022人工智能技术创新大赛-赛道1-电商关键属性匹配 比赛链接

成绩

  • 初赛 rank 4
  • 复赛 rank 8

另外两名队友

BaenRH & JoanSF

题目理解

判断脱敏后的图片数据与文本的属性匹配。

数据来源于电商平台上的商品信息。

特征属性13个类,:

图文,领型,袖长,衣长,版型,裙长,穿着方式....

针对13个属性做二分类,只需01判断,0表示该图文对不匹配,1表示匹配。

数据前处理

数据理解

一个有标签case:

{
	img_name = train023876,
	title = 高领灰色休闲男士加厚无扣长袖毛衣,
	key_attr = {领型=高领,袖长=长袖},
	match = {图文=1,领型=1,袖长=1,},
	feature = [-1.1453,-0.00761,...,-0.037] # len 2048
	
}

一个无标签case:

{
	img_name = train023876,
	title = 高领灰色休闲男士加厚无扣长袖毛衣,
	key_attr = {},
	match = {图文=1},
	feature = [-1.1453,-0.00761,...,-0.037] # len 2048
	
}
  • title : 文本
  • key_attr : 属性及对应的值,与title绑定,从title中可反映属性值
  • match : 属性是否匹配,1表示该case匹配,0表示不匹配
  • feature : 图片脱敏后的特征数据,长度2048

key_attr中的‘图文’ 表示图文是否匹配,如果有某一个属性不匹配,则‘图文’为0

原数据中正样本(图文=1)比例占0.85+,因此需要构造负样本。

无标签的共有10w,有标签有5w。

数据前处理

对无标签的10w做了属性值提取(从文本中),转成有标签,最终有标签数据达到13w+。

脱敏特征feature官方已处理,均值为0。

删除年份信息,含有年份信息的title占比0.70+,年份信息与模型任务不相关。

数据增强

全在**dataset.getitem**中增强

负样本生成

  • 随机title替换
  • 替换title中的属性值
  • 隐藏属性值替换,如颜色

其他增广

  • title重组,语义保持不变
  • 脱敏特征数据点调换

方案

模型

bert一把梭

队友用的Nezha+LSTM,Visualbert

Pretrain

  • 任务MLM+ITM
  • 13w有标签数据做‘图文’属性ITM和MLM,剩余只做MLM
  • 只在‘图文’属性 macth时,才做MLM任务
  • 取MLM loss + ITM loss 最低的模型
  • LXMERT、VILT、VILBERT 均无使用huggingface预训练权重
  • 自己生成的vocab,vocab_size = 1.5k+

Finetune

模型结构

  • 2048的feature经过linear转成768。
  • 取原模型中的bert backbone,拼接[768,13] linear作为下游进行二分类判断。
  • LXMERT 下游 取text 的cross enocder 的pooler_output。
  • lxmert 的图片encoder部分去掉了position_embedding和 type_embedding。
  • vilbert 下游 text 和 image两个通道 做element wise product 。
  • vilt 下游取pooler_output。
  • 损失函数:BECLoss。
  • 各模型其他输入操作与原文基本一致。
  • 三个模型的单模成绩抖动在 $\pm 0.002$ 以内。

tricks

  • 【提升较大】负样本生成。
  • 【提升较大】学习率线性warmup+余弦衰减。
  • 【有提升】nezha+lstm 用了fgm。
  • 【有提升】复赛用LXMERT做了多折,对参数进行融合。
  • 【提升较大】不同模型的的融合效果大于单个模型的多折效果。
  • 【小提升】下游多任务,例如针对属性分类。效果很小,复赛限制了模型规模后就没做考虑。

其他尝试

  • 【没提升】复赛将数据生成的分布拉成测试集的分布,效果猛降。

  • 【没提升】隐藏属性的考虑。考虑了性别,没提升。考虑了颜色,效果不大。

  • 【没提升】考虑features已经经过处理,用bert只做文本的特征提取,然后两个特征concat,最后交给一个linear处理。

  • 【没提升】离线生成数据集,按照线上测试集的分布,没有提升。可能姿势不对。

可考虑的其他trick(没有尝试)

  • 对抗训练,只在word embedding加了对抗,feature部分没有考虑
  • 一些重复属性的考虑。
  • 下游没有做其他尝试。几个模型的下游都是拼接linear,输入是bert的pooler_output。
  • 二分类任务,sigmoid出来之后的阈值。
  • 双流模型的pretrain任务可以考虑ITC。

code

pytorch版本

文件说明

|--- project
	|--- README.md 
	|--- data
		|--- fine_data_sample.json 				# 样例数据集,500个case
	|--- coor.txt  							# 颜色词表
	|--- vocab.txt 							# 字典
	|--- jeiba_userdict.txt 					# jieba分词词典
	|--- datasets.py 						# dataset
	|--- helper.py 							# 辅助工具
	|--- lxmert.py 							# model lxmert
	|--- vilt.py 							# model vilt
	|--- vilbert.py 						# model vilbert
	|--- pretrain_lxmert.py 					# lxmert pretrain
	|--- finetune_lxmert.py 					# lxmert finetune
	|--- finetune_lxmert_kfold.py 					# lxmert finetune kfold
	|--- pretrain_vilt.py 						# vilt pretrain
	|--- finetune_vilt.py 						# vilt finetune
	|--- pretrain_vilbert.py 					# vilbert pretrain
	|--- finetune_vilbert.py 					# vilbert finetune

运行案例

以lxmert为例子,运行样例数据集(--mode=test),只有500个case,另外两个模型运行方式类似。

## pretrain 
python3 pretrain_lxmert.py \
	--mode test \
	--gpu 0 \
	
## finetune
python3 finetune_lxmert.py \
	--mode test \ 
	--gpu 0
	
## finetune_kfold
python3 finetune_lxmert_kfold.py\
	--mode test\
	--gpu 0

成绩

榜单 rank 成绩
初赛B榜 4 0.95211401
复赛B榜 8 0.95045418

总结

没有创新点😂,全是bert一把梭哈+搜参微调。

复赛限制了模型scale,所以模型压了一下,成绩有所下降。

第一次参加比赛,重在学习参与,积累学习经验😁。