文本分类和序列标注“深度”实践
?PaperWeekly 原創(chuàng) ·?作者|周曉江
研究方向|文本分類、文本聚類
本文的主要目的是推廣 UNF 代碼庫,該代碼庫由筆者在實(shí)際工作中做文本分類和序列標(biāo)注的相關(guān)經(jīng)驗(yàn)抽象而來,歡迎 fork 和交流。
項(xiàng)目地址:https://github.com/waterzxj/UNF
全文分三部分,第一部分是相關(guān)動(dòng)機(jī),介紹這個(gè)項(xiàng)目為什么會(huì)出現(xiàn);第二部分是理論分析部分,通過近些年一些頂會(huì)論文來簡要梳理文本分類和序列標(biāo)注兩個(gè)任務(wù)的發(fā)展脈絡(luò);第三部分是實(shí)踐部分,也是本文最重要的部分,會(huì)介紹筆者實(shí)現(xiàn)的一個(gè)通用代碼庫,方便實(shí)現(xiàn)上述理論部分的模型,并且提供基礎(chǔ)組件方便應(yīng)用者做二次開發(fā),詳細(xì)的介紹會(huì)放到實(shí)踐部分介紹。
項(xiàng)目動(dòng)機(jī)
文本分類和序列標(biāo)注是入門 NLP 最好的兩個(gè)任務(wù),覆蓋了常用 NLP 任務(wù)的流程,因此掌握了這兩個(gè)任務(wù),也能方便的拓展到其他任務(wù)。
筆者搜索了網(wǎng)上這兩個(gè)任務(wù)相關(guān)的項(xiàng)目,發(fā)現(xiàn)一個(gè)痛點(diǎn):項(xiàng)目太單一,不夠系統(tǒng)化,這里的系統(tǒng)化是說涵蓋理論介紹,高效的算法實(shí)現(xiàn),到工程化的 server 以及可視化 web 界面(通常一個(gè)算法從研究到落地必經(jīng)的幾個(gè)環(huán)節(jié))。于是,筆者決定自己動(dòng)手解決這一痛點(diǎn)。
理論分析
文本分類相關(guān)理論?
這部分將通過 6 篇頂會(huì)論文,簡要介紹文本分類領(lǐng)域是如何從最初的淺層的 CNN 發(fā)展到深層的 CNN,到如何在 LSTM 中有效結(jié)合 attention 結(jié)構(gòu),再到結(jié)合 label-embedding 的 zero-shot 文本分類,最后是當(dāng)下比較火的基于 transformer 的文本分類。因?yàn)楸疚牡闹攸c(diǎn)是工程實(shí)踐部分,所以詳細(xì)的論文介紹讀者可以直接參考原 paper。
論文標(biāo)題:Convolutional Neural Networks for Sentence Classification
論文鏈接:https://arxiv.org/abs/1408.5882
源碼鏈接:https://github.com/yoonkim/CNN_sentence
TextCNN 分類算法的核心架構(gòu)如上圖表示所示。算法通常通過四步完成:
將原始的 one-hot 文本經(jīng)過 word embedding 變成稠密的向量表示;
經(jīng)過一層 1 維的卷積層,可選擇多個(gè) filter,每個(gè) filter 表示一個(gè)特征;
對上一步得到的每個(gè)卷積向量做 max-pooling 操作,最后每一個(gè)卷積得到一維向量,把所有的 max-pooling 結(jié)果 concat 起來,最終得到句子的向量表示;
將句子向量經(jīng)過一層全連接層,然后過 softmax-loss。
論文標(biāo)題:Deep Pyramid Convolutional Neural Networks for Text Categorization
論文鏈接:https://www.aclweb.org/anthology/P17-1052
源碼鏈接:https://github.com/riejohnson/ConText
DpCNN 分類算法在 TextCNN 的基礎(chǔ)上引入了多層 CNN 的機(jī)制,主要是為了解決語言中長距離語義關(guān)系捕獲的問題,并且經(jīng)過精心設(shè)計(jì)的網(wǎng)絡(luò)結(jié)構(gòu)在算法復(fù)雜度上是常數(shù),并不會(huì)因?yàn)榫W(wǎng)絡(luò)的加深而增加復(fù)雜度。整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)如上圖所示。
DpCNN 算法的關(guān)鍵點(diǎn):?
reigion embedding:region embedding 可以看做是在原始的 word embedding 基礎(chǔ)上先做了一層淺層的 TextCNN,不過論文中沒有保留詞序的信息,作者通過實(shí)驗(yàn)證明了原始的 TextCNN 的做法更加容易過擬合。?
等長卷積:等長卷積物理意義是序列信息經(jīng)過卷積層之后是等長輸出的,表示輸出的每個(gè)詞都建模了這個(gè)詞左右 n/2 個(gè)詞的語義信息。?
堆疊卷積層:為了能解決長距離語義特征的問題,作者采用了加深卷積層來解決。然而"Do Convolutional Networks need to be Deep for Text Classification"的研究證明了隨機(jī)的堆疊卷積層效果會(huì)很差,所以必須是精心設(shè)計(jì)的網(wǎng)絡(luò)結(jié)構(gòu)才能取得好的效果,作者在網(wǎng)絡(luò)結(jié)構(gòu)中引入了以下幾個(gè)設(shè)計(jì):
固定 feature-size 數(shù)量:不同于圖像里的深層 CNN 一樣,作者設(shè)計(jì)的網(wǎng)絡(luò)里每次 down sampling 的操作都會(huì)保持 feature-size 不變,從而減少了網(wǎng)絡(luò)的計(jì)算量;?
pre-activation:激活函數(shù)的計(jì)算在放到卷積的算之后,作者分析了這樣更有利于深層網(wǎng)絡(luò)的訓(xùn)練;?
1/2 池化層:引入卷積核為 3,stride 等于 2 的 max-pooling 操作,使得每次序列的長度減半,同時(shí)也點(diǎn)題,最后的網(wǎng)絡(luò)結(jié)構(gòu)就是一個(gè)類似"金字塔"形的。?
殘差連接:引入了圖像中深層網(wǎng)絡(luò)訓(xùn)練的殘差連接機(jī)制,從而保證了深層網(wǎng)絡(luò)的順利訓(xùn)練。
論文標(biāo)題:Hierarchical Attention Networks for Document Classification
論文鏈接:https://www.aclweb.org/anthology/N16-1174
復(fù)現(xiàn)代碼:https://github.com/tqtg/hierarchical-attention-networks
HAN 的網(wǎng)絡(luò)模型結(jié)構(gòu)如上圖所示。?
HAN 的主要 motivation 是采用層次的網(wǎng)絡(luò)結(jié)構(gòu)建模 document 的層級(jí)結(jié)構(gòu)。sentence embedding 的結(jié)果采用基于 additive attention 的方式對 GRU 的編碼結(jié)果進(jìn)行加權(quán)平均;doc embedding 采用同樣的方式對 sentence embedding 的結(jié)果加權(quán)求和得到。
論文標(biāo)題: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 處理方式不太一樣)思路到文本分類中。這個(gè)模型結(jié)構(gòu)有兩個(gè)關(guān)鍵點(diǎn):?
在 LSTM 的序列編碼器后引入 multi-head self-attention 的計(jì)算,物理意義是每個(gè) attention 捕捉到一個(gè)重點(diǎn)語義特征,多個(gè)頭捕捉到句子中不同的語義特征,從而也加強(qiáng)了句子長距離語義的捕獲能力;?
對 multi-head 的權(quán)重矩陣引入正則項(xiàng),做法是使得 multi-attention 矩陣之間彼此正交,物理意義是保證 attention 的多樣性,減少彼此間的冗余。筆者在實(shí)際實(shí)驗(yàn)中也發(fā)現(xiàn)加入這個(gè)正則項(xiàng)會(huì)有效果的提升。
論文標(biāo)題:Joint Embedding of Words and Labels for Text Classification
論文鏈接:https://arxiv.org/abs/1805.04174
源碼鏈接:https://github.com/guoyinwang/LEAM
這篇論文作者把 label 的信息引入到句子向量的編碼中,從而產(chǎn)生了更好的 sentence encoder。具體做法如下:?
用 label embedding 矩陣和 word embedding?矩陣做乘法,產(chǎn)生?attention 矩陣,對 word embedding 做加權(quán)求和,用來產(chǎn)生?sentence embedding;?
對上一步獲得的 sentence embedding 過 softmax-loss,同時(shí)在訓(xùn)練的時(shí)候引入了對 label-embedding 的正則項(xiàng),使得 label-embebding 直接過 softmax-loss 的損失也同時(shí)最小,從而學(xué)習(xí)更好的 label embedding。
這篇論文提出的模型不僅能獲得分類的結(jié)果,同時(shí)也能學(xué)習(xí)一個(gè)很好的?label embedding 表示,將 word embedding 和 label embedding 在同一個(gè)語義空間進(jìn)行表示,在基于?zero-short?的分類方法中也能得到很好的應(yīng)用。
論文標(biāo)題:How to Fine-Tune BERT for Text Classification?
論文鏈接:https://arxiv.org/abs/1905.05583
源碼鏈接:https://github.com/xuyige/BERT4doc-Classification
基本的思路是在預(yù)訓(xùn)練好的 bert 預(yù)訓(xùn)練模型上,用 cls 向量表征 sentence encoder,在目標(biāo)任務(wù)的數(shù)據(jù)上做 fine-tune。當(dāng)然論文中還介紹了一些具體的 fine-tune 策略,比如 lr 的選擇等。
序列標(biāo)注相關(guān)理論
論文標(biāo)題:Neural Architectures for Named Entity
論文鏈接:https://arxiv.org/abs/1603.01360
源碼鏈接:https://github.com/glample/tagger
這是結(jié)合神經(jīng)網(wǎng)絡(luò)做序列標(biāo)注模型的經(jīng)典思路。模型結(jié)構(gòu)上在 Bi-LSTM 的句子編碼器上結(jié)合 CRF 的 loss 函數(shù),模型實(shí)現(xiàn)上還是有很多需要注意的 trick,尤其在 CRF 的實(shí)現(xiàn)上。
論文標(biāo)題:Semi-supervised Multitask Learning for Sequence Labeling
論文鏈接:https://arxiv.org/abs/1704.07156
源碼鏈接:https://github.com/marekrei/sequence-labeler
這篇工作主要為了解決序列標(biāo)注中,label 主要分布在"O"標(biāo)簽的問題,也就是大部分 token 的預(yù)測都是非目標(biāo)實(shí)體。在上一篇的基礎(chǔ)上引入語言模型的 multi-task 訓(xùn)練。如上圖所示。
每個(gè)位置需要需要前一個(gè)詞、當(dāng)前的實(shí)體類別、下一個(gè)詞。通過引入語言模型的目標(biāo)函數(shù),讓模型建模更深層的語義特征和句法信息。但是整個(gè)模型在 infer 階段的模型復(fù)雜度并未增加,因?yàn)檎Z言模型的目標(biāo)函數(shù)只在訓(xùn)練階段采用,預(yù)測的時(shí)候只預(yù)測當(dāng)前詞的實(shí)體類別。
論文標(biāo)題:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
論文鏈接:https://arxiv.org/abs/1810.04805
源碼鏈接:https://github.com/google-research/bert
相比上一個(gè)工作,fine-tune 基于語言模型預(yù)訓(xùn)練的 Bert 實(shí)踐證明效果更好。其核心點(diǎn)是用 Bert 最后一層每一個(gè) token 的 embedding 接 MLP 或者 CRF 的損失函數(shù)進(jìn)行多分類。
代碼實(shí)踐
為了能夠更好的實(shí)現(xiàn)上述介紹的算法,于是筆者設(shè)計(jì)了 UNF 代碼庫,僅 5 行代碼就可以訓(xùn)練一個(gè)文本分類模型,詳見 github,歡迎 fork、star。下面就具體介紹一下這個(gè)代碼庫。?
UNF 庫特點(diǎn)?
模塊化(modularity):UNF 庫已經(jīng)實(shí)現(xiàn)了一些經(jīng)典的文本分類和序列標(biāo)注模型,用戶可開箱即用;另一方面基于已有的 module,用戶可方便二次開發(fā)調(diào)研實(shí)現(xiàn)一些新的模型或者技術(shù);?
效率(efficiency):支持多 GPU 訓(xùn)練和混合精度訓(xùn)練, 方便快速訓(xùn)練模型;?
全面(comprehensive):支持快速搭建 python server;支持 pytorch trace 成靜態(tài)圖,支持 c++ server 服務(wù),提供基于 restful api 的前端可視化 debug 界面。
整體架構(gòu)
模塊結(jié)構(gòu)
模型訓(xùn)練
#quick?start python3?train_flow.pyOnly 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 是可直接開箱即跑的示例代碼。
配置中加上如下兩行,即可享受混合精度訓(xùn)練和多卡訓(xùn)練的功能。
"use_fp16":?True,"multi_gpu":?True整個(gè)訓(xùn)練過程自動(dòng)注入 tensorboard 監(jiān)控。
Python inference
#quick?start python3?score_flow.pycore 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. 動(dòng)態(tài)圖 trace 成靜態(tài)圖
#quick?start python3?trace.pycore code:
step 2. c++ serving?
install cmake?
download libtorch and unzip to trace folder
RESTFUL-API web demo
cd?web_server python?run.py效果如下:
點(diǎn)擊以下標(biāo)題查看更多往期內(nèi)容:?
深度學(xué)習(xí)預(yù)訓(xùn)練模型可解釋性概覽
如何使用知識(shí)圖譜增強(qiáng)信息檢索模型?
AAAI 2020?| 可建模語義分層的知識(shí)圖譜補(bǔ)全
淺談Knowledge-Injected BERTs
BERT+知識(shí)圖譜:知識(shí)賦能的K-BERT模型
從 Word2Vec 到 BERT
#投 稿 通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。
總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得或技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來。
?????來稿標(biāo)準(zhǔn):
? 稿件確系個(gè)人原創(chuàng)作品,來稿需注明作者個(gè)人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?
? 如果文章并非首發(fā),請?jiān)谕陡鍟r(shí)提醒并附上所有已發(fā)布鏈接?
? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會(huì)添加“原創(chuàng)”標(biāo)志
???? 投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨(dú)在附件中發(fā)送?
? 請留下即時(shí)聯(lián)系方式(微信或手機(jī)),以便我們在編輯發(fā)布時(shí)和作者溝通
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的文本分类和序列标注“深度”实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝宝巴士旗下多款应用正式上架,引领全场景
- 下一篇: 3万元怎么存收益最大 其实存钱也有很