本方案在百度 Baseline 的基础上进行改进,逐渐优化,得到最终 B 榜第 3 名的成绩,分数为 91.837。
使用的深度学习框架为 PaddlePaddle,预训练模型为 ERNIE-Gram。在比赛的最后方案中,我只使用了单个 ERNIE-Gram 模型,没有进行模型集成。
数据集使用的是主办方提供的全部训练集,并参考 ACL 2020 最佳论文 的方法,用模板构造了几十个样本。在最后也使用了 伪标签 的方式进行半监督迭代训练。
使用的开发环境是百度 AI Studio V100 16G。
train.sh
:运行这个 bash 文件进行模型训练
predict.sh
:运行这个 bash 文件进行模型预测
train.py
:模型训练文件,主要参数如下。
--layerwise_decay
:学习率逐层衰减比率--LSR_coef
:标签平滑系数--rdrop_coef
:R-Drop 系数--fgm_coef
:对抗训练时添加扰动的范数大小--fgm_alpha
:对抗训练 Loss 的占比--clip_norm
:梯度裁剪--lookahead_k
:Lookahead 优化器 Fast 权重更新次数--lookahead_alpha
:Lookahead 优化器 Slow 权重更新步长--lazy_embedding
:是否对最底层的 Embedding 进行稀疏更新--amp
:是否开启混合精度训练
predict.py
:用模型预测测试集
generate_sample.py
:参考 ACL 2020 最佳论文,用模板构造样本
data_preprocess.py
:数据预处理,整合文件
data.py
:加载数据文件,把输入文本变成模型可以处理的形式
model.py
:模型文件,包括问题匹配分类模型、Embedding 稀疏更新模块、对抗训练模块、最终未使用的拼音层
loss.py
:损失函数文件,包括标签平滑、R-Drop
lookahead.py
:复现了 Lookahead 优化器
postprocess.py
:后处理,包括 CAN,频率副词、时态、错字、语法、数字、填充词检测和结果纠正
similar_character.npy
:形近字 DIct,用于错字检测。来源于 GitHub 开源项目,我把它从 txt 格式转成了 npy 格式,内容一样
syntactic_analysis.npy
:语法分析 Dict。用 HanLP 和 jieba.posseg 对测试集部分样本进行了语法解析,将解析结果存到了 npy 文件中
bash train.sh
如果是单卡 V100,预计需要训练 12 个小时。代码未测试过单机多卡或多机多卡训练。训练结束后会自动生成 B 榜预测结果,无需再单独预测一遍。
bash predict.sh
用训练好的 checkpoint 进行预测,预计 2 分钟就好。