彭小盛

又一个WordPress站点

BERT句向量词向量 Google-十万宝贝

BERT句向量词向量 Google-十万宝贝
Google AI 几周前发布的 BERT (Bidirectional Encoder Representations from Transformers) 模型在 NLP 圈掀起了轩然大波,其使用超多层 Transformer + 双任务预训练 + 后期微调的训练策略,在 11 个不同类型的 NLP 任务上刷新了纪录。
Google 随后在 Github 上开源了 BERT 的代码,并提供了在维基百科语料上使用 TPU 预训练好的模型供大家下载车静子 。这其中也包括了基于字符级别的中文 BERT 预训练模型。
论文地址:https://arxiv.org/abs/1810.04805
项目地址:https://github.com/google-research/bert
01
BERT介绍
BERT是预训练语言表示的方法,可以在大型文本语料库(如维基百科)上训练通用的“语言理解”模型第十三号仓库 ,然后将该模型用于下游NLP任务,比如机器翻译、问答。
BERT 最核心的就是预训练过程,这也是该论文的亮点所在。简单而言,模型会从数据集抽取两句话,其中 B 句有 50% 的概率是 A 句的下一句,然后将这两句话转化前面所示的输入表征。现在我们随机遮掩(Mask 掉)输入序列中 15% 的词,并要求 Transformer 预测这些被遮掩的词,以及 B 句是 A 句下一句的概率这两个任务。
02
使用BERT
使用BERT分为两步:预训练(Pre-training)和微调(Pre-training)两步。预训练和下游任务无关,却是一个非常耗时耗钱的过程。Google 坦言,对 BERT 的预训练一般需要 4 到 16 块 TPU 和一周的时间,才可以训练完成。
庆幸的是,大部分 NLP 研究者只需使用 Google 发布的预训练模型,而不需要重复这一过程。你可以把预训练模型想象成一个 Prior,是对语言的先验知识,一旦拥有就不需要重复构造。
微调取决于下游的具体任务。不同的下游任务意味着不同的网络扩展结构:比如一个对句子进行情感分类的任务,只需要在 BERT 的输出层句向量上接入几个 Dense 层,走个 softmax夺命金粤语。而对于 SQuAD 上的阅读理解任务,需要对 BERT 输出的词向量增加 match 层和 softmax。
总体来说,对 BERT 的微调是一个轻量级任务,微调主要调整的是扩展网络而非 BERT 本身。 换句话说,我们完全可以固定住 BERT 的参数,把 BERT 输出的向量编码当做一个特征(feature)信息,用于各种下游任务。
无论下游是什么任务,对于 NLP 研究者来说,最重要的就是获取一段文字或一个句子的定长向量表示,而将变长的句子编码成定长向量的这一过程叫做 sentence encoding/embedding彭泽教育网。
03
bert-as-service
bert-as-service 正是出于此设计理念,将预训练好的 BERT 模型作为一个服务独立运行,客户端仅需通过简单的 API 即可调用服务获取句子、词级别上的向量。在实现下游任务时,无需将整个 BERT 加载到 tf.graph 中,甚至不需要 TensorFlow 也不需要 GPU,就可以在 scikit-learn, PyTorch, Numpy 中直接使用 BERT。bert-as-service 将 BERT模型作为一个独立的句子编码(sequence encoding/embedding)服务,在客户端仅用两行代码就可以对句子进行高效编码。
项目地址:https://github.com/hanxiao/bert-as-service
(1)下载 Google 发布的预训练 BERT 模型
从下方链接下载 Google 发布的预训练模型,解压到某个路径下,比如:/tmp/english_L-12_H-768_A-12/
预训练模型下载:https://github.com/google-research/bert#pre-trained-models
你可以使用包括BERT-Base, Multilingual和BERT-Base, Chinese在内的任意模型黄晟晟 。
(2)开启BERT服务
pythonapp.py-model_dirtmp/chinese_L-12_H-768_A-12/-num_worker=4
这个代码将开启一个 4 进程的 BERT 服务,意味着它可以最高处理来自 4 个客户端的并发请求。虽然同一时刻连接服务的客户端数量没有限制,但在某时刻多余 4 个的并发请求将被暂时放到一个负载均衡中诡八楼,等待执行。
max_batch_size=256max_seq_len=25model_dir=tmp/chinese_L-12_H-768_A-12/num_worker=4pooling_layer=-2pooling_strategy=REDUCE_MEANport=5555

(3)使用客户端获取句子向量编码
对于客户端来说,你唯一需要的文件就是service/client.py ,因为我们需要从中导入 BertClient 。
fromservice.clientimportBertClientbc=BertClient()bc.encode(['因为刚好遇见你','留下十年的期许'])out:array([[0.6249112,0.11690004,-0.29489797,...,-0.31032327,-0.22686012,-0.77053344],张葳葳[-0.03935893,0.32058465,-0.21470328,...,-0.69790626,-0.5120306,-0.55002445]],dtype=float32)
这会返回一个 2x 768 的ndarray 结构,每一行代表了一句话的向量编码。你也可以通过设置,让其返回 Python 类型的 List[List[float]] 。
在另一台机器上使用 BERT 服务
客户端也可以从另一台机器上连接 BERT 服务川大杀人案 ,只需要一个 IP 地址和端口号:
#onanotherCPUmachinefromservice.clientimportBertClientbc=BertClient(ip='xx.xx.xx.xx',port=5555)bc.encode(['因为刚好遇见你','留下十年的期许'])
暗中观察
默默关注