【NLP傻瓜式教程】手把手带你HAN文本分类(附代码)
繼續之前的文本分類系列
【NLP傻瓜式教程】手把手帶你CNN文本分類(附代碼)
【NLP傻瓜式教程】手把手帶你RNN文本分類(附代碼)
【NLP傻瓜式教程】手把手帶你fastText文本分類(附代碼)
今天來看看網紅Attention的效果,來自ACL的論文Hierarchical Attention Networks for Document Classification
論文概述
近年來,在NLP領域,好像最流行的就是RNN、LSTM、GRU、Attention等及其變體的組合框架。這篇論文里作者就對文本的結構進行分析,使用了雙向GRU的結構,并且對Attention進行調整:考慮了word層面的attention和sentence層面的attention,分別對單詞在句子中和句子在文檔中的重要性進行了建模。仔細一想確實是挺合理的,一篇文檔就是由無數句子構成的,而一個句子又是由無數單詞構成的,充分考慮了文檔的內部結構。
上圖就是論文中文本分類模型的整體框架,可以看出主要分為四個部分:
word encoder? (BiGRU layer)
word attention (Attention layer)
sentence encoder? (BiGRU layer)
sentence attention (Attention layer)
首先回顧一下GRU的原理:
GRU是RNN的一個變種,使用門機制來記錄當前序列的狀態。在GRU中有兩種類型的門(gate):reset gate和update gate。這兩個門一起控制來決定當前狀態有多少信息要更新。
reset gate是用于決定多少過去的信息被用于生成候選狀態,如果Rt為0,表明忘記之前的所有狀態:
根據reset gate的分數可以計算出候選狀態:
update gate是用來決定有多少過去的信息被保留,以及多少新信息被加進來:
最后,隱藏層狀態的計算公式,有update gate、候選狀態和之前的狀態共同決定:
接著來回顧一下Attention原理:
好啦,下面具體來看看論文里的模型:
1、word encoder layer
首先,將每個句子中的單詞做embedding轉換成詞向量,然后,輸入到雙向GRU網絡中,結合上下文的信息,獲得該單詞對應的隱藏狀態輸出
2、word attention layer
attention機制的目的就是要把一個句子中,對句子表達最重要的單詞找出來,賦予一個更大的比重。
首先將word encoder那一步的輸出得到的輸入到一個單層的感知機中得到結果作為其隱含表示
接著為了衡量單詞的重要性,定義了一個隨機初始化的單詞層面上下文向量,計算其與句子中每個單詞的相似度,然后經過一個softmax操作獲得了一個歸一化的attention權重矩陣,代表句子i中第t個單詞的權重:
于是,句子的向量Si就可以看做是句子中單詞的向量的加權求和。這里的單詞層面上下文向量是隨機初始化并且可以在訓練的過程中學習得到的,我們可以把它看成是一種query的高級表示:“句子中哪些詞含有比較重要的信息?”
3、sentence encoder
通過上述步驟我們得到了每個句子的向量表示,然后可以用相似的方法得到文檔向量
4、sentence attention
和詞級別的attention類似,作者提出了一個句子級別的上下文向量,來衡量一個句子在整篇文本的重要性。
5、softmax
上面的v向量就是我們得到的最后文檔表示,然后輸入一個全連接的softmax層進行分類就ok了。
6、模型效果
代碼實現
定義模型
class HAN(object):def __init__(self, max_sentence_num, max_sentence_length, num_classes, vocab_size,embedding_size, learning_rate, decay_steps, decay_rate,hidden_size, l2_lambda, grad_clip, is_training=False,initializer=tf.random_normal_initializer(stddev=0.1)):self.vocab_size = vocab_sizeself.max_sentence_num = max_sentence_numself.max_sentence_length = max_sentence_lengthself.num_classes = num_classesself.embedding_size = embedding_sizeself.hidden_size = hidden_sizeself.learning_rate = learning_rateself.decay_rate = decay_rateself.decay_steps = decay_stepsself.l2_lambda = l2_lambdaself.grad_clip = grad_clipself.initializer = initializerself.global_step = tf.Variable(0, trainable=False, name='global_step')# placeholderself.input_x = tf.placeholder(tf.int32, [None, max_sentence_num, max_sentence_length], name='input_x')self.input_y = tf.placeholder(tf.int32, [None, num_classes], name='input_y')self.dropout_keep_prob = tf.placeholder(tf.float32, name='dropout_keep_prob')if not is_training:returnword_embedding = self.word2vec()sen_vec = self.sen2vec(word_embedding)doc_vec = self.doc2vec(sen_vec)self.logits = self.inference(doc_vec)self.loss_val = self.loss(self.input_y, self.logits)self.train_op = self.train()self.prediction = tf.argmax(self.logits, axis=1, name='prediction')self.pred_min = tf.reduce_min(self.prediction)self.pred_max = tf.reduce_max(self.prediction)self.pred_cnt = tf.bincount(tf.cast(self.prediction, dtype=tf.int32))self.label_cnt = tf.bincount(tf.cast(tf.argmax(self.input_y, axis=1), dtype=tf.int32))self.accuracy = self.accuracy(self.logits, self.input_y)手機瀏覽代碼不太舒服,完整代碼就不貼了,老規矩后臺自取吧~
「完整代碼可以在公眾號后臺回復"HAN"獲取。」
-?END?-
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站QQ群1003271085,加入本站微信群請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的【NLP傻瓜式教程】手把手带你HAN文本分类(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kick Algorithm】十大排序
- 下一篇: 【NLP傻瓜式教程】手把手带你RCNN文