□編譯/徐子淇、李煜
打造NLP文本分類深度學(xué)習(xí)方法庫
□編譯/徐子淇、李煜
這個庫的目的是探索用深度學(xué)習(xí)進行NLP文本分類的方法。它具有文本分類的各種基準模型。它還支持多標簽分類,其中多標簽與句子或文檔相關(guān)聯(lián)。
雖然這些模型大都看似簡單,可能不會讓你游刃有余地進行這項文本分類任務(wù)。但是其中還是有一些非常經(jīng)典的模型,可以說是非常適合作為基準模型的。
每個模型在模型類型下都有一個測試函數(shù)。
我們探討了用兩個seq2seq模型(帶有注意的seq2seq模型,以及transformer:attention is all you need)進行文本分類。同時,這兩個模型也可以用于生成序列和其他任務(wù)。如果你的任務(wù)是多標簽分類,那么你就可以將問題轉(zhuǎn)化為序列生成。
我們實現(xiàn)了一個記憶網(wǎng)絡(luò):循環(huán)實體網(wǎng)絡(luò)(recurrent entity network),追蹤世界的狀態(tài)。它用鍵值對塊(blocks of key-value pairs)作為記憶,并行運行,從而獲得新的狀態(tài)。它可以用于使用上下文(或歷史)來回答建模問題。例如,你可以讓模型讀取一些句子(作為文本),并提出一個問題(作為查詢),然后請求模型預(yù)測答案;如果你像查詢一樣向其提供一些素材資源,那么它就可以進行分類任務(wù)。Network)
1. fastText
2. TextCNN
3. TextRNN
4. RCNN
5. 分層注意網(wǎng)絡(luò)(Hierarchical Attention Network)
6. 具有注意的seq2seq模型(seq2seq with attention)
7. Transformer("Attend Is All You Need")
8. 動態(tài)記憶網(wǎng)絡(luò)(Dynamic Memory
9. 實體網(wǎng)絡(luò):追蹤世界的狀態(tài)
1. BiLstm Text Relation
2. Two CNN Text Relation
3. BiLstm Text Relation Two RNN
(多標簽預(yù)測任務(wù),要求預(yù)測能夠達到前5名,300萬訓(xùn)練數(shù)據(jù),滿分:0.5)
注意:“HierAtteNetwork”是指Hierarchical Attention Network
1. 模型在xxx_model.py中
2. 運行python xxx_train.py來訓(xùn)練模型
3. 運行python xxx_predict.py進行推理(測試)
每個模型在模型下都有一個測試方法。你可以先運行測試方法檢查模型是否能正常工作。
python 2.7+tensorflow 1.1
(tensorflow 1.2也是可以應(yīng)用的;大多數(shù)模型也應(yīng)該在其他tensorflow版本中正常應(yīng)用,因為我們在某些版本中只是添了非常少的特征變化;如果你使用的是python 3.5,只要更改print / try catch函數(shù),它也會運行得很好。)
注:一些util函數(shù)是在data_util.py中的;典型輸入如:“x1 x2 x3 x4 x5 label 323434”,其中“x1,x2”是單詞,“323434”是標簽;它具有一個將預(yù)訓(xùn)練的單詞加載和分配嵌入到模型的函數(shù),其中單詞嵌入在word2vec或fastText中進行預(yù)先訓(xùn)練。
《用于高效文本分類的技巧》(Bag of Tricks for Efficient Text Classification)論文的實現(xiàn)。
① 使用bi-gram 或者tri-gram。
② 使用NCE損失,加速我們的softmax計算(不使用原始論文中的層次softmax)結(jié)果:性能與原始論文中的一樣好,速度也非???。
查看:p5_fastTextB_model.py
《用于句子分類的卷積神經(jīng)網(wǎng)絡(luò)》(Convolutional Neural Networks for Sentence Classification)論文的實現(xiàn)。
結(jié)構(gòu):降維---> conv ---> 最大池化--->完全連接層--------> softmax。
查看:p7_Text CNN_model.py
為了能夠使用TextCNN獲得非常好的結(jié)果,你還需要仔細閱讀此論文“用于句子分類的卷積神經(jīng)網(wǎng)絡(luò)靈敏度分析(和從業(yè)者指南)”【A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification】,它可以幫助你了解一些影響性能的相關(guān)見解。當然,你還需要根據(jù)具體任務(wù)來更改某些設(shè)置。
結(jié)構(gòu):降維--->雙向lstm ---> concat輸出--->平均 -----> softmax。
查看:p8_Text RNN_model.py
結(jié)構(gòu)與Text RNN相同。但輸入是被特別設(shè)計的。例如:輸入“這臺電腦多少錢?筆記本電腦的股票價格(how much is the computer? EOS price of laptop)”?!癊OS”是一個特殊的標記,將問題1和問題2分開。
查看:p9_BiLstm Text Relation_model.py
結(jié)構(gòu):首先用兩個不同的卷積來提取兩個句子的特征,然后連接兩個函數(shù),使用線性變換層將映射輸出到目標標簽上,然后使用softmax。
查看:p9_two CNN Text Relation_model.py
結(jié)構(gòu):一個句子的一個雙向lstm(得到輸出1),另一個句子的另一個雙向lstm(得到輸出2),最終softmax(輸出1 M輸出2)。
查看:p9_BiLstm Text Relation Two RNN_model.py
有關(guān)更多詳細信息,你可以訪問:《Deep Learning for Chatbots》的第2部分—在Tensorflow中實現(xiàn)一個基于檢索的模型(Implementing a Retrieval-Based Model in Tensorflow)。
用于文本分類的循環(huán)卷積神經(jīng)網(wǎng)絡(luò)。
《用于文本分類的循環(huán)卷積神經(jīng)網(wǎng)絡(luò)》(Recurrent Convolutional Neural Network for Text Classification)論文的實現(xiàn)。
結(jié)構(gòu):① 循環(huán)結(jié)構(gòu)(卷積層);② 最大池化;③ 完全連接層+ softmax。
它用左側(cè)文本和右側(cè)文本學(xué)習(xí)句子或文檔中的每個單詞的表示:
表示當前單詞= [left_side_context_vector,current_word_embedding,right_side_context_vecotor]。
對于左側(cè)文本,它使用一個循環(huán)結(jié)構(gòu),前一個單詞的非線性轉(zhuǎn)換與左側(cè)上一個文本相結(jié)合;右側(cè)文本與其類似。
查看:p71_TextRCNN_model.py
《用于文檔分類的分層注意網(wǎng)絡(luò)》(Hierarchical Attention Networks for Document Classification )論文的實現(xiàn)。
結(jié)構(gòu):
① 降維;
② 詞編碼器:詞級雙向GRU,以獲得豐富的詞匯表征;
③ 詞注意:詞級注意在句子中獲取重要信息;
④ 句子編碼器:句子級雙向GRU,以獲得豐富的句子表征;
⑤ 句子注意:句級注意以獲得句子中的重點句子;
⑥ FC + Softmax。
數(shù)據(jù)輸入:
一般來說,這個模型的輸入應(yīng)該是幾個句子,而不是一個句子。形式是:[None,sentence_lenght]。其中None意味著batch_size。
在訓(xùn)練數(shù)據(jù)中,對于每個樣本來說,有四個部分,每個部分具有相同的長度,將四個部分形成一個單一的句子。該模型將句子分為四部分,形成一個形狀為:[None,num_sentence,sentence_length]的張量。其中num_sentence是句子的個數(shù)(在設(shè)置中,其值等于4)。
查看:p1_HierarchicalAttention_model.py
具有注意的Seq2seq模型的實現(xiàn)是通過《共同學(xué)習(xí)排列和翻譯的神經(jīng)機器翻譯》來實現(xiàn)的。
結(jié)構(gòu):
① 降維;
② bi-GRU也從源語句(向前和向后)獲取豐富的表示;
③ 具有注意的解碼器。
數(shù)據(jù)輸入:
使用三種輸入方法中的兩種:
① 編碼器輸入,這是一個句子;
② 解碼器輸入,是固定長度的標簽列表;
③ 目標標簽,它也是一個標簽列表。
例如,標簽是:“L1 L2 L3 L4”,則解碼器輸入為:[_ GO,L1,L2,L2,L3,_PAD];目標標簽為:[L1,L2,L3,L3,_END,_PAD]。長度固定為6,任何超出標簽將被截斷,如果標簽不足,將其填充完整。
注意機制:
① 傳輸編碼器輸入列表和解碼器的隱藏狀態(tài);
② 計算每個編碼器輸入隱藏狀態(tài)的相似度,以獲得每個編碼器輸入的可能性分布;
③ 基于可能性分布的編碼器輸入的加權(quán)和。
通過RNN Cell使用這個權(quán)重和解碼器輸入以獲得新的隱藏狀態(tài)。
Vanilla E編碼解碼工作原理:
在解碼器中,源語句將使用RNN作為固定大小向量(“思想向量”)進行編碼:
當訓(xùn)練時,使用另一個RNN嘗試通過使用這個“思想向量”作為初始化狀態(tài)獲取一個單詞,并從每個時間戳的解碼器輸入中獲取輸入。解碼器從特殊指令“_GO”開始。在執(zhí)行一步之后,新的隱藏狀態(tài)將與新輸入一起獲得,可以繼續(xù)此過程,直到達到特殊指令“_END”。我們可以通過計算對數(shù)和目標標簽的交叉熵損失來計算損失。logits是通過隱藏狀態(tài)的映射層(對于解碼器步驟的輸出,在GRU中,我們可以僅使用來自解碼器的隱藏狀態(tài)作為輸出)。
當測試時,沒有標簽,所以我們應(yīng)該提供從以前的時間戳獲得的輸出,并繼續(xù)進程直到我們到達“_END”指令。
注意事項:
在這里使用兩種詞匯,一個是由編碼器使用的單詞; 另一個是用于解碼器的標簽。
對于詞匯表,插入三個特殊指令:“_GO”,“_ END”,“_ PAD”; “_UNK”不被使用,因為所有標簽都是預(yù)先定義的。
狀態(tài):完成主要部分,能夠在任務(wù)中產(chǎn)生序列的相反順序。你可以通過在模型中運行測試函數(shù)來檢查它。然而,我還沒有在實際任務(wù)中獲得有用的結(jié)果。我們在模型中也使用并行的style.layer規(guī)范化、殘余連接和掩碼。
對于每個構(gòu)建塊,下面的每個文件中都包含測試函數(shù),并且已經(jīng)成功測試了每個小塊的性能。
帶注意的序列到序列是解決序列生成問題的典型模型,如翻譯、對話系統(tǒng)。大多數(shù)情況下,它使用RNN完成這些任務(wù)。直到最近,人們也應(yīng)用卷積神經(jīng)網(wǎng)絡(luò)進行序列順序問題。但是,Transformer,它僅僅依靠注意機制執(zhí)行這些任務(wù),便能快速地實現(xiàn)新的最先進的結(jié)果。
它還有兩個主要部分:編碼器和解碼器。
編碼器:
共6層,每個層都有兩個子層。第一層是多向自我注意機制;第二層是位置的全連接前饋網(wǎng)絡(luò)。對于每個子層使用LayerNorm(x+ Sublayer(x)),維度= 512。
解碼器:
① 解碼器由N = 6個相同層的堆疊組成;
② 除了每個編碼器層中的兩個子層之外,解碼器插入第三子層,其在編碼器堆棧的輸出上執(zhí)行多向注意;
③ 與編碼器類似,我們采用圍繞每個子層的殘余連接,然后進行層歸一化。我們還修改解碼器堆棧中的自我注意子層,以防止位置參與到后續(xù)位置。這種掩蔽與輸出嵌入偏移一個位置的事實相結(jié)合的操作確保了位置i的預(yù)測只能取決于位于小于i的位置的已知輸出。
模型中的突出特點:
① 多向自我注意:使用自我注意,線性變換多次獲取關(guān)鍵值的映射,然后開始注意機制;
② 一些提高性能的技巧(剩余連接、位置編碼、前饋、標簽平滑、掩碼以忽略我們想忽略的事情)。
有關(guān)模型的詳細信息,請查看:a2_transformer.py
輸入:
① 故事:它是多句話,作為上下文;
② 問題:一個句子,這是一個問題;
③ 回答:一個單一的標簽。
型號結(jié)構(gòu):
① 輸入編碼:使用一個詞來編碼故事(上下文)和查詢(問題);通過使用位置掩碼將位置考慮在內(nèi)。
通過使用雙向rnn編碼故事和查詢,性能從0.392提高到0.398,增長了1.5%。
② 動態(tài)記憶:
a. 通過使用鍵的“相似性”,輸入故事的值來計算門控;
b. 通過轉(zhuǎn)換每個鍵、值和輸入來獲取候選隱藏狀態(tài);
c. 組合門和候選隱藏狀態(tài)來更新當前的隱藏狀態(tài)。
③ 輸出(使用注意機制):
a. 通過計算查詢和隱藏狀態(tài)的“相似性”來獲得可能性分布;
b. 使用可能性分布獲得隱藏狀態(tài)的加權(quán)和;
c. 查詢和隱藏狀態(tài)的非線性變換獲得預(yù)測標簽。
這個模型的關(guān)鍵點:
① 使用彼此獨立的鍵和值塊,可以并行運行;
② 上下文和問題一起建模。使用記憶來追蹤世界的狀態(tài),并使用隱性狀態(tài)和問題(查詢)的非線性變換進行預(yù)測;
③ 簡單的型號也可以實現(xiàn)非常好的性能,可以簡單的編碼作為詞的使用包。
有關(guān)模型的詳細信息,請查看:a3_entity_network.py
在這個模型下,它包含一個測試函數(shù),它要求這個模型計算故事(上下文)和查詢(問題)的數(shù)字,但故事的權(quán)重小于查詢。
模塊:Outlook
① 輸入模塊:將原始文本編碼為向量表示。
② 問題模塊:將問題編碼為向量表示。
③ 獨特的記憶模塊:通過輸入,通過注意機制選擇哪些部分輸入,將問題和以前的記憶考慮在內(nèi)====>它將產(chǎn)生“記憶”向量。
④ 答案模塊:從最終的記憶向量生成答案。
詳情:
① 輸入模塊:
一個句子:使用gru獲取隱藏狀態(tài)b.list的句子,使用gru獲取每個句子的隱藏狀態(tài)。例如 [隱藏狀態(tài)1,隱藏狀態(tài)2,隱藏狀態(tài)...隱藏狀態(tài)n]。
② 問題模塊:使用gru獲取隱藏狀態(tài)。
③ 記憶模塊:使用注意機制和循環(huán)網(wǎng)絡(luò)來更新其記憶。
a.需要多集===>傳遞推理。
e.g. ask where is the football? it will attend to sentence of "john put down the football"),then in second pass, it need to attend location of john.
b.注意機制:
two-layer feed forward nueral network.input is candidate fact c,previous memory m and question q. feature get by take: elementwise,matmul and absolute distance of q with c,and q with m.
c.記 憶 更 新 機 制:h = f(c,h_previous,g)。 最后一個隱藏狀態(tài)是應(yīng)答模塊的輸入。
④ 答案模塊:
要做的事情:
① 文本分類的字符級卷積網(wǎng)絡(luò);
② 文本分類的卷積神經(jīng)網(wǎng)絡(luò):淺詞級與深字符級;
③ 文本分類的深度卷積網(wǎng)絡(luò);
④ 半監(jiān)督文本分類的對抗訓(xùn)練方法。