相比英文,中文命名實體的識別難在哪?又該如何解決?

專屬圖1.png

假設你藉助天然語言處理技術開發了一個可以從圖片(例如紙質文檔的掃描件)中提取重要文字(例如所涉及到的人名)的應用,面對 Tony、Lisa 之類英文名,應用很輕鬆就準確地識別了出來;可若是面對張3、李四這樣的中文名,識別效果卻老是不如意。這有多是什麼問題形成的?
並不必定是由於相關技術還沒學會中文,極可能是由於你的應用,在命名實體識別方面遇到了一些小問題。html

首先得明白,到底什麼是命名實體識別

命名實體識別(Named Entity Recognitio,NER),是指識別文本中具備特定意義的實體,主要包括人名、地名、機構名、專有名詞等。命名實體識別是信息提取、問答系統、句法分析、機器翻譯、知識圖譜等應用領域的重要基礎工具。git

那麼中文命名實體的識別有何難呢?

對於英文來講,因爲英語中的命名實體具備比較明顯的形式標誌(即實體中的每一個詞的第一個字母要大寫),因此實體邊界識別相對容易,此時的任務的重點只須要肯定實體的類別。
然而和英語相比,中文命名實體識別任務更加複雜,並且相對於實體類別標註子任務,實體邊界的識別更加困難。現有的 NER 工具(例如 Jiagu)對於特定領域的中文命名實體識別效果難以知足業務需求,並且這些工具很難使用自定義數據集訓練。所以不少客戶迫切想使用業內最早進的算法在行業內數據集上進行訓練,以改進現有 NER 工具的不足。github

Amazon Sagemaker 又是怎麼解決這個問題的?

Amazon SageMaker 是一項託管服務,可經過主動學習、超參數優化、模型分佈式訓練、監控訓練進展,部署培訓模型做爲自動擴展的 RESTful 服務,以及對併發 ML 實驗進行集中式管理,從標籤數據開始簡化 ML 工做流。算法

點擊此視頻瞭解如何在 Amazon SageMaker 上使用多種有趣的深度學習框架 (TensorFlow, MXNet, PyTorch等),爲你即將開始的編寫模型及從開源系統導入模型之旅打下基礎。docker

Amazon SageMaker 支持多種有趣的深度學習方式,TensorFlow 就是其中之一。bash

接下來,咱們將一塊兒來看看,如何在 Amazon SageMaker 上基於 TensorFlow 解決中文命名實體的識別問題。併發

中文命名實體識別算法

NER 一直是天然語言處理(NLP)領域中的研究熱點,從早期基於詞典和規則的方法,到傳統機器學習的方法,到近年來基於深度學習的方法,NER 研究進展的大概趨勢大體以下圖所示。框架

1.png

早期的命名實體識別方法基本都是基於規則的。以後因爲基於大規模的語料庫的統計方法在天然語言處理各個方面取得不錯的效果以後,一大批機器學習的方法也出如今命名實體類識別任務。
 
值得一提的是,因爲深度學習在天然語言的普遍應用,基於深度學習的命名實體識別方法也展示出不錯的效果,此類方法基本仍是把命名實體識別當作序列標註任務來作,比較經典的方法是 LSTM+CRF 、 BiLSTM+CRF 。
 
咱們知道,預訓練模型能夠大幅提高計算機視覺的深度學習算法表現,而在 NLP 領域也是同理,預訓練語言模型能夠有效提高文本分類、機器翻譯、命名實體識別等任務的效果。預訓練語言模型經歷了從詞嵌入(Word Embedding),到 BERT ,再到 ALBERT 的演進。
 
BERT 的全稱是 Bidirectional Encoder Representation from Transformers ,即雙向Transformer的編碼器(Encoder),由於解碼器(Decoder)是不能得到要預測的信息的。模型的主要創新點都在預訓練方法上,即用了 Masked LM 和 Next Sentence Prediction 兩種方法分別捕捉詞語和句子級別的表示。
 
ALBERT(見參考資料4)基於 BERT ,但有一些改進,它能夠在主要基準測試上得到最早進的性能,而參數卻減小了 30 %。好比,對於 albert_base_zh ,它只有原始 BERT 模型的 10 %的參數,可是保留了主要精度。
 
本文使用預訓練語言模型 ALBERT 作中文命名實體識別,該項目基於開源的代碼修改而來(本文代碼見參考資料 1 ,原始代碼見參考資料 2 ),使用 TensorFlow 框架開發,在下一節,咱們將展現如何在 Amazon SageMaker 中進行該模型的訓練。機器學習

Amazon SageMaker 中運行 TensorFlow

 
本節介紹如何使用 Amazon SageMaker 的自定義容器 ( Bring Your Own Container ,簡稱 BYOC )和自定義腳本( Bring Your Own Script ,簡稱 BYOS )兩種方式來運行 TensorFlow 程序的訓練任務。首先咱們來看下如何在 Amazon SageMaker Notebook 上運行這個項目,而後再把它運行在 Amazon SageMaker 上。
 分佈式

1.在 Amazon SageMaker Notebook 上運行 TensorFlow 開源代碼

咱們首先要建立  Amazon SageMaker Notebook  ,而後下載代碼和數據,最後運行代碼。若是一切運行正常,咱們就能夠進行下一步工做——將該 TensorFlow 代碼運行到 Amazon SageMaker 中了。

  • 建立 Amazon SageMaker Notebook

咱們首先要建立一個 Amazon SageMaker Notebook ,筆記本實例類型最好選擇 ml.p2.xlarge ,這樣就可使用 GPU 進行訓練的測試了,卷大小建議改爲 10GB 或以上,由於運行該項目須要下載一些額外的數據。

2.png

  • 下載代碼和數據

筆記本啓動後,打開頁面上的終端,執行如下命令下載代碼:

3.png

執行如下命令下載和解壓數據(數據來源見參考資料3):

4.png

  • 運行代碼

咱們須要進入一個虛擬環境 tensorflow_p36 ,該環境預製了運行 TensorFlow 所須要的經常使用組件,運行 run_train.sh 進行訓練,命令以下:

5.png

若是出現下面的輸出,說明運行結果正常,在實例類型爲 ml.p2.xlarge 的筆記本中,訓練速度能夠達到 23 個樣本/秒,若是是其餘類型實例,速度可能有差別。

6.png

2.自定義容器(BYOC)

自定義容器須要經歷準備 Dockerfile ,建立訓練的啓動腳本,建立鏡像並上傳到 Amazon ECR ,本地測試和 Amazon SageMaker 測試等步驟。完整執行過程見 tensorflow_bring_your_own.ipynb 。
 

  • 準備 Dockerfile

咱們首先須要準備 Dockerfile ,在其中安裝 TensorFlow 程序運行必須的環境,拷貝全部代碼到鏡像中。

7.png

這裏咱們須要瞭解 Amazon SageMaker 對於容器內目錄結構的要求,具體以下圖所示,訓練所需代碼放到 /opt/ml/code 目錄下,訓練所需數據放到 /opt/ml/input/data 目錄下,訓練輸出的模型放到 /opt/ml/model 目錄下,訓練結果文件或者日誌文件放到 /opt/ml/output 目錄下,訓練超參數文件是由 Amazon SageMaker 自動生成的,在 /opt/ml/input/config 目錄下。

8.png

  • 建立訓練的啓動腳本

Amazon SageMaker 在訓練時默認的啓動腳本是 train ,您能夠將本身代碼中的啓動腳本命名爲 train ,但咱們更建議您使用咱們提供的啓動腳本 train ,該腳本是基於 Python 的,能夠幫助您解析傳入的超參數,並調用您代碼中的實際啓動腳本。

  • 建立鏡像並上傳到 Amazon ECR

在準備好 Dockerfile 和啓動腳本後,咱們可使用 build_and_push.sh 這個腳本建立鏡像並上傳到 Amazon ECR 。注意這個過程可能須要進行不少次,由於咱們不可避免地要修改 Dockerfile 或者 TensorFlow 程序以使得它們能夠正常工做。若是還沒有調試完成,咱們能夠暫時不執行該腳本的最後一句 docker push ${fullname} ,以免頻繁上傳鏡像到 Amazon ECR 。

  • 本地測試

在建立鏡像完成後,咱們可使用 Amazon SageMaker 的本地模式進行本地測試:

第一步,執行 utils/setup.sh 來初始化本地模式。
第二步,指定執行的角色,這裏咱們假設您是在 Amazon SageMaker Notebook 上執行的,若是是其餘環境,您可能須要手動指定角色的 ARN 。
第三步,設定超參數,這裏須要對應到您程序中所需的超參數。
第四步,設定訓練機型爲 local 或者 local_gpu (支持 GPU )。
第五步,建立 Estimator,這裏須要傳入以前得到的角色、訓練機型、機器數量、鏡像名稱、超參數等。
第六步,啓動訓練,這裏須要傳入訓練數據的位置,在本地模式下,訓練數據的位置能夠設置成本地路徑。

9.png

訓練啓動後,咱們能夠看到訓練的日誌輸出,以及監控本機的 GPU 、 CPU 、內存等的使用率等狀況,以確認程序能夠正常工做。

若是在此過程當中須要進入正在運行的容器內調試,咱們可使用 docker ps 命令獲取當前正在運行的容器 ID ,並使用 docker exec -it <CONTAINER ID> /bin/bash 進入容器內進行調試。

  • Amazon SageMaker測試

在本地測試和上傳鏡像到 Amazon ECR 完成後,咱們可使用 Amazon SageMaker 進行測試:

第一步,上傳數據到 Amazon S3 ,獲取鏡像在 Amazon ECR 的地址。
第二步,指定執行的角色,這裏咱們假設您是在 Amazon SageMaker Notebook 上執行的,若是是其餘環境,您可能須要手動指定角色的 ARN 。
第三步,設定超參數,這裏須要對應到您程序中所需的超參數。
第四步,設定訓練機型爲 ml.p2.xlarge (支持 GPU )。
第五步,建立 Estimator ,這裏須要傳入以前得到的角色、訓練機型、機器數量、鏡像地址、超參數等。
第六步,啓動訓練,這裏須要傳入訓練數據的位置,在 Amazon SageMaker 模式下,訓練數據的位置須要設置成 Amazon S3 路徑。

10.png

訓練啓動後,咱們能夠在 Amazon SageMaker 控制檯看到這個訓練任務,點進詳情能夠看到訓練的詳情,日誌輸出,以及監控機器的 GPU 、 CPU 、內存等的使用率等狀況,以確認程序能夠正常工做。

11.png
12.png
13.png
14.png

在此過程當中咱們沒法進入正在運行的容器內調試,您能夠將盡可能多的日誌打印出來,或者輸出到 /opt/ml/output 路徑下,該路徑下的全部文件在訓練完成後會被自動打包成 output.tar.gz 放到設定好的位於 Amazon S3 的輸出路徑下。

  • 訓練結果

本文所示程序使用了 MSRA 公開的中文實體識別數據集進行訓練,在訓練 3 輪以後,最優的 F1 值就能夠達到 0.948345 ,屬於比較領先的結果。

15.png

3.自定義腳本(BYOS)

使用 BYOS 的方法和 BYOC 的不一樣之處在於:BYOC 是使用用戶本身建立的鏡像來運行程序,更適用於用戶對鏡像自定義程度較高的使用情景;而 BYOS 是使用預先構建好的鏡像,只是傳入用戶本身的代碼來運行程序,不須要用戶本身調試鏡像,更適用於比較簡單的使用情景。

因爲不須要編譯自定義鏡像,咱們能夠直接進行本地測試和 Amazon SageMaker 測試,完整流程見tensorflow_script_mode_quickstart.ipynb。

  • 本地測試

咱們可使用 Amazon SageMaker 的本地模式進行本地測試:

第一步,執行 utils/setup.sh 來初始化本地模式。
第二步,指定執行的角色,這裏咱們假設您是在 Amazon SageMaker Notebook 上執行的,若是是其餘環境,您可能須要手動指定角色的 ARN 。
第三步,設定超參數,這裏須要對應到您程序中所需的超參數。
第四步,設定訓練機型爲 local 或者 local_gpu (支持GPU)。
第五步,建立一個名爲 TensorFlow 的 Estimator ,這裏須要傳入訓練入口腳本(entry_point)、源代碼路徑(source_dir)、以前得到的角色、訓練機型、機器數量、 TensorFlow 版本、 Python 版本、超參數等。
第六步,啓動訓練,這裏須要傳入訓練數據的位置,在本地模式下,訓練數據的位置能夠設置成本地路徑。

16.png

這裏咱們能夠注意到 estimator.fit ()傳入的參數與 BYOC 略有不一樣,這兩個寫法實際上是等價的,事實上,這裏的寫法更規範一些,按照 Amazon SageMaker 的文檔,輸入數據能夠有多個通道(Channel),默認的通道是 training ,在本文的代碼中,訓練、驗證等過程其實都是從 training 通道中讀取的數據,因此更規範的作法是,咱們應該額外增長一個通道 validation ,用來存放驗證數據。

訓練啓動後,咱們能夠看到訓練的日誌輸出,以及監控本機的 GPU、CPU 、內存等的使用率等狀況,以確認程序能夠正常工做。

若是在此過程當中須要進入正在運行的容器內調試,咱們可使用docker ps命令獲取當前正在運行的容器ID,並使用docker exec -it <CONTAINER ID> /bin/bash進入容器內進行調試。另外,咱們使用docker images命令能夠看到Amazon SageMaker自動下載了一個名爲763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-training:1.15.2-gpu-py3的鏡像,該鏡像是由Amazon SageMaker預編譯的。

17.png

  • Amazon SageMaker測試

在本地測試完成後,咱們可使用Amazon SageMaker進行測試:

第一步,上傳數據到Amazon S3。
第二步,指定執行的角色,這裏咱們假設您是在Amazon SageMaker Notebook上執行的,若是是其餘環境,您可能須要手動指定角色的ARN。
第三步,設定超參數,這裏須要對應到您程序中所需的超參數。
第四步,設定訓練機型爲ml.p2.xlarge(支持GPU)。
第五步,建立一個名爲TensorFlow的Estimator,這裏須要傳入訓練入口腳本(entry_point)、源代碼路徑(source_dir)、以前得到的角色、訓練機型、機器數量、TensorFlow版本、Python版本、超參數等。
第六步,啓動訓練,這裏須要傳入訓練數據的位置,在Amazon SageMaker模式下,訓練數據的位置須要設置成Amazon S3路徑。

18.png

訓練啓動後,咱們能夠在Amazon SageMaker控制檯看到這個訓練任務,點進詳情能夠看到訓練的詳情,日誌輸出,以及監控機器的GPU、CPU、內存等的使用率等狀況,以確認程序能夠正常工做。

在這裏,source_dir咱們設置的是本地代碼路徑,Amazon SageMaker會自動將該路徑下的全部代碼和數據拷貝進容器中。此外,BYOS模式還支持 git 路徑做爲代碼路徑,使用方法以下:

19.png

可是,因爲本文所用代碼須要ALBERT預訓練數據,而該數據不包含在git內,因此咱們須要對代碼進行改造,以使得在代碼內下載並解壓數據,纔可以正常訓練。這裏咱們再也不展現如何操做,感興趣的讀者能夠自行嘗試。

4.結論

本文講解了如何使用 Amazon SageMaker運行基於 TensorFlow 的中文命名實體識別,其中算法部分是使用預訓練語言模型ALBERT作中文命名實體識別。

本文展現瞭如何把一個已有項目快速運行到 Amazon SageMaker 上,若是您想使用到 Amazon SageMaker 的更多高級用法,須要對已有項目進行改造,好比支持實時推理、批量推理、斷點從新訓練等,具體能夠查看 Amazon SageMaker 的文檔。

本文所演示的使用方法是基於單機單卡的,Amazon SageMaker 提供基於 Docker 的簡化分佈式 TensorFlow 訓練平臺,若是要將程序擴展到多機多卡進行訓練,能夠參考其餘相關博客。

參考資料

1. 本文代碼:
https://github.com/whn09/albe...

2. 使用預訓練語言模型ALBERT作中文NER:
https://github.com/ProHiryu/a...

3. 海量中文預訓練ALBERT模型:
https://github.com/brightmart..._zh

4. ALBERT論文:
https://arxiv.org/pdf/1909.11...

5. 命名實體識別 – Named-entity recognition | NER:
https://easyai.tech/ai-defini...

號外,號外,號外!!!

今天晚上8點,前浪清華學霸 UP 主現身B站直播間,教你們遷移TensorFlow 腳本至 Amazon SageMaker,歡迎你們來圍觀。
直播通道:https://live.bilibili.com/219...

B站第二期.jpg

底圖2.png

相關文章
相關標籤/搜索