监督分类空白处也被分类了_NLP中文文本分类监督学习类竞赛复盘

4ad487201b86c759a19352a3e1d0c7c0.png

比赛的内容是中文文本分类的监督学习任务,文本长度基本小于100个字,因此不算是长文本,类别有20个,60000个训练样本,8000个测试样本。

在接触这个比赛之前,我还刚刚入门深度学习,更没有接触过任何竞赛,更不用说是比较难的NLP类的竞赛,唯一做过的NLP类任务是烂大街的垃圾邮件分类,因此一开始并没有抱着太大的希望,更多的是以学习的态度来参加竞赛,当然,最后结果还不错,也确确实实学到了很多东西。

作为复盘,会谈到解题思路,解题中遇到的困难,以及以后还需要改进的点,文章按照模型的流程,可以划分为以下几个部分:

  1. 数据清洗
  2. 数据增强
  3. 特征工程
  4. 模型构建
  5. 在竞赛中遇到的一些问题

在模型构建中又分为:

  • 传统机器学习模型
  • 深度学习模型
  • 模型融合
  • 调参

1. 数据清洗

数据的清洗十分重要,清洗的不干净会引入大量的噪音,导致模型很有可能将噪音特征也拟合进去,因此清洗是第一步。

1.1 观察数据

要清洗数据,首先得知道怎么清洗,因此需要对数据有一定的了解。

总共只有60000条短文本,因此我的方法是直接全部打印下来,从头到尾先拉一遍,发现数据其实很规整,都只有一句话,有少量的数据存在特殊符号和英文,于是统计了一下,出现英文的仅占了不到%0.05,再去查看测试集,仅存在10条不到包含英文,于是考虑直接删除。

接着观察数据的类型分布,发现是一个分布非常偏的数据集,这样训练出来的模型很有可能会更加偏重于数量较多的类别,泛化性能差。

1.2 清洗和分词

清洗的话使用re包可以较快的将中文直接全部提取出来。

分词基本上是做NLP的必备步骤,中文文本使用了jieba分词,但简单的分词显然不行,还需要尝试各种模式和粒度,以及考虑是否要去除停用词。

分词需要考虑的点:

  • jieba分词模式:全模式,搜索模式,精确模式
  • 分词粒度
  • 是否去除停用词

比较有意思的是,发现对于这个比赛的数据集,保留停用词使用Lightgbm模型的效果更好,而对于深度模型来说,不保留停用词的效果更好。

不过据我所知,NLP任务中停用词一般而言都会保留,是为了保证不破坏语句原有的语义。

2. 数据增强

考虑做数据增强,是因为训练集类别分布太不均衡,对于某个样本特别少的类别,其训练是不充分的,通过数据增强,增加这种类别的样本,可以改善这种情况。

对于图像的数据增强非常简单,可以对原始样本进行放大,缩小,旋转,截取部分,增加噪音,遮挡,变形等各种操作,都能得到不错的增强样本,这些样本在我们人眼看来是一样的,但是对于计算机语言来说,每个像素点都发生了变化,因此是完全不同的样本,但其标签一定是不变的。

但是对于文本来说,数据增强要困难的多,因为简单的一个改变很可能改变整个句子的语义,对于这个比赛的监督学习来说,很可能得到的增强文本的类型已经发生了改变,这就引入了被错误标记的训练样本,对模型的训练非常不友好。

但尽管有种种不便,仍然有一些公众认可的效果比较好的方法。

文本数据增强的方法:

  • 过采样
  • 回译
  • 同义词替换,随机添加,删除,交换单词等
  • 生成模型

过采样对于NLP任务来说并不是一个好的方法,简单重复采样会造成过拟合,而使用SMOTE方法得到的增强样本很可能已经大大偏离了原来的语义,这是因为文本进行embedding后得到的向量处于高维空间。

而生成模型一般需要大量的文本进行训练,因此我也没有考虑。

最后使用了回译和同义词替换,以及随机添加删除和交换单词的方法,这应该也是兼顾了简单快速和语义保存较为完整的两个方法。

回译是指将文本的语言翻译成另一种语言,再翻译回原来的语言,也分为使用线上翻译或者自己构建翻译器。

构建本地翻译器需要大量的文本进行训练,因此不予考虑,我使用的是某网站的API,将样本数量较少的类别通过20多种语言进行了回译,增加样本数量。

需要注意的是,用来进行回译的原始样本尽可能保留其中的符号,如果去掉符号很可能线上翻译将识别出不同的语义,另外,回译后得到的样本很有可能发生重复,因此需要将重复样本剔除,不然容易过拟合。

同义词替换可以在网上查找中文的同义词表,这个方法直觉上将完整的保留语义,不过比较奇怪的是,在采用了这个方法后分类模型的效果反而变差了。

于是我又尝试了用word2vec方法,得到与每个词最相近的前几个词语,再用这些词语进行替换,还有就是在同义词的前后增加相近词,或者随机删除和替换词语,但直观来看语义还是有可能改变的。

不过最后还是提升了一些模型的准确率,因此对于不同的情境,有些大家都认可的方法有可能并不适用,而一些直观上看起来就不太可靠的方法,有可能反而效果不错,因此需要大量的实战经验,才能在各种情境下得心应手。

3. 特征工程

经过实战,认识到一个重要的点,就是模型的选择并不是最重要的,因为模型说白了就这么多,将合适的模型全部试一遍也花不了太多时间和精力,但特征工程反而更重要,这是将你和其他人拉开距离的地方,往往得到一个好的特征就可以将准确率大大提升。

特征工程分为了两个部分,一是为传统机器学习提取文本特征,采用了tfidf得到,以及对每个句子的词性进行了统计,并且对词性统计特征做了特征交叉。

第二是为深度学习提取文本特征,采用了word2vec进行word embedding。

3.1 传统部分

我一开始只是分词后进行了tfidf,并尝试了朴素贝叶斯,决策树,随机森林等模型,最后还是选择了现在大火的lightgbm训练模型,效果确实不错。

但是tfidf后就不知道该怎么办了,感觉文本除了这种特征外好像也没别的特征可以提取了,后来在纸上写写画画,发现其实每个词它们本身都还有隐藏特征,就是它们的词性。

于是我对每个出现的词都标注了词性,一开始的想法是将一些不重要的词性去除,比如地名,数量词等等,因为去掉后好像也不怎么影响语义,但去除后发现效果并不好。

转念一想好像也有些道理,因为标签中有”文化“,”国际“,”工业“等字眼,实际上地名与这些标签还是隐藏着各种联系的,比如出现了”藏族“,”回族“等民族字眼的样本更有可能分类到”文化“中,而出现了”上海“,”广州“,”北京“等国际化都市,则更有可能被分类到”国际“中,而对于重工业地区,包含这些地区名的文本则更有可能与”工业“有关。

特征交叉:

于是转移到对词性频率的统计上,首先统计了所有出现的词性,并且每个词性在样本中出现的频率都作为一个统计特征,没想到有一些提升,后来又对这些词性特征做了特征交叉,又提升了一些。

特征交叉其实是一个很好的方法,它可以得到一些非线性的特征,但很难对这样的特征进行解释。一般的就是对两个特征进行相乘,相加,相减和相除的计算,得到新的特征,也可以对三个,四个甚至更多特征进行类似的计算,但经验上来说两两特征运算已经足够了。

3.2 深度部分

深度部分的word embedding使用了一些经典方法,最终还是使用了word2vec得到词向量。

4. 模型构建

4.1 传统机器学习模型

这部分没有太过于纠结,尝试了一下朴素贝叶斯,决策树,随机森林和lightgbm。

lightgbm不愧是传统机器学习中的大杀气,速度又快准确率又高,但是因为对这一模型的原理理解不足,用起来比较云里雾里,这也是之后使用一些复杂的深度学习模型时的弱点所在。

对一个模型的原理理解不够,很容易造成不知道下一步应该怎么办,进而在改进模型的时候只能一个个试错,导致浪费了很多的时间,这也是我之后需要提升的部分,不能只知道怎么使用模型,更要明白模型的原理。

4.2 深度学习模型

在参加这个比赛之前,我仅仅是入门了深度学习,会建立简单的全链接模型,并且大致明白CNN,RNN,残差网络等的原理,但仍然是对深度学习的理论知识掌握不够。

因此在使用模型时,更多的还是直接调用,很少能够做到对模型的改进。

在这场比赛中,现学现卖的学会了TextCNN,BiLSTM,BiGRU和Attention机制的使用,实际上也学会了Bert应该怎么用,奈何机器性能不够,直接OOM了。

针对深度学习模型的论文很多,但参加比赛时我印象比较深的只有wide-deep模型,这还是针对推荐系统的深度模型,不过借鉴这一模式,我在TextCNN,BiLSTM,BiGRU层后成功加入了之前做的词性频率特征,想让神经网络也能够考虑这一特征,可惜效果不尽如人意。

后来发现原来是给的batchsize太大的缘故,于是将512的batchsize直接改成32就可以运作了。但距离截止日期已经临近,不知道还能不能赶得上,实际上直接用预训练的bert得到词向量是非常快的,这就相当于将bert中的所有参数设置为trainable = False,但效果肯定没有参数可优化好,因此还是决定Bert后面加BiLSTM和TEXTCNN看看效果。

因为原来60000条数据的训练,使用Kaggle上的GPU已经需要5个小时左右,而此时又临近截止日期,因此应该来不及再加上数据增强了,算是初赛的遗憾,不过之后复赛也是可以用得上的。

4.3 模型融合

模型融合要在比赛的最后阶段进行,而在这场比赛中,我做模型融合就过早了,虽然我明白也可以先针对单个模型进行改进,但就是忍不住想要每次改进后都做一次融合看看最终的效果,看不到最终的效果心里就不舒服,这可能是一种病。

在这个比赛中使用的模型融合方法有stacking和bagging。

stacking:

简单来说,stacking就是使用交叉验证的方法,每次使用不同的训练集训练出多个模型,并使用所有模型对测试集进行分类,将得到的结果进行平均,就得到最后的结果。

bagging:

bagging的思想,是使用其它模型得到的验证结果作为特征,在bagging的模型中使用随机抽样的方式得到不同的训练集,再训练多个模型,并使用所有模型对测试集进行分类,将得到的结果进行平均,得到最后的结果。

在比赛中,我对Lightgbm,TextCNN,BiLSTM和BiGRU四个模型都做了5折stacking,也就是得到了20个模型,每种模型都有5个,将它们的预测都作为特征,在bagging中又训练了三个模型,才得到最终结果。

结果还是令我很惊讶的,直接提升了%1,这个效果真的杠杠的,果然名不虚传。

比较有意思的一点是,lightgbm和深度模型使用的特征数据实际上完全不同,lightgbm使用的是tfidf和词性统计频率以及词性特征的交叉特征,而深度模型中使用的是word2vec得到的词向量,也就是针对传统和深度做了两套不同的特征数据。

4.4 调参:

调参是一个很磨人的工作,特别是对于我这种对模型的理解不足的入门小白更是如此,为了节约时间,我没有使用网格搜索,而是一种叫贝叶斯调参的方法。

相比于特征工程,调参得到的提升可以说也不甚显著,因此也可以放在比赛的最后时间进行。

5. 在竞赛中遇到的一些问题

实际上遇到的大大小小的问题非常之多,其中一个最大的问题就是很多NLP的模型根本不会用,那些经典模型只能一个个查用法,而会用了却也没有很理解其原理,导致无法进行优化,一开始没法用Bert就是因为对模型理解不够,虽然看到了batchsize这个参数,但是没有往与硬件条件相关方面去想,以至于不知道其实调了batchsize就可以使用了。

另一个问题是,目前对项目的理解还在于用更好的模型,做更好的特征工程,但对好坏的认知比较模糊,实际上模型和特征工程的好坏需要针对项目本身的情况来决定,这就需要对项目的深入理解,一个比较好的方法是每次得到模型分类结果,从分类结果中查看哪些是分类错误的,并分析分类错误的原因,再据此改进特征工程和模型结构。

小问题就太多了,一个让我很心累的小问题是,在数据清洗阶段实际上是改变了原始数据的,但是竞赛要求提交的文件中需要包含原始数据和预测shu数据,而我i在花了大量时间训练模型后提交的是被清洗了的数据,以至于我纠结了很久不知道哪里出了错误。

在特征增强中,一个是随机添加同义词,这个小部分我对其改动比较多,因为一开始就是挑选原数据中的一个词,然后随机选择一个同义词,再随机插入文本中的一个位置,后来想了想,觉得这样改变语义的可能性很大,于是把插入的位置改成原数据中挑选词的前后两个位置。这让我明白其实一个方法并不像看上去那么简单,深入思考,会发现很多值得改进的地方。

更多的困惑实际上来源于模型本身,比如在学习Bert的用法时,很长时间都没法将训练集转换成Bert需要的独特的输入格式,而错误提示又没法直接指向错误代码,这让我纠结了好一阵子,神经网络中每一层的输出和输入的形状也时长出现不匹配的情况。

一个影响效率的地方在于,每天白天我都会改模型,然后跑几个改动好的模型,再进行分析,这导致如果我要对这些跑好的模型进行改动,就会错过睡觉时间,而晚上是跑模型最好的时间,因此之后的竞赛我需要对我的时间安排做一些调整。

最后,我没有充分利用Kaggle所提供的硬件,实际上Kaggle提供了十个CPU,1个GPU和1个TPU,理论上我可以同时跑10个传统和2个深度,这提高的效率不是一点半点。


总结:

总结而言,这次比赛主要是了解了打比赛的流程,以及如何使用一些工具,包括:

  • 用于数据增强部分的回译方法,以及同义词替换方法等
  • 用于特征工程的交叉特征方法
  • 用于获得词向量的word2vec
  • 模型的使用lightgbm,TextCNN,BiLSTM,BiGRU,Bert
  • 模型的融合stacking和bagging
  • 用于调参的贝叶斯调参

之后需要改进的点:

  • 对模型原理的深入理解
  • 对各种数据清洗,特征工程,数据增强方法的深入理解
  • 通过模型结果的分析改进模型结构
  • 调整时间安排,提高效率
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值