飛槳帶你瞭解:基於百科類資料訓練的 ELMo 中文預訓練模型

pythontab發表於2019-06-06

  在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的開源實現(依賴於 PaddlePaddle 1.4.0),釋出要點如下。

  注意啦,下面劃重點!!!

  接下來

  我們看看怎麼可以快速

  把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,7

  python 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 任務的主要步驟如下:

  #step 1: 在已經搭建好的LAC 網路結構之後,載入 ELMo 預訓練模型引數

  from bilm import init_pretraining_params

  init_pretraining_params(exe, args.pretrain_elmo_model_path, fluid.default_main_program())

  #step 2: 基於 ELMo 字典 將輸入資料轉化為 word_ids,利用 elmo_encoder 介面獲取 ELMo embedding

  from bilm import elmo_encoder

  elmo_embedding = elmo_encoder(word_ids)

  #step 3: ELMo embedding 與 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 的效果。

  更多詳細內容可以參見:

  https://github.com/PaddlePaddle/LARK


相關文章