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
安裝部分講的比較詳細,後面講自己的數據怎麼跑
理論講解比較多