参加了一个竞赛学习小组,要求每天要打卡发布文章。公益性的组织确实不易,自己既然参加了,就不要辜负大佬的期望。先总结一下别人的经验。
文章目录
如何到top5%?NLP文本分类和情感分析竞赛总结
就像他说的那样
机器学习提取的是如tf-idf的具体(concrete)特征
深度学习提取的是如词向量的抽象(abstract)特征
对于分类器,传统的朴素贝叶斯分类、SVM、XGB、LGB算法,在NLP竞赛中都不太好使,因此NLP比赛里用到的基本都是深度学习。竞赛中最重要的两步就是:
做好文本表示工作,可以简单理解成词向量训练,即做好 “数据–>信息” 的流程
做好分类器,可以理解成模型的设计,即做好 “信息–>知识” 的流程
语义粒度与文本长度
语义粒度是指对文本是否分词,以词还是以字来表示一个句子的输入特征。一般来讲,我们都需要对他们进行尝试,只要效果不相差太多,我们都需要保留,为最后的模型融合增加差异性。
文本长度我一般用占比95%或者98%的长度最为最大长度,对超过最大长度的句子进行截取,不足的进行填充(padding)。另外就是对句子进行padding的时候,keras补0默认是补在前面,我想了下这应该是RNN结构的隐藏层参数空间最开始初始化为0,有个冷启动过程,所以我觉得补在前面是不错的。
词向量模型与维度
如果数据没有脱敏,可以直接用github上训练好的词向量;否则就自己训练。
这里面有一个重要的trick是拼接Word2Vec和GloVe作为新的特征输入会对模型由一定提升效果,直接相加或者求平均效果通常都不好。
在单种词向量维度选择上,一般要费点时,加上拼接的话需要做的测试就更多了。而且不同模型上表现也不一样,最后大概率也选不到最佳维度,做这种事情心里都会觉得草蛋,但是心态要平和。这也是我为什么觉得态度端正,不要眼高手低非常重要。
当然,牛逼的人总是会想办法自动找一下最合适的词向量维度,感兴趣的同学可以看看NeurIPS 2018斯坦福的这篇论文《On the Dimensionality of Word Embedding》。
语言模型词向量
因为我们需要预训练语言模型,因此这就很像图像领域的迁移学习:先根据大规模语料训练好网络的一部分,然后用这部分网络接个分类器在小规模语料上重新finetune提高性能。
有了语言模型词向量最好的一点是,我们可以不用太纠结Word2Vec和GloVe的词向量维度选择了,可以选一个200维或者300维的最后再一起融合就好了。
训练模型
我觉得文本分类最重要的是抓取关键词,而影响关键词抓取最重要的一点是文本的长度,就像人类做阅读题一样,越长的内容越难把握住重心。但是如果我们过于优化长文本性能,在短文本上的性能就会受到影响。因此我们关注的重点是:
- 关键词特征
- 长文本
- 短文本
主要是以下的这个图片:
对于短文本,CNN配合Max-pooling池化(如TextCNN模型)速度快,而且效果也很好。因为短文本上的关键词比较容易找到,而且Max-pooling会直接过滤掉模型认为不重要特征。虽然Attention也突出了重点特征,但是难以过滤掉所有低分特征。而Capsules效果比CNN好,所以我个人觉得在短文本上LSTM/GRU+Capusules是一个不错模型,这也是目前Kaggle Quora比赛上(短文本分类)最好的baseline之一。
但是对于长文本直接用CNN就不行了,在客服领域意图分类任务里,TextCNN会比HAN模型低十多个点,几乎没法用。当然我们可以在TextCNN前加一层LSTM,这样效果就能提升很多。
上面讲的这些网络我还不太懂,懂了会好好再写出来各个网络是什么
trick
Finetune
- 微调Embedding学习率
- 训练过程中,验证集得分或loss变差,重新加载上一轮的模型,并降学习率降半。
- Snapshot Ensemble。
半监督假标签
- 通过训练集训练好的模型,去预测测试集的结果
- 把测试集这个结果作为测试集的标签,和训练集混合在一起训练模型
- 一般模型能忍受10%的噪音,所以建议假标签方法不要一股脑把所有测试集和训练集混合,尽量保持比例在10:1附近