文本分類是自然語言處理中的基礎(chǔ)算法,在對話系統(tǒng)的應(yīng)用中,可利用文本分類算法來判斷用戶的咨詢意圖。然而單個問題并不能很好捕獲用戶的意圖,通常需要結(jié)合用戶上文的咨詢結(jié)合當(dāng)句才能更好的判斷用戶的意圖。這里就需要我們建立一個基于上下文的分類模型來結(jié)合上文信息判斷用戶的最終意圖。這里常用的方式大概分為兩個方式:
? ? ? ? 1)非end-2-end建模:首先抽取上文的主題、意圖或者關(guān)鍵詞,然后結(jié)合當(dāng)前問題建模。
? ? ? ? 2)end-2-end建模:通過時序模型,直接抽取上文信息結(jié)合當(dāng)前問題建立模型。
本文主要參考《Hierarchical Attention Networks for Document Classification》,該論文介紹了Attention機制在英文文本分類中的應(yīng)用。文章采用document級分類,即document由sentence組成,而sentence由word組成,因此天然的具有層級關(guān)系。以word為粒度輸入網(wǎng)絡(luò)抽取word級特征得到表示sentence的特征向量;然后將sentence級向量輸入網(wǎng)絡(luò)抽取sentence級特征得到最終的document級特征,然后將document特征通過一個線性表示和softmax。為了給與不同的word和不同的sentence分配不同的權(quán)重,論文設(shè)計一個層級架構(gòu)的attention機制用于提升模型的性能。本文設(shè)計上下文模型的時候稍作修改,將一個會話中的單句作為第一層輸入,然后將第一層各個單句抽取的特征作為第二層會話級的輸入,獲得最終的會話級特征輸出。Attention機制最近火的不要不要,被廣泛應(yīng)用在nlp和圖像處理中。這里同樣在第一層特征抽取之后,設(shè)計了一個Attention層,用于更加精確的抽取句子的特征。但是在會話層特征抽取之后,并沒有再設(shè)計同樣的Attention了,因為在對話系統(tǒng)中,和當(dāng)前句子越接近句子的重要性越高,因此這里我們之后抽取時序模型的最后輸出作為最終的特征。整體算法的設(shè)計圖如下:

LSTM網(wǎng)絡(luò)在處理中文時,其準(zhǔn)確率和速度都要差于CNN網(wǎng)絡(luò),因此這里對論文的網(wǎng)絡(luò)結(jié)構(gòu)進行調(diào)整,將第一層的LSTM網(wǎng)絡(luò)替換為CNN網(wǎng)絡(luò)。論文中在一層和第二層都加入了Attention機制,但是實驗時發(fā)現(xiàn)第一層加入Attention效果沒有提升,因此Attention只在第二層中使用。整個網(wǎng)絡(luò)在融合CNN和LSTM之后,整個網(wǎng)絡(luò)結(jié)構(gòu)已經(jīng)非常復(fù)雜了,而GRU是LSTM的簡化版,GRU在語料較少時效果更加,因此這里采用GRU替換第二層網(wǎng)絡(luò)的LSTM,即有最終的模型H-CNN-GRU網(wǎng)絡(luò):

實驗步驟
1:本次實驗采用單句問題和對應(yīng)的標(biāo)簽作為輸入。實驗之前首先對問題按字切詞,然后采用word2vec對問題進行預(yù)訓(xùn)練(這里采用按字切詞的方式避免的切詞的麻煩,并且同樣能獲得較高的準(zhǔn)確率)。
2:由于本次實驗采用固定長度的GRU/LSTM,因此需要對問題和答案進行截斷(過長)或補充(過短)。

3:實驗建模Input。本次實驗單句問題和標(biāo)簽進行建模(q,l),q代表問題,l代表標(biāo)簽。

4:將問題進行Embedding(batch_size*session_len, sentence_len, embedding_size)表示。

5:對一個batch中所有會話包含的問題采用GRU/LSTM模型計算特征。
? ? ? 1):這里第一層針對單句問題的特征抽取采用固定長度的句子,嘗試過采用雙向動態(tài)rnn,并沒有很好的效果提升,并且相對計算速度慢點。

6:GRU/LSTM模型輸出向量為(batch_size, seq_len,rnn_size),因此需要對輸出特征向量進行特征抽取。常用的特征抽取方式為取模型最后一步的輸出為下一層的特征,但是該特征抽取方式只取了最后一步的特征,丟棄了其他的特征信息,所以本次實驗采用Attention機制計算每一步特征的權(quán)值,然后進行加權(quán)平均。

7:將第一層單句級的特征輸出作為第二層會話級encoder的輸入。
? ? ? 1):這里采用動態(tài)rnn進行特征抽取,因為每一個session所包含的問題不是固定的。
? ? ? 2):這里沒有用雙向的rnn而是采用單向的rnn,并且沒有外加attention、avg_pool或者max_pool,因為越靠近當(dāng)前句子理應(yīng)越為重要。

7:對模型輸出的特征進行線性變換。
8:針對多類文本分類,需要將線性變換的輸出通過softmax。
參數(shù)設(shè)置
1:、這里優(yōu)化函數(shù)采用論文中使用的Adam(嘗試過SGD,學(xué)習(xí)速率0.1,效果不佳)。
2、學(xué)習(xí)速率為2e-4。
3:、訓(xùn)練60輪。
4、embedding_size為150維。
5、attention為100維。
6、batch_size這里采用128。
7、問題長度限制為60字。
8、rnn_size為201。
9、本次算法每一級特征抽取都只采用了單層,由于計算耗時,沒有嘗試不同級多級的方式。
10、dropout為0.5(在輸入和輸出時均執(zhí)行dropout,單次dropout實驗時效果不佳)
注:從線上數(shù)據(jù)的分析結(jié)果來看,采用H-CNN-GRU算法在處理上下文場景時能取得不錯的效果。
如果有任何疑問,歡迎留言或發(fā)送到我的郵箱lirainbow0@163.com