Google 最強開源模型 BERT 在 NLP 中的應用 | 技術頭條
作者 | 董文濤
責編 | 唐小引
出品 | CSDN(ID:CSDNnews)
【CSDN 編者按】Google 的 BERT 模型一經發布便點燃了 NLP 各界的歡騰,Google Brain 的資深研究科學家 Thang Luong 曾給出其「開啟了 NLP 新時代」的高度定義,國內外許多公司及開發者對其進行了研究及應用,本文作者及其團隊對 BERT 進行了應用探索。
隨著 Google 推出的 BERT 模型在多種 NLP 任務上取得 SOTA,NLP 技術真正進入了大規模應用階段,由此,我們展開了對 BERT 的探索。
訓練模型
訓練數據
訓練其他模型時我們已經標註了大量的訓練數據,主要把相似句對分為三類來標註:
不相似(0)、相關(0.5)、相似(1)
所以,訓練 BERT 模型時就可以「拿來主義」了。
模型修改
我們的主要應用點是相似度計算,期望模型返回的結果是一個概率(分值)而不是每個類別的概率。當然如果模型給的結果是每一個類別的概率,依然可以通過加權求和輸出一個分值,但這樣是不是又複雜了。
所以我們在官方代碼上做了點小的修改(將最後的 softmax 改為了 sigmoid)使得模型輸出是一個分值,這個分值也就是我們要的相似度了。
模型訓練
我們使用之前標註的數據集在 GeForce GTX 1070 上訓練(Fine-Tune),大概訓練了 8 個小時左右。
模型導出
模型訓練完會產生幾個 Checkpoint,這些 Checkpoint 是不能直接在工程中使用的,需要導出成 PB 文件,可以使用 Estimator 的 export_savedmodel 方法導出。
模型使用
通過調研,主要有兩種方式:
Java JNI:基於我們的 GPU 編譯[1]一個合適的 libtensorflow 和libtensorflow_jni_gpu(如果你的配置和官方一致就不需要自己編譯 了,自己編譯太多坑,這裡有一份經過驗證的編譯環境配置[2])打成 jar 包並加入到工程依賴,使用 TensorFlow 提供的 Java API 載入 BERT 模型,在你的 Java 工程中使用[3]。
Docker + Nvidia-docker + Tensorflow Serving:需要一個合適的 Tensorlfow Serving 的 image,這裡有一份官方做好的 image 列表[4],當然你也可以自己做一個。
這兩種方式各有優缺點,我們主要考慮以下幾個方面:
性能:我們對兩種方案做了實驗,Tensorflow Serving 是 C++ 寫成的服務,對於 batch 做過優化[6],性能優於 Java JNI。
多模型支持能力:方案 2 是支持多模型的,也就是多個模型共用一個 GPU,方案 1 不支持。
簡單好部署:兩種方案都不複雜。
與現有服務開發和運維體系兼容性:方案 1 更有優勢。
另外,方案 2 不僅支持多模型還支持多版本、模型的冷啟動和熱載入。綜合考慮下,我們使用了方案 2 進行模型部署。
效果對比
我們用一些典型客戶的數據構建了測試環境,抽取這些客戶的真實訪客數據,對現有模型和 BERT 模型做了對比實驗,BERT 模型的效果相比於對照模型提高了超過 10%。
調用圖
這是我們的調用時序圖:
FAQ 服務->相似度計算服務:句子 1 和 句子 2 相似度是多少 ?
相似度計算服務->TensorflowServing: 句子 1 和 句子 2 相似度是多少 ?
Note right of TensorflowServing: bert 模型預測
TensorflowServing->相似度計算服務: 句子 1 和 句子 2 相似度是 xx
相似度計算服務->FAQ 服務: 句子 1 和 句子 2 相似度是 xx
這裡抽象出一個相似度計算服務,是因為我們集成了多種相似度計算方法。
優化
後處理
這種模型的一個主要問題是:模型並不能完美解決所有問題,時不時總會有 bad case 出現。一旦模型上線,如果有問題我們無法及時解決(訓練模型和上線都會消耗大量時間)。為此我們增加了後處理,以便於我們的訓練師能夠及時干預,解決問題。
預訓練
BERT 預訓練的模型使用的數據來源於維基百科,與我們的主要應用場景不一致。我們可以猜想如果在 BERT 原有 Pre-Training 模型的基礎上,使用客服里的數據再次進行 Pre-Training 應該會更好,事實上我們也的確這樣做了。結論是影響不大,可能是數據不夠多,新的訓練實驗還在進行中。
數據標註
GBDT 2.0 的出現再次證明了要想得到好的模型,不僅要有數據量,還要提高數據的品質。我們新的標註也在進行中,相信會對模型效果有所提高。
其他應用
我們在產品中還提供了意圖識別的服務,意圖識別服務要求必須能夠在線訓練。如果直接使用 BERT 來做意圖識別,很難滿足在線訓練的要求(BERT 訓練太慢了)。為此我們使用了簡單的模型來支持在線訓練,並把 Fine-tune 模型的倒數第二層作為特徵,增強意圖識別的效果。
BERT 的近鄰
最近 Google 又攜 XLnet 屠榜了,從實驗效果看對比 BERT 確實有比較大的提升,我們也在關注中,實驗的小手已經蠢蠢欲動了。如果在我們的場景實驗效果好的話,相信我們的客戶很快會便會體驗到。
[1]: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/README.md
[2]: https://www.tensorflow.org/install/source#tested_build_configurations
[3]: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/java/README.md
[4]: https://hub.docker.com/r/tensorflow/serving/tags
[5]: https://github.com/tensorflow/serving/blob/master/tensorflow_serving/g3doc/building_with_docker.md
[6]: https://github.com/tensorflow/serving/tree/master/tensorflow_serving/batching
[7]: https://www.tensorflow.org/tfx/serving/serving_config
[8]: https://arxiv.org/abs/1906.08237
作者簡介:董文濤,環信人工智慧研發中心演算法工程師,負責環信中文語義分析開放平台和環信智能機器人的設計與研發。
【END】
熱 文推 薦
?三十四載 Windows 崛起之路: 蘋果、可視都是微軟「鋪路石」
?GitHub 排行榜 C 位出道:手把手教你玩轉 V 語言版的俄羅斯方塊!|CSDN 博文精選
?微軟為何痛失移動操作系統?
?程序員們如何破局 5G?
?軟體為什麼會淪為遺留系統?
?因為有了 TA,搞定行業應用開發,不怕不怕啦!
?除了V神,17個以太坊大會講師的演講精華都在這兒了!
?2019年技術盤點容器篇(二):聽騰訊雲講講踏入成熟期的容器技術 | 程序員硬核評測
?50行Python代碼,獲取公眾號全部文章
?不寫一行代碼,也能玩轉Kaggle競賽?
?馬雲曾經偶像,終於把阿里留下的1400億敗光了!
點擊閱讀原文,輸入關鍵詞,即可搜索您想要的 CSDN 文章。
你點的每個「在看」,我都認真當成了喜歡
※為什麼 C 語言仍然佔據統治地位?
※華為反擊!要求美國運營商巨頭支付 10 億美元專利費
TAG:CSDN |