Bert介绍
Bert模型是Google在2018年10月发布的语言表示模型,Bert在NLP领域横扫了11项任务的最优结果,可以说是现今最近NLP中最重要的突破。Bert模型的全称是Bidirectional Encoder Representations from Transformers,是通过训练Masked Language Model和预测下一句任务得到的模型。关于Bert具体训练的细节和更多的原理,有兴趣的读者可以去看在arXiv上的原文。本篇文章从实践入手,带领大家进行Bert的中文文本分类和作为句子向量进行使用的教程。
准备工作
1.下载bert
1 | git clone https://github.com/google-research/bert.git |
2.下载bert预训练模型
Google提供了多种预训练好的bert模型,从下方链接下载 Google 发布的预训练模型,解压到某个路径下,比如: /tmp/english_L-12_H-768_A-12/
你可以使用包括 BERT-Base, Multilingual 和 BERT-Base, Chinese 在内的任意模型。
开启 BERT 服务
python app.py -model_dir /tmp/english_L-12_H-768_A-12/ -num_worker=4
这个代码将开启一个 4 进程的 BERT 服务,意味着它可以最高处理来自 4 个客户端的并发请求。虽然同一时刻连接服务的客户端数量没有限制,但在某时刻多余 4 个的并发请求将被暂时放到一个负载均衡中,等待执行。
3.(可选项)安装bert-as-service,这是一个可以利用bert模型将句子映射到固定长度向量的服务。
1 2 | pip install bert-serving-server # server pip install bert-serving-client # client, independent of 'bert-serving-server' |
该服务要求tensorflow的最低版本为1.10。
bert-as-service 将 BERT模型作为一个独立的句子编码(sequence encoding/embedding)服务,在客户端仅用两行代码就可以对句子进行高效编码。
无论下游是什么任务,对于 NLP 研究者来说,最重要的就是获取一段文字或一个句子的定长向量表示,而将变长的句子编码成定长向量的这一过程叫做 sentence encoding/embedding。bert-as-service 正是出于此设计理念,将预训练好的 BERT 模型作为一个服务独立运行,客户端仅需通过简单的 API 即可调用服务获取句子、词级别上的向量。在实现下游任务时,无需将整个 BERT 加载到 tf.graph 中,甚至不需要 TensorFlow 也不需要 GPU,就可以在 scikit-learn, PyTorch, Numpy 中直接使用 BERT。
以句子向量的形式使用Bert
如果想要将bert模型的编码和其他模型一起使用,将bert模型作为句子向量使用很有意义。我们可以使用bert-as-service来完成这个目标。
安装完bert-as-service以后,就可以利用bert模型将句子映射到固定长度的向量上。在终端中用一下命令启动服务:
1 | bert-serving-start -model_dir /media/ganjinzero/Code/bert/chinese_L-12_H-768_A-12 -num_worker=4 |
model_dir后面的参数是bert预训练模型所在的文件夹。num_worker的数量应该取决于你的CPU/GPU数量。
这时就可以在Python中调用如下的命令:
1 2 3 | from bert_serving.client import BertClient bc = BertClient() bc.encode(['一二三四五六七八', '今天您吃了吗?']) |
最好以列表的形式,而非单个字符串传给bc.encode()参数,这样程序运行的效率较高。
在启动了bert-as-service服务之后,客户端也可以从另一台机器上连接 BERT 服务,只需要一个 IP 地址和端口号:
from bert_serving.client import ConcurrentBertClient
bc = ConcurrentBertClient(port=5555, port_out=5556)
res = bc.encode(query)
res_sum = res[0].tolist()
参考链接:
重点说了官网上的demo怎么跑,讲的水了点
https://zhuanlan.zhihu.com/p/50582974
重点将了两个demo任务,该博主还有其他一系列将bert的文章可以一起看
https://www.jianshu.com/p/3d0bb34c488a
安装部分讲的比较详细,后面讲自己的数据怎么跑
理论讲解比较多