Awesome
ATEC 花呗金融大脑NLP比赛
赛题简述
给一对给花呗客服的提问,判断是否表达了一个意思。 该问题属于NLP领域的 Paraphrase Identification 问题,和 Text Similarity 问题有一定关联。 数据集中完全相同的语句只出现一次。
项目组织简述
- README.md 说明文档
- input/ 存放输入的文件夹
- input_online.py 模拟线上训练输入环境
- input_predict.py 模拟线上测试环境
- ensemble.py 集成训练的文件
- ensemble_predict.py 模型预测输出的文件
- models/dict.txt 自定义词典
- Dockerfile 项目仿真使用的docker虚拟机
- requirements.txt Docker虚拟机的环境。(tensorflow未列出)
数据预处理
没有进行数据预处理。集成的时候使用了词级别模型和字级别模型。序列均填充到长为20. 使用了来自苏剑林博客的词向量 没有使用传统数据挖掘特征。
模型简述
-
模型用python3.5 + keras实现。keras版本为2.1.6,tensorflow 版本为1.5.0。输入层有spatial dropout. 编码层为两层双向 128单元lstm,共享权重。池化层使用了MaxPooling 和AveragePooling。交叉层 为 $ f (x_1,x_2)=(|x1-x2|,-x1.*x2) $, FC层为两层Relu全连接层。用10折验证训练模型的时候对模型结构做了扰动,其中4个模型使用词向量做嵌入层,其余使用字向量。
-
测试时中使用了半监督学习。 选取集成模型输出概率值 $ <0.25 $或 $ >0.75 $ 的样本加入训练集中,将成对的测试集序列重新组对作为负类加入训练集中, 训练5个epoch。本地验证可看见auc微弱上升,f1提升不明显。 在比赛中由于提交次数过少实际效果不明 :)
参考资料
个人感受
- 在处理口语化的短文本时, 字级别向量比词级别可能更好
- 时间维度上的MaxPooling比Attention更适合这个问题,KMaxPooling没有显著优于MaxPooling和AveragePooling。
- 孪生网络性能远差于编码+交互+FC的模型。可能是因为该数据集上的同义关系由于噪音+争议数据并不完全满足自反对称传递性质加上孪生网络的表达能力有限。
- 双向RNN性能十分适合此任务。编码层全部或者部分换为transformer(这一点和排名靠前的某个队伍不一致,可能是我实现有问题),CNN,或是用基于交互的CNN,基于交互的HAN性能都劣于双向RNN。
- 初赛时使用了基于谷歌翻译的增广,发现没有用。。花光了谷歌云的赠金还差点玩脱
- 尝试过一些数据增强手段,包括在词向量空间进行mixup ,随机反转一些样本,没有明显改善。
没有尝试的思路
- 词向量和字向量的结合提升了性能,如果使用拼音序列能否进一步提升性能呢?由于平台环境限制没有尝试。