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

Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类

640?wx_fmt=jpeg


作者 | Thilina Rajapakse
译者 | Raku
编辑 | 夕颜
出品 | AI科技大本营(ID: rgznai100)

【导读】本文将介绍一个简单易操作的Transformers库——Simple Transformers库。它是AI创业公司Hugging Face在Transformers库的基础上构建的。Hugging Face Transformers是供研究与其他需要全面控制操作方式的人员使用的库,简单易操作。

简介
Simple Transformers专为需要简单快速完成某项工作而设计。不必拘泥于源代码,也不用费时费力地去弄清楚各种设置,文本分类应该非常普遍且简单——Simple Transformers就是这么想的,并且专为此实现。
一行代码建立模型,另一行代码训练模型,第三行代码用来预测,老实说,还能比这更简单吗?
所有源代码都可以在Github Repo上找到,如果你有任何问题或疑问,请在这上面自行寻求答案。

GitHub repo:
https://github.com/ThilinaRajapakse/simpletransformers
安装
1、从这里(https://www.anaconda.com/distribution/)安装Anaconda或Miniconda Package Manager。
2、创建一个新的虚拟环境并安装所需的包。
conda create -n transformers python pandas tqdm	
conda activate transformers
如果是cuda:
conda install pytorch cpuonly -c pytorch	
conda install -c anaconda scipy	
conda install -c anaconda scikit-learn	
pip install transformers	
pip install tensorboardx
3、安装simpletransformers。
用法
让我们看看如何对AGNews数据集执行多类分类。
对于用Simple Transformers简单二分类,参考这里。
下载并提取数据
1、从Fast.ai(https://s3.amazonaws.com/fast-ai-nlp/ag_news_csv.tgz)下载数据集。
2、提取train.csv和test.csv并将它们放在目录data/ 中。
为训练准备数据
Simple Transformers要求数据必须包含在至少两列的Pandas DataFrames中。你只需为列的文本和标签命名,SimpleTransformers就会处理数据。或者你也可以遵循以下约定:
•  第一列包含文本,类型为str。
•  第二列包含标签,类型为int。
对于多类分类,标签应该是从0开始的整数。如果数据具有其他标签,则可以使用python dict保留从原始标签到整数标签的映射。
模型
from simpletransformers.model import TransformerModel	# Create a TransformerModel	model = TransformerModel('roberta', 'roberta-base', num_labels=4)
这将创建一个TransformerModel,用于训练,评估和预测。第一个参数是model_type,第二个参数是model_name,第三个参数是数据中的标签数:
•  model_type可以是['bert','xlnet','xlm','roberta','distilbert']之一。
•  有关可用于model_name的预训练模型的完整列表,请参阅“当前预训练模型”(https://github.com/ThilinaRajapakse/simpletransformers#current-pretrained-models)。
要加载以前保存的模型而不是默认模型的模型,可以将model_name更改为包含已保存模型的目录的路径。
TransformerModel具有dict参数,其中包含许多属性,这些属性提供对超参数的控制。有关每个属性的详细说明,请参阅repo。默认值如下所示:
self.args = {	'output_dir': 'outputs/',	'cache_dir': 'cache_dir',	'fp16': True,	'fp16_opt_level': 'O1',	'max_seq_length': 128,	'train_batch_size': 8,	'gradient_accumulation_steps': 1,	'eval_batch_size': 8,	'num_train_epochs': 1,	'weight_decay': 0,	'learning_rate': 4e-5,	'adam_epsilon': 1e-8,	'warmup_ratio': 0.06,	'warmup_steps': 0,	'max_grad_norm': 1.0,	'logging_steps': 50,	'save_steps': 2000,	'overwrite_output_dir': False,	'reprocess_input_data': False,	'process_count': cpu_count() - 2 if cpu_count() > 2 else 1,	}
在创建TransformerModel或调用其train_model方法时,只要简单地传递包含要更新的键值对的字典,就可以修改这些属性中的任何一个。下面给出一个例子:
# Create a TransformerModel with modified attributes	
model = TransformerModel('roberta', 'roberta-base', num_labels=4, 	
args={'learning_rate':1e-5, 'num_train_epochs': 2, 	
'reprocess_input_data': True, 'overwrite_output_dir': True})
训练
# Train the model	
model.train_model(train_df)
这就是训练模型所需要做的全部。你还可以通过将包含相关属性的字典传递给train_model方法来更改超参数。请注意,即使完成训练,这些修改也将保留。
train_model方法将在第n个步骤(其中n为self.args ['save_steps'])的第n个步骤创建模型的检查点(保存)。训练完成后,最终模型将保存到self.args ['output_dir']。
评估
要评估模型,只需调用eval_model。此方法具有三个返回值:
•  result:dict形式的评估结果。默认情况下,仅对多类分类计算马修斯相关系数(MCC)。
•  model_outputs:评估数据集中每个项目的模型输出list。用softmax函数来计算预测值,输出   每个类别的概率而不是单个预测。
•  wrong_predictions:每个错误预测的InputFeature list。可以从InputFeature.text_a属性获取文本。(可以在存储库 https://github.com/ThilinaRajapakse/simpletransformers 的utils.py文件中找到InputFeature类)
你还可以包括在评估中要使用的其他指标。只需将指标函数作为关键字参数传递给eval_model方法。指标功能应包含两个参数,第一个是真实标签,第二个是预测,这遵循sklearn标准。
对于任何需要附加参数的度量标准函数(在sklearn中为f1_score),你可以在添加了附加参数的情况下将其包装在自己的函数中,然后将函数传递给eval_model。
from sklearn.metrics import f1_score, accuracy_score	def f1_multiclass(labels, preds):	return f1_score(labels, preds, average='micro')	result, model_outputs, wrong_predictions = model.eval_model(eval_df, f1=f1_multiclass, acc=accuracy_score
作为参考,我使用这些超参数获得的结果如下:
考虑到我实际上并没有进行任何超参数调整,效果还不错。感谢RoBERTa!
预测/测试
在实际应用中,我们常常不知道什么是真正的标签。要对任意示例执行预测,可以使用predict方法。此方法与eval_model方法非常相似,不同之处在于,该方法采用简单的文本列表并返回预测列表和模型输出列表。
结论
在许多实际应用中,多分类是常见的NLP任务,Simple Transformers是将Transformers的功能应用于现实世界任务的一种简单方法,你无需获得博士学位才能使用它。
关于项目
我计划在不久的将来将“问答”添加到Simple Transformers 库中。敬请关注!
Simple Transformers 库:https://github.com/ThilinaRajapakse/simpletransformers

原文链接:

https://medium.com/swlh/simple-transformers-multi-class-text-classification-with-bert-roberta-xlnet-xlm-and-8b585000ce3a

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


精彩推荐



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

640?wx_fmt=jpeg

推荐阅读

640?wx_fmt=png

你点的每个“在看”,我都认真当成了AI

相关文章:

StarUML中时序图添加小人

转载于 http://blog.csdn.net/longyuhome/article/details/9011629 在看时序图的例子的时候,发现有些的时序图上有小人的图标,可是一些UML工具却没有找到小人的图标,这让我很闹心,一直没解决,今天终于将该问题给解…

Swift学习: 从Objective-C到Swift

作者:方秋枋(GitHub) 这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。 结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感…

C/C++中static关键字用法汇总

1. 函数内static局部变量:变量在程序初始化时被分配,直到程序退出前才被释放,也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期。多次调用,仅需一次初始化。2. cpp内的static全局变量&…

CornerNet: 成对关键点物体检测 | CSDN博文精选

作者 | 贾小树来源 | CSDN博客文章目录1、论文总述2、使用锚定框的两个缺点3、角点检测比边界框中心或 proposals效果好的两个原因4、corner pooling5、用于Grouping Corners的 embedding vector的工作原理6、正负样本的分配方式(改进的focal loss)7、角…

PHP创建日志记录(已封装)

1 <?php2 3 class Logs{4 private $_filepath; //文件路径5 private $_filename; //文件名6 private $_filehandle; //文件引擎7 8 9 public function Logs($dir null,$filename null){ 10 11 $this->_filepath empty($dir) ? : $d…

如何用Swift实现一个好玩的弹性动画

本文由CocoaChina译者浅夏旧时光翻译自Raywenderlich 原文&#xff1a;How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一定会有自定义元素、自定义UI以及自定义动画等等很多自定义的东西。 假如你想让你的应用脱颖而出&#xff0c;你必须花费一些时间为…

深入探讨Python的import机制:实现远程导入模块 | CSDN博文精选

来源 | Python编程时光&#xff08;ID:Python-Time&#xff09;所谓的模块导入&#xff0c;是指在一个模块中使用另一个模块的代码的操作&#xff0c;它有利于代码的复用。也许你看到这个标题&#xff0c;会说我怎么会发这么基础的文章&#xff1f;与此相反。恰恰我觉得这篇文章…

吴恩达老师深度学习视频课笔记:人脸识别

什么是人脸识别&#xff1a;人脸验证和人脸识别的区别&#xff0c;如下图&#xff1a;One-shot learning&#xff1a;人脸识别所面临的挑战就是需要解决一次学习(one-shot learning)问题。这意味着在绝大多数人脸识别应用中你需要通过单单一张图像或者单单一个人脸图像就能去识…

用小白鼠喝毒药

题设&#xff1a;有N瓶水&#xff0c;其中有一瓶水有剧毒&#xff0c;如果小白鼠喝了会在24小时的时候死亡。 问&#xff1a;用多少只小白鼠能够检测出哪瓶水有剧毒&#xff1f; 要求&#xff1a;用的小白鼠数量少并且用时要短&#xff0c;并给出合理的过程与结论。 我的解题思…

怎样在swift中创建CocoaPods

本文由yake_099&#xff08;博客&#xff09;翻译自raywenderlich&#xff0c;作者&#xff1a;Joshua Greene 原文&#xff1a;How to Create CocoaPods with Swift 你可能对一些比较著名的开源的CocoaPods框架比较熟悉&#xff0c;比如Alamofire、MBProgressHUD。但是有时你…

吴恩达老师深度学习视频课笔记:神经风格迁移(neural style transfer)

什么是神经风格迁移(neural style transfer)&#xff1a;如下图&#xff0c;Content为原始拍摄的图像&#xff0c;Style为一种风格图像。如果用Style来重新创造Content照片&#xff0c;神经风格迁移可以帮你生成Generated图像。深度卷积网络在学什么&#xff1a;如下图&#xf…

“Jupyter的杀手”:Netflix发布新开发工具Polynote

作者 | Michael Li 译者 | Rosie 编辑 | Jane 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】10 月 29 日&#xff0c;Netflix 公开了他们内部开发的 Polynote。现如今&#xff0c;大型高科技公司公开其内部的工具或服务&#xff0c;然后受到业界…

System Center 2012 r2优点

System Center 2012System Center2012 是一个全面的管理平台&#xff0c;可帮助你轻松、高效地管理数据中心、客户端设备和混合云 IT 环境。为您提供了针对私有云、托管云和公有云基础结构和应用程序服务的通用管理工具集。可按照您的需求&#xff0c;为生产基础架构、可预期应…

Swift 闭包表达式

闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。 闭包的形式主要有三种&#xff1a; 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封…

GNU AWK中BEGIN/END使用举例

以下是使用gnu awk将test.cpp文件拆分成两个文件a.cpp和b.cpp&#xff0c;其中b.cpp仅存放test.cpp中的数据&#xff0c;其它内容存放在a.cpp文件中。test.cpp内容如下&#xff1a; #include <stdio.h> #include <iostream> #include <string>int main() {//…

目标检测的渐进域自适应,优于最新SOTA方法

作者 | Han-Kai Hsu、Chun-Han Yao、Yi-Hsuan Tsai、Wei-Chih Hung、Hung-Yu Tseng、Maneesh Singh、Ming-Hsuan Yang译者 | 刘畅编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】目标检测的最新深度学习方法依赖于大量的边界框标注信息…

讨论下IDS的绕过

自从知道dedecms自带了80sec的内置Mysqlids后&#xff0c;一直以来也没有想到绕过的办法。或者是自己mysql的根底太差了吧。于是分析dedecms源码时&#xff0c;只找模板执行&#xff0c;本地包含&#xff0c;上传等&#xff0c;完全没有想到注入存在的可能性了。 可以看看某牛的…

GCC编译选项参数介绍

gcc和g分别是gnu的c和c编译器&#xff0c;下面是整理的常用编译选项参数&#xff1a; #(1). -x: 设定文件所使用的语言&#xff0c;使文件后缀名无效&#xff0c;如下&#xff0c;执行完后生成test.o gcc -c -x c test.jpg #(2). -c: 只编译生成目标文件即*.o,只编译不链接生成…

程序员自学到底有没有用?网友们吵翻了...

最近就有个程序员吐槽说&#xff0c;自己大学没怎么听老师讲课&#xff0c;老师讲的知识要么太旧&#xff0c;要么老师不会讲&#xff0c;自己大部分时间是在网上看视频学的。引发了以下激烈的讨论。很多网友觉得&#xff0c;学校老师的代码能力不行&#xff0c;现在技术更新又…

更新 FrameWork

这里把想要改变的东西封装到FrameWork以便实现热更新&#xff0c;提一下关于BundiD 一定要一致&#xff0c;在打包的时候一定在Edit scheme —— >Run 选择Release如图&#xff1a; 因为你要跑在真机上&#xff0c;所以这个要选择Release 另外将包含你想要放出的方法类添加…

把Illustrator矢量图转化为代码:Drawscript

2019独角兽企业重金招聘Python工程师标准>>> DrawScript是一款Illustrator插件&#xff0c;可以将Illustrator的矢量图片转换成代码&#xff0c;目前免费&#xff0c;支持转换的语言有 OBJ-CCJAVASCRIPTCREATEJS/EASELJSPROCESSINGACTIONSCRIPT 3JSONRAW BEZIER PO…

必读:ICLR 2020 的50篇推荐阅读论文

来源 | 香侬科技本文整理了ICLR2020的相关论文&#xff0c;此次分享的是从Openreview中选取的部分论文&#xff0c;共50篇&#xff0c;其中大部分为NLP相关。文中涉及的相关论文推荐指数与推荐理由仅为个人观点&#xff0c;利益无关&#xff0c;亦不代表香侬科技立场。希望大家…

14个Xcode中常用的快捷键操作

在Xcode 6中有许多快捷键的设定可以使得你的编程工作更为高效&#xff0c;对于在代码文件中快速导航、定位Bug以及新增应用特性都是极有效的。 当然&#xff0c;你戳进这篇文章的目的也在于想要快速的对代码文件进行操作&#xff0c;或者是让Xcode的各面板更为适应你小本子的屏…

C++中标准模板库std::pair的实现

以下用C实现了标准模板库中的std::pair实现&#xff0c;参考了 cplusplus 和 vs2013中的utility文件。关于std::pair的介绍和用法可以参考&#xff1a; https://blog.csdn.net/fengbingchun/article/details/52205149 实现代码pair.hpp如下&#xff1a; #ifndef FBC_STL_PAIR_H…

【人在职场】能力与价值

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://yunli.blog.51cto.com/831344/1547051 最近给团队&#xff08;指#UC浏览器电脑版#开发团队&#xff09;分享了我的《基层技术管理原则》。…

Windows与Linux之间互传文件的方法

以下方法均是以Windows为操作机&#xff1a;1. 通过WinSCP:WinSCP是一款开源的SFTP客户端&#xff0c;运行于Windows系统下&#xff0c;遵照GPL发布。WinSCP除了SFTP&#xff0c;还支持SSH、SCP(SecureCopy Protocol)。WinSCP的开发始于2000年4月&#xff0c;由布拉格经济大学所…

一文读懂简化的图卷积网络GCN(SGC)| ICML 2019

作者 | yyl424525来源 | CSDN博客文章目录1 相关介绍1.1 Simple Graph Convolution (SGC)提出的背景1.2 SGC效果2 Simple Graph Convolution 简化的图卷积2.1 符号定义2.2 图卷积网络GCNGCN vs MLPFeature propagation 特征传播Feature transformation and nonlinear transitio…

iOS UITableViewCell重用问题

TableView的重用机制&#xff0c;为了做到显示和数据分离&#xff0c;iOS tableView的实现并且不是为每个数据项创建一个tableCell。而是只创建屏幕可显示最大个数的cell&#xff0c;然后重复使用这些cell&#xff0c;对cell做单独的显示配置&#xff0c;来达到既不影响显示效果…

NLP常用工具

为什么80%的码农都做不了架构师&#xff1f;>>> NLP常用工具 各种工具包的有效利用可以使研究者事半功倍。 以下是NLP版版友们提供整理的NLP研究工具包。 同时欢迎大家提供更多更好用的工具包&#xff0c;造福国内的NLP研究。 *NLP Toolbox CLT http://compl…

Swift快速入门之getter 和 setter

属性可以用getter和setter方法的形式提供。 <code class"hljs lasso has-numbering" style"display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: Source Code Pro, monospace;font-size:u…