ATEC 15th
这次比赛跟以往的比赛似乎很不一样(虽然这个是我第一次参加),以往比赛的特征技巧,融合技巧,以及一些典型的模型都在这次比赛都失效。我一度怀疑蚂蚁金服是故意设计了数据。。。。
赛题介绍
问题相似度计算,即给定客服里用户描述的两句话,用算法来判断是否表示了相同的语义。
示例:
“花呗如何还款” –“花呗怎么还款”:同义问句
“花呗如何还款” – “我怎么还我的花被呢”:同义问句
“花呗分期后逾期了如何还款”– “花呗分期后逾期了哪里还款”:非同义问句
对于例子a,比较简单的方法就可以判定同义;对于例子b,包含了错别字、同义词、词序变换等问题,两个句子乍一看并不类似,想正确判断比较有挑战;对于例子c,两句话很类似,仅仅有一处细微的差别 “如何”和“哪里”,就导致语义不一致。
比赛思路
初赛期间,我花了大量时间做特征工程,收效甚微。因为如前面所说,这次比赛传统方法在这次数据里面都没有效果。但是,正因为我在前期做了大量的特征分析,在后期我在设计网络结构的时候能够更加得心应手,比如DIIN 这个网络模型结构,很多top20的队伍都尝试过,可是他们都说这个模型不给力,而这个模型恰恰是我的最强模型,这个跟我之前做的特征工程这部分工作有着紧密的联系。
比赛的整体流程如下
这次比赛,我是非常遗憾的,也吐槽一下阿里PAI平台,每次模型训练都要排很久的队。。。 这次我进复赛的排名很低,前100名进复赛,我是第70进的,排位在前的一些大佬有认识的,但是由于排名低,最终决定自己一个人打比赛。自己一个人打比赛,随之而来的问题很多,其中最严重的问题是对时间利用效率非常低,以至于最终我的模型还没有完全收敛,就提交了最终的分数,而且期间因为一些突发事故,我丢失了几次线上提交机会,在仅剩最后一次提交机会的时候,选择了稳妥一点,但是分数低一些的模型融合。
特征工程
1)n-gram similiarity(blue score for n-gram=1,2,3…);
2) get length of questions, difference of length
3) how many words are same, how many words are unique
4) question 1,2 start with how/why/when(wei shen me,zenme,ruhe,weihe)
5)edit distance
6) cos similiarity using bag of words for sentence representation(combine tfidf with word embedding from word2vec)
7)manhattan_distance,canberra_distance,minkowski_distance,euclidean_distance
深度学习模型
Siamese LSTM
这个模型如果实现好,单模型在初赛B榜上排名 150名左右。
这是一个非常直观的模型,这个是大多数参赛选手首先会想到的模型结构。但是有一个很重要的一点是要预训练词向量,并在训练期间固定 这个trick 其实在Quora比赛中就有很多经验帖子提过,但是没人郑重提过,以至于我当时并没有在意。在这次比赛中如果update embedding vector during training 的话,看到的现象就是非常容易过拟合,在训练数据上几个epoch之后loss 已经降低到最低,而在验证集上的loss却开始上升,F1值变为0。 很多人在这个时候就会认为是模型不行,而去尝试别的模型去了,其实在这个时候,稍微分析一下就会知道,模型在验证集上表现如此异常,就好像是遇到了从未见过的数据一样(我称之为陌生感 哈哈),就好像训练数据和验证集完全没有联系一样,这个时候我们需要在训练数据和验证机之间搭接一个桥梁,就是固定词向量。
固定了词向量,效果果然有明显的提升,在线下测试集分数可以到0.52左右,提交上去之后分数在0.59左右。排名150名。
Siamese LSTM 改进方案
这个模型在word 和 char 级别的 embedding 一同送入同一个神经网络去训练,并增加了传统特征。这个单模型线下测试集合可以到0.54,线上分数在0.61。做k-fold之后提交,分数可以到0.63的线上分数,排名73名。 我也是靠这个模型进入到复赛
(在这里需要提一下的是,传统特征在初赛数据上是比较有用的,只是到了复赛平台就不行了。)
Decompose Attention
到了复赛阶段,我主要是尝试Attention的方法,最先尝试的模型就是这个。
这个模型在复赛平台上分数可以到0.70(word char 级别 embedding 一同送入神经网络训练)
这个模型有效,很大程度上是因为通过attention的方式学习到字与字之间的关系。
Decompose Attention 改进方案
word char 级别的 decompose attention 结构如下:
在Pooling Layer 中 我采用的是 AvgPooling 和 MaxPooling 拼接。还有其他的一些模型细节是 ,对F函数我采用的是一层线性结构(如果线性层数增多会产生Bug,最终还是找了古师兄帮忙调了这个bug,这bug如果调不出来,这模型就要丢掉了),relu**函数,没有使用drop out(这主要是为了加速收敛,效果上可能会打折扣)。
ESIM 模型
这个模型我没有进行细致的调试,最终提交到线上的分数是0.705 。后来知道这个模型是很多队伍融合模型之一的时候,还是比较遗憾的。