本篇文章4734字,读完约12分钟

雷锋。这篇文章的原作者陈云,最初发表在智湖专栏。雷锋网(公开号:雷锋网)已经作者授权。智虎关山杯夺冠游戏源代码(pytorch实现)github地址github/chenyutcc/pytorchtext

知乎 “看山杯” 夺冠记

竞赛官方网站:比恩达塔/竞赛/胡志/

比赛结果的官方公告:7月份,zhuanlan.zhihu/p/28912353,天气酷热难耐,我认识的几个学生参加了智湖看山杯,他们都得到了好的名次。当时天池爱医大赛的预赛已经结束,官员正在调试复赛的平台,复赛时间拖得很长。看到几个学生在比赛中名列前茅,我决定画空并试一试。结果,我失去了控制,发现两个学生组成了一个团队(团队初始),所以我整个暑假都在这场比赛中度过,最终以一定的优势获得了第一名(见最终排名)。

知乎 “看山杯” 夺冠记

1.竞赛介绍这是一个多分类问题:目标是“训练参与者根据智虎给出的问题与主题标签之间的绑定关系的训练数据自动标记未标记的数据。”一般来说,当用户在智能手机上提问时,程序应该能够根据问题的内容自动添加主题标签。一个问题可能对应多个主题标签,如下图所示。

知乎 “看山杯” 夺冠记

amp;lt;img src= amp;quot;getimg.jrj/images/2017/09/leiphone/one_20170901164435414.png amp;quot; data-rawwidth= amp;quot;998 amp;quot; data-rawheight= amp;quot;560 amp;quot; >

这是一个文本多分类,多 label 的分类问题(一个样本可能属于多个类别)。总共有 300 万条问题 - 话题对,超过 2 亿词,4 亿字,共 1999 个类别。amp。lt。img src= amp。quot。geting . jrj/images/2017/09/leiphone/one _ 20170901164435414 . png amp;quot。数据-rawwidth= amp。quot。998安培。quot。数据-rawheight= amp。quot。560安培。quot。>这是一个具有多个分类和多个标签的文本分类问题(一个样本可能属于多个类别)。共有300万个问题-主题对,超过2亿个单词,4亿个单词,总共1999个类别。

知乎 “看山杯” 夺冠记

1.1参考biendata/竞争/胡志/数据/

一般来说,它是:

脱敏后,数据不是以“如何评价2017智湖关山杯机器学习大赛”的形式,而是以“w2w34w234w54w909w2343w1”或“c13c 44 c 5642 c 782 c 934 c 02 c 2309 c 42 c 13C 234 c 97 c 8425 c 98 c 43 c”的形式。

知乎 “看山杯” 夺冠记

因为单词和单词是不敏感的,所以不可能使用第三方单词向量。官方特别提供了预先训练好的单词向量,即char _ embedding.txt和word _ embedding.txt,它们都是256维的。

知乎 “看山杯” 夺冠记

组织者提供了1999年类别的描述和它们之间的父子关系(例如,机器学习的父主题是人工智能、统计学和计算机科学),但是没有使用这些知识。

训练集包含300万个问题的标题、描述和主题

测试集包含210,000个问题的标题、问题的描述和五个最有可能的主题。

1.2数据处理数据处理主要包括两个部分:

Char _ embedding.txt和word _ embedding.txt被转换成numpy格式,这非常简单,您可以直接使用word2vec的python工具

对于不同长度的问题文本,填充和被截断为相同的长度(您也可以使用填充序列函数自己编写代码填充)。如果太短,填写空案例;如果太长,它将被截断。操作图如下:

知乎 “看山杯” 夺冠记

1.3数据增强文本中的数据增强并不常见。在这里,我们使用无序播放和丢弃数据增强,前者打乱了单词顺序,后者随机删除一些单词。效果示例如下:

1.4对每个预测样本的评价指标,提供五个最可能的主题标签,计算加权准确率和召回率,然后计算f1值。请注意,准确性是经过加权和累积的,这意味着正确的预测越高,对分数的贡献就越大。这也意味着精度可能高于1。但是,在计算f1值时,分子不会乘以2,因此很难达到0.5。

知乎 “看山杯” 夺冠记

请参考具体评估指标的描述

比恩达塔/竞赛/胡志/评估/

2模型介绍建议您先阅读本文,了解几种常用的文本多分类模型:在cnn的关注下解决大规模文本分类问题

2.1通用模型结构文本分类有许多模型,本次竞赛中使用的模型基本遵循以下体系结构:

其基本思想是在一个词(或多个词)通过嵌入层后,利用cnn/rnn结构提取局部信息、全局信息或上下文信息,并利用由两个完全连通的层组成的分类器进行分类。

知乎 “看山杯” 夺冠记

在介绍每个模型之前,让我们在这里得出一个结论:

当模型复杂到一定程度时,不同模型之间的得分差异非常小!

这是最经典的文本分类模型,所以我在这里不再赘述。模型架构如下:

和原纸的区别在于:

使用两层卷积

使用更多的卷积核,更多的尺度卷积核

使用Batchnorm

在分类中使用两层完全连接

简而言之,它更深更复杂。然而,卷积核的尺寸设计不够合理,导致感受野存在较大差距。

2.3 textrnn找不到纸张,所以我凭感觉意识到:

与其他人的做法相比,这里的区别在于:

使用两层双向lstm。

分类时,我们不仅使用最后一个隐藏元素的输出,还使用所有隐藏元素的输出作为k-max pool来分类。

2.4 textrcnn指原论文的实现。与rnn类似,它也是一个两层双向lstm,但它需要直接连接到嵌入层的输出concat(类似于resnet的快捷方式)。

2.5 text initiative是我自己提出的,它是参照textcnn的思想(多尺度卷积核)模仿cutout的结构设计的。一层的切口结构如下图所示。在比赛中,使用了两层切口,最深的四层卷积,比textcnn更深。

知乎 “看山杯” 夺冠记

2.6当训练每个模型的分数时,每个模型或者只训练基于单词的模型,或者只训练基于字符的模型。每个模型的得分都是相似的,所以这里不单独列出,只区分训练模型的类型和数据是否增强。

知乎 “看山杯” 夺冠记

你可以看到

基于词的模型的效果远远好于基于词的模型(这说明中文分词是必要的)。

数据增强在一定程度上改进了基于词的模型,但它主要对基于字符的模型有副作用。

这些模型之间的得分差别不大。

2.7模型融合模型融合是赢得这场竞争的关键,这场竞争相对简单,数据量相对较少。

在这里,我只使用最简单的模型融合方法——概率和其他权重融合。对于每个样本,单个模型给出一个1999维向量,它表示模型属于1999主题的概率。融合的方式是直接将每个模型的输出向量相加,然后选择概率最高的五个主题提交。结构如图所示:

知乎 “看山杯” 夺冠记

让我们来看看这两个模型融合的分数:

第一列中的比较模型是rnn(代替数据增强,word用作训练数据),第二列是四个不同的模型(不同的结构或不同的数据)。

我们可以得出以下结论:

从第一条线和第二条线的比较中,我们可以看到模型之间的差异越大,改进就越大(rnn和rcnn相似,因为它们都使用双向lstm来提取底部的特征)。虽然rcnn得分高于初始阶段,但初始阶段更能促进模型融合。

知乎 “看山杯” 夺冠记

从第一行和第四行的比较中,我们可以看到数据差异越大,融合就越容易。尽管基于词(char)训练的模型得分相对较低,但与基于词训练的模型的融合仍然可以大大提高。

知乎 “看山杯” 夺冠记

利用数据增强有助于改善数据差异,促进模型融合。

摘要:差异越大,模型融合效果越好。如果没有差别,创造条件也应该创造差别。

2.8多模型实际上是一种模型融合模式。从另一个角度来看,它实际上是一个非常大的模型,每个分支就像一个多频道的textcnn。那么我们能训练一个超大型模型吗?答案是肯定的,但效果往往很差。因为模型太复杂,很难训练。在这里,我尝试了两种改进方法。

知乎 “看山杯” 夺冠记

第一种方法使用预先训练好的单一模型来初始化复杂模型的一些参数,模型架构如下所示:

然而,这种方法会带来一个问题:模型的过度拟合是非常严重的,并且很难学到新的东西。由于训练集中单个模型的分数都接近0.5,接近理论极限分数,此时学习新内容比较困难。这里采用的应对策略是采用较高的初始学习率,强行将模型拉出过拟合点,使模型在训练集中的得分快速降低到0.4左右,然后降低学习率,慢慢学习,提高模型的得分。

知乎 “看山杯” 夺冠记

第二种方法是将预训练模型的嵌入矩阵修改为政府给出的嵌入权重。这样,共享嵌入可以在一定程度上抑制模型的过拟合,减少参数数量。虽然cnn/rnn和其他模型的参数都是过拟合的,但是由于相应的嵌入不是过拟合的,模型的分数在开始会下降很多,然后慢慢增加。这种方法更好。在提交模型重现结果的最后,我只提交了7个这样的模型,其中包括不同子模型的组合,一般包括3-4个子模型。以这种方式生成的权重文件也相对较小(约600-700米),将其上传到网络磁盘相对方便。

知乎 “看山杯” 夺冠记

2.9失败的模型和方法多模式只是我尝试过的比较成功的方法之一,其他大多数方法都以失败告终(或者效果不明显)

数据的多重训练:因为严重的过度拟合,我认为先用一半的数据训练,让它完全过度拟合,然后用另一半的数据训练。效果不如以前的型号。

注意栈,指的是这篇文章,实际上相当于重量调整,但它的效果是有限的和麻烦的,所以它是直接融合相同的重量(所有重量设置为1)。

栈太费时费力,浪费大量时间,或者在实现上可能出错,在推广上受到限制,不能继续学习。

Boost类似于第二种考拉方法,首先训练一个模型,然后训练第二个模型来添加第一个模型的输出,但是固定第一个模型的参数。这相当于不断地纠正先前模型的误判(你可以尝试计算梯度,你会发现第一个模型已经判断出正确的样本。即使第二个模型是错误的,第二个模型的梯度也不会很大(也就是说,第二个模型不会花太多时间学习这个样本)。但是效果并不好。原因是过度拟合非常严重,训练集中第一个模型的分数直接接近0.5,导致第二个模型什么也学不到。考拉队最终凭借这种助推模式获得了第二名。我放弃得太早了,很遗憾我没能在这个方法上取得突破。

知乎 “看山杯” 夺冠记

Tta(测试期间的数据增强)相当于测试期间的人工制造差异,对单个模型有一般影响,并且对融合几乎没有帮助。

超点用于超参数查询,主要用于查询模型融合的权重。效果是平均的,最后不使用,所以手动调整。

标签设置权重,给正样本赋予更高的权重,训练模型,然后与正常权重的模型融合,可以在单个模型上增加2-3千分之一(非常大),但是在最终的模型融合中,效果非常有限(0.0002),调整权重很麻烦,所以放弃了。

知乎 “看山杯” 夺冠记

结论:虽然我以前学习过cs224d并完成了前两项作业,但我从未写过任何与自然语言处理相关的代码。没有队友的支持和同学们的不断鼓励,我不可能获得一等奖。

知乎 “看山杯” 夺冠记

在本次比赛开始时,对我帮助最大的两篇文章是《cnn rnn关注解决大规模文本分类问题》和《深度学习——自然语言处理——最佳实践》

第一篇是《北京邮报》的一位大四学生写的(我不知道~),介绍了很多文本分类模型(cnn/rnn/rcnn),对我的入门很有帮助。

第二篇文章是一位外国医生写的。那时,我已经把我的分数刷到了前三名。在家里读完这篇文章后,我很惊讶,并解释了我的许多疑虑。提到的许多经历确实与我的情况相符。

知乎 “看山杯” 夺冠记

另外,为什么这个团队叫做init?Git init,linux init,python __init__。我最喜欢的三个工具。pidof init为1。

另外,欢迎申请北友模式识别实验室

最后,最后:生命太短暂了,赶快用火把吧!

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

标题:知乎 “看山杯” 夺冠记

地址:http://www.hcsbodzyz.com/hcxw/10059.html