这个比赛,我是最后5天参加的,只做了两天。师兄问我要不要打,最近心情比较无聊,作为消遣就打一打。
比赛地址:CHIP 2018
这个比赛跟蚂蚁金服比赛一样,是一个语义相似度比赛。数据已经做了脱敏处理,字向量,词向量都已经给了。
我就把我在蚂蚁金服比赛都拿出来跑了一跑,发现分数不高。就开始做了以下数据分析
由此可以看出这个数据特点是句子不长,数据少。这也解释了为什么蚂蚁金服上的模型拿到这来效果不明显。原因就蚂蚁金服上的模型过于复杂,在这个数据集上是很容易过拟合的。那么接下来要做的就是给给模型简化,增加模型的泛化能力。
自然语言处理比赛中,重要的一点就是细节,细节上的把握是之声的关键。我的第一个思路就是对于那些低频词用random initial 方法进行初始化。首先我们来看看词频分布情况吗,来看看这样做的思路是不是可行。
由上述分析可以看到,仅仅简单的将出现次数为1的数据抹掉,可以大大地降低词表长度。可想而知,如果把这些低频词都加入的词表,让模型拟合于这些低频词,模型的泛化能力会受到很大的影响。
模型部分仍然是用典型siamese LSTM和 Decompose Attention 模型了。具体的方案请前往蚂蚁金服ATEC2018NLP比赛,在这里就不再多讲了。
在蚂蚁金服比赛中是把word level embedding 和 char level embedding 结合在一起放在模型中训练的。在这个比赛中,可能很多朋友也用同样的方法去做,结果发现效果也就那样。在这里多说一句,虽然深度学习是一个玄学炼丹,但是真的就是自己乱尝试吗? 不是的,任何模型的设计都由他背后的意义,我们拿过来别人的方案代码,看懂了之后如果不进行思考,那么以后再打比赛仍然还是会发现分数上不去。
这里解释一下为什么在蚂蚁金服比赛中要把word level embedding 和 char level embedding 结合在一起,是我们用jieba 分词工具对蚂蚁金服数据进行分词之后,用肉眼观察发现,由很多分词不妥当的地方。
比如高频词 “余额宝” 会分成 “余额”,“宝” 。 还有很多名词分词是不合理的,靠人工添加分词规则,在10万个数据上是添加不完。 直接的表现就是word 模型要比char模型差很多。那我们在最后进行模型融合的时候就不会使用word模型了啊,效果相差太大,反而会拉低原来好的模型效果。
可是word模型的效果是差了些,但是他是一个有用的模型(至少比随机猜测强了很多),所以才有了word level embedding 融入到char 模型的做法,让模型自己去学习怎么word level中提取特征。这种做法极大地提高了分数的效果,当时我就是靠这个进入到复赛的。
但是在CHIP 这个比赛中这种做法就不行了,因为数据量少,如前面所说,我们应该给模型做减法。
首先,我们选择的模型是siamese LSTM 和 Decompose Attention两种最简单的模型,同时我们将word 和 char 分开训练。
由于数据量少,我们可以考虑一下使用传统特征。
特征1: 两个句子长度差绝对值
特征2: 两个句子长度和
特征3: (特征1)/(特征2)
特征4: 所有字词的预训练向量,乘以对应tfidf值,算他们的manhattan_distance,canberra_distance,minkowski_distance,euclidean_distance,cos_distance。
这个时候的特征如下:
用SVM跑一下是0.68,感觉不错哦,继续加特征并改用xgboost
特征5:增加了一个最小编辑距离
分数进一步上升,这个特征可以留
特征6: 共同出现的词的个数 分数到0.7
特征7: 对共同出现词取tfidf 并选取最大和第二大的 分数到0.75
在往下没再做了,做的这些特征并没有加进模型里面,最终提交的是siamese LSTM 加 Decompose Attention 模型word level 和char level独立训练。
分数提交今天看到终榜是9名。 这个比赛特征做着挺顺的,这点不像蚂蚁金服那个比赛。
以上这些,这个比赛没有看到熟悉的大佬们的身影,所以也是提不起劲来,现在一看到bird,skyhigh 这样的大佬的名字就来劲,他们打的比赛肯定好好打。