小数据、高准确率的文本分类:利用迁移学习创造通用语言模型
作者 | Jeremy Howard、Sebastian Ruder
译者 | Liu Zhiyong
编辑 | Natalie,Vincent
AI 前线导读:本文是对 Fast.ai 新论文的介绍,面向大众读者,阐述了如何自动对文档进行分类,同时比以前的方法具有更高的准确率,以及更少的数据需求。本文将用简单的术语来解释:自然语言处理、文本分类、迁移学习、语言建模;以及这个新的方法是如何将这些想法结合在一起的。如果你已经熟悉自然语言处理和深度学习,你可以访问这个项目主页来获得技术信息:http://nlp.fast.ai/category/classification.html
更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)
前 言
我们发表了论文 Universal Language Model Fine-tuning for Text Classification,(ULMFiT)(https://arxiv.org/abs/1801.06146),提供了预训练模型(pre-trained models)和 Python 实现的完整代码。这篇论文在已经在国际顶级会议 ACL 2018 经过同行评议并接收(Annual Meeting of the Association for Computational Linguistics,ACL 2018,http://acl2018.org/)。可以在此网页(http://nlp.fast.ai/category/classification.html)观看相关视频,视频提供了对该方法的深入探讨、所有使用的 Python 模块、预训练模型以及用于构建自己的模型的脚本。
这种方法大大改进了以前的文本分类方法,任何人都可以用我们的代码和预训练模型来更好地解决以下问题:
查找与法律案件相关的文件;
识别垃圾邮件、机器人回复和攻击性评论;
对产品的正面和负面评论进行分类;
按政治倾向进行文章分类;
其他。
与以前的方法相比,ULMFiT 需要的数据量要少得多。(论文中的图 3)
那么这种新技术究竟做了什么改进呢?让我们首先看一看论文摘要的部分内容,看看它是怎么说的,然后在本文接下来的章节,我们将由此展开并准确了解其全部含义:
迁移学习极大地影响了计算机视觉,但是自然语言处理现有的方法,仍然需要从头开始进行特定任务的修改和训练。我们提出了一种有效的迁移学习方法,可以应用于自然语言处理中的任何任务,并引入对语言模型进行微调的关键技术。我们的方法在六种文本分类任务上,明显优于现有的技术,在大多数数据集上的错误减少了 18~20%。此外,这种方法只用了带 100 个带标记的样本,就可以与拥有 100 倍以上数据并且从头开始训练的模型性能相媲美。
自然语言处理、深度学习和分类
自然语言处理(Natural language processing,NLP)是计算机科学和人工智能的一个领域,顾名思义,它是指使用计算机来处理自然语言。自然语言是指我们日常交流的正常语言,如英语或汉语,而不是像计算机代码或音乐符号那样的专门语言。自然语言处理用于各种应用,如搜索、个人助理、摘要等等。总体来说,自然语言处理颇具挑战性,因为我们在编写计算机代码时,所使用的严格规则并不适用于语言的细微差别和灵活性。你自己也可能遇到过这些限制,比如尝试与自动电话应答系统交流,带给你的是令人沮丧的体验;或者像 Siri 那样的早期对话式机器人那可怜的能力。
在过去的几年中,我们已经目睹深度学习正大举进入那些计算机以前只能取得有限成功的领域。深度学习并不需要程序员来定义一组固定规则,而是使用神经网络,直接从数据中习得丰富的非线性关系。最值得注意的是,深度学习在计算机视觉上取得的成功,例如在 ImageNet 图像分类竞赛中的突飞猛进地发展。
深度学习在自然语言处理也取得了一些成功,例如在《纽约时报》的文章中曾谈及的自动翻译。大凡成功的自然语言处理任务的一个共同特点是,都有大量的标记数据可用于训练模型。然而到目前为止,这些应用仅限于那些能够收集和标记大型数据集,并拥有计算资源可以在计算机集群上长时间处理它们的机构。
说来也奇怪的是,自然语言处理对于深度学习来说仍然极具挑战性的一个子领域,也正是它在计算机视觉领域大获成功的领域:分类。它指的是,你的目标是将事物(如图像或文档)分类的任何问题(如猫和狗的图像,或正面与负面的评论,等等)。大量重要的现实问题主要是关于分类的,这就是为什么深度学习在 ImageNet(一个分类问题)取得的成功催生了大量的商业应用的原因。在自然语言处理中,目前的方法能够很好地识别,例如,判断关于某部电影的评论是正面还是负面,这是一个称之为“情感分析”的问题。然而,当事情变得更加模糊时,模型就会“犹豫不决”,这通常是因为没有足够的标签数据来学习。
迁移学习
我们的目标是解决这两个问题:a) 处理自然语言处理问题,我们并没有大量的数据和计算资源;b) 使自然语言处理的分类更容易。我们(Jeremy 和 Sebastian)都在研究解决这个问题的确切领域:迁移学习。迁移学习指的是使用经过训练解决某个问题(如将 ImageNet 中图像分类)的模型作为解决其他类似问题的基础。一种常见的方法是对原始模型进行微调(如将 CT 扫描分类为癌症或非癌症,这是 Jeremy 在创建 Enlitic 时所开发的迁移学习的应用)。由于微调模型不需要从头开始学习,因此,与不使用迁移学习的模型相比,它通常可以达到更高的准确率,而且所需的数据和计算时间也少得多。
非常简单的迁移学习只使用一层权重(称为嵌入),在这几年来红得发紫,比如 Google 的 word2vec 嵌入。然而在实践中,完整的神经网络包含了许多层,所以,仅使用单个层的迁移学习,显然只是对无尽可能性的浅尝即止。
那么问题来了,为了解决自然语言处理的问题,我们可以从哪里进行迁移学习?这个问题的答案就在 Jeremy 手上,当时他的朋友 Stephen Merity 宣布开发了 AWD 长短期记忆网络模型(AWD LSTM language model, https://github.com/salesforce/awd-lstm-lm ),这与以前的语言建模方法相比有了很大的改进。语言模型是一种自然语言处理的模型,它学习预测句子中的下一个单词。例如,如果你需要手机键盘猜测接下来要键入的单词,那么就需要使用语言模型。很重要的原因是,语言模型很擅长猜测你接下来要说什么,它需要大量世界性的常识(如:“I ate a hot” →“dog”;“It is very hot” → “weather”),并深入理解语法、语义和自然语言的其他元素。这正是我们在阅读和分类文档时所具备却浑然不知的能力。
我们发现,在实践中,这种迁移学习的方法具有使其成为自然语言处理迁移学习的通用方法的特征:
适用于不同文档大小、数量和标签类型的任务;
使用单一架构和训练过程;
不需要自定义特征工程或预处理;
不需要额外的域内文档或标签。
让它发挥作用
ULMFiT 高级方法(以 IMDb 为例)
这个想法以前就尝试过,但需要数百万份文档才能获得足够的性能。我们发现,通过更聪明地对语言模型进行微调,就可以做得更好。特别是,我们发现,如果仔细地控制模型学习的速度,并更新预训练模型,这样它就不会忘记之前学过的东西,那么模型就可以更好地适应新的数据集。有一件事令我们感到特别兴奋,那就是模型可以很好地从有限的样本中学习。在一个包含两个类的文本分类数据集中,我们发现,仅用 100 个标记的样本来训练我们的方法(并允许它访问大约 50000 个未标记的样本),我们就能够实现与用 10000 个标记样本从头开始训练模型相同的性能。
另一个重要的见解是,我们可以使用任何合理且通用的大型语言语料库来创建通用语言模型:我们可以对任何自然语言处理目标语料库进行微调。我们决定使用 Stephen Merity 的 Wikitext 103 数据集,它包含了英文版维基百科的预处理大型子集。
自然语言处理的研究主要集中在英语上,而非英语语言的模型训练会带来一系列挑战。一般而言,非英语语言的公开数据集的数量很少,如果你想为一种语言(如泰语)训练文本分类模型,就得收集自己的数据。以非英语语言收集数据通常意味着你需要对数据进行标注,或者自己找到标注者,因为像 Amazon Mechanical Turk 这样的众包服务大多使用了讲英语的标注者。
在 ULMFiT 的帮助下,我们可以使除英语以外的语言训练文本分类模型变得更容易,因为我们所需要的只是访问维基百科,而维基百科目前有 301 种语言,少量文档可以方便手动进行标注,还可以随意添加未标记的文档。为了让这更容易,我们将很快推出一个模型合集(model zoo,http://nlp.fast.ai/category/model_zoo.html),为多种语言提供预训练语言模型。
ULMFiT 的未来我们发现,这种方法在不同的任务中,使用相同的设置效果很好。除了文本分类外,还有很多其他重要的自然语言处理问题,如序列标记或自然语言生成,我们希望 ULMFiT 将来能更容易地解决这些问题。一旦我们完成实验并在这些领域构建模型,我们将会更新这个网站。
在计算机视觉领域中,迁移学习的成功和预训练 ImageNet 模型的可用性已经改变了这一领域。包括企业家、科学家和工程师在内的许多人,他们正在使用微调的 ImageNet 模型来解决涉及计算机视觉的重要问题:从提高非洲农作物产量到制造乐高积木的机器人。现在,同样的工具可以用来处理自然语言,我们希望在这个领域也能看到同样应用的激增。
虽然我们已经阐述了文本分类的最新成果,但是仍然需要做大量的工作,才能真正充分利用自然语言处理迁移学习。在计算机视觉领域中,已经涌现许多重要而有见地的论文,深入分析了该领域的迁移学习。尤其是 Yosinski 等人试图回答“how transferable are features in deep neural networks(https://arxiv.org/abs/1411.1792)”这一问题,Huh 等人研究了“what makes ImageNet good for transfer learning(https://arxiv.org/abs/1608.08614)”。Yosinski 甚至创建了一个丰富的可视化工具包(visualization toolkit,https://github.com/yosinski/deep-visualization-toolbox),帮助从业者更好地理解他们的计算机视觉模型中的特征,如下视频所示:
Deep Visualization Toolbox
原文链接:
http://nlp.fast.ai/classification/2018/05/15/introducting-ulmfit.html
小数据、高准确率的文本分类:利用迁移学习创造通用语言模型相关推荐
- 用迁移学习创造的通用语言模型ULMFiT,达到了文本分类的最佳水平
https://www.jqr.com/article/000225 这篇文章的目的是帮助新手和外行人更好地了解我们新论文,我们的论文展示了如何用更少的数据自动将文本分类,同时精确度还比原来的方法高. ...
- 基于Kaggle数据的词袋模型文本分类教程
基于Kaggle数据的词袋模型文本分类教程 发表于23小时前| 454次阅读| 来源FastML| 0 条评论| 作者Zygmunt Z 词袋模型文本分类word2vecn-gram机器学习 w ...
- Pytorch:利用迁移学习做图像分类
**Pytorch:利用迁移学习做图像分类** 数据准备 数据扩充 数据加载 迁移学习 训练 验证 推理/分类 在这一篇文章中,我们描述了如何在 pytorch中进行图像分类.我们将使用Caltech ...
- 使用Flow forecast进行时间序列预测和分类的迁移学习介绍
ImageNet首次发表于2009年,在接下来的四年里,它成为了大多数计算机视觉模型的基础.到目前为止,无论您是在训练一个模型来检测肺炎还是对汽车模型进行分类,您都可能从在ImageNet或其他大型( ...
- Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
小数据存储 我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储.但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何 ...
- 文本分类 决策树 python_NLTK学习笔记(六):利用机器学习进行文本分类
关于分类文本,有三个问题 怎么识别出文本中用于明显分类的特征 怎么构建自动分类文本的模型 相关的语言知识 按照这个思路,博主进行了艰苦学习(手动捂脸..) 一.监督式分类:建立在训练语料基础上的分类 ...
- 论文阅读2018-Deep Convolutional Neural Networks for breast cancer screening 重点:利用迁移学习三个网络常规化进行分类
论文阅读2018-Deep Convolutional Neural Networks for breast cancer screening 摘要:我们探讨了迁移学习的重要性,并通过实验确定了在训练 ...
- ItClust:利用迁移学习解决scRNA-seq中的细胞聚类问题
目录 背景描述 方法 ItClust架构 使用源网络从source data提取信息 将细胞信息从source data迁移到target data 在target data上微调 细胞类型分配 补充 ...
- 宠物狗图片分类之迁移学习代码笔记
五月两场 | NVIDIA DLI 深度学习入门课程 5月19日/5月26日一天密集式学习 快速带你入门阅读全文> 正文共3152个字,预计阅读时间8分钟. 本文主要是总结之前零零散散抽出时间 ...
- 吴裕雄 python 神经网络——TensorFlow 花瓣分类与迁移学习(1)
import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...
最新文章
- 浅谈权限设计(来自深空老大)
- HTML5地理定位用法
- oracle xtts 介绍,oracle_rman_xtts_v3
- php 一年中所有的天,PHP获取一年中的每星期的开始日期和结束日期
- Java集合框架一览笔录
- c语言linux打印运行时间(耗时) gettimeofday()、timeval、<sys/time.h>
- go语言基础到提高(12)-函数类型与函数变量
- java 队列的数组_JAVA-循环数组实现简单的队列
- CTO 太水!犯了低级错误,还删除代码隐藏证据!
- MFC模块状态(一)
- 任何时候,写下一个类,一定要有三个函数
- 3dmax贴图材料丢失如何恢复
- 美团点评Java一二面过,三面“凉凉”~复习备战“金三春招季
- HDU 2122 Ice_cream’s world III
- Sevlet相关 摘抄笔记
- #学习方法 linux的教程推荐
- zz]Prisoners’ Dilemma Tit For Tat
- 利用ajax从jsp中返回的字符串时出现回车符号解决办法
- 二维数组与字符数组——英文字母、数字字符及其他字符的个数
- 商业模式与盈利模式的区别
热门文章
- 计算机专业外语的特点,计算机专业英语在邮政信息技术领域的应用特点|计算机专业哪个好...
- Kubernetes详解(十三)——Pod详解
- leetcode 14 最长公共前缀(python)
- VS2017产品密钥
- [Erlang 0041] 详解io:format
- ajax data传值
- 虚拟化--001 view win7优化
- C# 程序启动其他进程程序
- 利用自定义事件实现不同窗体间的通讯 -- C#篇
- java cxf webservice 对象 c#客户端_使用CXF开发WebService客户端