文本分类实战技巧(tricks)汇总

目录

 

前言

关于分词器

关于中文字向量

如果数据集噪声很严重

baseline选用CNN还是RNN?路线沿着CNN还是RNN走?

Dropout加在哪里

关于二分类

关于多标签分类

类别不均衡怎么办

别太纠结系列

还是不会用tricks但是就是想跑出个好结果怎么办


前言

一年前小夕在知乎上提问过这么一个问题

文本分类有哪些论文中很少提及却对性能有重要影响的tricks?
链接:https://www.zhihu.com/question/265357659/answer/578944550

当时正好在刷一个比较有趣的task,结果发现奇奇怪怪的tricks可以带来不少的性能收益。再加上后来为了验证一个小idea跑了一堆公开的文本分类数据集,虽然idea没有多亮,倒是积累和摸索了不少刷性能的tricks╮( ̄▽ ̄””)╭然后呢,小夕后续又用这些tricks刷了不少相关的比赛(哪怕是文本匹配这种特殊的文本分类问题),发现baseline+一堆tricks+简单集成就可以随随便便刷到一个文本分类的水比赛的top10甚至top3,甚感调参和tricks的重要性。然鹅,最近好一段时间都没有文本分类这个基础问题了,感觉都快忘了,趁着还有点模糊的记忆就整理下来分享给大家叭~希望能在大家刷论文实验、比赛或实际项目的时候提供点帮助或者启发。首先来一个结论,tricks用的好,调参调的妙,TextCNN也能吊打绝大多数花里胡哨的深度模型。tricks没用好,SOTA模型也会性能差的让你怀疑人生。下面就不分重点,没有逻辑的开始本文辣。

关于分词器

中文也好,英文也好,拿过来数据集无可避免的就是要看看要不要做分词(有的小伙伴以为英文数据集就完全不用分词真的让人很无奈鸭),如果要做,就要纠结分词器的选择了。

路人丙:我厂有全方位吊打各种开源分词工具的分词器了
小夕:好了你可以往下划了

首先就有一个问题,**真的是算法越“先进”的分词器就会给下游任务带来越好的性能吗?**很多人走到这一步的时候会忽略一个东西,**词向量!!!**其实比起分词算法本身的先进程度,在神经网络使用预训练词向量的大背景下,**确保分词器与词向量表中的token粒度match其实是更更重要的事情!**毕竟哪怕你词分的再好,一旦词向量表里没有的话,那么就变成OOV了,分的再好也木用了╮( ̄▽ ̄””)╭(除非你不嫌麻烦多写点代码去对相对于词向量表的OOV进行特殊处理,反正我一般嫌麻烦╮(╯▽╰)╭)于是这里就有了两种情况。1. ****已知预训练词向量的分词器一般像word2vec、glove、fasttext这些官方release的预训练词向量都会公布相应训练语料的信息,包括预处理策略如分词等,这种情况真是再好不过了,不用纠结,如果你决定了使用某一份词向量,那么直接使用训练该词向量所使用的分词器叭!此分词器在下游任务的表现十之八九会比其他花里胡哨的分词器好用。2. ****不知道预训练词向量的分词器这时就需要去“猜”一下分词器了。怎么猜呢?首先,拿到预训练词向量表后,去里面search一些特定词汇比如一些网站、邮箱、成语、人名等,英文里还有n't等,看看训练词向量使用的分词器是把它们分成什么粒度,然后跑几个分词器,看看哪个分词器的粒度跟他最接近就用哪个,如果不放心,就放到下游任务里跑跑看啦。当然,最理想的情况当然是先确定最适合当前任务数据集的分词器,再使用同分词器产出的预训练词向量啦。可惜互联网上不可能有那么多版本的公开词向量供选择,因此自己在下游任务训练集或者大量同分布无监督语料上训练词向量显然更有利于进一步压榨模型的性能。不过,怎么为当前的任务去预训练一份儿好用的词向量又够写一篇文章的。。这里就不展开讲啦,小夕以后再写~(没关注小夕的赶紧关注!)当然,除了分词器跟词向量表要match上,另外还要保证大小写、OOV的定义等跟词向量表match上。如果使用了一个区分了大小写的词向量表,但是你还将下游任务的单词全都小写,那么不用想了,绝对性能丢N多个百分点。

关于中文字向量

路人丁:好麻烦,我不分词了,我要用字向量了哼
小夕:别逃( ̄∇ ̄)

如果你真的将char-level作为主力,那么别忘了中文的字向量也要预训练!并且预训练的时候记得把窗口开大一些,不要直接使用word-level的窗口大小哦,其他预训练超参数也随手调一调更好了,绝对比随机初始化的字向量明显的好。

如果数据集噪声很严重

这里噪声严重有两种情况。对于数据集D(X, Y),一种是X内部噪声很大(比如文本为口语化表述或由广大互联网用户生成),一种是Y的噪声很大(一些样本被明显的错误标注,一些样本人也很难定义是属于哪一类,甚至具备类别二义性)。对于前一种噪声,一个很自然的想法是去使用语言模型或者基于编辑距离去做文本纠错,然鹅实际中由于专有名词和超出想象的“假噪声”存在,在实际场景中往往效果并不是很好。这里小夕一般有两种思路,一种是直接将模型的输入变成char-level(中文中就是字的粒度),然后train from scratch(不使用预训练词向量)去跟word-level的对比一下,如果char-level的明显的效果好,那么短时间之内就直接基于char-level去做模型叭~如果性能差不太多,或者char的已经做到头了,想做一下word-level呢?不要急,先帮小夕买根棒棒糖呗( ̄∇ ̄)一个很work但是貌似没有太多人发现的trick就是使用特殊超参的FastText去训练一份词向量啦。为什么说特殊呢?一般来说fasttext在英文中的char ngram的窗口大小一般取值3~6,但是在处理中文时,如果我们的目的是为了去除输入中的噪声,那么我们可以把这个窗口限制为1~2,这种小窗口有利于模型去捕获错别字(想象一下,我们打一个错误词的时候,一般都是将其中的一个字达成同音异形的另一个字),比如word2vec学出来的“似乎”的最近词可能是“好像”,然而小ngram窗口fasttext学出来的“似乎”最近词则很有可能是“是乎”等内部包含错别字的词,这样就一下子让不太过分的错别字构成的词们又重新回到了一起,甚至可以一定程度上对抗分词器产生的噪声(把一个词切分成多个字)。当然,如果数据集很干净的话,这样训练词向量的话可能就gg了。而对于后一种噪声的情况(即Y中的噪声),一种很直接的想法是做标签平滑,然而小夕在实战中使用多次发现效果并不是太明显。最后总结的trick是,首先忽略这个噪声,强行的把模型尽可能好的训出来,然后让训练好的模型去跑训练集和开发集,取出训练集中的错误样本和开发集中那些以很高的置信度做出错误决策的样本(比如以99%的把握把一个标签为0的样本预测为1),然后去做这些bad cases的分析,如果发现错误标注有很强的规律性,则直接撸一个脚本批量纠正一下(只要确保纠正后的标注正确率比纠正前明显高就行)。如果没有什么规律,但是发现模型高置信度做错的这些样本大部分都是标注错误的话,就直接把这些样本都删掉吧~常常也可以换来性能的小幅提升,毕竟测试集都是人工标注的,困难样本和错标样本不会太多。

baseline选用CNN还是RNN?路线沿着CNN还是RNN走?

在文本分类中真的不要太纠结这个问题,个人倾向于CNN,主要是因为跑得快呀。。。可以多跑几组实验,多好。而且实际经验感觉TextCNN这种基础款CNN模型不仅实现特别容易,而且很容易成为一个数据集上的很强的baseline(除非这个分类任务很难),花一两个小时把这个baseline做出来后再去做其他模型一点也不迟~也有助于早期就能纠正大方向。而如果要谈到客观的思路决策上,那就去花一个小时好好看一下数据集吧~如果你感觉数据集里很多很强的ngram可以直接帮助生成正确决策,那就CNN起步吧。如果感觉很多case都是那种需要把一个句子看完甚至看两三遍才容易得出正确tag,那就RNN起步吧。当然,如果数据大,又有显卡,还可以尝试Transformer。时间多的话,还可以CNN、RNN的模型都跑出来简单集成一下。

Dropout加在哪里

word embedding层后、pooling层后、FC层**(全联接层)**后,哦了。起步阶段dropout概率保持统一,有时间再单独微调就好(从来没有这个时间过)。至于偶尔有人吹捧的word dropout策略(将一些token随机mask成[PAD],或者说0。注意这个操作跟dropout加在embedding层后不等价哈),最后有时间的话试一下就好,亲测在dropout调好的情况下一般并不会发挥多大作用。

关于二分类

二分类问题一定要用sigmoid作为输出层的激活函数?当然不是,尝试一下包含俩类别的softmax吧。可能多一条分支就多一点信息叭,虽然后者在数学形式上更丑一点,但是实践中常常带来零点几个点的提升也是比较玄学了。

关于多标签分类

如果一个样本同时拥有多个标签,甚至标签同时还构成了DAG(有向无环图),不要着急,先用binary-cross-entropy训出个baseline来(即把每个类别变成一个二分类问题,这样N个类别的多标签分类问题就变成了N个二分类问题),毕竟这个都在tensorflow里有现成API了,即tf.nn.sigmoid_cross_entropy_with_logits。因此实现代价很小。然后你还可能惊喜的发现,这个baseline做好后好像多标签问题不大了,DAG问题自己也基本解决了(虽然模型层并没有专门针对这个问题作处理),然后就可以安心做模型辣。什么?问题木有解决?去查论文吧╮( ̄▽ ̄””)╭小夕还没有接触过这方面太难的数据集。

类别不均衡怎么办

像网上说的那样赶紧各种上采样下采样boosting策略用起来?nono,正负样本比才9:1的话,继续做你的深度模型调你的超参吧,模型做好后你会发现这点不均衡对模型来说不值一提,决策阈值也完全不用手调。但!是!如果你发现经常一个batch中完全就是同一个类别的样本,或者一些类别的样本经过好多batch都难遇到一个的话,均衡就非常非常有必要了。类别不均衡问题传送门->【小夕精选】如何优雅而时髦的解决不均衡分类问题

别太纠结系列

  1. 别太纠结文本截断长度使用120还是150

  2. 别太纠结对性能不敏感的超参数带来的开发集性能的微小提升

  3. 别太纠结未登陆词的embedding是初始化成全0还是随机初始化,别跟PAD共享embedding就行

  4. 别太纠结优化器用Adam还是MomentumSGD,如果跟SGD的感情还不深,就无脑Adam,最后再用MomentumSGD跑几遍

还是不会用tricks但是就是想跑出个好结果怎么办

BERT了解一下。Over。暂时想起来的就是这些啦,剩下有想起来的tricks小夕会更新到知乎上,传送门:

https://www.zhihu.com/question/265357659/answer/578944550

话说,小夕跟大家分享了这么多tricks,亲爱的们有没有秘藏tricks在评论区分享给小夕呢( ̄∇ ̄)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「优知学院」淘宝架构的前世今生(下)

“ 淘宝技术架构前世今生就是一部架构活教材,今天仍然由陈睿mikechen为大家解读淘宝架构。 我稍微把前面淘宝架构的三个阶段简短总结: 淘宝1.0 采用LAMP mysql读写操作 淘宝2.0 把mysql替换为oracle,为了使用oracle的连接池,php采用代理连…

学习排序 Learning to Rank:从 pointwise 和 pairwise 到 listwise,经典模型与优缺点

Ranking 是信息检索领域的基本问题,也是搜索引擎背后的重要组成模块。本文将对结合机器学习的 ranking 技术——learning2rank——做个系统整理,包括 pointwise、pairwise、listwise 三大类型,它们的经典模型,解决了什么问题&…

论文浅尝 | 从 6 篇顶会论文看「知识图谱」领域最新研究进展 | 解读 代码

本文内容源自往期「论文浅尝」,由 PaperWeekly 精选并重新排版整理,感谢 PaperWeekly。ISWC 2018■ 链接 | http://www.paperweekly.site/papers/1912■ 源码 | https://github.com/quyingqi/kbqa-ar-smcnn■ 解读 | 吴桐桐,东南大学博士生&a…

互联网(IT)大厂面试技巧(面经)

目录 前言 面试的正确姿势 实战 最后的总结 前言 虽然资历尚浅,但是也面过不少试,有Google、微软等外企大佬,也有BAT等国内巨头,工作的这几年也有幸当过几次面试官,小鹿这里呢就结合自己的亲身经历,聊…

「优知学院」淘宝技术架构的前世今生(上)

“ 淘宝技术架构经历从最初的LAMP架构,到IOE架构,再到分布式架构,再到去IOE,最后到现在的云计算平台架构这一变化过程在不断解决上面的技术问题,可以说淘宝技术架构的演变就是活生生的一本架构教科书。 这次为大家带…

十大双跨平台整体发展情况盘点

在2019年国家级双跨平台发布一年之际和新一轮遴选开场之前,相关媒体“从战略演进、平台发展、资源汇聚及行业应用四个维度九个细分指标”,对十大双跨平台整体发展情况通过“一张图”的形式做了一次盘点(图略)。 我们通过对图中指…

论文浅尝 | 知识图谱问答中的层次类型约束主题实体识别

Citation:Qiu, Y., Li, M., Wang, Y., Jia, Y., & Jin, X.(2018). Hierarchical Type Constrained Topic Entity Detection for Knowledge Base Question Answering. Companion of the Web Conference (pp.35-36).动机对于 KBQA 任务,有两个最为重要的部分&…

机器学习中的范数规则化之(一)L0、L1与L2范数

机器学习中的范数规则化之(一)L0、L1与L2范数 zouxy09qq.com http://blog.csdn.net/zouxy09今天我们聊聊机器学习中出现的非常频繁的问题:过拟合与规则化。我们先简单的来理解下常用的L0、L1、L2和核范数规则化。最后聊下规则化项参数的选择问…

模型训练慢和显存不够怎么办?GPU加速混合精度训练

目录 混合精度训练 理论原理 三大深度学习框架的打开方式 Pytorch Tensorflow PaddlePaddle 混合精度训练 一切还要从2018年ICLR的一篇论文说起。。。 《MIXED PRECISION TRAINING》 这篇论文是百度&Nvidia研究院一起发表的,结合N卡底层计算优化&#x…

陈睿:架构设计之数据库拆分六大原则

架构设计之数据库拆分原则 数据拆分前其实是要首先做准备工作的,然后才是开始数据拆分,我先讲拆分前需要做的事情: 第一步:采用分布式缓存redis、memcached等降低对数据库的读操作。 第二步:如果缓存使用过后&#xf…

(摘要)新基建风口下,今年工业互联网平台将呈现十大新特征

目录一是提升核心能力成为平台发展的主攻方向二是垂直行业和产业集聚区应用爆发式增长四是数据驱动的制造范式正在形成五是平台加速推动大中小企业融通发展六是平台 “双创”生态体系初步形成七是平台采用知识图谱提升核心能力八是CPS和数字孪生崭露头角九是区块链支撑平台构建…

论文浅尝 | 基于知识图谱的子图匹配回答自然语言问题

本文转载自公众号:珞珈大数据。本次论文讲解的是胡森 邹磊 于旭 王海勋 赵东岩等作者写的论文-Answering Natural Language Questions by Subgraph Matching over Knowledge Graphs,主要是分享一些阅读论文的收获,希望能对正在学习自然语…

模式识别之特征提取算法

说明:此处暂时简单介绍下各种特征提取算法,后续完善。 前言:模式识别中进行匹配识别或者分类器分类识别时,判断的依据就是图像特征。用提取的特征表示整幅图像内容,根据特征匹配或者分类图像目标。常见的特征提取算法…

ACL2020 | 对话数据集Mutual:论对话逻辑,BERT还差的很远

一只小狐狸带你解锁 炼丹术&NLP 秘籍本文为MuTual论文作者的特别约稿编辑:rumor酱、夕小瑶前言自然语言处理是人工智能领域的掌上明珠,而人机对话则是自然语言处理领域的最终极一环。以BERT为代表的预训练模型为自然语言处理领域带来了新的春天&…

大型网站系统的特点和架构设计

分布式架构 阿里P8架构师谈:淘宝技术架构从1.0到4.0的架构变迁 优知学院」淘宝技术架构的前世今生(上) 优知学院」淘宝架构的前世今生(下) 揭秘:一位亲历者眼中的淘宝技术架构发展之路 淘宝发展历程最具…

IDC 和浪潮联合发布了《2020-2021 中国人工智能计算力发展评估报告 》

近日,IDC 和浪潮联合发布了《2020-2021 中国人工智能计算力发展评估报告 》(以下简称《报告》)。《报告》指出,中国 AI 基础设施市场规模在 2020 年达到了 39.3 亿美元,到 2024 年预计达到 172. 2 亿美元。 《报告中》…

Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用

Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用 1,首先切换到Oracle用户,并进入数据库#sql / as sysdba2,启动数据库,并连接样例及表格,启动命令#startup,连接样例#conn scott/tiger3&#xff…

论文浅尝 | 基于动态知识图谱向量表示的对称合作对话代理的学习

链接:https://arxiv.org/abs/1704.07130文本研究了对称合作对话(symmetric collaborative dialogue)任务,任务中,两个代理有着各自的先验知识,并通过有策略的交流来达到最终的目标。本文还产生了一个11k大小的对话数据集。为了对结…

知乎搜索框背后的Query理解和语义召回技术

一只小狐狸带你解锁 炼丹术&NLP 秘籍前言随着用户规模和产品的发展, 知乎搜索面临着越来越大的 query 长尾化挑战,query 理解是提升搜索召回质量的关键。本次分享将介绍知乎搜索在 query term weighting,同义词扩展,query 改写…

JSON-LD 和知识图谱

JSON-LD 正式推荐标准2020年7月发布 2020年7月16日,W3C JSON-LD 工作组发布三份正式推荐标准(W3C Recommendation): JSON-LD 1.1 语法(JSON-LD 1.1)定义了一种基于 JSON 的格式来序列化关联数据。该语法的…