当前位置: 首页 > 编程日记 > 正文

从词袋到Transfomer,NLP十年突破史

640?wx_fmt=jpeg


作者 | Zelros AI
译者 | 夕颜
出品 | AI科技大本营(ID:rgznai100)
【导读】通过 Kaggle 竞赛视角,观察 NLP 十年发展简史。
640?wx_fmt=png根据上下文(这里指句子的最后一个词),“它”可以指“动物”或“街道”。图源 | Google Transfomer 介绍。
自 2010 年创立以来,著名的数据科学竞赛平台 Kaggle 一直是机器学习趋势演变的绝佳观察场。这里见证了机器学习史上的历代突破,吸引了成千上万从业者在这里交流讨论。
这个在线平台发布了各种类型的竞赛挑战(计算机视觉、语音等),其中自然语言处理(NLP)如今引起了特别的关注。确实,近几个月以来,该领域正在见证数项令人兴奋的创新。最新的一个技术是 Transfomer 和预训练语言模型的问世。
今天,从 Kaggle 平台的视角,我们来简单回顾一下 NLP 的发展历史。


2016年之前:词袋和TF-IDF“一统天下”

在 2016 年左右往前,解决(并赢得胜利!)Kaggle NLP 挑战的标准方法是使用词袋(基本上就是计算一个单词在文档中出现的次数)来创建功能,以供机器学习分类器使用,例如典型的Naive Bayes。TF-IDF 略有改进。
例如,在 StumbleUpon Evergreen 分类挑战赛中使用了这种方法(顺便说一句,由 FrançoisChollet 于 2013年获胜,就是那个两年之后创建 Keras 的人)。


2016–2019年:词嵌入+ Keras和Tensorflow的兴起

2015年,出现了用于密集单词表示的库,例如 Gensim(包括 Word2vec 和 GloVe)。随后出现了其他预训练的嵌入,例如 Facebook FastText 和 Paragram。
同时,被广泛采用、简单易用的神经网络框架的 Keras 和 Tensorflow 的第一个版本流行起来。有了它们,就可以开始按单词顺序捕获含义,而不再仅按词袋捕获。
为了运行深度神经网络,要解决的最后一个大障碍是:获得很高的处理能力。这个可以通过使用低成本 GPU 解决。2017 年 3 月 Kaggle 被 Google 收购后更加开放,Kaggle 在其平台上(通过协作 Notebooks 内核)免费开放。
从那时起,万事俱备,单词嵌入和神经网络(RNN、LSTM、GRU 等…以及诸如注意力等改进)成为解决 Kaggle 上 NLP 任务的标准方法。这么长的TF-IDF…

640?wx_fmt=png用递归神经网络编码单词序列


2018–2019年:PyTorch的突破

近几个月以来,一种新的神经网络框架在数据科学界越来越受关注:PyTorch。
我们不讨论 Tensorflow 和 PyTorch 哪个更优,但是可以确定的是,在 Kaggle上,PyTorch 参赛者社区蓬勃发展起来。平台上会定期发布 PyTorch notebook 和教程。
640?wx_fmt=pngTensorflow(蓝色)与PyTorch(红色)搜索趋势(来源 | Google Trend)


2019:Transfomer和预训练语言模型诞生

如前几节所述,到目前为止,解决 NLP 任务的标准方法是使用单词嵌入(在大量未标记的数据上进行预训练),使用它们来初始化神经网络的第一层,并在其上训练其他层特定任务的数据(可能是文本分类、问题解答、自然语言推断等)。
仔细想一下,问题是这种方法不是最佳的。确实,对于新任务,这种方法都必须几乎从零开始重新学习所有的东西。用词嵌入初始化的模型始终需要从头开始学习如何从词序列中得出含义,尽管这是语言理解的核心。
2018年,NLP 的关键范式转变——Transfomer 诞生了:从仅初始化模型的第一层到使用分层表示对整个模型进行预训练。这开辟了全新的工作方式:将信息从预先训练的语言模型转移到下游任务(也称为迁移学习)。
640?wx_fmt=pngTransfomer 模型架构,摘自论文 Attention is All You Need
在实践中,如今,利用预训练语言模型的最佳方法是使用 Hugging Face(由现在居住在美国的法国企业家和 Station F Microsoft AI Factory 的校友创建)的 Transfomer 库。现在它与PyTorch 和 TensorFlow 兼容。如果你想完成诸如文本分类之类的简单任务,可以试试 simple-transformers。
另外,如果你专注非英语文本,那么另一个值得关注的库是 fast.ai,该库旨在结合针对不同语言的预训练模型,由 Kaggle 前总裁兼首席科学家 Jeremy Howard 创建。


下一步是什么?

每个人现在都可以使用最新一代预训练语言模型的现成库。这使得我们可以快速实验,用上最先进的 NLP 技术。
关注未来Kaggle NLP 比赛中会如何使用这些技术将很有趣,比如最近的 TensorFlow 2.0 问题解答挑战一样,这个挑战可以识别有关 Wikipedia 页面内容的真实用户问题的答案。敬请关注!
参考链接:
https://medium.com/@Zelros/from-bag-of-words-to-transformers-10-years-of-practical-natural-language-processing-8ccc238f679a

(*本文为AI科技大本营编译文章,转载请微信联系 1092722531


精彩推荐



2019 中国大数据技术大会(BDTC)再度来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。6.6 折票限时特惠(立减1400元),学生票仅 599 元!

640?wx_fmt=png


推荐阅读

相关文章:

《千只鹤》--[日]川端康成

《千只鹤》,作者是川端康成 故事梗概: 三谷菊治的父亲是个著名的茶道师匠,他生前与一位叫栗本近子的女人有染,后来又 钟情于太田夫人,而且由于后者而疏远了前者,但前者仍出入于三谷家。在三谷先生去 世四年…

所有接口添加plist文件的写法 swift

第一步 建立plist文件 interface JMTConfigUtils : NSObject /** * 获取配置文件中友盟key * * return NSString */ - (NSString *)umengKey; /** * 微信AppId * * return NSString */ - (NSString *)wxAppId; /** * 微信appSecret * * return NSString */ - (NSString…

提高C++性能的编程技术笔记:标准模板库+测试代码

标准模板库(Standard Template Library, STL)是容器和通用算法的强效组合。 渐近复杂度:算法的渐近复杂度是对算法性能的近似估计。它是算法集到特定性能标准集的映射。如果需要对包含N个整数的向量的所有元素求和,那么每个整数必须且仅需检查一次&…

「创式纪」人工智能应用创新大赛启动,首次结合商业计划和机器学习

谈到人工智能,技术和应用场景成为了大家广泛关注的话题。技术的演进,是推动人工智能发展的核心,而广泛的场景应用,则是人工智能真正价值所在。现阶段,精准营销、信贷风控、人脸比对等为人熟知的AI,已经经过…

linux chattr命令

chattr 设置linux文件的属性 (参照man手册进行翻译,常用的属性都翻译过来,个人觉得很少用到的属性就没有翻译) 用法:chattr [ -RVf ] -[acdeijstuADST] files选项:-R 对目录进行递归处理-V 显示详细的输出-F 忽略…

swift 中高德地图随时读取坐标地点的写法

自己写的方法 不比比 自己能看懂就行 只用作自己学习swift的总结 import UIKit typealias block (String,String) ->() class MoveCarViewController: UIViewController,MAMapViewDelegate,AMapLocationManagerDelegate,AMapSearchDelegate,UITextFieldDelegate,UIAler…

万字干货 | Python后台开发的高并发场景优化解决方案

嘉宾 | 黄思涵 来源 | AI科技大本营在线公开课互联网发展到今天,规模变得越来越大,也对所有的后端服务提出了更高的要求。在平时的工作中,我们或多或少都遇到过服务器压力过大问题。针对该问题,本次公开课邀请到了金山办公AI平台研…

提高C++性能的编程技术笔记:引用计数+测试代码

引用计数(reference counting):基本思想是将销毁对象的职责从客户端代码转移到对象本身。对象跟踪记录自身当前被引用的数目,在引用计数达到零时自行销毁。换句话说,对象不再被使用时自行销毁。 引用计数和执行速度之间的关系是与上下文紧密…

如何提升 CSS 选择器的性能?

CSS选择器对性能的影响源于浏览器匹配选择器和文档元素时所消耗的时间,所以优化选择器的原则是应尽量避免使用消耗更多匹配时间的选择器。而在这之前我们需要了解CSS选择器匹配的机制, 如子选择器规则: #header > a {font-weight:blod;} 我…

百度AI攻坚战:PaddlePaddle中国突围

作者 | 阿司匹林出品 | AI科技大本营(ID:rgznai100)2013年,百度开始研发深度学习框架PaddlePaddle,搜索、凤巢CTR预估上线DNN模型。2016年,在百度世界大会上,百度宣布PaddlePaddle开源&#xff…

提高C++性能的编程技术笔记:编码优化+测试代码

缓存:在现代处理器中,缓存经常与处理器中的数据缓存和指令缓存联系在一起。缓存主要用来存储使用频繁而且代价高昂的计算结果,这样就可以避免对这些结果的重复计算。如,循环内对常量表达式求值是一种常见的低性能问题。 预先计算…

Swift 中使用 SQLite——打开数据库

关于Swift中使用SQLite,接下来可能会分别从打开、增、删、改、查,几个方面来介绍SQLite的具体使用,这一篇重点介绍一下如何打开。 定义全局数据库访问句柄 /// 全局数据库访问句柄 private var db: COpaquePointer nil实现打开数据库函数 …

MVC中获取模型属性的Range和StringLength验证特性设置

MVC中的客户端及服务端模型验证信息都以ModelMetadata类型作为承载,在获得属性的ModelMetadata之后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),我们可以轻松得到一些我们在模型中定义的特性,比如显示名称、是否…

以安装PyTorch为例说明Anaconda在Windows/Linux上的使用

在Windows10上配置完MXNet 1.3.0后,再配置PyTorch 1.0时,发现两者需要依赖的NumPy版本不一致,之前是通过pip安装NumPy,根据pip的版本不同,会安装不同版本的NumPy,使用起来很不方便,而且MXNet和P…

常用 SQL介绍

创建表 /*创建数据表CREATE TABLE 表名 (字段名 类型(INTEGER, REAL, TEXT, BLOB)NOT NULL 不允许为空PRIMARY KEY 主键AUTOINCREMENT 自增长,字段名2 类型,...)注意:在开发中,如果是从 Navicat 粘贴的 SQL,需要自己添加一个指令IF NO…

AttoNets,一种新型的更快、更高效边缘计算神经网络

作者 | Alexander Wong, Zhong Qiu Lin, and Brendan Chwyl 译者 | Rachel 出品 | AI科技大本营(ID:rgznai100)尽管机器学习已经在很多复杂的任务中取得了进展,但现有模型仍然面临许多边缘计算实践的困难,这些边缘计算场景包括移…

Appro DM8127 IPNC 挂载NFS遇到的问题及解决

对于Appro DM8127 IPNC,默认的启动方式是NAND is used for booting kernel and NAND is used as root filesystem 为了调试应用程序方便,通常使用挂载NFS作为 root filesystem 但是如果直接采用ti文档中所给的方法修改文件系统挂载方式(将启动…

提高C++性能的编程技术笔记:设计优化/可扩展性/系统体系结构相关+测试代码

1. 设计优化 我们可以粗略地将性能优化分为两种类型:编码优化和设计优化。编码优化定义为不需要完整理解要解决的问题或者应用程序的执行流程就能实施的优化。通过定义看出,编码优化用于局部代码,同时该过程不牵涉周围的代码。除了这些容易实…

ICLR 2020被爆半数审稿人无相关领域经验,同行评审制度在垮塌?

作者 | 若名出品 | AI科技大本营(ID:rgznai100)根据维基百科,同行评议(peer review),是指由一个或多个具有与作品生产者具有相似能力的人员(同行)对作品进行的评估活动。同行评审方法用于维持质…

Swift 中使用 SQLite——批量更新(事务处理)

本文是Swift 中使用 SQLite系列的收官之作,介绍一下在数据库中的批量更新。 事务 在准备做大规模数据操作前,首先开启一个事务,保存操作前的数据库的状态开始数据操作如果数据操作成功,提交事务,让数据库更新到数据操…

网络管理常用命令之二 - Ipconfig 命令详解(图文)

2、Ipconfig 命令...不带参数.../all 参数.../release 和 /realease6 参数.../Renew 和 /Renew6 参数.../flushdns 参数.../displaydns 参数2、Ipconfig 命令 ipconfig命令也是使用率非常高的一个命令,可用于显示系统的TCP/IP网络配置值,并刷新动态主…

Swift 中使用 SQLite——查询数据

本文主要介绍如何查询 SQLite 结果集,以及封装 SQLite 的操作方法。 准备测试代码 /// 从数据库中加载 person 数组 class func persons() -> [Person]? {// 1. 准备 SQLlet sql "SELECT id, name, age, height FROM T_Person;"// 2. 访问数据库// …

提高C++性能的编程技术笔记:总结

《提高C性能的编程技术》这本书是2011年出版的,书中有些内容的介绍可能已经过时,已不再适用于现在的C编程中,但大部分内容还是很有参考意义的。 这里是基于之前所有笔记的简单总结,笔记列表如下: 跟踪实例&#xff1…

13岁小孩都跟我抢Python了,完了!

以下来自一位程序员母亲和工作人员的对话。程序员妈妈:您好,可以帮我推荐一本适合我家小孩看的编程书籍吗?兔子:可以的呀,《Scratch从入门到精通》,这本书适合小孩学习,您可以先看一下哦~程序员…

Windows Mobile 6.0 SDK和中文模拟器下载

【转】 Windows Mobile 6.0 SDK和中文模拟器下载 Windows Mobile 6.5 模拟器2010年12月06日 星期一 07:48转载自 zhangyanle86终于编辑 zhangyanle86Windows Mobile 6.0 SDK和中文模拟器下载 SDK 6.0下载页面:http://www.microsoft.com/downloads/details.aspx?fam…

wxPython:Python首选的GUI库 | CSDN博文精选

作者 | 天元浪子来源 | CSDN博客文章目录概述窗口程序的基本框架事件和事件驱动菜单栏/工具栏/状态栏动态布局AUI布局DC绘图定时器和线程后记概述跨平台的GUI工具库,较为有名的当属GTK、Qt 和 wxWidgets 了。GTK是C实现的,由于C语言本身不支持OOP&#x…

Swift 中使用 SQLite——修改和删除数据

本文主要介绍在SQLite中修改数据、删除数据&#xff1a; 更新记录 /// 将当前对象信息更新到数据库 /// /// - returns: 是否成功 func updatePerson() -> Bool {guard let name name else {print("姓名不能为空")return false}if id < 0 {print("id 不…

用python3实现指定目录下文件sha256及文件大小统计

有时会统计某个目录下有哪些文件&#xff0c;每个文件的sha256及文件大小等相关信息&#xff0c;这里用python3写了个脚本用来实现此功能&#xff0c;此脚本可跨平台&#xff0c;同时支持windows和linux&#xff0c;脚本(get_dir_file_info.py)内容如下&#xff1a; import os…

Swift 中使用 SQLite——新增数据

本文重点介绍两个方面&#xff0c;1、新增数据&#xff0c;2、获取自动增长 ID。 建立 Person.swift 数据模型 /// 个人模型 class Person: NSObject {// MARK: - 模型属性/// 代号var id: Int64 0/// 姓名var name: String?/// 年龄var age 0/// 身高var height: Double …

投稿2877篇,EMNLP 2019公布4篇最佳论文

整理 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;自然语言处理领域的顶级会议之一EMNLP 2019公布了年度最佳论文。EMNLP是由国际语言学会&#xff08;ACL&#xff09;下属的SIGDAT小组主办的自然语言处理领域的顶级国际会议&#xff0c;是自然语言算法…