比赛地址https://tianchi.aliyun.com/competition/entrance/531865/introduction
赛题背景
自从2017年具有划时代意义的Transformer模型问世以来,短短两年多的时间内,如雨后春笋般的出现了大量的预训练模型,比如:Bert,Albert,ELECTRA,RoBERta,T5,GPT3等等。然而之前的基准评测体系存在两个缺陷:评测强度不够,模型不通用。评测强度不够指的是选手只提交结果,不提交inference的代码。模型不通用指的是预训练模型不能保证在相同超参数情况下在所有任务上都获得比较好的性能。以上两点极大限制了预训练技术的应用和发展。如果我们能通过算法实现泛化能力强的中文预训练模型,这将提高下游业务的准确性,从而提升企业的核心竞争力,并为企业创造更多的价值。
本赛题数据集来自中文语言理解测评基准(CLUE), www.CLUEbenchmarks.com。为提供更好的比赛体验,我们同时为本赛题定制了系列工具教程,其中包括EasyTransfer、多任务baseline教程等,具体见参考资料。
赛题数据
本赛题精选了以下3个具有代表性的任务,要求选手提交的模型能够同时预测每个任务对应的标签:
数据说明
OCNLI:是第一个非翻译的、使用原生汉语的大型中文自然语言推理数据集;�
OCEMOTION:是包含7个分类的细粒度情感性分析数据集;
TNEWS:来源于今日头条的新闻版块,共包含15个类别的新闻;
数据格式
任务1:OCNLI–中文原版自然语言推理
0 一月份跟二月份肯定有一个月份有. 肯定有一个月份有 0
1 一月份跟二月份肯定有一个月份有. 一月份有 1
2 一月份跟二月份肯定有一个月份有. 一月二月都没有 2
3 一点来钟时,张永红却来了 一点多钟,张永红来了 0
4 不讲社会效果,信口开河,对任何事情都随意发议论,甚至信谣传谣,以讹传讹,那是会涣散队伍、贻误事业的 以讹传讹是有害的 0
(注:id 句子1 句子2 标签)
(注:标签集合:[蕴含,中性,不相关])
任务2:OCEMOTION–中文情感分类
0 你知道多伦多附近有什么吗?哈哈有破布耶...真的书上写的你听哦...你家那块破布是世界上最大的破布,哈哈,骗你的啦它是说尼加拉瓜瀑布是世界上最大的瀑布啦...哈哈哈''爸爸,她的头发耶!我们大扫除椅子都要翻上来我看到木头缝里有头发...一定是xx以前夹到的,你说是不是?[生病] sadness
1 平安夜,圣诞节,都过了,我很难过,和妈妈吵了两天,以死相逼才终止战争,现在还处于冷战中。sadness
2 我只是自私了一点,做自己想做的事情! sadness
3 让感动的不仅仅是雨过天晴,还有泪水流下来的迷人眼神。happiness
4 好日子 happiness
(注:id 句子 标签)
任务3:TNEWS–今日头条新闻标题分类
0 上课时学生手机响个不停,老师一怒之下把手机摔了,家长拿发票让老师赔,大家怎么看待这种事? 108
1 商赢环球股份有限公司关于延期回复上海证券交易所对公司2017年年度报告的事后审核问询函的公告 104
2 通过中介公司买了二手房,首付都付了,现在卖家不想卖了。怎么处理? 106
3 2018年去俄罗斯看世界杯得花多少钱? 112
4 剃须刀的个性革新,雷明登天猫定制版新品首发 109
(注:id 句子 标签)
Baseline
https://github.com/datawhalechina/team-learning-nlp/tree/master/PretrainModelsGeneralization 44
https://github.com/finlay-liu/tianchi-multi-task-nlp/blob/main/README.md
运行过程
- 下载Bert全权重,下载 https://huggingface.co/bert-base-chinese/tree/main 下载config.json vocab.txt pytorch_model.bin,把这三个文件放进tianchi-multi-task-nlp/bert_pretrain_model文件夹下。
- 下载比赛数据集,把三个数据集分别放进
tianchi-multi-task-nlp/tianchi_datasets/数据集名字/
下面:
- OCEMOTION/total.csv: http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531841/OCEMOTION_train1128.csv
- OCEMOTION/test.csv: http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531841/b/ocemotion_test_B.csv
- TNEWS/total.csv: http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531841/TNEWS_train1128.csv
- TNEWS/test.csv: http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531841/b/tnews_test_B.csv
- OCNLI/total.csv: http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531841/OCNLI_train1128.csv
- OCNLI/test.csv: http://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531841/b/ocnli_test_B.csv
文件目录样例:
tianchi-multi-task-nlp/tianchi_datasets/OCNLI/total.csv
tianchi-multi-task-nlp/tianchi_datasets/OCNLI/test.csv
- 分开训练集和验证集,默认验证集是各3000条数据,参数可以自己修改:
python ./generate_data.py
- 训练模型,一个epoch:
python ./train.py
会保存验证集上平均f1分数最高的模型到 ./saved_best.pt
- 用训练好的模型 ./saved_best.pt 生成结果:
python ./inference.py
- 打包预测结果。
zip -r ./result.zip ./*.json
- 生成Docker并进行提交,参考:https://tianchi.aliyun.com/competition/entrance/231759/tab/174
- 创建云端镜像仓库:https://cr.console.aliyun.com/
- 创建命名空间和镜像仓库;
- 然后切换到
submission
文件夹下,执行下面命令;
# 用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
sudo docker login --username=xxx@mail.com registry.cn-hangzhou.aliyuncs.com
# 使用本地Dockefile进行构建,使用创建仓库的【公网地址】
# 如 docker build -t registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit:1.0 .
docker build -t registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit:1.0 .
输出构建过程:
Sending build context to Docker daemon 18.94kB
Step 1/4 : FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
---> a4cc999cf2aa
Step 2/4 : ADD . /
---> Using cache
---> b18fbb4425ef
Step 3/4 : WORKDIR /
---> Using cache
---> f5fcc4ca5eca
Step 4/4 : CMD ["sh", "run.sh"]
---> Using cache
---> ed0c4b0e545f
Successfully built ed0c4b0e545f
# ed0c4b0e545f 为镜像id,上面构建过程最后一行
sudo docker taged0c4b0e545f registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit:1.0
# 提交镜像到云端
docker push registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit:1.0
- 比赛提交页面,填写镜像路径+版本号,以及用户名和密码则可以完成提交。
比赛改进思路
- 修改 calculate_loss.py 改变loss的计算方式,从平衡子任务难度以及各子任务类别样本不均匀入手;
- 修改 net.py 改变模型的结构,加入attention层,或者其他层;
- 使用 cleanlab 等工具对训练文本进行清洗;
- 做文本数据增强,或者在预训练时候用其他数据集pretrain;
- 对训练好的模型再在完整数据集(包括验证集和训练集)上用小的学习率训练一个epoch;
- 调整bathSize和a_step,变更梯度累计的程度,当前是batchSize=16,a_step=16;
- 用 chinese-roberta-wwm-ext 作为预训练模型;
最终结果
-
第一次提交结果
- 第二次提交结果
- 修改内容
- 用 chinese-roberta-wwm-ext 作为预训练模型
-
修改batchSize=32