bert 中文 代码 谷歌_如何用最强模型BERT做NLP迁移学习?

47495a7384dee14d5b1cd0a5860f322c.png

作者 | 台湾大学网红教授李宏毅的三名爱徒

来源 | 井森堡,不定期更新机器学习技术文并附上质量佳且可读性高的代码。

编辑 | Jane

谷歌此前发布的NLP模型BERT,在知乎、Reddit上都引起了轰动。其模型效果极好,BERT论文的作者在论文里做的几个实验数据集都被轰平了。要做那几个数据集的人可以洗洗睡啦,直接被明明白白地安排了一波。

98bbf69a0edc5702dffe44cfb326895a.png

坊间流传 BERT 之于自然语言处理有如 ResNet 之于计算机视觉。谷歌还是谷歌呀,厉害!以后做 NLP 的实验就简单多了,可以先用 BERT 抽特征,再接几层客制化的神经网络后续实验,可以把 BERT 看作是类似于 word to vector 那样的工具。有人在知乎上整理了跑一次BERT的成本:

https://www.zhihu.com/question/298203515/answer/509470502

For TPU pods:4 TPUs * ~$2/h (preemptible) * 24 h/day * 4 days = $768 (base model)16 TPUs = ~$3k (large model)
For TPU:16 tpus * $8/hr * 24 h/day * 4 days = 12k64 tpus * $8/hr * 24 h/day * 4 days = 50k
For GPU:"BERT-Large is 24-layer, 1024-hidden and was trained for 40 epochs over a 3.3 billion word corpus. So maybe 1 year to train on 8 P100s? "

这还只是跑一次的时间,试想一下谷歌在调参、试不同神经网络结构时该需要多少时间与运算资源,太可怕了。

不禁让人感慨,深度学习已经变为大公司之间的军备竞赛,也只有谷歌这样的大公司才能做出这么伟大的模型,那是不是意味着我们普通人就没机会了呢?喜大普奔的是谷歌已经把训练好的模型公布出来,和大家分享他们的成果。我们可以运用大公司提前训练好的模型做迁移学习,用于客制化的应用。

本文想通过一个实际案例来检验一下提前训练好的 BERT 模型的威力,在已经训练好的 BERT 模型上再连几层神经网络做迁移学习。我们用的数据来源是 Kaggle 上的一个豆瓣影评分析数据集,目标是训练出一个模型,输入给模型一条影评的文字,模型能正确输出这条影评所对应的评分。

数据集

这个豆瓣电影短评数据集里面一共有28部电影,总共200多万笔影评,每笔影评有对应的文字以及用户给电影的评分(最高5分,最低1分)。下面是一些简单的范例:

https://www.kaggle.com/utmhikari/doubanmovieshortcomments/

bd5f9479d1c57f52b3c7dae11882fc45.png

前处理的时候,我们先把每条影评的标点符号去掉,然后用 Jieba 断词,Jieba 是一个很方便的中文断词函数库,安装也很方面直接用 PIP 安装就好。

最后把数据切为 training,testing 和 validation set 三部分,下表是三个 set 的一些简单统计量:

91f8f138a521edac4450754e6e204493.png

模型结构

第一步,我们先用“Jieba”将影评断词,再把每个词用一个 one-hot vector 表示。

第二步,再把每条影评对应的 one-hot vector 丢到如下图的 BERT 模型抽出特征。

9fd748d643b2fc4650bf3a5f40399e6e.png

第三步,再把抽出的特征丢进我们客制化设计的神经网络,最后输出网络的预测。网络的预测是 1-5 分,我们分别做了回归和分类两个实验。分类的输出结果是 1-5 分 5 类当中的某一类,回归输出结果是介于 1-5 之间的一个数值。我们会用到如下图所示的 Bengio 在 2017 年提出的自注意力模型做一些语义分析。

7615399f71fc5b3e010bcf8efcb48335.png

第四步,定义损失函数,固定 BERT 的参数不变,再用梯度下降法更新我们客制化设计的网络。

PS:由于 BERT 和 self-attention 模型结构较为复杂,而且本文的目的是探讨如何用 BERT 做迁移学习,所以我们不会赘述模型结构,我们会在文末附上论文链接,感兴趣的小伙伴可以去看看。

实验结果

BERT 分类

  • 分类准确率:61%

  • 混淆矩阵:

265b6671704f7be6786559f4b2a1a2ac.png

以第 1 行第二列的 0.13 为例:意思是真实标签是第一类,被分类为第二类的占总的第一类的个数的比例是 0.13。可以看到 1 分,5 分的大部分例子都能分类正确。大部分分类不正确的情况是被分到相邻的等级了,例如真实标签是 2 分的被分类为 3 分或是真实标签是 3 分的被分类为 2 分。这种情况是合理的,针对某一条特定的影评,就算是人去预测,也很难斩钉截铁地判定为是 2 分还是 3 分,所以也难怪机器分不出来。

我们对评价标准做了一点修改,将误判为相邻评分的例子判别为正确,结果如下:

  • 分类准确率:94.6%

  • 混淆矩阵:

eec19039c75fe69a147587599f66ecc9.png

BERT 回归

同样的架构,我们修改了一下最后一层的输出,让模型预测相应影评的评分,输出一个实数值,重新训练了模型。如果是分类的实验,1 分与 5 分这两个类别用数值表示的话都是一个 one-hot 的类别,体现在损失函数里没有差别,模型不会对二者区别对待。如果是回归的实验,模型的输出是一个实数值,实数值具有连续性,1 分和 5 分二者分数的高低能在实数上得到体现。

下面来看看实验结果:

  • 分类准确率:95.3%

  • 混淆矩阵:

ee344b36b99824318edb135f0ece538f.png

  • 真实评分的分布:

55648db28b2d371e11ee3eceb0f04cc7.png

  • 模型预测评分的分布:

e66d49b66b5aff6d850b398b1029ffdf.png

我们也对 BERT 出来的特征向量做了 TSNE 降维,可视化结果如下:

7b3b99a17a4717211684c2e84ce7889c.png

根据右上角的图例,不同的颜色代表不同的评分,比如紫色代表五分。每一个点都是一笔影评的高维特征降维后在二维平面上的体现。可以明显看出,不同评分的影评被归在了不同的群里。相近的评分,比如 5 分和 4 分、4 分与 3 分会有一些重叠部分。

  • 自注意力机制的一些可视化结果:

ca382d4a36a2bba7796ecc6d83d976b6.pnge792921c8d58a7866b2942e944a3f724.png

引入自注意力机制的模型在预测一句影评对应的评分的时候,能够先通过注意力机制抓取一句话中的重要部分,给重要部分很多的比重。上述几个例子就能看出来,再模型给一条影评 5 分的时候,会给“爆”、“动人”这样的字眼予以高亮。在给 2 分的时候,会给“一般”这样的字眼予以高亮。

案例分析

接下来我们针对疯狂动物城这部电影,做一些可视化分析,来呈现训练好之后的模型的效果。

  • 分类准确率:72.63%

  • 混淆矩阵:

a4ecca30792edd4324747c548e0bcecf.png

将误判为相邻评分的例子判别为正确的结果如下:

  • 分类准确率:98.56%

  • 混淆矩阵:

9d1f04bdf93cacb968a4f6addc3e9acf.png

  • 真实评分的分布:

963f4f7b2cdfac7fe41f59a302194430.png

  • 模型预测评分的分布:

8fc7da3dc7782d1303662d4039c5b4f1.png

  • TSNE 降维后可视化结果:

0526e42f523d22bb912cc4f3ae325c3a.png

  • 自注意力机制可视化结果:

790232d7b69fd791c23481f24f2349c9.png

针对疯狂动物城这部电影,我们做了 TF-IDF 的词频分析。

  • 词频前三十的词:

ece05e3a5dcd825d17669b3227689491.png

  • 不同评分的高频词:

86e5bf5286fd2f1df3f96006d4f2ef93.png

第一行的 1-5 是评分,下面的词后面的数字代表的是这个词的出现个数。

最后,用一张词云欢快地结束案例分析:

3bfaa1b28e7b6b204f61d59808f378ad.png

结论

  • 本文用了目前自然语言界最强的模型BERT做迁移学习,效果看起来还挺 okay 的。

  • BERT 模型可以很好地抽出文字的特征,用于后续的实验。如果小伙伴们有比较好的运算资源,可以把 BERT 当作是一个类似于 word to vector 的工具。

  • 自注意力机制不光能提高模型的效能,同时引入此机制能大大加强模型的可解释性。

参考内容:

  • https://www.zhihu.com/question/298203515/answer/509470502

  • https://arxiv.org/abs/1810.04805

  • https://arxiv.org/abs/1703.03130

  • Github:https://github.com/Chung-I/Douban-Sentiment-Analysis

(本文为AI科技大本营转载文章,转载请联系作者。)

2735050373f8b76737632055217dcc02.png

6d1a3e194ff7ced913d9c4f39b58bd83.png

推荐阅读:

AI被“横扫”反噬?

如何帮新手程序员快速分析 Error?

ProgPow:以太坊上浮世绘

名下企业比老板刘强东还多,京东“最强女助理”张雱什么来头?

互联网巨头的春晚江湖

一万多条拼车数据,看春运迁移大军

30个让程序员崩溃的瞬间,笑死我了

程序员给银行植入病毒,分 1300 次盗取 718 万,被判 10 年半!

81252ae486ed2b6b7a3634fd1f7c1183.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP、无法连网问题)

目录ubuntu安装包获取ubuntu的安装安装网络配置命令ifconfig连接网络(解决ubuntu无法连网问题)如何修改IP地址安装VMtools解决VMware Tools选项灰色VMtools安装安装中文,汉化添加中文输入法调整分辨率安装新版的Vim安装gccubuntu安装包获取 xunlei中直接搜索下载 …

arm-2014.05 编译三星内核错误 “not support ARM mode ‘smc 0’ ”

(1)arch/arm/mach-exynos/include/mach/smc.h文件: 在第54行和第69下面添加: __asm__ volatile (".arch_extension sec\n""smc 0\n": "r"(reg0), "r"(reg1), "r"(reg2), &…

树莓派基于Linux内核驱动开发详解

目录一、驱动认知1.1 为什么要学习写驱动1.2 文件名与设备号1.3 open函数打通上层到底层硬件的详细过程二、基于框架编写驱动代码2.1 编写上层应用代码2.2 修改内核驱动框架代码2.3 部分代码解读2.3.1 static的作用2.3.2 结构体成员变量赋值方式2.3.3 结构体file_operations(最…

3.X内核下设备树–platform设备驱动

1。历史的车轮总是向前,技术更替。在linus 同学发出那句 WFK 后内核进入了设备树时代(站在驱动工程师角度)。 前几天我已经被mach-imx 中的文件折磨的夜不能眠。我终于在一个清晨,喝完一杯咖啡后决定放弃蹩脚的传统device描述方式…

六核cpu安装SQL Server 2005时报错,提示启动服务失败

2019独角兽企业重金招聘Python工程师标准>>> 新买的IBM3650M4的服务器上安装SQL server2005 安装到一半时,报"提示:SQL Server 服务无法启动。"错。 一开始以为是操作系统的问题,先重装了一遍,还是不行&…

网络编程知识预备(1) ——了解OSI网络模型

参考:简单了解OSI网络模型 作者:丶PURSUING 发布时间: 2021-03-18 20:07:09 网址:https://blog.csdn.net/weixin_44742824/article/details/114968802?spm1001.2014.3001.5502 根据需求摘抄自下面这篇文章,内容非常详…

antd表格显示分页怎么取消_真相!Word里怎么也删不掉的文档空白页原来是这样...

大家好,我是你们的海宝老师在Word里,经常会遇到这种情况:文档莫名其妙地多出一个或多个空白页,没啥内容却怎么也删不掉。不着急,咱们来一一分析。1、标题前的空白页像这种标题前面有空白,基本就是【段落】设…

网络编程知识预备(2) ——三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL

参考:浅显易懂的三次握手与四次挥手 作者:丶PURSUING 发布时间: 2021-03-19 09:33:20 网址:https://blog.csdn.net/weixin_44742824/article/details/114990198?spm1001.2014.3001.5502 参考:(四十七&…

面向对象2

python之路——面向对象进阶 阅读目录 isinstance和issubclass反射setattr  delattr  getattr  hasattr__str__和__repr____del__item系列__getitem__  __setitem__  __delitem____new____call____len____hash____eq__回到顶部isinstance和issubclass isinstance(obj…

DM9000网卡原理与基地址设置

从上面可以看出DM9000的地址总线就一根,它不像CS8900那样地址总线和数据总线都齐全。而这里只有一根地址线(CMD),16跟数据线,所以可以确定位宽为16位,而地址线为什么只有一根,这是DM9000决定的,看手册可以知…

网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系

参考:SOCKET,TCP,HTTP之间的区别与联系 作者:丶PURSUING 发布时间: 2021-03-19 11:54:01 网址:https://blog.csdn.net/weixin_44742824/article/details/114992140?spm1001.2014.3001.5502 参考:TCP连接、Http连接与S…

debian 9 安装后的配置,debian 9 开发环境。

注意:以下命令用sudo或者以root用户进行 一.Xterm(在安装KDE桌面情况下)的配置(可以黏贴,复制): 首先在根目录下编辑文件.Xresources(没有可以创建) rootdebian:~# vim ~/.Xresources rootdebi…

嵌入式RT3070 AP模式移植

环境:ubuntu1~14.04.3 编译器:arm-none-linux-gnueabi-gcc-4.8.3 无线网卡为RT3070,驱动分为STA驱动和SoftAP驱动两种,STA驱动支持无线网卡工作在STA模式下,而SoftAP的驱动支持无线网卡工作在软AP的模式下&#xff0…

Wireshark抓包介绍和TCP三次握手分析

wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。 wireshark是开源软件,可以放心使用。 可以运行在Wind…

网络编程知识预备(4) ——了解应用层的HTTP协议与HTTPS协议

参考:简单了解HTTP协议与HTTPS协议 作者:丶PURSUING 发布时间: 2021-03-15 10:55:13 网址:https://blog.csdn.net/weixin_44742824/article/details/114807328?spm1001.2014.3001.5502 编程实现人脸识别需要基于人工智能平台&…

Django之orm查询

ORM相关 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不…

智能家居 (2) ——设计模式的引入

目录设计模式的概念引入工厂模式的实现animal.hmainPro.ccat.cdog.cperson.c工厂模式的功能验证往期文章设计模式的概念引入 工厂模式的实现 所有代码最好在Source Insight下编写&#xff0c;并将所有代码进行关联&#xff0c;方便读写。 animal.h #include <stdio.h>s…

卷积核和全连接层的区别_「动手学计算机视觉」第十六讲:卷积神经网络之AlexNet...

前言前文详细介绍了卷积神经网络的开山之作LeNet&#xff0c;虽然近几年卷积神经网络非常热门&#xff0c;但是在LeNet出现后的十几年里&#xff0c;在目标识别领域卷积神经网络一直被传统目标识别算法(特征提取分类器)所压制&#xff0c;直到2012年AlexNet(ImageNet Classific…

vnc配置备忘录

因为我开发板上要用到Qt&#xff0c;所以我在服务器上安装了Qt的开发环境&#xff0c;为了能远程连接到服务器我安装了VNC&#xff0c; 中间也是遇到了很多问题&#xff0c;比如连接上去后&#xff0c;只显示一个控制台的窗口&#xff0c;只能使用命令行。后来几经周折才搞定先…

网络编程知识预备(5) ——libcurl库安装及其编程访问百度首页

本文为学习笔记&#xff0c;整合课程内容以及下列文章&#xff1a; 其中&#xff0c;libcurl函数库常用字段解读部分&#xff1a; 参考博文&#xff1a;原文地址 作者&#xff1a;冬冬他哥哥 目录Libcurl库简介Libcurl等三方库的通用编译方法三方库使用前通读方法库的配置、编…