在 NLP 世界裡,有一支很重要的家族,英文叫做 LARK( LAnguage Representations Kit ),翻譯成中文是語言表示工具箱。目前 LARK 家族最新最重要的三種算法,分別是 ELMo , BERT 和 ERNIE 。
你一定不知道,這三個普通的名字,竟然包含著一個有趣的秘密。
真相,即將揭開!
我們先從算法模型的名字尋找一些蛛絲馬跡
第一位, ELMo :
來自英文 Embedding from Language Models 的縮寫,來自論文名為Deep contextualized word representation
第二位, BERT :
來自英文 Bidirectional Encoder Representations from Transformers 的縮寫,來自論文名為 Pre-training of Deep Bidirectional Transformers for Language Understanding
第三位, ERNIE :
來自英文 Enhanced Representation through kNowledge IntEgration) 的縮寫,來自論文名為Enhanced Representation through Knowledge Integration
看完了,是不是,還是一頭霧水,哪裡有什麼秘密?
不賣關子了,直接上圖!
What??
再回頭看看,你還記得那三個算法的名字麼?
ELMo , BERT , ERNIE
竟然都是美國經典動畫片,《 Sesame Street (芝麻街)》裡面的卡通人物!!!
好吧,如果你說,沒看過這個動畫片,沒感覺啊。那我舉個例子,如果把《芝麻街》類比成中文《舒克和貝塔》。那麼,第一篇論文把模型取做「舒克」,第二篇很有愛的就叫做「貝塔」,第三篇就硬把模型叫做「皮皮魯」,也許不久的下一個模型就命名為「魯西西」啦。
誰說科學家們很無聊,是不是也很童趣?
好了,扯遠了,今天我們先給大家介紹 LARK 家族的 ELMo ! 提出它的論文獲得2018年 NAACL 最佳 paper ,它在 NLP 領域可是有著響噹噹的名頭,讓我們來認識它!
ELMo 模型簡介
ELMo ( Embeddings from Language Models )是重要的通用語義表示模型之一,以雙向 LSTM 為網路基本組件,以 Language Model 為訓練目標,通過預訓練得到通用的語義表示,將通用的語義表示作為 Feature 遷移到下遊 NLP 任務中,會顯著提升下遊任務的模型性能。
ELMo 模型核心是一個雙層雙向的 LSTM 網絡,與傳統的 word2vec 算法中詞向量一成不變相比, ELMo 會根據上下文改變語義 embedding 。
一個簡單的例子就是「蘋果」的詞向量:
句子1:「我買了1斤蘋果」
句子2:「我新買了1個蘋果X」
在 word2vec 算法中,「蘋果」的詞向量固定,無法區分這兩句話的區別,而ELMo 可以解決語言中的二義性問題,可以帶來性能的顯著提升。
ELMo 項目的飛槳( PaddlePaddle )實現
為了方便廣大的開發者,飛槳( PaddlePaddle )完成了 ELMo 的開源實現(依賴於 Paddle Fluid 1.4),發布要點如下。
注意啦,下面劃重點!!!
完整支持 ELMo 多卡訓練,底層算子優化,訓練速度比主流實現快約1倍。
下遊任務的性能明顯提升: LAC 任務加入 ELMo 後 F1 可以提升 1.1%;閱讀理解任務加入 ELMo 後 Rouge-L 提升 1%。
接下來,我們看看怎麼可以快速把 ELMo 用到我們的項目中來吧!
ELMo 訓練過程介紹
(1)數據預處理
將文檔按照句號、問號、感嘆以及內容分詞預處理。預處理後的數據文件,每行為一個分詞後的句子。給出了訓練數據 data/train 和測試數據 data/dev 的數據示例如下:
本 書 介紹 了 中國 經濟 發展 的 內外 平衡問題 、 亞洲 金融 危機 十 周年 回顧 與 反思 、 實踐 中 的 城鄉 統籌 發展 、 未來 十 年 中國 需要 研究 的 重大 課題 、 科學 發展 與新型 工業 化 等 方面 。
吳 敬 璉 曾經 提出 中國 股市 「 賭場 論 」 , 主張 維護 市場 規則 , 保護 草根 階層 生計, 被 譽 為 「 中國 經濟 學界 良心 」 , 是 媒體 和公眾 眼中 的 學術 明星
(2)模型訓練
利用提供的示例訓練數據和測試數據,進行單機多卡預訓練。在開始預訓練之前,需要把 CUDA 、 cuDNN 、 NCCL2 等動態庫路徑加入到環境變量 LD_LIBRARY_PATH 之中,然後執行 run.sh 即可開始單機多卡預訓練,run.sh 文件內容如下:
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7python train.py \--train_path='data/train/sentence_file_*' \--test_path='data/dev/sentence_file_*' \--vocab_path data/vocabulary_min5k.txt \--learning_rate 0.2 \--use_gpu True \--all_train_tokens 35479 \--local True $@
其中, all_train_tokens 為 train 和 dev 統計出來的 tokens 總量,訓練過程中,默認每個epoch後,將模型參數寫入到 checkpoints 路徑下,可以用於遷移到下遊 NLP 任務。
(3)ELMo模型遷移
以 LAC 任務為示例,將 ELMo 預訓練模型的語義表示遷移到 LAC 任務的主要步驟如下:
#step1:在已經搭建好的 LAC 網絡結構之後,加載 ELMo 預訓練模型參數:
from bilm import init_pretraining_paramsinit_pretraining_params(exe,args.pretrain_elmo_model_path, fluid.default_main_program()
#step2: 基於ELMo 字典 將輸入數據轉化為 word_ids,利用 elmo_encoder 接口獲取 ELMo embedding:
from bilm import elmo_encoderelmo_embedding = elmo_encoder(word_ids)
#step3: ELMoembedding 與 LAC 原有 word_embedding 拼接得到最終的 embedding:
word_embedding=fluid.layers.concat(input=[elmo_embedding, word_embedding], axis=1)
好的,到這裡,模型的遷移就完成了,再來回顧一下加入 ELMo 後對性能的提升,心動不如行動,趕緊用起來吧!
ERNIE 模型簡介
學習完了 ELMo ,我們再來了解一下 LARK 家族的學習成績最好的重磅成員ERNIE ,在多項 NLP 中文任務上表現非凡。
ERNIE 通過建模海量數據中的實體概念等先驗語義知識,學習真實世界的語義關係。具體來說, ERNIE 模型通過對詞、實體等語義單元的掩碼,使得模型學習完整概念的語義表示。相較於 BERT 學習原始語言信號, ERNIE 直接對先驗語義知識單元進行建模,增強了模型語義表示能力。
ERNIE 在多個公開的中文數據集上進行了效果驗證,包括語言推斷、語義相似度、命名實體識別、情感分析、問答匹配等自然語言處理各類任務上,均超越了語義表示模型 BERT 的效果。
查看更多詳細內容請點擊文末「閱讀原文」。