日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文本分类和序列标注“深度”实践

發布時間:2024/10/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文本分类和序列标注“深度”实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?PaperWeekly 原創 ·?作者|周曉江

研究方向|文本分類、文本聚類

本文的主要目的是推廣 UNF 代碼庫,該代碼庫由筆者在實際工作中做文本分類和序列標注的相關經驗抽象而來,歡迎 fork 和交流。

項目地址:https://github.com/waterzxj/UNF

全文分三部分,第一部分是相關動機,介紹這個項目為什么會出現;第二部分是理論分析部分,通過近些年一些頂會論文來簡要梳理文本分類和序列標注兩個任務的發展脈絡;第三部分是實踐部分,也是本文最重要的部分,會介紹筆者實現的一個通用代碼庫,方便實現上述理論部分的模型,并且提供基礎組件方便應用者做二次開發,詳細的介紹會放到實踐部分介紹。

項目動機

文本分類和序列標注是入門 NLP 最好的兩個任務,覆蓋了常用 NLP 任務的流程,因此掌握了這兩個任務,也能方便的拓展到其他任務。

筆者搜索了網上這兩個任務相關的項目,發現一個痛點:項目太單一,不夠系統化,這里的系統化是說涵蓋理論介紹,高效的算法實現,到工程化的 server 以及可視化 web 界面(通常一個算法從研究到落地必經的幾個環節)。于是,筆者決定自己動手解決這一痛點。

理論分析

文本分類相關理論?

這部分將通過 6 篇頂會論文,簡要介紹文本分類領域是如何從最初的淺層的 CNN 發展到深層的 CNN,到如何在 LSTM 中有效結合 attention 結構,再到結合 label-embedding 的 zero-shot 文本分類,最后是當下比較火的基于 transformer 的文本分類。因為本文的重點是工程實踐部分,所以詳細的論文介紹讀者可以直接參考原 paper。

論文標題:Convolutional Neural Networks for Sentence Classification

論文鏈接:https://arxiv.org/abs/1408.5882

源碼鏈接:https://github.com/yoonkim/CNN_sentence

TextCNN 分類算法的核心架構如上圖表示所示。算法通常通過四步完成:

  • 將原始的 one-hot 文本經過 word embedding 變成稠密的向量表示;

  • 經過一層 1 維的卷積層,可選擇多個 filter,每個 filter 表示一個特征;

  • 對上一步得到的每個卷積向量做 max-pooling 操作,最后每一個卷積得到一維向量,把所有的 max-pooling 結果 concat 起來,最終得到句子的向量表示;

  • 將句子向量經過一層全連接層,然后過 softmax-loss。

論文標題:Deep Pyramid Convolutional Neural Networks for Text Categorization

論文鏈接:https://www.aclweb.org/anthology/P17-1052

源碼鏈接:https://github.com/riejohnson/ConText

DpCNN 分類算法在 TextCNN 的基礎上引入了多層 CNN 的機制,主要是為了解決語言中長距離語義關系捕獲的問題,并且經過精心設計的網絡結構在算法復雜度上是常數,并不會因為網絡的加深而增加復雜度。整個網絡結構如上圖所示。

DpCNN 算法的關鍵點:?

reigion embedding:region embedding 可以看做是在原始的 word embedding 基礎上先做了一層淺層的 TextCNN,不過論文中沒有保留詞序的信息,作者通過實驗證明了原始的 TextCNN 的做法更加容易過擬合。?

等長卷積:等長卷積物理意義是序列信息經過卷積層之后是等長輸出的,表示輸出的每個詞都建模了這個詞左右 n/2 個詞的語義信息。?

堆疊卷積層:為了能解決長距離語義特征的問題,作者采用了加深卷積層來解決。然而"Do Convolutional Networks need to be Deep for Text Classification"的研究證明了隨機的堆疊卷積層效果會很差,所以必須是精心設計的網絡結構才能取得好的效果,作者在網絡結構中引入了以下幾個設計:

  • 固定 feature-size 數量:不同于圖像里的深層 CNN 一樣,作者設計的網絡里每次 down sampling 的操作都會保持 feature-size 不變,從而減少了網絡的計算量;?

  • pre-activation:激活函數的計算在放到卷積的算之后,作者分析了這樣更有利于深層網絡的訓練;?

  • 1/2 池化層:引入卷積核為 3,stride 等于 2 的 max-pooling 操作,使得每次序列的長度減半,同時也點題,最后的網絡結構就是一個類似"金字塔"形的。?

  • 殘差連接:引入了圖像中深層網絡訓練的殘差連接機制,從而保證了深層網絡的順利訓練。

論文標題:Hierarchical Attention Networks for Document Classification

論文鏈接:https://www.aclweb.org/anthology/N16-1174

復現代碼:https://github.com/tqtg/hierarchical-attention-networks

HAN 的網絡模型結構如上圖所示。?

HAN 的主要 motivation 是采用層次的網絡結構建模 document 的層級結構。sentence embedding 的結果采用基于 additive attention 的方式對 GRU 的編碼結果進行加權平均;doc embedding 采用同樣的方式對 sentence embedding 的結果加權求和得到。

論文標題:A Structured Self-attentive Sentence Embedding

論文鏈接:https://arxiv.org/abs/1703.03130

源碼鏈接:https://github.com/facebookresearch/pytext

這篇論文引入了 multi-head self-attention 的(這里和 transformer 中的 multi-head attention 處理方式不太一樣)思路到文本分類中。這個模型結構有兩個關鍵點:?

  • 在 LSTM 的序列編碼器后引入 multi-head self-attention 的計算,物理意義是每個 attention 捕捉到一個重點語義特征,多個頭捕捉到句子中不同的語義特征,從而也加強了句子長距離語義的捕獲能力;?

  • 對 multi-head 的權重矩陣引入正則項,做法是使得 multi-attention 矩陣之間彼此正交,物理意義是保證 attention 的多樣性,減少彼此間的冗余。筆者在實際實驗中也發現加入這個正則項會有效果的提升。

論文標題:Joint Embedding of Words and Labels for Text Classification

論文鏈接:https://arxiv.org/abs/1805.04174

源碼鏈接:https://github.com/guoyinwang/LEAM

這篇論文作者把 label 的信息引入到句子向量的編碼中,從而產生了更好的 sentence encoder。具體做法如下:?

  • 用 label embedding 矩陣和 word embedding?矩陣做乘法,產生?attention 矩陣,對 word embedding 做加權求和,用來產生?sentence embedding;?

  • 對上一步獲得的 sentence embedding 過 softmax-loss,同時在訓練的時候引入了對 label-embedding 的正則項,使得 label-embebding 直接過 softmax-loss 的損失也同時最小,從而學習更好的 label embedding。

這篇論文提出的模型不僅能獲得分類的結果,同時也能學習一個很好的?label embedding 表示,將 word embedding 和 label embedding 在同一個語義空間進行表示,在基于?zero-short?的分類方法中也能得到很好的應用。

論文標題:How to Fine-Tune BERT for Text Classification?

論文鏈接:https://arxiv.org/abs/1905.05583

源碼鏈接:https://github.com/xuyige/BERT4doc-Classification

基本的思路是在預訓練好的 bert 預訓練模型上,用 cls 向量表征 sentence encoder,在目標任務的數據上做 fine-tune。當然論文中還介紹了一些具體的 fine-tune 策略,比如 lr 的選擇等。

序列標注相關理論

論文標題:Neural Architectures for Named Entity

論文鏈接:https://arxiv.org/abs/1603.01360

源碼鏈接:https://github.com/glample/tagger

這是結合神經網絡做序列標注模型的經典思路。模型結構上在 Bi-LSTM 的句子編碼器上結合 CRF 的 loss 函數,模型實現上還是有很多需要注意的 trick,尤其在 CRF 的實現上。

論文標題:Semi-supervised Multitask Learning for Sequence Labeling

論文鏈接:https://arxiv.org/abs/1704.07156

源碼鏈接:https://github.com/marekrei/sequence-labeler

這篇工作主要為了解決序列標注中,label 主要分布在"O"標簽的問題,也就是大部分 token 的預測都是非目標實體。在上一篇的基礎上引入語言模型multi-task 訓練。如上圖所示。

每個位置需要需要前一個詞、當前的實體類別、下一個詞。通過引入語言模型的目標函數,讓模型建模更深層的語義特征和句法信息。但是整個模型在 infer 階段的模型復雜度并未增加,因為語言模型的目標函數只在訓練階段采用,預測的時候只預測當前詞的實體類別。

論文標題:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

論文鏈接:https://arxiv.org/abs/1810.04805

源碼鏈接:https://github.com/google-research/bert

相比上一個工作,fine-tune 基于語言模型預訓練的 Bert 實踐證明效果更好。其核心點是用 Bert 最后一層每一個 token 的 embedding 接 MLP 或者 CRF 的損失函數進行多分類。

代碼實踐

為了能夠更好的實現上述介紹的算法,于是筆者設計了 UNF 代碼庫,僅 5 行代碼就可以訓練一個文本分類模型,詳見 github,歡迎 fork、star。下面就具體介紹一下這個代碼庫。?

UNF 庫特點?

模塊化(modularity):UNF 庫已經實現了一些經典的文本分類和序列標注模型,用戶可開箱即用;另一方面基于已有的 module,用戶可方便二次開發調研實現一些新的模型或者技術;?

效率(efficiency):支持多 GPU 訓練混合精度訓練, 方便快速訓練模型;?

全面(comprehensive):支持快速搭建 python server;支持 pytorch trace 成靜態圖,支持 c++ server 服務,提供基于 restful api 的前端可視化 debug 界面。

整體架構

模塊結構

模型訓練

#quick?start python3?train_flow.py

Only 5 line code need

#data?loader data_loader?=?DataLoader(data_loader_conf) train_iter,?dev_iter,?test_iter?=?data_loader.generate_dataset()#model?loader model,?model_conf?=?ModelLoader.from_params(model_conf,?data_loader.fields)#learner?loader learner?=?LearnerLoader.from_params(model,?train_iter,?dev_iter,?learner_conf,?test_iter=test_iter,?fields=data_loader.fields,?model_conf=model_conf)#learning learner.learn()

代碼 UNF/train_flow.py 是可直接開箱即跑的示例代碼。

配置中加上如下兩行,即可享受混合精度訓練多卡訓練的功能。

"use_fp16":?True,"multi_gpu":?True

整個訓練過程自動注入 tensorboard 監控。

Python inference

#quick?start python3?score_flow.py

core code:

#core?code from?models.predictor?import?Predictorpredictor?=?Predictor(model_path,?device,?model_type) logits?=?predictor.predict(input)(0.18,?-0.67)

C++ inference?

step 1. 動態圖 trace 成靜態圖

#quick?start python3?trace.py

core code:

#core?code net?=?globals()[model_cls](**config.__dict__) net.load_state_dict_trace(torch.load("%s/best.th"?%?model_path)) net.eval()mock_input?=?net.mock_input_data() tr?=?torch.jit.trace(net,?mock_input) tr.save("trace/%s"?%?save_path)

step 2. c++ serving?

  • install cmake?

  • download libtorch and unzip to trace folder

cd?trace cmake?-DCMAKE_PREFIX_PATH=libtorch?.

make

./predict?trace.pt?predict_vocab.txt output:?2.2128?-2.3287

RESTFUL-API web demo

cd?web_server python?run.py

效果如下:

點擊以下標題查看更多往期內容:?

  • 深度學習預訓練模型可解釋性概覽

  • 如何使用知識圖譜增強信息檢索模型?

  • AAAI 2020?| 可建模語義分層的知識圖譜補全

  • 淺談Knowledge-Injected BERTs

  • BERT+知識圖譜:知識賦能的K-BERT模型

  • 從 Word2Vec 到 BERT

#投 稿 通 道#

?讓你的論文被更多人看到?

如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。

總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?

PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得技術干貨。我們的目的只有一個,讓知識真正流動起來。

?????來稿標準:

? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?

? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?

? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志

???? 投稿郵箱:

? 投稿郵箱:hr@paperweekly.site?

? 所有文章配圖,請單獨在附件中發送?

? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通

????

現在,在「知乎」也能找到我們了

進入知乎首頁搜索「PaperWeekly」

點擊「關注」訂閱我們的專欄吧

關于PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的文本分类和序列标注“深度”实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。