https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTwpython
這個庫的目的是探索用深度學習進行NLP文本分類的方法。git
它具備文本分類的各類基準模型,還支持多標籤分類,其中多標籤與句子或文檔相關聯。github
雖然這些模型不少都很簡單,可能不會讓你在這項文本分類任務中游刃有餘,可是這些模型中的其中一些是很是經典的,所以它們能夠說是很是適合做爲基準模型的。web
每一個模型在模型類型下都有一個測試函數。網絡
咱們還探討了用兩個seq2seq模型(帶有注意的seq2seq模型,以及transformer:attention is all you need)進行文本分類。同時,這兩個模型也能夠用於生成序列和其餘任務。若是你的任務是多標籤分類,那麼你就能夠將問題轉化爲序列生成。ide
咱們實現了一個記憶網絡:循環實體網絡(recurrent entity network):追蹤世界的狀態。它用鍵值對塊(blocks of key-value pairs)做爲記憶,並行運行,從而得到新的狀態。它能夠用於使用上下文(或歷史)來回答建模問題。例如,你可讓模型讀取一些句子(做爲文本),並提出一個問題(做爲查詢),而後請求模型預測答案;若是你像查詢同樣向其提供故事,那麼它就能夠進行分類任務。函數
若是你想了解更多關於文本分類,或這些模型能夠應用任務的數據集詳細信息,能夠點擊連接進行查詢,咱們選擇了一個:性能
https://biendata.com/competition/zhihu/學習
模型:測試
1.fastText
2.TextCNN
3.TextRNN
4.RCNN
5.分層注意網絡(Hierarchical Attention Network)
6.具備註意的seq2seq模型(seq2seq with attention)
7.Transformer("Attend Is All You Need")
8.動態記憶網絡(Dynamic Memory Network)
9.實體網絡:追蹤世界的狀態
其餘模型:
1.BiLstm Text Relation;
2.Two CNN Text Relation;
3.BiLstm Text Relation Two RNN
性能:
(多標籤預測任務,要求預測可以達到前5,300萬訓練數據,滿分:0.5)
注意:「HierAtteNetwork」是指Hierarchical Attention Network
用途:
模型在xxx_model.py中
運行python xxx_train.py來訓練模型
運行python xxx_predict.py進行推理(測試)。
每一個模型在模型下都有一個測試方法。你能夠先運行測試方法來檢查模型是否能正常工做。
環境:
python 2.7+tensorflow 1.1
(tensorflow 1.2也是能夠應用的;大多數模型也應該在其餘tensorflow版本中正常應用,由於咱們使用很是少的特徵來將其結合到某些版本中;若是你使用的是python 3.5,只要更改print / try catch函數的話,它也會運行得很好。)
注:一些util函數是在data_util.py中的;典型輸入如:「x1 x2 x3 x4 x5 label 323434」,其中「x1,x2」是單詞,「323434」是標籤;它具備一個將預訓練的單詞加載和分配嵌入到模型的函數,其中單詞嵌入在word2vec或fastText中進行預先訓練。
模型細節:
1.快速文本(fast Text)
《用於高效文本分類的技巧》(Bag of Tricks for Efficient Text Classification)論文的實現(https://arxiv.org/abs/1607.01759)
使用bi-gram 或者tri-gram。
使用NCE損失,加速咱們的softmax計算(不使用原始論文中的層次softmax)結果:性能與原始論文中的同樣好,速度也很是快。
查看:p5_fastTextB_model.py
2.文本卷積神經網絡(Text CNN)
《卷積神經網絡進行句子分類》(Convolutional Neural Networks for Sentence Classification)論文的實現。(http://www.aclweb.org/anthology/D14-1181)
結構:降維---> conv ---> 最大池化 --->徹底鏈接層--------> softmax
查看:p7_Text CNN_model.py
爲了可以使用TextCNN得到很是好的結果,你還須要仔細閱讀此論文「用於句子分類的卷積神經網絡靈敏度分析(和從業者指南)」(A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification),它能夠幫助你瞭解一些影響性能的相關看法。(https://arxiv.org/abs/1510.03820)固然,你還須要根據具體任務來更改某些設置。
3.文本循環神經網絡(Text RNN)
結構:降維--->雙向lstm ---> concat輸出--->平均 -----> softmax
查看:p8_Text RNN_model.py
4.雙向長短時間記憶網絡文本關係(BiLstm Text Relation)
結構:結構與Text RNN相同。但輸入是被特別設計的。例如:輸入「這臺電腦多少錢?筆記本電腦的股票價格(how much is the computer? EOS price of laptop)」。「EOS」是一個特殊的標記,將問題1和問題2分開。
查看:p9_BiLstm Text Relation_model.py
5.兩個卷積神經網絡文本關係(two CNN Text Relation)
結構:首先用兩個不一樣的卷積來提取兩個句子的特徵,而後鏈接兩個功能,使用線性變換層將投影輸出到目標標籤上,而後使用softmax。
查看:p9_two CNN Text Relation_model.py
6.雙長短時間記憶文本關係雙循環神經網絡(BiLstm Text Relation Two RNN)
結構:一個句子的一個雙向lstm(獲得輸出1),另外一個句子的另外一個雙向lstm(獲得輸出2)。那麼:softmax(輸出1 M輸出2)
查看:p9_BiLstm Text Relation Two RNN_model.py
有關更多詳細信息,你能夠訪問:《Deep Learning for Chatbots》的第2部分—在Tensorflow中實現一個基於檢索的模型(Implementing a Retrieval-Based Model in Tensorflow)
7.循環卷積神經網絡(RCNN)
用於文本分類的循環卷積神經網絡。
《用於文本分類的循環卷積神經網絡》(Recurrent Convolutional Neural Network for Text Classification)論文的實現。(https://scholar.google.com.hk/scholar?q=Recurrent+Convolutional+Neural+Networks+for+Text+Classification&hl=zh-CN&as_sdt=0&as_vis=1&oi=scholart&sa=X&ved=0ahUKEwjpx82cvqTUAhWHspQKHUbDBDYQgQMIITAA)
結構:
循環結構(卷積層)
最大池化
徹底鏈接層+ softmax
它用左側文本和右側文本學習句子或文檔中的每一個單詞的表示:
表示當前單詞= [left_side_context_vector,current_word_embedding,right_side_context_vecotor]。
對於左側文本,它使用一個循環結構,前一個單詞的非線性轉換和左側上一個文本;相似於右側文本。
查看:p71_TextRCNN_model.py
8. 分層注意網絡(Hierarchical Attention Network)
《用於文檔分類的分層注意網絡》(Hierarchical Attention Networks for Document Classification)論文的實現。(https://www.cs.cmu.edu/~diyiy/docs/naacl16.pdf)
結構:
降維
詞編碼器:詞級雙向GRU,以得到豐富的詞彙表徵
次注意:詞級注意在句子中獲取重要信息
句子編碼器:句子級雙向GRU,以得到豐富的句子表徵
句子注意:句級注意以得到句子中的重點句子
FC + Softmax
數據輸入:
通常來講,這個模型的輸入應該是幾個句子,而不是一個句子。形式是:[None,sentence_lenght]。其中None意味着batch_size。
在個人訓練數據中,對於每一個樣原本說,我有四個部分。每一個部分具備相同的長度。我將四個部分造成一個單一的句子。該模型將句子分爲四部分,造成一個形狀爲:[None,num_sentence,sentence_length]的張量。其中num_sentence是句子的個數(在個人設置中,其值等於4)。
查看:p1_HierarchicalAttention_model.py
9. 具備註意的Seq2seq模型
具備註意的Seq2seq模型的實現是經過《共同窗習排列和翻譯的神經機器翻譯》來實現的。(https://github.com/brightmart/text_classification/blob/master/README.md)
結構:
降維
bi-GRU也從源語句(向前和向後)獲取豐富的表示。
具備註意的解碼器。
數據輸入:
使用三種輸入中的兩種:
編碼器輸入,這是一個句子;
解碼器輸入,是固定長度的標籤列表;
目標標籤,它也是一個標籤列表。
例如,標籤是:「L1 L2 L3 L4」,則解碼器輸入將爲:[_ GO,L1,L2,L2,L3,_PAD];目標標籤爲:[L1,L2,L3,L3,_END,_PAD]。長度固定爲6,任何超出標籤將被截斷,若是標籤不足以填補,將填充完整。
注意機制:
傳輸編碼器輸入列表和解碼器的隱藏狀態
計算每一個編碼器輸入隱藏狀態的類似度,以得到每一個編碼器輸入的可能性分佈。
基於可能性分佈的編碼器輸入的加權和。
經過RNN Cell使用這個權重和解碼器輸入以得到新的隱藏狀態。
Vanilla E編碼解碼工做原理:
在解碼器中,源語句將使用RNN做爲固定大小向量(「思想向量」)進行編碼:
當訓練時,將使用另外一個RNN嘗試經過使用這個「思想向量」做爲初始化狀態獲取一個單詞,並從每一個時間戳的解碼器輸入獲取輸入。解碼器從特殊指令「_GO」開始。在執行一步以後,新的隱藏狀態將與新輸入一塊兒得到,咱們能夠繼續此過程,直到咱們達到特殊指令「_END」。咱們能夠經過計算對數和目標標籤的交叉熵損失來計算損失。logits是經過隱藏狀態的投影層(對於解碼器步驟的輸出,在GRU中,咱們能夠僅使用來自解碼器的隱藏狀態做爲輸出)。
當測試時,沒有標籤。因此咱們應該提供咱們從之前的時間戳得到的輸出,並繼續進程直到咱們到達「_END」指令。
注意事項:
這裏我使用兩種詞彙。 一個是由編碼器使用的單詞; 另外一個是用於解碼器的標籤。
對於詞彙表,插入三個特殊指令:「_ GO」,「_ END」,「_ PAD」; 「_UNK」不被使用,由於全部標籤都是預先定義的。
10. Transformer(「Attention Is All You Need」)
狀態:完成主要部分,可以在任務中產生序列的相反順序。你能夠經過在模型中運行測試功能來檢查它。然而,我尚未在實際任務中得到有用的結果。咱們在模型中也使用並行的style.layer規範化、殘餘鏈接和掩碼。
對於每一個構建塊,咱們在下面的每一個文件中包含測試函數,咱們已經成功測試了每一個小塊。
帶注意的序列到序列是解決序列生成問題的典型模型,如翻譯、對話系統。大多數時候,它使用RNN完成這些任務。直到最近,人們也應用卷積神經網絡進行序列順序問題。可是,Transformer,它僅僅依靠注意機制執行這些任務,是快速的、實現新的最早進的結果。
它還有兩個主要部分:編碼器和解碼器。看如下內容:
編碼器:
共6層,每一個層都有兩個子層。第一是多向自我注意結構;第二個是位置的全鏈接前饋網絡。對於每一個子層使用LayerNorm(x + Sublayer(x)),維度= 512。
解碼器:
解碼器由N = 6個相同層的堆疊組成。
除了每一個編碼器層中的兩個子層以外,解碼器插入第三子層,其在編碼器堆棧的輸出上執行多向注意。
與編碼器相似,咱們採用圍繞每一個子層的殘餘鏈接,而後進行層歸一化。咱們還修改解碼器堆棧中的自我注意子層,以防止位置參與到後續位置。這種掩蔽與輸出嵌入偏移一個位置的事實相結合確保了位置i的預測只能取決於位於小於i的位置的已知輸出。
主要從這個模型中脫穎而出:
多向自我注意:使用自我注意,線性變換屢次獲取關鍵值的投影,而後開始注意機制
一些提升性能的技巧(剩餘鏈接、位置編碼、前饋、標籤平滑、掩碼以忽略咱們想忽略的事情)。
有關模型的詳細信息,請查看:a2_transformer.py
11.循環實體網絡(Recurrent Entity Network)
輸入:
故事:它是多句話,做爲上下文。
問題:一個句子,這是一個問題。
回答:一個單一的標籤。
型號結構:
輸入編碼:
使用一個詞來編碼故事(上下文)和查詢(問題);經過使用位置掩碼將位置考慮在內。
經過使用雙向rnn編碼故事和查詢,性能從0.392提升到0.398,增加了1.5%。
動態記憶:
經過使用鍵的「類似性」,輸入故事的值來計算門控。
經過轉換每一個鍵,值和輸入來獲取候選隱藏狀態。
組合門和候選隱藏狀態來更新當前的隱藏狀態。
輸出(使用注意機制):
經過計算查詢和隱藏狀態的「類似性」來得到可能性分佈。
使用可能性分佈得到隱藏狀態的加權和。
查詢和隱藏狀態的非線性變換得到預測標籤。
這個模型的關鍵點:
使用彼此獨立的鍵和值塊,能夠並行運行。
上下文和問題一塊兒建模。使用記憶來追蹤世界的狀態,並使用隱性狀態和問題(查詢)的非線性變換進行預測。
簡單的型號也能夠實現很是好的性能。簡單的編碼做爲詞的使用包。
有關模型的詳細信息,請查看:a3_entity_network.py
在這個模型下,它包含一個測試函數,它要求這個模型計算故事(上下文)和查詢(問題)的數字,但故事的權重小於查詢。
12.動態記憶網絡
模塊:Outlook
輸入模塊:將原始文本編碼爲向量表示。
問題模塊:將問題編碼爲向量表示。
獨特的記憶模塊:經過輸入,經過注意機制選擇哪些部分輸入、將問題和之前的記憶考慮在內====>它將產生「記憶」向量。
答案模塊:從最終的記憶向量生成答案。
詳情:
輸入模塊:
一個句子:使用gru獲取隱藏狀態b.list的句子:使用gru獲取每一個句子的隱藏狀態。例如 [隱藏狀態1,隱藏狀態2,隱藏狀態...,隱藏狀態n]。
問題模塊:使用gru獲取隱藏狀態。
記憶模塊:
使用注意機制和循環網絡來更新其記憶。
須要多集===>傳遞推理。
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.
注意機制:
two-layer feed forward nueral network.input is candidate fact c,previous memory m and question q. feature get by take: element-wise,matmul and absolute distance of q with c, and q with m.
記憶更新機制:h = f(c,h_previous,g)。 最後一個隱藏狀態是應答模塊的輸入。
答案模塊
要作的事情:
文本分類的字符級卷積網絡
文本分類的卷積神經網絡:淺詞級與深字符級
文本分類的深度卷積網絡
半監督文本分類的對抗訓練方法
參考:
1. 《用於高效文本分類的技巧》Bag of Tricks for Efficient Text Classification
2.《語音分類的卷積神經網絡》Convolutional Neural Networks for Sentence Classification
3.《卷積神經網絡對句子分類的敏感性分析(和使用指南)》A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification
4. 《聊天機器人中的深度學習》,第2部分—在Tensorflow中實現基於檢索的模型Deep Learning for Chatbots, Part 2 – Implementing a Retrieval-Based Model in Tensorflow(www.wildml.com)
5.《文本分類的複雜卷積神經網絡》Recurrent Convolutional Neural Network for Text Classification
6.《文檔分類的分層注意網絡》Hierarchical Attention Networks for Document Classification
7. 《共同窗習對齊排列和翻譯的神經機器翻譯》Neural Machine Translation by Jointly Learning to Align and Translate
8. Attention Is All You Need
9. 《問我任何事情:天然語言處理的動態記憶網絡》Ask Me Anything:Dynamic Memory Networks for Natural Language Processing
10.《用循環實體網絡跟蹤世界的情況》Tracking the state of world with recurrent entity networks