关于作者:肖涵博士,bert-as-service 作者。现为腾讯 AI Lab 高级科学家、德中人工智能协会主席。肖涵的 Fashion-MNIST 数据集已成为机器学习基准集,在 Github 上超过 4.4K 星,一年来其学术引用数超过 300 篇。
肖涵在德国慕尼黑工业大学计算机系取得了计算机博士(2014)和硕士学位(2011),在北邮取得了信息通信学士学位(2009)。他曾于 2014-2018 年初就职于位于德国柏林的 Zalando 电商,先后在其推荐组、搜索组和 Research 组担任高级数据科学家。肖涵所创办的德中人工智能协会(GCAAI)如今拥有 400 余名会员,致力于德中两国 AI 领域的合作与交流,是德国最具影响力的新型团体之一。
WeChat: hxiao1987
Blog: https://hanxiao.github.io
德中人工智能协会: https://gcaai.org
Google AI 几周前发布的 BERT (Bidirectional Encoder Representations from Transformers) 模型在 NLP 圈掀起了轩然大波,其使用超多层 Transformer + 双任务预训练 + 后期微调的训练策略,在 11 个不同类型的 NLP 任务上刷新了纪录。
Google 随后在 Github 上开源了 BERT 的代码,并提供了在维基百科语料上使用 TPU 预训练好的模型供大家下载。这其中也包括了基于字符级别的中文 BERT 预训练模型。
BERT开源代码:
https://github.com/google-research/bert
bert-as-service 能让你简单通过两行代码,即可使用预训练好的模型生成句向量和 ELMo 风格的词向量:
你可以将 bert-as-service 作为公共基础设施的一部分,部署在一台 GPU 服务器上,使用多台机器从远程同时连接实时获取向量,当做特征信息输入到下游模型。
回顾: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。
bert-as-service 正是出于此设计理念,将预训练好的 BERT 模型作为一个服务独立运行,客户端仅需通过简单的 API 即可调用服务获取句子、词级别上的向量。在实现下游任务时,无需将整个 BERT 加载到 tf.graph 中,甚至不需要 TensorFlow 也不需要 GPU,就可以在 scikit-learn, PyTorch, Numpy 中直接使用 BERT。
bert-as-service
bert-as-service 将 BERT模型作为一个独立的句子编码(sequence encoding/embedding&#