用於文本分類的RNN-Attention網絡

Attention機制在NLP上最早是被用於seq2seq的翻譯類任務中,如Neural Machine Translation by Jointly Learning to Align and Translate這篇文章所說。

之後在文本分類的任務中也用上Attention機制,這篇博客主要介紹Attention機制在文本分類任務上的作用,與seq2seq中使用的可能會略有不同, 主要參考的論文是Hierarchical Attention Networks for Document Classification。這裏的層次Attention網絡並不是只含有Attention機制的網絡,而是在雙向RNN的輸出後加了Attention機制,層次表現在對於較長文本的分類,先將詞向量通過RNN+Attention表示爲句子向量,再將句子向量通過RNN+Attention表示爲文檔向量。兩部分的Attention機制是一樣的,這篇博客就不重複說明了。

一、Attention 的作用

在RNN的文本分類模型中,可以把RNN看成一個encoder,將需要被分類的文本表示爲一個dense vector,再使用全連接層與softmax輸出各類別的概率。

在具體的文本的表示上,可以將RNN最後一個時刻的輸出作爲文本的表示,也可以綜合考慮每個時刻的的輸出,將它們合併爲一個向量。在tagging與classication的任務中常用雙向RNN(下文寫作BIRNN),每個時刻的輸出向量可以理解爲這個時刻的輸入詞在上下文的語境中對當前任務的一個貢獻。BIRNN如下圖所示

BIRNN

根據人類的閱讀習慣進行思考,我們在閱讀的時候,注意力通常不會平均分配在文本中的每個詞。再回到上面的文本表示,如果直接將每個時刻的輸出向量相加再平均,就等於認爲每個輸入詞對於文本表示的貢獻是相等的,但實際情況往往不是這樣,比如在情感分析中,文本中地名、人名這些詞應該佔有更小的權重,而情感類詞彙應該享有更大的權重。

所以在合併這些輸出向量時,希望可以將注意力集中在那些對當前任務更重要的向量上。也就是給他們都分配一個權值,將所有的輸出向量加權平均。假設輸出向量爲ht ,權值爲αt ,則合併後的表示爲

s=tαtht

上文所說的爲BIRNN的每個輸出向量分配不同權值,使得模型可以將注意力集中在重點幾個詞,降低其他無關詞的作用的機制就是Attention機制。使用了Attention機制可以使得文本表示的結果在當前的任務中更合理。

使用Attention的兩個好處:

  1. 可以更好的表徵文本,使訓練出的模型具有更好的表現(更高的精度)。
  2. 爲模型提供了更好的解釋性,如直觀的看出在文本分類中哪些詞或句子更重要, 如果訓練出的模型不理想,根據這些權值分析badcase也非常方便。

這裏寫圖片描述

Hierarchical Attention Networks for Document Classification 這篇論文中提到他們的模型可以學習到詞的上下文信息,並且分配與上下文相關的詞的權重。我覺得這並不是由於Attention這個機制的作用,而是RNN本身就具有這個能力。

二、Attention 原理

上文說到需要給BIRNN的每個輸出分配權重,如何分配就是Attention的原理,用一張結構圖加三個公式應該就可以解釋清楚了。

這裏寫圖片描述

ut=tanh(Wwht+bw)(1)

αt=exp(uTtuw)texp(uTtuw)(2)

s=tαtht(3)

公式(1)中的Wwbw 爲Attention的權重與bias,在實現的時候也要設置attention的size,不過也可以簡單的令它們等於BIRNN的輸出向量的size。

公式(2)中的uw 也是需要設置的權重,公式(2)其實也就是對所有uTtuw 結果的softmax。

公式(3)即是將計算出的αt 作爲各時刻輸出的權值,對它們加權求和表示爲一個向量。

三、代碼實現

代碼中的BIRNN使用的是LSTM(層次Attention網絡那篇論文使用的是GRU)

代碼放在github了,裏面註釋寫了很多,這裏就不重複了。代碼是使用tensorflow 1.0.0實現的。

model.py

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章