论文复现TextCNN(基于PyTorch)

前言

复现经典论文,可以回顾深度学习和自然语言处理基础,强化对常用模型的理解,体会经典模型中蕴含的设计哲学,为后续实现自己的模型打下良好基础。如果不深入了解深度学习原理,对基本的模型都不能实现,只会拿开源代码抄抄改改,就会陷入盲目调参的误区,最终浪费时间又一无所获。因此,我们要避免成为调包侠、调参侠,强化对模型的主人翁意识,做到调参有的放矢,方能事半功倍。自己动手实现一个模型并达到或接近原论文效果,正是锻炼动手能力,提升深度学习基本功的好方法。

TextCNN

TextCNN(论文Arxiv地址)是CNN用于文本分类的开山之作。据Google Scholar统计,目前该论文引用量已达9000多次,足见其影响之深远。学习深度学习自然语言处理的人一定都听说过它的大名,也在初入NLP大门的时候运行过相关代码。但是一般都是简单看一下论文,跑一下示例代码,得出个差不多的结果就可以了,没有进一步深究细节。毕竟,在如此内卷的今天,大家时间都很宝贵,没有那么多心思花费在基本模型上。
殊不知,由于篇幅所限,论文中不能把模型的每一个细节都解释清楚,很多地方只有在代码里才能完美呈现。因此,使用作者的源代码才能真正实现复现论文模型的全貌。而原始论文的代码是基于Theano,这个框架几乎已经没人使用,因此我们使用新的框架PyTtorch来复现论文,争取通过这样的方式理解论文的每一个细节,对论文源代码进行原汁原味的还原。

数据预处理

在正式写模型之前,我们需要进行数据的预处理。
之前有句流传很广的话“数据决定了模型的上限, 而调参只不过是在逼近这个上限而已”,可见数据在深度学习与自然语言处理领域中的重要性。本文用到了MR,SST,SST2,SUBJ,TREC,TR,MPQA共7个数据集来进行文本分类,大多都是情感二分类。下面说几个需要注意的点:

  • 字符串预处理
    拿到原始数据集的文本后,在tokenize化之前,需要对字符串做出初步的处理,这里我们参考了论文原文作者的实现方式,即SST数据集、MR以及其他数据集分别使用不同的处理方式,具体代码见https://github.com/yoonkim/CNN_sentence/blob/master/process_data.py97117行。
  • 数据集划分
    已经分好的train,testvalid的数据集,直接使用原始的切分方式即可,最终的评价方式就是模型在测试集上的得分。对于未做切分的数据集,则进行10折交叉验证,10份测试结果的均值作为最终得分
  • 构建Embedding
    原论文使用Google原版的word2vec,权重数据下载地址https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM/edit。对于没有在词典中的词语,采用随机初始化的方式,这里随机初始化不是随便初始化,而使用均匀分布效果更好。论文作者使用了[-0.25,0.25]的均匀分布,我使用的是[-0.1,0.1]的均匀分布,相比之前使用的正态分布随机初始化可以至少提高1个百分点。
    np.random.uniform_(-0.1,0.1,300)
  • 使用预训练词向量时,训练、测试、验证集的词都加入词表,加载其对应的词向量,效果会更好。

代码实现

在仔细阅读之后,我动手实现了该论文的完整代码,代码位于这里。深度学习框架实用PyTorch,因为PyTorch1.5以上不能完全保证两次结果一致,影响控制变量,因此我使用1.4版本的PyTorch。在实现过程中我参考了以下代码和教程:

  1. TextCNN论文作者原版,使用Theano框架,地址:https://github.com/yoonkim/CNN_sentence
  2. Tensorflow版,地址:https://github.com/dennybritz/cnn-text-classification-tf
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值