本文主要是介绍【金融大脑-一支优秀的队伍】比赛经验分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说在前面的话
大家好,我是“一支优秀的队伍”队长,SpaceOdd,我们队伍有俩人,另一个是我师弟。这次是我第一次参加比赛,复赛封榜前侥幸拿到了第一的成绩,实在是走运得很,不过还有重要的答辩环节,还要继续努力加油:)在这里斗胆做一个简单的分享是为了和大家一起学习,难免因能力不足而出现一些错误请不吝指出。
实际上前排大佬们的最后结果都是在伯仲之间,大家的解法都有很可取之处,期待大家也做出自己的比赛经验分享,一起为NLP添砖加瓦:)另外复赛A榜大佬们十分令人惋惜,B榜测试集只有1W条的确是会让结果很波动,甚至大变天都是有可能的,我相信并不是所有人都在试图“overfit”测试集,我们自己队伍最后几日的不断尝试也带来了非常波动的结果,所以很能理解大家的心情,不过也不要一味的抱怨,生活还是要不断往前的。
题目简介
这个题目其实就是Natural Language Inference、Sentence Match这一类经典NLP问题,简单来说就是判断两个sentence的关系,在本比赛中,就是判断两个sentence是否语意一致。
这个任务非常有实用价值,想象你在做一个客服系统,事先会有一个问题-答案的表单,客服的工作其实就是在面对用户的提问时,迅速找到与之最接近的问题,并整理出答案来给用户。文本匹配系统一旦做的好了,可以直接解决第二个阶段的问题,也是最需要人力的部分——找到最接近的问题,这能大大减轻客服的压力,让他们去解决真正困难的问题。(真正的客服系统远比这个过程复杂,这里只是一个简单的例子)
与这个比赛相关的领域也包括像QA match、machine reading甚至recommendation等,只要问题涉及到了两类信息的交互,都是相关领域,都可以找paper来看,来借鉴idea。
解题基本策略
本人比赛经验比较少,听比赛经验略多的师弟说,NLP比赛一般不用feature(快有人来辟谣),所以我们一开始就没有朝着 找feature 这条ML的路走,我们毅然决然的选择了DL,换句话说,就是堆模型,靠模型的结构来自动提取、推演相关的feature,这也是DL的玄学魅力。
我们的配合方式很简单。我和师弟用的是不同的框架,我keras他torch,所以用并行的方式来做比赛——互相分享好的paper、好的idea,互换实验结果及分析,然后各取所长,最后谁的结果好就用谁的模型。
建议大家组队的时候,还是尽量选择框架一致的队友,因为一旦你有事,队友能快速帮你补实验= =
我们无论是在做初赛还是复赛,都会先用siamese结构的纯基于encoding的网络来当baseline,然后再上基于交互的模型。在这个比赛里基于交互的模型还是要好于纯粹基于encoding的模型,不过并不是所有的匹配数据集都满足这一条件,依稀记得COLING 18年的一个复现paper(引用[4])里提到了,quora数据集上纯粹基于encoding的一个模型比ESIM等等模型效果还好,所以还是要多做实验验证。
我们的解题策略很简单,选一个可扩展性强的模型,然后根据其他paper的idea、自己的idea来改进模型,把它改的面目全非为止。
从一开始我们就选择了ESIM模型(引用[6]),相比现在动不动就好多层网络结构的NLI模型,ESIM思路清晰、能说服我们、网络结构相对简单、没有用很多trick、扩展性也强、效果很棒,所以就一眼相中了。目前来看逼格learning队伍也是用ESIM改进版取得了不错的成绩,看来所见略同。
对于这个任务来讲,模型的潜力是蛮大的,我们没有做任何的预处理,完整的保留了每个句子的所有信息(当然了padding和截取是必须的),因为我们觉得每一个信息对于DL来说都有用。我们没有使用词级别的向量,而是纯用的字级别的向量,在做实验的过程中发现基于词级别的结果普遍要差一点,这和分词质量不无关系,而且本人认为GRU、LSTM这样的网络因为引入了gate,已经具备一定程度的分词作用了。但是可以料想的是,如果经过了良好的分词处理,结合word和char级别的embedding,应该是有一定帮助的。我们在b榜上的最终成绩是多个模型求平均作ensemble的结果,这几个模型和下面将提到的最优单模型实际上比较相关,这里也是一个有待改进的点。
比赛经验分享
初赛阶段
这一段我们没花很多的精力,就简单的略过一下(主要成绩也不好,哈哈)模型就是原始的ESIM略作改动,自始至终都只用了字向量,初赛的时候本地数据并不多,我们在github上找了预训练好的300D的char embedding,地址在这儿 <a href="https://github.com/Embedding/Chinese-Word-Vectors" target="_blank">https://github.com/Embedding/Chinese-Word-Vectors ,我们用的是skipgram的mix-large版本,最终单模型初赛60名左右。
复赛阶段
我们的baseline encoding模型是三层bi-GRU+mult-head self-attention的siamese模型,每一层都用了残差。char emb方面我们用了初赛用的pretrain emb并作了fine-tune,对数据没有做任何预处理。A榜里单模型有728左右,10fold作平均来做ensemble,大概可以到735。作为一个baseline已经是很好的出发点了。
我们的最佳单模型是从ESIM出发一步步改进的,改到最后已经连ESIM也认不出来了。它像一个全新的物种,不过细细一看,眉眼、神情还是似曾相识的。我们参考了大概六七篇paper,附在本文的结尾,大家感兴趣的可以下下来看看。
关于最佳单模型的具体结构,这里暂时不透露太过详细,因为考虑到之后我们可能会用这个模型来做一些事情:)在一切妥当之后,会放出开源代码和大家一起学习。
经验分享(重要性不分先后)
1.数据集够大的时候,用外部训练好的emb并不一定就比本地训练的emb要好,比如复赛;
2.fix住emb能够很好的防止过拟合风险。实验发现fine-tune emb能够取得很低的loss,但F1不一定就提高了。但是凡事有利有弊,fix emb会让模型的能力受限,一个两者兼得的方式是——在fix emb的同时,额外引入一些可训练的emb维度,实验证明效果非常不错;
3.残差连接很好用。想提效果,一个很自然的方式就是加入适度的复杂性->堆mlp,但是直接加mlp,会有难以训练的风险,用残差连接就能较好的中和这个问题,这个方法很简单粗暴但是有用,我们的最优单模型在很多地方都用了一层Relu的mlp+残差连接;
4.很喜欢一个叫CLR leraning的学习率自动调整策略,是在看fast.ai的视频里学到的,尽管没有发生什么神奇的事情,但是稳定在第4个epoch收敛的效果我很喜欢,paper见引用[1];
5.self-attention(引用[9])比双向RNN要好用。初赛的时候我把ESIM顶层的双向LSTM替换成mult-head self-attention,很好用,复赛最优单模型也用了mult-head self-attention;
6.learning rate、dropout、batch size对模型效果影响很大很大;
7.很喜欢fuse gate(引用[8]中提到),用得好的话感觉比残差连接要有用,还有一种可视化的感觉——告诉你模型什么时候需要什么level的信息。在最优单模型上面我主要用在了char emb和encoder之后的表达上面,效果有提升;
8.对于DL模型,输入永远都是非常有用的,尽管你可以设计出牛逼的结构,但是如果输入信息就那么些,实在是强模型所难,我们发现把一些简单的char-level feature引入模型是会带来一点提升的(但是比较有限),个人不建议在模型后面再引入feature,会误导模型。我们用的char-level feature有四个,一个是exact match,一个是idf,另外两个是自动提取的feature,来自一个很赞的KDD 2018的paper,见引用[3];
9.在需要pooling的时候,拼接max-pooling和avg-pooling通常是很有用的,他们没有参数,而且尽可能的保留了信息量,这一块我们初赛和复赛一开始有在用;
10.还是pooling方面,也推荐s2t mult-dim的pooling方式(见paper引用[8]),最优的模型里我用了这个,之所以没有用max和avg的拼接,是不太希望最后接mlp之前的向量维度太大;
11.直接复现别人的paper不一定就效果好,通常需要自己做一些调整;
12.loss方面,加权的CE效果非常好,公式见引用[5]的paper,另外试过upsampling,效果和加权CE差不多,还没有尝试margin loss,不知道有没有队伍尝试过,可以分享一下;
13.想到再补充。
那些想实现但是没有实现的idea
1.引入拼音emb,这主要是为了一定程度上解决同音错别字的问题,逼格learning战队试过在初赛上有一点效果;
2.data augmentation,在图像领域旋转一下图像就能让模型鲁棒性更强,那么在NLP领域,是不是可以随机更改一下句子里的重要名词来制造负例,更改一下句子里不影响语意的词语来增加正例;
3.从外部找大量的语料,训练一个language model来做ELMo,见引用[2];
4.参考引用[7]来在emb层面上引入对抗扰动来增强模型的鲁棒性;
5.combine word和char emb,并引入pos tag等feature;
6.尝试更好的ensemble策略,比如stacking,然后可以尝试差异性更大的模型来做ensemble。
写在后面的话
从参赛到复赛封榜,历时两个多月,中间各种酸甜苦辣都尝了个遍,所有美好的旅程都是如此。感谢比赛方提供这样一个平台,感谢师弟的全力合作,感谢女票对我的悉心照顾,没有你我很难把比赛坚持下来:)
答辩日益临近,现在还远不是放松的时刻,大家一起加油,各位杭州见:)
参考文章链接
[1].Cyclical Learning Rates for Training Neural Networks, https://ieeexplore.ieee.org/document/7926641/
[2].Deep contextualized word representations, <a href="https://aclanthology.info/papers/N18-1202/n18-1202" target="_blank">https://aclanthology.info/papers/N18-1202/n18-1202
[3].Multi-Cast Attention Networks for Retrieval-based Question Answering and Response Prediction, https://arxiv.org/abs/1806.00778
[4].Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering , <a href="https://aclanthology.info/papers/C18-1328/c18-1328" target="_blank">https://aclanthology.info/papers/C18-1328/c18-1328
[5].ETH-DS3Lab at SemEval-2018 Task 7: Effectively Combining Recurrent and Convolutional Neural Networks for Relation Classification and Extraction , <a href="https://aclanthology.info/papers/S18-1112/s18-1112" target="_blank">https://aclanthology.info/papers/S18-1112/s18-1112
[6].Enhanced LSTM for Natural Language Inference, <a href="http://aclweb.org/anthology/P17-1152" target="_blank">http://aclweb.org/anthology/P17-1152
[7].Adversarial Training Methods for Semi-Supervised Text Classification, https://arxiv.org/abs/1605.07725
[8].DiSAN: Directional Self-Attention Network for RNN/CNN-Free Language Understanding, https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16126
[9].Attention is all you need, <a href="http://papers.nips.cc/paper/7181-attention-is-all-you-need" target="_blank">http://papers.nips.cc/paper/7181-attention-is-all-you-need
这篇关于【金融大脑-一支优秀的队伍】比赛经验分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!