目录
- 什么是Bert
- Bert能干什么?
- Bert和TensorFlow的关系
- BERT的原理
- Bert相关工具和服务
- Bert的局限性和对应的解决方案
沉舟侧畔千帆过, 病树前头万木春. 今天介绍的是NLP新秀 - Bert.
什么是Bert
一年多之前, 那是2018年的一个秋天(10月11日), 谷歌AI团队新发布了BERT模型,在NLP业内引起巨大反响,认为是NLP领域里程碑式的进步。BERT模型在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7%(绝对改进率5.6%)等。
Bert的官网是: https://github.com/google-research/bert
Bert能干什么?
Bert能显著提升智能客服系统的表现, 因为Bert在智能客服系统所需要的如下技术和模块中都表现优越:
• 问答 Question Answering (SQuAD v1.1)
• 推理 Natural Language Inference (MNLI)
除了智能客服系统外, Bert还可以用于以下系统和任务中:
• 问答系统
• 命名实体识别
• 文档聚类
• 邮件过滤和分类
• 情感分析
Bert和TensorFlow的关系
那Bert和大名鼎鼎的TensorFlow有什么关系呢?
1. Bert是一个模型, 不是一个工具. TensorFlow是一个工具.
2. Bert这个模型可以在TensorFlow这个工具里实现.
3. 可见, 这两者不是一个维度的东西, 并不是竞争对手, 所以Bert的推出会取代TensorFlow绝对是一个谣言.
BERT的原理
BERT的创新点在于它将双向 Transformer 用于语言模型,
之前的模型是从左向右输入一个文本序列,或者将 left-to-right 和 right-to-left 的训练结合起来。
实验的结果表明,双向训练的语言模型对语境的理解会比单向的语言模型更深刻,
论文中介绍了一种新技术叫做 Masked LM(MLM),在这个技术出现之前是无法进行双向语言模型训练的。
BERT 利用了 Transformer 的 encoder 部分。
Transformer 是一种注意力机制,可以学习文本中单词之间的上下文关系的。
Transformer 的原型包括两个独立的机制,一个 encoder 负责接收文本作为输入,一个 decoder 负责预测任务的结果。
BERT 的目标是生成语言模型,所以只需要 encoder 机制。
Transformer 的 encoder 是一次性读取整个文本序列,而不是从左到右或从右到左地按顺序读取,
这个特征使得模型能够基于单词的两侧学习,相当于是一个双向的功能。
Bert相关工具和服务
那么Bert有没有开箱即用的工具和服务呢?
有的, 比如bert-as-service: https://github.com/hanxiao/bert-as-service
现在让我们来走一遍bert-as-sevice吧. (我用mac, 所以以下所用命令会和在windows下不一样, windows的朋友请自行调整)
第一时间想到的最简单、快速、方便的方法当然是去docker hub上拉一个最新的image啦,然而docker hub上的bert-as-service太旧了,不得不放弃了,我们还是使用传统方法来安装吧。
先要确认安装了:
- vs code,
- python 3.5到3.7(on 2020年2月14日: 不要python 3.8, 因为目前tensorflow最高版本只支持到3.7) (中国的朋友可以使用taobao镜像: https://npm.taobao.org/mirrors/python/ ),
- Tensorflow 1.10 到1.15.0 (中国的朋友可以使用douban镜像:sudo pip3 install tensorflow==1.15.0 -i https://pypi.douban.com/simple ) (on 2020年2月14日 :不要安装Tensorflow其他版本 )
- Windows的话还需要安装Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019. https://aka.ms/vs/16/release/vc_redist.x64.exe
1. 打开vs code, 建立好bert目录. 在bert目录右键打开命令区
2. 先建立python虚拟环境, 输入命令: python3 -m venv bert-env
3. 安装server: pip install bert-serving-server
4. 安装client: pip install bert-serving-client
5. 下载Download a Pre-trained BERT Model一节里的模型。我选择了BERT-Large, Cased https://storage.googleapis.com/bert_models/2018_10_18/cased_L-24_H-1024_A-16.zip. 如果需要对中文做处理的推荐 https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
6. 新建一个model文件夹,下载后解压到这个model文件夹里。
7. 启动BERT service: bert-serving-start -model_dir /model/cased_L-24_H-1024_A-16/ -num_worker=4
如果运行报错, 大概率是版本不对, 可以指定绝对路径来确保你调用的是正确的版本
Bert的局限性和对应的解决方案
说得这么牛,那么Bert有什么局限性吗?
万事万物是不可能完美的,Bert当然也有其局限性,Bert只适合处理数百个单词,所以用来做智能、 问答系统、命名实体识别、文档聚类、邮件过滤和分类、情感分析等一般只有几百个单词的人工智能系统是很适合的。
但是Bert不能处理成千上万个单词,所以不适用于书籍、合同等大量文本。如果需要处理书籍、合同等大量文本,推荐使用Google的另一个模型:Reformer。
Reformer模型能够处理多达100万字的环境,从目前的实际应用来讲,面向百字的Bert + 面向万字的Reformer组合基本能够横扫整个NLP领域了。
不得不说,Google真的是牛,不但连续拿到了互联网、移动互联网、人工智能等领域的门票。现在还针对NLP各个子领域推出相应技术和产品。这样下去,Google又在NLP届全领域占领了!
自从Google在2016年AlphaGo下赢围棋以来,推出Tensorflow,又在Tensorflow上面推出一堆模型,战略布局很赞,这盘大棋下得真好!
最后以一句话结束此文, 学习让我青春, 学习让我年轻 -> 不断地学习让我永葆青春.