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