廣告行業中那些趣事系列5:BERT實戰多標籤標註模型(附github源碼)

微信公衆號:數據拾光者。願結交更多的小夥伴,一同走人生路。

摘要:之前廣告行業中那些趣事系列2:BERT實戰NLP文本分類任務(附github源碼),我們通過BERT構建了二分類器。這裏根據實際項目需要使用BERT構建多標籤標註模型,可通過一個模型識別多類標籤,極大提升建模效率。實際項目中會根據業務需要同時使用二分類器和多標籤標註模型完成文本識別任務。

通過本篇學習,小夥伴們可以使用BERT模型來解決多標籤標註任務。對數據挖掘、數據分析和自然語言處理感興趣的小夥伴可以多多關注。

 

目錄

01 多標籤標註任務背景介紹

02 多標籤標註任務VS二分類任務

03 BERT構建多標籤標註模型實戰

 

01 多標籤標註任務背景介紹

之前講過BERT構建二分類器的項目實戰,我們需要識別用戶的搜索是否對傳奇遊戲感興趣。實際項目中我們的興趣類目體系非常複雜,並且有嚴格的層級結構。假如我們現在有個類目體系如下:

  • 遊戲
    • 傳奇遊戲
    • 消除遊戲
    • 魔幻遊戲
  • 汽車
  • 明星
  • 理財

通常情況下用戶的搜索不僅僅對一個標籤有興趣,可能同時對多個標籤感興趣,或者都沒有興趣,僅僅是無效的搜索。這種情況下如果僅僅使用二分類器工作量異常繁多。如果我們有上百甚至上千個標籤,我們是不是就需要上百甚至上千個二分類器?這顯然不合理。

有些小夥伴說,那我們可以使用多分類器。對,使用多分類器可以很好的緩解這個問題。但是多分類器下一條數據只會劃分到一類,各類之間是互斥的,還是無法解決用戶的一條搜索可能對應多個標籤的情況。我們需要的是多標籤標註模型。

小結下,在複雜的興趣類目體系中,用戶的搜索可能同時對應多個興趣標籤,所以我們需要構建多標籤標註模型。

02 多標籤標註任務VS多分類任務

這裏通過一張圖來很好的說明多分類任務和多標籤標註任務的區別和聯繫。注意二分類任務僅僅是多分類任務的一個特例。

圖1 多分類任務和多標籤標註任務

 

多分類任務的特點是一條用戶query只能屬於一個標籤。二分類是多分類任務的特例,如果我們現在用來識別用戶query是不是屬於傳奇標籤,這就是一個最簡單的二分類任務。屬於和不屬於可以分別代表label1和label2。

多標籤標註模型的特點則是一條用戶query可能同時屬於多個標籤,也可能一個都不屬於。舉個例子來說“成龍大哥代言的一刀傳奇好玩麼”,可能既屬於上面興趣類目體系中的傳奇遊戲標籤,還屬於明星標籤。

最通俗的理解二分類器、多分類器和多標籤標註任務的方法可能是咱們小時候經常考試的試題了。二分類器可以對應咱們做的判斷對錯題,多分類器則對應單項選擇題(候選項多於兩個),而多標籤標註模型則對應多項選擇題,只是這裏稍有區別是多標籤標註模型可以都不選。小夥伴可以通過這個例子明白其中的區別和聯繫。

使用多標籤標註模型的好處在於我們可以構建一個模型識別多個標籤,不僅可以充分的利用數據源,而且可以提升建模效率。缺點在於多標籤標註模型的各項評價指標可能不如二分類器那麼好。這個其實非常好理解,讓你去做判斷對錯題和多項選擇題,一般人都是判斷題做的更好點吧。

實際項目中一般是同時使用二分類器和多標籤標註模型。對於原始的用戶query可能通過一個三俗二分類器進行過濾。將數據中的三俗數據過濾之後能很好的提升標註數據質量。三俗數據對於興趣建模本身沒有什麼意義。如果不進行過濾,會降低標註數據的效率。舉例來說,現在需要標註10W的用戶query數據。通常情況下10W數據裏會摻雜20%以上的三俗數據。通過三俗二分類器我們可以提前將這2W多的數據過濾,然後只需要提交剩下的8W數據給標註團隊,提升了20%以上的標註效率。

經過三俗分類器之後會構建一個基於一級類目的多標籤標註模型,將用戶query數據分類到各個一級類目中,最後就是根據不同的業務需求來進行文本識別了。這裏一個小訣竅是對於一些多標籤標註模型中某些效果不理想的標籤,可以通過二分類器來重點識別,這樣既可以享受到多標籤標註模型的高效,還能享受到二分類器的高準確率。具體項目使用策略如下圖所示:

圖2 多標籤標註模型和二分類器結合使用

 

03 BERT構建多標籤標註模型實戰

通過BERT模型構建多標籤標註模型。下面是項目github鏈接:

https://github.com/wilsonlsm006/NLP_BERT_multi_label。也歡迎小夥伴們多多fork,多多關注我。

項目目錄結構如下:

和二分類模型類似,多標籤標註項目主要分成四個部分:

1. bert預訓練模型


廣告系列的第二篇已經講過BERT是預訓練+fine-tuning的二階段模型。這裏簡單的提一句,預訓練過程就相當於我們使用大量的文本訓練語料,使得BERT模型學會很多語言學知識。而這部分就是學習語言學知識得到的相關參數。

之前二分類器的模型使用的是基於google的TensorFlow框架的keras_bert完成的二分類器。後面因爲實際項目中慢慢往pytorch框架遷移,所以這個多標籤標註模型是基於pytorch框架的fast_ai開發完成的。fast_ai類似keras_bert,採用非常簡單的代碼結構即可將BERT模型用於我們的NLP任務中。

Pytorch將BERT模型進行改造,各個版本的路徑及下載地址如下:

因爲實際項目中我們主要識別中文,所以選擇最後一個“bert-base-chinese”作爲我們的BERT預訓練模型。下載完成解壓之後會得到bert_config.json和pytorch_model.bin兩個文件,然後加上之前的詞表vocab.txt一起復制到我們的bert_model目錄下。該過程即可完成。

2. 訓練數據集

之前說過二分類器模型的數據輸入格式是ocr,label樣式的。ocr是用戶query,也是我們需要識別的目標。Label則代表這句query是不是對某個標籤感興趣,取值爲0或者1,1代表感興趣,0代表沒有興趣。

多標籤標註任務中,數據輸入格式分成兩部分,第一部分也是ocr,是我們需要識別的用戶query。第二部分由多個字段組成,需要識別幾個標籤,就有幾個字段。舉例來說,我們現在需要識別用戶的query是不是屬於五個標籤。那麼現在我們訓練集的格式就是ocr,lable1,label2,label3,label4,label5。實際數據舉例如下:

“成龍大哥代言的一刀傳奇好玩麼?”,1,0,0,1,1。這條數據代表用戶這條query同時屬於標籤1、標籤4和標籤5。

訓練數據集分成訓練集和測試集。模型訓練中我們會用訓練集去完成模型訓練。然後用這個訓練好的模型去測試集上檢查模型的識別能力。這裏訓練集和測試集是完全互斥的,所以通過查看測試集的效果能一定程度上反映這個模型上線之後的識別能力。因爲線上的數據和測試集的數據分佈可能不同,所以測試集的效果可能和線上效果存在差異。

3. 模型代碼及腳本

之前二分類器項目中只有代碼。很多小夥伴私信反應說在訓練、驗證和測試過程中可能還要修改相關參數,比較麻煩。這裏在多標籤模型中通過shell腳本調用python代碼能很好的解決這個問題。只要數據輸入格式和上面講的相同。針對不同的任務只需要修改shell腳本即可完成模型。

模型代碼主要分成三部分:

multi_label_train.py:模型訓練代碼。

這裏通過具體使用模型訓練任務的腳本來詳細說明模型訓練代碼的輸入和輸出。對應train_multi_tag.sh腳本:

輸入:模型訓練需要使用BERT預訓練模型和訓練集,所以需要配置的參數有訓練數據的路徑TRAIN_DATA和BERT預訓練任務的路徑BERT_MODEL_NAME

輸出:模型訓練完成之後會得到一個xxxx.pth文件,所以需要配置的參數有MODEL_SAVE_PATH。因爲在模型訓練階段,可能多進行多次訓練,所以需要存儲不同的模型,這個通過配置LAB_FLAG來識別實驗。

具體模型訓練只需要在服務器下直接通過sh train_multi_tag.sh開始訓練任務。

multi_label_validate.py:模型驗證代碼。

模型驗證部分主要是爲了驗證模型的各項效果指標,我們主要使用準確率、精度、召回率、f1得分等來評估模型。

輸入:模型驗證需要上一個訓練過程得到的模型和測試集。對應腳本中需要配置的參數有TEST_DATA和MODEL_LOAD_PATH

輸出:模型輸出爲測試集上的預測數據以及模型的各項指標數據,對應腳本中的TEST_PREDICT_DATA和MODEL_EVALUATE_DATA。

multi_label_predict.py:模型預測代碼。

當整個模型開發完成之後,會使用訓練集和測試集同時作爲新的訓練集去訓練模型,得到一個最終的模型。這個模型也是要拿到線上去跑的。

輸入:這裏需要最終得到的模型和線上需要真正預測的數據,對應腳本中的TEST_DATA和MODEL_LOAD_PATH。

輸出:預測輸出的部分就是線上真正預測的結果數據,對應腳本中TEST_PREDICT_DATA參數。

4. 訓練完成得到的模型

這一部分就是上面訓練過程的結果。我們需要使用這個訓練好的模型去部署上線進行線上數據的預測。這裏和之前二分類器有所不同,二分類器得到的是一個XX.hdf5文件,而多標籤標註模型得到的是一個XX.pth文件。其他和之前講過的二分類器類似,這裏不再贅述。

總結下,我們通過項目實戰完成一個多標籤標註模型,從模型訓練到模型驗證,再到最後上線預測流程。模型通用性較強,我們只需要更改腳本代碼即可迅速完成線上任務。

 

總結和預告

本篇從實際項目出發完成了一個多標籤標註模型。實際文本分類任務中,我們會根據具體業務需要同時使用多標籤標註模型和二分類器。由於NLP任務和傳統的機器學習任務有所不同,我們不需要做過多的特徵工程,但是對於文本語料的預處理非常重要。除此之外,樣本的選擇也很有技巧性。這裏需要不斷積累經驗,才能根據實際的業務需要調整模型。

喜歡本類型文章的小夥伴可以關注我的微信公衆號:數據拾光者。有任何干貨我會首先發布在微信公衆號,還會同步在知乎、頭條、簡書、csdn等平臺。也歡迎小夥伴多交流。如果有問題,可以在微信公衆號隨時Q我哈。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章