2021 CCF BDCI 千言-问题匹配鲁棒性评测-baseline
2021 CCF BDCI 千言-问题匹配鲁棒性评测-baseline 79.788
〇、简介
1.比赛地址
2.赛题背景
问题匹配(Question Matching)任务旨在判断两个自然问句之间的语义是否等价,是自然语言处理领域一个重要研究方向。问题匹配同时也具有很高的商业价值,在信息检索、智能客服等领域发挥重要作用。
近年来,神经网络模型虽然在一些标准的问题匹配评测集合上已经取得与人类相仿甚至超越人类的准确性,但在处理真实应用场景问题时,性能大幅下降,在简单(人类很容易判断)的问题上无法做出正确判断(如下图),影响产品体验的同时也会造成相应的经济损失。
问题1 | 问题2 | 标签(Label) | Model |
---|---|---|---|
婴儿吃什么蔬菜好 | 婴儿吃什么绿色 蔬菜好 | 0 | 1 |
关于牢房 的电视剧 | 关于监狱 的电视剧 | 1 | 0 |
心率过快 有什么问题 | 心率过慢 有什么问题 | 0 | 1 |
黑色裤子 配什么上衣 | 黑色上衣 配什么裤子 | 0 | 1 |
当前大多数问题匹配任务采用单一指标,在同分布的测试集上评测模型的好坏,这种评测方式可能夸大了模型能力,并且缺乏对模型鲁棒性的细粒度优劣势评估。本次评测关注问题匹配模型在真实应用场景中的鲁棒性,从词汇理解、句法结构、错别字、口语化、对话理解五个维度检测模型的能力,从而发现模型的不足之处,推动语义匹配技术的发展。本次竞赛主要基于千言数据集,采用的数据集包括哈尔滨工业大学(深圳)的LCQMC和BQ数据集、OPPO的小布对话短文本数据集以及百度的DuQM数据集,期望从多维度、多领域出发,全面评价模型的鲁棒性,进一步提升问题匹配技术的研究水平。本次竞赛将在第九届“CCF大数据与计算智能大赛”举办技术交流论坛和颁奖仪式,诚邀学术界和工业界的研究者和开发者参加本次竞赛!
3.基线评测效果
本项目分别基于ERNIE-1.0、Bert-base-chinese、ERNIE-Gram 3 个中文预训练模型训练了单塔 Point-wise 的匹配模型, 基于 ERNIE-Gram 的模型效果显著优于其它 2 个预训练模型。
此外,在 ERNIE-Gram 模型基础上我们也对最新的正则化策略 R-Drop 进行了相关评测, R-Drop 策略的核心思想是针对同 1 个训练样本过多次前向网络得到的输出加上正则化的 Loss 约束。
我们开源了效果最好的 2 个策略对应模型的 checkpoint 作为本次比赛的基线方案: 基于 ERNIE-Gram 预训练模型 R-Drop 系数分别为 0.0 和 0.1 的 2 个模型, 用户可以下载相应的模型来复现我们的评测结果。
模型 | rdrop_coef | dev acc | test-A acc | test-B acc |
---|---|---|---|---|
ernie-1.0-base | 0.0 | 86.96 | 76.20 | 77.50 |
bert-base-chinese | 0.0 | 86.93 | 76.90 | 77.60 |
ernie-gram-zh | 0.0 | 87.66 | 80.80 | 81.20 |
ernie-gram-zh | 0.1 | 87.91 | 80.20 | 80.80 |
ernie-gram-zh | 0.2 | 87.47 | 80.10 | 81.00 |
4.最终结果
最终得分: 79.788,可能和batch size等等设置有关,如下图。
一、建立项目
所有解压缩只进行一起,以后注释掉即可
1.解压缩基线
%cd ~
/home/aistudio
# !git clone https://gitee.com/paddlepaddle/PaddleNLP.git --depth=1
2.解压缩训练集
# !unzip -qoa data/data104940/train.zip
!head train/BQ/train
用微信都6年,微信没有微粒贷功能 4。 号码来微粒贷 0
微信消费算吗 还有多少钱没还 0
交易密码忘记了找回密码绑定的手机卡也掉了 怎么最近安全老是要改密码呢好麻烦 0
你好 我昨天晚上申请的没有打电话给我 今天之内一定会打吗? 什么时候可以到账 0
“微粒贷开通" 你好,我的微粒贷怎么没有开通呢 0
为什么借款后一直没有给我回拨电话 怎么申请借款后没有打电话过来呢! 1
为什么我每次都提前还款了最后却不给我贷款了 30号我一次性还清可以不 0
请问一天是否都是限定只能转入或转出都是五万。 微众多少可以赎回短期理财 0
微粒咨询电话号码多少 你们的人工客服电话是多少 1
已经在银行换了新预留号码。 我现在换了电话号码,这个需要更换吗 1
!head train/LCQMC/train
喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1
我手机丢了,我想换个手机 我想买个新手机,求推荐 1
大家觉得她好看吗 大家觉得跑男好看吗? 0
求秋色之空漫画全集 求秋色之空全集漫画 1
晚上睡觉带着耳机听音乐有什么害处吗? 孕妇可以戴耳机听音乐吗? 0
学日语软件手机上的 手机学日语的软件 1
打印机和电脑怎样连接,该如何设置 如何把带无线的电脑连接到打印机上 0
侠盗飞车罪恶都市怎样改车 侠盗飞车罪恶都市怎么改车 1
什么花一年四季都开 什么花一年四季都是开的 1
看图猜一电影名 看图猜电影! 1
!head train/OPPO/train
充电提示音 开启充电提示音 0
那叫你帮我找在这里香肠派对吗 那麻烦帮我定下位好吗 0
导航去大理 导航去观音桥 0
oppo手环怎么连接手机 如何连接oppo 手环 1
我也没感觉 我也没感触 1
咱们游戏里那个问道是那个版本啊 我不知道那是什么啊我是一个小学生诶 0
你应该就是不男不女的 那你就是不男不女 1
梦泪在哪直播 虎牙直播 0
小布下载万能钥匙 小布打开万能钥匙 0
手机密码忘 查找手机密码忘记了 0
3.查看testA
!head data/data104941/test_A
今天会不会下大雨哦 今天的天气很好哦
怎么退出微博会员续费 怎么退出微博会员
企业帐户怎么开通 企业账户怎么开通
农历多少今天 还有多少天到冬天
你今年应该过第多少个生日了呢 那你今年多大了
明天有雨吗明天 你明天,明天走一天
十字路口用英文怎么说 十字路口英文
梦见死去的亲人还有猫 梦见去世的亲人还有猫
2020广东放假 2020浙江放假
敦煌莫高窟的历史 敦煌莫高窟的文物
4.训练集合并
注意事项:
- 仅执行一次
- 没有表头
- 遇到读不进来得设置error_bad_lines=False
- 分隔符设置 sep=’\t’
%cd ~
/home/aistudio
import pandas as pd
# 读取3个数据集的训练集
LCQMC_train = pd.read_csv('train/LCQMC/train', sep = '\t', header=None)
OPPO_train = pd.read_csv('train/OPPO/train', sep = '\t', header=None)
BQ_train = pd.read_csv('train/BQ/train', sep="\t", header=None, error_bad_lines=False)
b'Skipping line 20746: expected 3 fields, saw 4\nSkipping line 54107: expected 3 fields, saw 4\nSkipping line 65083: expected 3 fields, saw 4\nSkipping line 69869: expected 3 fields, saw 4\n'
LCQMC_train=LCQMC_train.dropna()
LCQMC_train.head()
0 | 1 | 2 | |
---|---|---|---|
0 | 喜欢打篮球的男生喜欢什么样的女生 | 爱打篮球的男生喜欢什么样的女生 | 1 |
1 | 我手机丢了,我想换个手机 | 我想买个新手机,求推荐 | 1 |
2 | 大家觉得她好看吗 | 大家觉得跑男好看吗? | 0 |
3 | 求秋色之空漫画全集 | 求秋色之空全集漫画 | 1 |
4 | 晚上睡觉带着耳机听音乐有什么害处吗? | 孕妇可以戴耳机听音乐吗? | 0 |
OPPO_train=OPPO_train.dropna()
OPPO_train.head()
0 | 1 | 2 | |
---|---|---|---|
0 | 充电提示音 | 开启充电提示音 | 0 |
1 | 那叫你帮我找在这里香肠派对吗 | 那麻烦帮我定下位好吗 | 0 |
2 | 导航去大理 | 导航去观音桥 | 0 |
3 | oppo手环怎么连接手机 | 如何连接oppo 手环 | 1 |
4 | 我也没感觉 | 我也没感触 | 1 |
BQ_train.head()
0 | 1 | 2 | |
---|---|---|---|
0 | 用微信都6年,微信没有微粒贷功能 | 4。 号码来微粒贷 | 0.0 |
1 | 微信消费算吗 | 还有多少钱没还 | 0.0 |
2 | 交易密码忘记了找回密码绑定的手机卡也掉了 | 怎么最近安全老是要改密码呢好麻烦 | 0.0 |
3 | 你好 我昨天晚上申请的没有打电话给我 今天之内一定会打吗? | 什么时候可以到账 | 0.0 |
4 | “微粒贷开通" | 你好,我的微粒贷怎么没有开通呢 | 0.0 |
BQ_train=BQ_train.dropna()
BQ_train[2]=BQ_train[2].astype(int)
BQ_train.head(10)
0 | 1 | 2 | |
---|---|---|---|
0 | 用微信都6年,微信没有微粒贷功能 | 4。 号码来微粒贷 | 0 |
1 | 微信消费算吗 | 还有多少钱没还 | 0 |
2 | 交易密码忘记了找回密码绑定的手机卡也掉了 | 怎么最近安全老是要改密码呢好麻烦 | 0 |
3 | 你好 我昨天晚上申请的没有打电话给我 今天之内一定会打吗? | 什么时候可以到账 | 0 |
4 | “微粒贷开通" | 你好,我的微粒贷怎么没有开通呢 | 0 |
5 | 为什么借款后一直没有给我回拨电话 | 怎么申请借款后没有打电话过来呢! | 1 |
6 | 为什么我每次都提前还款了最后却不给我贷款了 | 30号我一次性还清可以不 | 0 |
7 | 请问一天是否都是限定只能转入或转出都是五万。 | 微众多少可以赎回短期理财 | 0 |
8 | 微粒咨询电话号码多少 | 你们的人工客服电话是多少 | 1 |
9 | 已经在银行换了新预留号码。 | 我现在换了电话号码,这个需要更换吗 | 1 |
# 合并3个数据集的训练集
df_tmp = LCQMC_train.append(OPPO_train)
all_train = df_tmp.append(BQ_train)
all_train.info
<bound method DataFrame.info of 0 1 2
0 喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1
1 我手机丢了,我想换个手机 我想买个新手机,求推荐 1
2 大家觉得她好看吗 大家觉得跑男好看吗? 0
3 求秋色之空漫画全集 求秋色之空全集漫画 1
4 晚上睡觉带着耳机听音乐有什么害处吗? 孕妇可以戴耳机听音乐吗? 0
... ... ... ..
86191 申请的额度能取现吗 取现一次性取完可以吗 0
86192 利息与罚息如何计算 咱这个利息多高啊 1
86193 如何申请货款 怎样开通我微粒贷 1
86194 多久才有贷款 凌晨以后的申请何时到账 1
86195 你好 我要换卡怎么换 我卡掉了 换卡失败 0
[492132 rows x 3 columns]>
all_train_2=all_train
all_train_2[0]=all_train_2[1]
all_train_2[1]=all_train[0]
all_train_2.head()
0 | 1 | 2 | |
---|---|---|---|
0 | 爱打篮球的男生喜欢什么样的女生 | 爱打篮球的男生喜欢什么样的女生 | 1 |
1 | 我想买个新手机,求推荐 | 我想买个新手机,求推荐 | 1 |
2 | 大家觉得跑男好看吗? | 大家觉得跑男好看吗? | 0 |
3 | 求秋色之空全集漫画 | 求秋色之空全集漫画 | 1 |
4 | 孕妇可以戴耳机听音乐吗? | 孕妇可以戴耳机听音乐吗? | 0 |
all_train=all_train.append(all_train_2)
# 另存
all_train.to_csv('all_train.csv', sep = '\t', index=None, header=None)
!head all_train.csv
爱打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1
我想买个新手机,求推荐 我想买个新手机,求推荐 1
大家觉得跑男好看吗? 大家觉得跑男好看吗? 0
求秋色之空全集漫画 求秋色之空全集漫画 1
孕妇可以戴耳机听音乐吗? 孕妇可以戴耳机听音乐吗? 0
手机学日语的软件 手机学日语的软件 1
如何把带无线的电脑连接到打印机上 如何把带无线的电脑连接到打印机上 0
侠盗飞车罪恶都市怎么改车 侠盗飞车罪恶都市怎么改车 1
什么花一年四季都是开的 什么花一年四季都是开的 1
看图猜电影! 看图猜电影! 1
5.合并测试集
仅执行一次
# 读取3个数据集的测试集
LCQMC_dev = pd.read_csv('train/LCQMC/dev', sep = '\t', header=None)
OPPO_dev = pd.read_csv('train/OPPO/dev', sep = '\t', header=None)
BQ_dev = pd.read_csv('train/BQ/dev', sep="\t", header=None, error_bad_lines=False)
# 合并3个数据集的测试集
df_tmp = LCQMC_dev.append(OPPO_dev)
all_dev = df_tmp.append(BQ_dev)
all_dev.dropna()
0 | 1 | 2 | |
---|---|---|---|
0 | 开初婚未育证明怎么弄? | 初婚未育情况证明怎么开? | 1 |
1 | 谁知道她是网络美女吗? | 爱情这杯酒谁喝都会醉是什么歌 | 0 |
2 | 人和畜生的区别是什么? | 人与畜生的区别是什么! | 1 |
3 | 男孩喝女孩的尿的故事 | 怎样才知道是生男孩还是女孩 | 0 |
4 | 这种图片是用什么软件制作的? | 这种图片制作是用什么软件呢? | 1 |
... | ... | ... | ... |
9995 | 您好,我还款了怎么还没扣款 | 今天一直没有扣款 | 1 |
9996 | 有联系方式吗? | 电话号码是多少 | 1 |
9997 | 昨天打的电话我没接到 | 我开通却总是接不到你们的电话 | 1 |
9998 | 0.05%是日利率 | 如何借款,利息如何计算 | 0 |
9999 | 不使用可以关闭吗? | 额度申请成功后会短信通知吗 | 0 |
28802 rows × 3 columns
all_dev.info
<bound method DataFrame.info of 0 1 2
0 开初婚未育证明怎么弄? 初婚未育情况证明怎么开? 1
1 谁知道她是网络美女吗? 爱情这杯酒谁喝都会醉是什么歌 0
2 人和畜生的区别是什么? 人与畜生的区别是什么! 1
3 男孩喝女孩的尿的故事 怎样才知道是生男孩还是女孩 0
4 这种图片是用什么软件制作的? 这种图片制作是用什么软件呢? 1
... ... ... ..
9995 您好,我还款了怎么还没扣款 今天一直没有扣款 1
9996 有联系方式吗? 电话号码是多少 1
9997 昨天打的电话我没接到 我开通却总是接不到你们的电话 1
9998 0.05%是日利率 如何借款,利息如何计算 0
9999 不使用可以关闭吗? 额度申请成功后会短信通知吗 0
[28802 rows x 3 columns]>
all_dev_2=all_dev
all_dev_2[0]=all_dev_2[1]
all_dev_2[1]=all_dev[0]
all_dev_2.head()
0 | 1 | 2 | |
---|---|---|---|
0 | 初婚未育情况证明怎么开? | 初婚未育情况证明怎么开? | 1 |
1 | 爱情这杯酒谁喝都会醉是什么歌 | 爱情这杯酒谁喝都会醉是什么歌 | 0 |
2 | 人与畜生的区别是什么! | 人与畜生的区别是什么! | 1 |
3 | 怎样才知道是生男孩还是女孩 | 怎样才知道是生男孩还是女孩 | 0 |
4 | 这种图片制作是用什么软件呢? | 这种图片制作是用什么软件呢? | 1 |
all_dev=all_dev.append(all_dev_2)
# 另存
all_dev.to_csv('all_dev.csv', sep = '\t', index=None, header=None)
! tail all_dev.csv
怎么成为微粒贷 怎么开通微粒贷 怎么成为微粒贷 怎么开通微粒贷 1
我如果今天借4000什么时候到还款日,还多少钱 我如果今天借4000什么时候到还款日,还多少钱 0
借一万,有没有多久开始计算利息 借一万,有没有多久开始计算利息 1
财付通怎么绑定银行卡 财付通怎么绑定银行卡 1
电话确认需要等待多久? 电话确认需要等待多久? 1
今天一直没有扣款 今天一直没有扣款 1
电话号码是多少 电话号码是多少 1
我开通却总是接不到你们的电话 我开通却总是接不到你们的电话 1
如何借款,利息如何计算 如何借款,利息如何计算 0
额度申请成功后会短信通知吗 额度申请成功后会短信通知吗 0
二、训练
1.更新paddlenlp至2.0.8版本
注意:一定要更新,不更新会出问题。
!pip install -U paddlenlp
2.修改train相关参数
据悉这个效果好,精度高,我来试试
45行
parser.add_argument("--epochs", default=30, type=int, help="Total number of training epochs to perform.")
47行
parser.add_argument('--save_step', default=500, type=int, help="Step interval for saving checkpoint.")
202行
if global_step % args.eval_step == 0 and rank == 0 and global_step>5000:
3.开始训练
%cd ~/PaddleNLP/examples/text_matching/question_matching
/home/aistudio/PaddleNLP/examples/text_matching/question_matching
!python -u -m paddle.distributed.launch --gpus "0" train.py \
--train_set /home/aistudio/all_train.csv \
--dev_set /home/aistudio/all_dev.csv \
--device gpu \
--eval_step 1000 \
--save_dir ./checkpoints \
--train_batch_size 50 \
--rdrop_coef 0.0 \
--seed 1024 \
--epochs 1
三、预测
1.A TEST
修改PaddleNLP/examples/text_matching/ernie_matching/predict_pointwise.py,让结果输出到 ccf_qianyan_qm_result_A.csv
with open('ccf_qianyan_qm_result_A.csv','w') as f:
for idx, y_pred in enumerate(y_preds):
text_pair = valid_ds[idx]
text_pair["pred_label"] = y_pred
print(text_pair)
f.writelines(str(y_pred)+'\n')
%cd ~/PaddleNLP/examples/text_matching/question_matching
!python -u \
predict.py \
--device \
--params_path "./checkpoints/model_10000/model_state.pdparams" \
--batch_size 128 \
--input_file "${test_set}" \
--result_file "predict_result"
2.查看
!head ccf_qianyan_qm_result_A.csv
3. 下载并提交即可
更多推荐
所有评论(0)