第一次参加数据应用比赛,比赛过程中付出了很多精力, 经常写代码,检查代码带凌晨一两点。前期查阅了许多资料, 试了四五个模型。单模型最好的结果是0.28左右。离进入复赛只有一步之遥。初赛结束前两天,刚好赶上了期末考试,没有时间进行stacking。我觉得做一下模型集成,进入复赛还是由希望的。
这篇博客旨在总结参赛经历,将参赛过程当中学到的知识,模型,技巧整理一下,达到巩固的作用。
这个比赛是自然语言处理类的。智能客服聊天机器人场景中,待客户提出问题后,往往需要先计算客户提出问题与知识库问题的相似度,进而定位最相似问题,再对问题给出答案。本次比赛的题目便是问题相似度算法设计。
为保护用户隐私并保证比赛的公平公正,所有原始文本信息都被编码成单字ID序列和词语ID序列。单字包含单个汉字、英文字母、标点及空格等;词语包含切词后的中文词语、英文单词、标点及空格等。单字ID和词语ID存在于两个不同的命名空间,即词语中的单字词或者标点,和单字中的相同字符及相同标点不一定有同一个ID。
以“彩虹年华多少?”为例子,用单字为单位划分得到:彩,虹,年,化,多,少,?。以词语为单位划分得到:彩虹,年华,多少,?。分别用单字级别的词向量和词语级别的词向量来表示。
给定两个句子question1和question2的基于词向量的表达,将它们作为模型的输入,经过模型的运算以后,模型输入两个相似的概率([0, 1])。
经过一番搜索后,发现这属于text match类的问题。于是,在Github上面以text matching 为关键字进行搜索,匹配到的star最多的是matchzoo。matchzoo是中科院做的一个文本匹配的开源工具,里面有8个左右的模型,我试了其中的matchsrnn, matchpyramid, asci, ascii, 效果都不好,可能是我没有仔细调参数的原因。另外我还试了siamese LSTM + manhantan distance。siamese LSTM + manhantan的结果不错, 没有用CV的时候,线上能达到0.29左右。(为什么没有CV? 第一次参赛,好多骚操作都不知道。。。)。想着要用stacking,而LSTM的训练比较慢,因为LSTM不能并行计算。所以我又尝试了siamese CNN, 用到了dialated convolution。siamese CNN没有CV的时候效果能达到0.28左右。在这个模型上使劲地调了参数,也没有得到一个更好的结果。之后我又试了最新出的论文里面的模型DIIN,这个模型很复杂,准确率高但是loss却不理想,甚至比不上siamese LSTM.。这个模型的参数也难调,稍不注意,模型就不收敛了。
总结起来,这次参加比赛,没有做太多事情,基本上就是尝试了几个模型,然后知道了参加这类比赛特征工程和模型集成很重要。
后期,我准备白赛中用到的代码整理一下,发布到我的Github上面。