如何應用 BERT :Bidirectional Encoder Representations from Transformers
上一篇文章介紹了 Google 最新的BERT (Bidirectional Encoder Representations from Transformers) ,這個模型在 11 個 NLP 任務上重新整理了紀錄。
Google 還開源了 BERT 的程式碼:ofollow,noindex">https://github.com/google-research/bert
大家可以下載在維基百科語料上使用 TPU 預訓練好的模型,包括中文 BERT 預訓練模型。
BERT 模型的訓練分為預訓練(Pre-training)和微調(Pre-training) 兩步。
預訓練過程耗時又耗錢,Google 對 BERT 的預訓練一般需要 4 到 16 塊 TPU 和一週的時間才可以完成。幸好多數情況下我們可以使用 Google 釋出的預訓練模型,不需要重複構造,
微調時可以根據不同的任務,對模型進行相應的擴充套件,例如對句子進行情感分類時,只需要在 BERT 的輸出層的句向量上面加入幾個 Dense 層。所以可以固定 BERT 的引數,將它的輸出向量當做一個特徵用於具體任務。
那麼要如何應用 BERT 呢?
這裡介紹一下 bert-as-service ,專案地址:https://github.com/hanxiao/bert-as-service
這個專案將預訓練好的 BERT 模型作為一個服務獨立執行,很簡單地用幾行程式碼就可以呼叫服務獲取句子、詞級別上的向量 ,然後將這些向量當做特徵資訊輸入到下游模型。在做具體 NLP 任務時,不需要將整個 BERT 載入到 tf.graph 中,或者可以直接在 scikit-learn, PyTorch, Numpy 中使用 BERT。
這個專案的作者是肖涵博士,他的 Fashion-MNIST 資料集 大家應該比較熟悉,現在已成為機器學習基準集,在 Github 上超過 4.4K 星。
使用方法很簡單:
- 下載 Google 的預訓練 BERT 模型,可以選擇 BERT-Base, Chinese 等任意模型:
https://github.com/google-research/bert#pre-trained-models
解壓到某個路徑下,例如:/tmp/english_L-12_H-768_A-12/
- 開啟 BERT 服務
python app.py -model_dir /tmp/english_L-12_H-768_A-12/ -num_worker=4
這個程式碼將開啟一個 4 程序的 BERT 服務,即最高處理來自 4 個客戶端的併發請求。如果在某時刻多餘 4 個的併發請求,將被暫時放到一個負載均衡中等待執行。
- 使用客戶端獲取句子向量編碼
唯一需要的檔案就是service/client.py
,從中匯入 BertClient 。
from service.client import BertClient bc = BertClient() bc.encode(['First do it', 'then do it right', 'then do it better'])
然後就可以得到一個 3 x 768 的 ndarray 結構,每一行代表了一句話的向量編碼。也可以通過設定,返回 Python 型別的 List[List[float]] 。
推薦閱讀歷史技術博文連結彙總
http://www.jianshu.com/p/28f02bb59fe5
也許可以找到你想要的:
[入門問題][TensorFlow][深度學習][強化學習][神經網路][機器學習][自然語言處理][聊天機器人]