到底什么方法 训练1000个样本,就能完成400万条评论分类!
来源:feedly blog
编译:Bing
编者按:关于NLP领域的迁移学习我们已经介绍过了,fast.ai也有很多相应的讨论。今天给大家展示一个在亚马逊评论数据集上实现的任务,即将评论分为积极或消极两类。
GitHub地址在这里:github.com/feedly/ml-demos/blob/master/source/TransferLearningNLP.ipynb,感兴趣的同学可以自己动手试试。
相关阅读:《概览迁移学习在NLP领域中的应用》
PS:阅读原文,领取复现代码!
什么是迁移学习?
得益于迁移学习,计算机视觉领域的发展非常迅速。有着几百万个参数的高度非线性模型通常需要大型数据集的训练,经过几天甚至几周的训练,也只能分辨猫狗。
有了ImageNet挑战赛后,每年各种队伍都会设计出不同的图像分类器。我们发现这类模型的隐藏层可以捕捉图像的通用特征(例如线条、形式、风格等)。于是,这样就不用每次都为新的任务重建模型了。
以VGG-16模型为例:
它的结构相对复杂,图层较多,同时参数也很多。论文作者称需要用四个GPU训练三周。
而迁移学习的理念是,由于中间的图层是学习图像一般特征的,所以我们可以将其用作一个大型“特征生成器”!我们可以先下载一个预训练模型(在ImageNet任务上训练了好几周),删去网络的最后一层(全连接层),根据我们的任务进行调整,最后只训练我们的分类器图层。由于使用的数据可能和之前训练的模型所用数据不同,我们也可以花点时间训练所有图层。
由于只在最后一层进行训练,迁移学习会用到更少的标记数据。对数据进行标注非常费时,所以创建不需要大量数据的高质量模型就非常受欢迎了。
NLP中的迁移学习
说实话,迁移学习在自然语言处理中的发展并不像在机器视觉里那样受重视。让机器学习线条、圆圈、方块,然后再用于分析还是比较容易设计的。但是用来处理文本数据似乎不那么容易。
最初用来处理NLP中的迁移学习问题的是词嵌入模型(常见的是word2vec和GloVe),这些词嵌入表示利用词语所在的语境来用向量表示它们,所以相似的词语有相似的词语表示。
然而,词嵌入只能表示大多数NLP模型的第一个图层,之后我们仍需要从零开始训练所有的RNN/CNN等图层。
对语言模型进行微调
今年年初,Jeremy Howard和Sebastian Ruder提出了ULMFiT模型,这也是对NLP领域迁移学习的深入尝试。具体可参考论智此前报道的:《用迁移学习创造的通用语言模型ULMFiT,达到了文本分类的最佳水平》。
他们所研究的问题基于语言模型。语言模型是能够基于已知单词预测下一个单词的模型(例如手机上的智能拼写)。就像图像分类器一样,如果NLP模型能准确预测下一个单词,那就可以认为该模型学了很多自然语言组合的规则了。这一模型可以作为初始化,能够针对不同任务进行训练。
ULMFiT提出要在大型语料上训练语言模型(例如维基百科),然后创建分类器。由于你的文本数据可能和维基百科的语言风格不同,你就需要对参数进行微调,把这些差异考虑进去。然后,我们会在语言模型的顶层添加一个分类图层,并且只训练这个图层!论文建议逐渐解锁各个图层进行训练。
ULMFiT论文中的收获
这篇论文最让人惊喜之处就是用非常少的标记数据训练分类器。虽然未经标记过的数据随处可见,但是标记过的数据获取的成本是很高的。下面是对IMDb进行情感分析之后的结果:
只用了100个案例,他们就达到了和用2万个案例训练出的模型同样的错误率水平。除此之外,他们还提供了对模型进行预训练的代码,因为维基百科有多种语言,这使得我们能快速地进行语言转换。除英语之外,其他语种并没有很多经过标记的公开数据集,所以你可以在语言模型上对自己的数据进行微调。
处理亚马逊评论
为了加深对这种方法的理解,我们在另一个公开数据集上试了试。在Kaggle上发现了这个“亚马逊评论情感分析数据集”(地址:www.kaggle.com/bittlingmayer/amazonreviews/home)。它含有400万条商品评论已经相关的情感标签(积极或消极)。我们用fast.ai提出的ULMFiT对亚马逊的评价进行分类。我们发现,仅用1000个案例,模型就达到了在全部数据上训练的FastText模型的表现成果。而用100个案例进行训练,模型也能表现出不错的性能。
如果你想复现这个实验,可以参考notebook:github.com/feedly/ml-demos/blob/master/source/TransferLearningNLP.ipynb,在微调和分类过程中有一个GPU还是很高效的。
NLP中非监督 vs 监督学习
在使用ULMFiT的过程中,我们用到了非监督和监督学习两种方法。训练一个非监督式语言模型很“便宜”,因为你可以从网上找到很多文本数据。但是,监督式模型的成本就很高了,因为需要标记数据。
虽然语言模型可以捕捉到很多有关自然语言组织的信息,但是仍不能确定模型能否捕捉到文本的含义,即它们能否了解说话者想传达的信息。
Emily Bender在推特上曾提出了一个有趣的“泰语实验”:“假设给你所有泰语书籍,没有译文。假如你一点都不懂泰语,你永远不会从中学会什么。”
所以,我们认为语言模型更多的是学习语法规则,而不是含义。而语言模型能做的不仅仅是预测在语法规则上相近的句子。例如“I ate this computer”和“I hate this computer”两句话结构相同,但是一个良好的模型应该会将后者看作是“更正确”的句子。所以我们可以将语言模型看作是学习自然语言句子的架构的工具,从而帮助我们了解句子含义。
想了解更多这方面的话题,可以观看ACL 2018上Yejin Choi的演讲:sites.google.com/site/repl4nlp2018/home?authuser=0
NLP迁移学习的未来
ULMFiT的出现推动了迁移学习在自然语言处理中的发展,同时也出现了其他的微调工具,例如FineTune Transformer LM。我们注意到随着更多更好地语言模型的出现,迁移的效率也在不断提高。
最后再附上ULMFiT的原论文:arxiv.org/pdf/1801.06146.pdf
原文地址:blog.feedly.com/transfer-learning-in-nlp/
获 论智 授权
PS:阅读原文,领取复现代码!(格式为ipynb格式的,需要电脑上查看)
推荐阅读:
一大批历史精彩文章啦
【机器学习】今天想跟大家聊聊SVM
【机器学习】今天详细谈下Soft Margin SVM和 SVM正则化
到底什么方法 训练1000个样本,就能完成400万条评论分类!相关推荐
- 花木兰到底好看不,我用Python爬取了几万条评论!
对于神仙姐姐刘亦菲,估计很多码农都很喜欢,小编也非常喜欢她.从一开始的金粉世家里面的青涩的白秀珠,到天龙八部的神仙姐姐王语嫣,再到仙剑奇侠传里面的赵灵儿,后来挑战四大名捕里面的无情,演技也是越来越好. ...
- 《一出好戏》讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何?
视频课程链接:https://edu.csdn.net/course/detail/9348 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演阵容强大,相信许多 ...
- 《一出好戏》讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何?...
黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演阵容强大,相信许多观众也都是冲着明星们去的. 目前<一出好戏>在猫眼上已经获得近60万个评价,评分为 ...
- 《预训练周刊》第51期:无重构预训练、零样本自动微调、一键调用OPT
No.51 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...
- GPT系列:生成式预训练与零样本学习
GPT系列:生成式预训练与零样本学习 本文的主要参考是李沐老师关于 GPT 系列的解读:GPT,GPT-2,GPT-3 论文精读[论文精读]. 关于BERT和GPT Transformer/BERT/ ...
- #今日论文推荐# 西湖大学工学院姜汉卿课题组提出一种全新的微流体操控方法,可实现“样本进结果出”的即时检测
#今日论文推荐# 西湖大学工学院姜汉卿课题组提出一种全新的微流体操控方法,可实现"样本进结果出"的即时检测 即时检测(Point-of-care technology, POCT) ...
- Python计算训练数据集(测试集)中某个分类变量阴性(阳性)标签样本的不同水平(level)或者分类值的统计个数以及比例
Python计算训练数据集(测试集)中某个分类变量阴性(阳性)标签样本的不同水平(level)或者分类值的统计个数以及比例 目录
- DL之DCGNN:基于TF利用DCGAN实现在MNIST数据集上训练生成新样本
DL之DCGNN:基于TF利用DCGAN实现在MNIST数据集上训练生成新样本 目录 输出结果 设计思路 实现部分代码 说明:所有图片文件丢失 输出结果 更新-- 设计思路 更新-- 实现部分代码 更 ...
- 最邻近方法nn_【庖丁解牛】从零实现RetinaNet(七):使用分布式方法训练RetinaNet...
下列代码均在pytorch1.4版本中测试过,确认正确无误. 如何把nn.DataParallel模式训练代码改为nn.parallel.DistributedDataParallel分布式训练代码 ...
- java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
目录 场景介绍 项目配置 Mybatis为什么慢? JdbcTemplate让我眼前一亮 原生JDBC就是快啊! 存储过程怎么样? 越简单越快 前言 一直有一种说法:批量插入大量数据到MySQL数据库 ...
最新文章
- linux系统无法挂载U盘
- layui.table.render设置自定义高度高度
- 关于C10K、异步回调、协程、同步阻塞
- 一个交易平台源码,全源无接口
- Java之WeakReference与SoftReference使用讲解
- 福建地震局网站被******挂壮阳广告
- java打印日期序列,Java GSON-日期格式
- Java并发编程之CountDownLatch闭锁
- Linux Man手册的使用示例
- 【已解决】ModuleNotFoundError: No module named ‘web’的解决办法:
- request.getcontextPath() 详解(转)
- console.log、toString方法与js判断变量类型
- android弹幕控件,可能是目前轻量级弹幕控件中功能最强大的一款
- 各种通信接口的简单对比
- 行程单批量打印软件(eTerm航空电子客票行程单打印软件)
- 移动和嵌入式人体姿态估计(Mobile and Embedded Human Pose Estimation)
- C#实现笔记本摄像头调用、拍照 USB摄像头
- 肤色冷暖色测试软件_认识你自己|肤色冷暖测试
- 往超级表格导入Excel,让数据处理不再繁杂!
- 同城滴滴啦啦啦啦啦啦啦啦