点击上方,选择星标置顶,每天给你送干货

阅读大概需要12分钟

跟随小博主,每天进步一丢丢

来自:实在智能

知乎链接:https://zhuanlan.zhihu.com/p/54934304

碎片化利用时间推荐:

提升自己,尽在点滴。推荐几个业余时间可以看得NLP、CV、python、github相关的高质量公众号

10月中旬,谷歌AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:两个衡量指标上超越人类,并且还在11种不同NLP测试中创出最佳成绩,奠基新的NLP里程碑。后续,谷歌开源了该项目,并且公布了包括中文字向量预训练模型等在大规模数据上预训练过的通用模型。随后,陆续有AI业界同仁尝试在不同任务中应用BERT预训练模型,其中有团队在AI Challenger阅读理解赛道中取得了最好成绩。

开源项目公布之前,我们对BERT论文进行了学习和讨论,并根据论文思想实现了简化版、预训练的TextCNN模型。在预训练的中文BERT模型公布不久,作者写了一个BERT中文预训练模型的简短教程,并将模型成功部署到我们正在推进的“AI赋能法律”相关系统。

最近,我们结合智能法律评估工作实践对pre-train和fine-tune不同模式下BERT模型与经典模型的效果差异进行了对比,发现即使仅训练有限轮次,预训练过的BERT模型也能取得很不错的效果。本文将具体介绍上述实践和探索,同时也将介绍在谷歌TPU上训练定制版BERT模型的过程。

关键词:

BERT; pre-train; fine-tuning; performance; sequence length; TPU; multi-label; on-line prediction

1. 模型效果对比

我们使用司法领域的公开数据,在10万份民事判决书上进行训练和效果对比。输入包括原告诉求请求、事实描述或法院认定的事实以及特定案由下的诉求类型;输出是“0,1”。“1”代表支持原告,“0”代表不支持原告。训练数据包含11个民事大案由,55个诉求类型。所有诉求类型的数据都经过采样,支持与否比例为1比1。虽已预先过滤了一部分缺失证据、诉讼时效存在问题等影响结果预测的数据,但数据集中仍存在不少噪音。字符级别文本平均长度为420。报告的准确率,指验证集上的准确率。

数据集:100k, 55个类别, 二元分类,验证集上准确率,类别平衡

3L代表3层网络;sent-piar代表sentence pairs即句子对任务;seq-512代表sequence length即最大句子长度为512;batch32表示batch size即批次大小为32;epoch10代表训练10轮次。其他简写,表示类似意思。

从训练结果来看,有以下初步结论:

(1). 在同等条件下,使用句子对 (sent-pair)形式和单纯的文档分类(classify)的形式,来做本任务,效果相差不显著;

(2). 根据12层(12L)和3层(3L)的模型对比效果,在本任务中暂不能得到 “更多层的BERT模型效果更好”的结论;

(3).最大序列长度(max sequence length)对模型的效果影响比较大。最好的模型是序列长度为512、使用3层的预训练过的BERT模型。随着最大序列长度增加,效果有所提升,但模型的训练时间也相应增加。当最大序列长度变小后(如截取信息),模型的准确率下降约3-4%。

(4). 批次大小(batch size)对模型的效果影响也比较,如从64下降到16后,模型的准确率下降幅度较大。

(5).fine-tuning模式下略微提高训练轮次(epoch) ,效果可进一步提高2-5%。

(6). 不同模型效果对比:BERT模型>Fasttext模型(仅需训练几分钟,准确率仅比BERT模型低3.5%)>TextCNN模型。可能的原因是我们的智能法律评估任务并不仅关注关键词等局部信息,同时要结合文本中很多信息做综合判断。

需要说明的是,本次效果对比在有限时间内完成,虽然每个模型都有做了一些调优工作,但这些模型如能结合一些其他技术、特征工程等,可能都有比较大的提升空间。

除上述结论外,我们还发现了BERT预训练模型在特定情况下(GPU环境,显卡配置固定)长文本任务中的困境——无法同时增大对最终效果提升有帮助的批次和最大序列长度。

从总体上看,在我们的任务中,使用比较长的序列长度,比较大的批次大小,效果比较好。但由于BERT模型比较大,在11G的显卡环境下,使用12层的网络、512的序列长度,批次大小最大只能设置为4,批次过小,导致训练会不稳定。而使用256的序列长度,批次可以增大为16,但很多信息又被丢失,效果也不佳,从而陷入两难境地。

2. 在自己的数据集上运行BERT的三个步骤

(1).在github上克隆谷歌的BERT项目,下载中文预训练的模型;

(2).分类任务中,在run_classifier.py中添加一个processor,明确如何获取输入和标签。之后将该processor加到main中的processors。将自己的数据集放入到特定目录。每行是一个数据,包括输入和标签,中间可以用特殊符号,如”\t”隔开。数据集包含训练集(如train.tsv)和验证集(如dev.tsv);

(3).运行命令run_classifier.py,带上指定参数,主要包含:训练的任务类型、预训练的模型地址、数据集的位置等。

3. 在自有数据集上做pre-train,然后做fine-tune

如果有任务相关的比较大的数据集,可在BERT中文预训练模型的基础上,再使用自有数据集做进一步的预训练(可称之为domain-pre-train),然后在具体的任务中做fine-tune。

需要做的工作包括:

(1)从领域相关的数据集上抽取出预训练文本。文本的格式如下:每一句话是一行,每一个文档直接用空行隔开。

(2)将预训练文本转换成tfrecord格式的数据。

运行 create_pretraining_data.py

(3)预训练模型pre-train

运行 run_pretraining.py

(4)调优模型(fine-tuning)

运行 run_classifier.py

预训练任务上的效果对比:

由此可看到,使用领域相关的数据做pre-train,在两个预训练任务上,效果提升了3-5%。在我们的实验中,为了加快预训练速度,只选取了领域相关的300万行数据,运行12个小时,1/3个epoch,但预训练任务的准确率还是有明显的提升。

领域相关的任务上的效果对比:

我们使用了5个不同业务类别的数据,文本平均长度超过400,预测结果为0或1。

使用领域相关的数据做pre-train,相对直接使用BERT预训练过的模型,绝对值有4.4%的提升,相对值有5.9%的提升。

随着使用更大的领域相关数据,并且增加训练轮次,相信效果会有进一步的提升。

4. 在TPU上使用BERT模型

下面简单介绍使用TPU的两种方式。任何一种方式下,都需要有谷歌计算引擎的账户,以及谷歌云存储的账户来存储数据和保存训练过的模型。使用TPU的好处之一是可以利用其强大的计算能力,犹如在CPU时代使用GPU来训练,大幅提升训练速度和效率。

Google Colab notebook方式体验TPU

可通过Google Colab notebook 免费使用TPU, 体验在TPU环境下,BERT在两个自带数据集的分类任务: "BERT FineTuning with Cloud TPUs"。但这个Colab主要是demo形式为主,虽能得出训练和结果,但可能仅支持BERT自带任务。

CTPU方式访问TPU(谷歌云专门访问TPU环境的工具)

相比方式一,这是一个真正的生产环境,可以训练模型。序列长度为512,在普通GPU下只能支持batch size为4,而在TPU下可以设置为128。从下图可以看到训练使用了8卡的TPU,每个卡训练的batch size为16.

可通过谷歌的ctpu工具(见ctpu的github项目说明)运行“ctpu up”命令进入tpu环境。

(1).需要谷歌云账号和google cloud storage(gcs)存储服务。

(2).在gcs中新建bucket,放入训练和验证数据、BERT预训练过的模型。之后可通过gs:\\形式,像访问本地文件一样访问存储服务中的数据。如新建了一个名叫data_training的bucket,那么在TPU中它的地址就可以写成

“gs:\\data_training”。

(3).在TPU环境下克隆并下载自己定制的BERT项目(或github上谷歌的BERT项目)。

(4).像在GPU里一样运行命令训练任务,只需加上参数use_tpu=true。训练完后,从谷歌存储位置的bucket中下载模型的checkpoint。

TPU下的训练,Sequence length=512, batch size=128

第一次仅训练了三轮后的准确率为0.739,模型的检查点(checkpoint)自动被保存到预先设定的谷歌存储服务的bucket中。如下图:

5. 使用BERT模型做多类别任务

BERT模型本身只支持二分类或多分类,或是阅读理解任务和命名实体识别任务。如需支持多类别任务(multi-label classfication),则需要定制。具体可基于tensorflow的高级API(tf.estimator)来修改,也可以直接基于session-feed的风格实现。其中,基于session-feed方式主要修改如下:

(1)修改损失函数,使得多个类别任务具有非排他性。

(2)将一些输入、标签等,特别是是否训练(is_training)的参数,变成占位符(placeholder)。这样可使用feed方式提供训练或验证数据;从而也可以根据训练、验证或测试的类型,来控制模型的防止过拟合的参数值(dropout的比例)。

因为做的是分类任务,需要在输入序列的第一位插入特殊符号[CLS],训练完后,模型根据最后一层的[CLS]所在的位置的隐藏状态(hidden states),得到做为整个任务状态的表示(representation)。

(3)根据BERT数据转换的方式,以feed方式在session中将转换后的数据通过占位符输出至模型。

6. 使用BERT模型做在线预测

BERT模型本身在训练或验证中只支持从文件中读取数据,并不支持在线预测。可基于session-feed方式,根据BERT数据转换的规则,将需要预测的数据提供给模型,从而获得预测的概率分布,并完成预测。

7. 总结

BERT发布之前,模型的预训练主要应用于计算机视觉领域。BERT发布后,很多NLP相关工作可在BERT模型预训练的基础上完成,使得自然语言处理更加成熟,支持在不同应用场景取得更好效果。

BERT模型在很大程度上提升了短文本、阅读理解等任务效果,但由于目前业界单个显存大小的限制和瓶颈,在长文本等任务上存在占用较大计算资源和效果打折等问题。

在后续的工作中,我们将继续尝试提升BERT预训练模型在长文本上的效果,如在领域相关的大数据上训练、采用基于词向量的BERT模型、使用滑动窗口方式应对文本过长的问题以及在TPU环境下实施大数据集的大规模训练等。

实在智能算法团队

作者介绍:

徐亮,实在智能算法专家,在深度学习、文本分类、意图识别、问答系统方面有非常深入的研究和创新,github top10最受欢迎的文本分类项目作者。


方便交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

推荐阅读:

【ACL 2019】腾讯AI Lab解读三大前沿方向及20篇入选论文

【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency  Parsing

【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译

【一分钟论文】Semi-supervised Sequence Learning半监督序列学习

【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing

详解Transition-based Dependency parser基于转移的依存句法解析器

经验 | 初入NLP领域的一些小建议

学术 | 如何写一篇合格的NLP论文

干货 | 那些高产的学者都是怎样工作的?

一个简单有效的联合模型

近年来NLP在法律领域的相关研究工作


让更多的人知道你“在看”

【NLP应用之智能司法】最强之谷歌BERT模型在智能司法领域的实践浅谈相关推荐

  1. [NLP自然语言处理]谷歌BERT模型深度解析

    BERT模型代码已经发布,可以在我的github: NLP-BERT--Python3.6-pytorch 中下载,请记得start哦 目录 一.前言 二.如何理解BERT模型 三.BERT模型解析 ...

  2. 干货 | 谷歌BERT模型fine-tune终极实践教程

    作者 | 奇点机智 从11月初开始,Google Research就陆续开源了BERT的各个版本.Google此次开源的BERT是通过TensorFlow高级API-- tf.estimator进行封 ...

  3. 自然语言处理——谷歌BERT模型深度解析

    BERT模型代码已经发布,可以在我的github: NLP-BERT--Python3.6-pytorch 中下载,请记得start哦 目录 一.前言 二.如何理解BERT模型 三.BERT模型解析 ...

  4. 谷歌BERT模型fine-tune终极实践教程

    从11月初开始,Google Research就陆续开源了BERT的各个版本.Google此次开源的BERT是通过TensorFlow高级API-- tf.estimator进行封装(wrapper) ...

  5. 是时候“抛弃”谷歌 BERT 模型了!新型预训练语言模型问世

    作者 | XLNet Team 译者 | 孙薇 责编 | Jane 出品 | AI科技大本营(ID: rgznai100) 近日,XLNet 团队发布了新型预训练语言模型 XLNet,这个新模型在各项 ...

  6. 谷歌AI论文BERT双向编码器表征模型:机器阅读理解NLP基准11种最优(公号回复“谷歌BERT论文”下载彩标PDF论文)

    谷歌AI论文BERT双向编码器表征模型:机器阅读理解NLP基准11种最优(公号回复"谷歌BERT论文"下载彩标PDF论文) 原创: 秦陇纪 数据简化DataSimp 今天 数据简化 ...

  7. Pytorch | BERT模型实现,提供转换脚本【横扫NLP】

    <谷歌终于开源BERT代码:3 亿参数量,机器之心全面解读>,上周推送的这篇文章,全面解读基于TensorFlow实现的BERT代码.现在,PyTorch用户的福利来了:一个名为Huggi ...

  8. 【NLP】BERT 模型与中文文本分类实践

    简介 2018年10月11日,Google发布的论文<Pre-training of Deep Bidirectional Transformers for Language Understan ...

  9. bert 中文 代码 谷歌_从字到词,大词典中文BERT模型的探索之旅

    导语: BERT模型自诞生以来统治了各项NLP任务的榜单,谷歌也针对中文给出了基于字的模型.然而我们知道词是语言最重要的组成部分,因此,一个自然的想法就是做基于词的BERT模型.但是受限于显存,谷歌原 ...

  10. 老杨说运维 | 2023,浅谈智能运维趋势(三)

    文末附有视频回顾 前言: 在回顾(一)中,老杨提到的智能运维发展趋势中,面对国际化形势不确定的情况,信创部分的比例要求正在递增.作为国家经济发展的新动能,信创发展已步入深水区,智能运维信创化已成为必行 ...

最新文章

  1. 前后端分离跨域问题解决方案
  2. day32 java的多线程(4)synchronized
  3. SVM支持向量机,我用到的自学材料
  4. android局部布局替换,android – 子片段替换父片段根布局
  5. idea 安装jrebel6.4.3及破解
  6. Unity3D游戏开发入门引导:Unity3D收费方案和版本、下载地址、安装教程
  7. YYLabel 自动布局 不换行 numberOfLines无效
  8. B02 - 025、使用Hive配置mysql作为元数据库
  9. 2022年茶艺师(初级)考试练习题模拟考试平台操作
  10. mac automator 自动操作 使用初探
  11. php面试题2--php面试题系列
  12. 路由及路由器工作原理深入解析1:概述
  13. win2008 R2 安装VS2003
  14. 蒸妙熏蒸,疏通身体的“堵”
  15. 【genius_platform软件平台开发】第八十二讲:ARM Neon指令集一(ARM NEON Intrinsics, SIMD运算, 优化心得)
  16. JavaScript 动画效果
  17. 极速PDF编辑器有哪些快捷键?
  18. 在HTML网页中打开chm格式的帮助文件
  19. [转]论语新解(上篇)(2)
  20. oppo 手机侧滑快捷菜单_OPPO新专利让人大开眼界:侧滑屏和弹出屏 手机副屏使用的新途径...

热门文章

  1. 窗口的新建移动和改变大小
  2. 30天C#基础巩固------了解委托,string练习
  3. 关于Python中的classmethod
  4. 代码创建数据库_表--SqlServer数据库
  5. 试用EF开发WEB应用程序(15): EF Servlet, or EFSP?
  6. JavaScript中call,apply,bind方法的总结
  7. LightOJ 1410 Consistent Verdicts(找规律)
  8. Linux上层应用--Shell scripts基础规范
  9. 第四章表单与文件-笔记-验证
  10. vb调用存储过程的方法