啊啊啊,又是好久好久没更博客了。

前言

寒假有点无聊,碰巧看到kaggle上有几个比赛,然后就参加了看着比较有趣的一场比赛,Mercari Price Suggestion Challenge ,第一次玩kaggle,搞了一个多星期,最后拿到一个银牌,也算是还能接受吧。

这个比赛,要求你通过商品的标题类型商品描述文本信息预测商品定价,数据来自二手电商平台Mercari。同时这个比赛采用的是kernel only的赛制,它要求提交代码,并且代码要在kaggle的服务器(16gb内存+1gb硬盘+4核cpu)上在一个小时之内跑出答案,第二阶段不能修改提交的代码。这对参赛选手是一个非常大的挑战,首先你要保证代码能在规定硬件资源下跑出答案,同时第二阶段不允许修改代码,但预测数据是第一阶段的5倍,这使得你的代码要具有比较高的鲁棒性(这也使得我除夕那天才发现我的代码会在第二阶段爆内存,然后一直肝到3点多)。总的来说,这是一个非常良心的比赛,成绩基本上非常的稳定。

开源方案

首先,由于参赛比较晚,kernel区已经开源了许多的方案,主要的模型Ridge Regression、lightgbm、ftrl-fm、rnn。参赛的前几天,我基本上都在kernel区看别人的代码,学到了非常多,同时也奠定了我最后的模型基础。

预处理

这题预处理部分对整体成绩影响比较少,无非就是一些符号、停词的去除,一些词语的变换,错别词的修正等等。

神经网络模型

对于nlp类的问题,网络基本上有几个可以尝试的地方:

  1. 首先是word embedding,要注意的是这题的硬件限制,所以词向量大小不能太大。同时,我还尝试了采用预训练的词向量(GloVe、word2vec)作为初始化,让模型进行微调,不过最后的效果基本上没有随机化好,看kaggle上的讨论,大家基本上都没有采用预训练的模型。个人觉得,主要还是首先这题的背景是二手商品的价格预测,语料都是产生于电商平台,并且这是一个回归类的问题,而word2vec和GloVe的词向量都是基于CBOW或是Skip-Gram训练的,产生的词向量一般会使得在同一上下文的词相似度会比较高。而出现在同一上下文的词,对于价格不一定有很大的指导性,好比不同品牌的手机,他们的词向量可能都很接近,但价格的偏差会是非常的大。再加上这题的数据已经是比较大,所以最后就没有做预训练的词向量。但是不可否认在分类问题上预训练的词向量应该效果会比较好

  2. 然后就是网络的结构,主要有RNN(gru/lstm)、BiRNN、TextCNN+Average/Max Pooling、Attention等模型可以去尝试,但最后还是由于时间的限制选择了gru(不过根据赛后分享,很多人用tectcnn上成绩也做的非常好)。

FM模型

以前只听说过fm/ffm在ctr领域有不错的效果,当时在开源区看到ftrl-fm是非常震惊的,而且作者自己用cython实现,采用了openMp(cython.parallel)做并行化,速度和效果上都非常的好。

最后的将这两个模型做一个简单的加权融合得到最后的成绩。

赛后分享

赛后大佬们纷纷开源解决方案,不得不说kaggle上开源精神真是非常让人感动,简单看了一下:

  • 第一名开源的解决方案是先做ngram的tf-idf统计,然后将这个巨大的稀疏矩阵放入MLP中训练,30分钟的运行时间,百行不到的代码,处处都是非常优雅的实现,而且实际的效果也非常的好,非常令人敬佩。值得一提的是,他们在排行榜上的成绩还要比开源的版本好一些,他们自己私底下的解决方案应该比开源的还要好(噗通)。https://www.kaggle.com/lopuhin/mercari-golf-0-3875-cv-in-75-loc-1900-s

  • 第三名的解决方案是TextCNN+MaxPooling+Attention的网络+ftrl_fm,值得一提的是它的网络有许多的细节,比如加入bn层(为什么我加上去就没有用呢);加入resnet的shortcut;并列的堆叠多个激活函数(有点类似inception的想法,堆叠多个不同大小的卷积核)。https://www.kaggle.com/whitebird/mercari-price-3rd-0-3905-cv-at-pb-in-3300-s

  • 第四名的解决方案非常的复杂,作者尝试了各种各样的网络架构和FM。比较有亮点的是作者采取了一个snapshot-ensemble( https://arxiv.org/abs/1704.00109 )的方法,做网络的融合,snapshot-ensemble是来自一篇ICLR2017的论文,核心想法是想通过一次训练得到模型的n个极小点,具体实现结合cyclic-lr-schedule,在多次下降后,对当前网络的位置做一个快照,保存当前网络结点变量,然后预测时将多个网络快照结果进行融合。还有一个亮点是作者github上自己实现了TensorFlow版的DeepFM( https://arxiv.org/abs/1703.04247 ),DeepFM是一篇IJCAI2017的论文,虽然感觉想法还是比较普通,但通过结合FM和MLP达到低阶特征组合高阶特征组合的共同作用效果确实会比较好,另外作者的TensorFlow代码写的也是非常的漂亮(噗通)。https://github.com/ChenglongChen/tensorflow-XNN

小结

kaggle虽然是一个国外的数据挖掘比赛,但还是有许许多多优秀的国人,比如上面讲的第三第四名的解决方案都是来自国人,而且kernel真的对新人非常友好。
这篇博文基本上还是比赛的经验为主,最近kaggle上还有一道nlp问题,希望这里的经验能给大家一点启发。之后有机会应该会写一写关于embedding、cnn、rnn(gru/lstm)、FM的基础知识。

本文地址: http://www.dzglalala.cn/2018/03/01/Mercari Price赛后感/