什麼是自注意力機制?
注意力機制模仿了生物觀察行為的內部過程,即一種將內部經驗和外部感覺對齊從而增加部分割槽域的觀察精細度的機制。注意力機制可以快速提取稀疏資料的重要特徵,因而被廣泛用於自然語言處理任務,特別是機器翻譯。而自注意力機制是注意力機制的改進,其減少了對外部資訊的依賴,更擅長捕捉資料或特徵的內部相關性。本文通過文字情感分析的案例,解釋了自注意力機制如何應用於稀疏文字的單詞對錶徵加權,並有效提高模型效率。
目前有許多句子表徵的方法。本文作者之前的博文中已經討論了 5 中不同的基於單詞表徵的句子表徵方法。想要了解更多這方面的內容,你可以訪問以下連結:https://kionkim.github.io/(儘管其中大多數資料是韓文)
句子表徵
在文字分類問題中,僅僅對句子中的詞嵌入求平均的做法就能取得良好的效果。而文字分類實際上是一個相對容易和簡單的任務,它不需要從語義的角度理解句子的意義,只需要對單詞進行計數就足夠了。例如,對情感分析來說,演算法需要對與積極或消極情緒有重要關係的單詞進行計數,而不用關心其位置和具體意義為何。當然,這樣的演算法應該學習到單詞本身的情感。
迴圈神經網路
為了更好地理解句子,我們應該更加關注單詞的順序。為了做到這一點,迴圈神經網路可以從一系列具有以下的隱藏狀態的輸入單詞(token)中抽取出相關資訊。
當我們使用這些資訊時,我們通常只使用最後一個時間步的隱藏狀態。然而,想要從僅僅儲存在一個小規模向量中的句子表達出所有的資訊並不是一件容易的事情。
卷積神經網路
借鑑於 n-gram 技術的思路,卷積神經網路(CNN)可以圍繞我們感興趣的單詞歸納區域性資訊。為此,我們可以應用如下圖所示的一維卷積。當然,下面僅僅給出了一個例子,我們也可以嘗試其它不同的架構。
大小為 3 的一維卷積核掃描我們想要歸納資訊的位置周圍的單詞。為此,我們必須使用大小為 1 的填充值(padding),從而使過濾後的長度保持與原始長度 T 相同。除此之外,輸出通道的數量是 c_1。
接著,我們將另一個過濾器應用於特徵圖,最終將輸入的規模轉化為 c_2*T。這一系列的過程實在模仿人類閱讀句子的方式,首先理解 3 個單詞的含義,然後將它們綜合考慮來理解更高層次的概念。作為一種衍生技術,我們可以利用在深度學習框架中實現的優化好的卷積神經網路演算法來達到更快的運算速度。
關係網路
單詞對可能會為我們提供關於句子的更清楚的資訊。實際情況中,某個單詞往往可能會根據其不同的用法而擁有不同的含義。例如,「I like」中的單詞「like」(喜歡)和它在「like this」(像... 一樣)中的含義是不同的。如果我們將「I」和「like」一同考慮,而不是將「like」和「this」放在一起考慮,我們可以更加清楚地領會到句子的感情。這絕對是一種積極的訊號。Skip gram 是一種從單詞對中檢索資訊的技術,它並不要求單詞對中的單詞緊緊相鄰。正如單詞「skip」所暗示的那樣,它允許這些單詞之間有間隔。
正如你在上圖中所看到的,一對單詞被輸入到函式 f(⋅) 中,從而提取出它們之間的關係。對於某個特定的位置 t,有 T-1 對單詞被歸納,而我們通過求和或平均或任意其它相關的技術對句子進行表徵。當我們具體實現這個演算法時,我們會對包括當前單詞本身的 T 對單詞進行這樣的計算。
需要一種折衷方法
我們可以將這三種不同的方法寫作同一個下面的通用形式:
當所有的 I_{t,⋅} 為 1 時,通用形式說明任何「skip bigram」對於模型的貢獻是均勻的。
對於 RNN 來說,我們忽略單詞 x_t 之後的所有信息,因此上述方程可以化簡為:
對於雙向 RNN 來說,我們可以考慮從 x_T 到 x_t 的後向關係。
另一方面,CNN 只圍繞我們感興趣的單詞瀏覽資訊,如果我們只關心單詞 x_t 前後的 k 個單詞,通用的公式可以被重新排列為:
儘管關係網路可能過於龐大,以至於我們不能考慮所有單詞對關係。而 CNN 的規模又太小了,我們不能僅僅考慮它們之間的區域性關係。所以,我們需要在這兩個極端之間找到一種折衷的方式,這就是所謂的注意力機制。
自注意力機制
上文提到的通用形式可以被重新改寫為下面更加靈活的形式:
在這裡,α(⋅,⋅) 控制了每個單詞組合可能產生的影響。例如,在句子「I like you like this」中,兩個單詞「I」和「you」可能對於確定句子的情感沒有幫助。然而,「I」和「like」的組合使我們對這句話的情感有了一個清晰的認識。在這種情況下,我們給予前一種組合的注意力很少,而給予後一種組合的注意力很多。通過引入權重向量 α(⋅,⋅),我們可以讓演算法調整單詞組合的重要程度。
假設第 i 個句子中的 T 個單詞被嵌入到了 H_{i1},…,H_{iT} 中,每個詞嵌入都會被賦予一個權重α_{it},它代表了將單詞歸納到一個統一的表徵中時的相對重要性。
我們在這裡想要擁有的最終結果是每個輸入句子的權重矩陣。如果我們把 10 個句子輸入到網路中,我們會得到 10 個如下所示的注意力矩陣。
自注意力機制的實現
自注意力機制在論文「A structured Self-Attentive Sentence Embedding」中被首次提出,此文作者將自注意力機制應用於雙向LSTM的隱層,模型結構如下圖所示:
論文地址:https://arxiv.org/pdf/1703.03130.pdf
然而,我們並不一定要用LSTM來做單詞表徵(並不一定是單詞表徵,我的意思是句子表徵之前的階段),我們將把自注意力機制應用到基於關係網路的單詞表徵中。
與原論文中的自注意力機制不同(如上圖所示,數學上的細節可以在我的上一篇博文中找到),關係網路的注意力機制可以被定義為:
參見:https://kionkim.github.io/_posts/2018-07-12-sentiment_analysis_self_attention.md
為了解釋上面的圖示,不妨假設我們想要得到第 i 個單詞的表徵。對於包含第 i 個單詞的單詞組合,會生成兩個輸出:一個用於特徵提取(綠色圓圈),另一個用於注意力加權(紅色圓圈)。這兩個輸出可能共享同一個網路,但在本文中,我們為每個輸出使用單獨的網路。在得到最後的注意力權重之前,注意力(紅色圓圈)的輸出通過需要經過 sigmoid 和 softmax 層的運算。這些注意力權重會與提取出的特徵相乘,以得到我們感興趣的單詞的表徵。
用 Gluon 實現 自注意力機制
在具體實現部分,我們假設網路結構十分簡單,有兩個相連的全連線層用於關係提取,有一個全連線層用於注意力機制。緊跟著是兩個相連的全連線層用於分類。在這裡,關係提取和注意力提取會用到下面的程式碼片段:
class Sentence_Representation(nn.Block): def __init__(self, **kwargs): super(Sentence_Representation, self).__init__() for (k, v) in kwargs.items(): setattr(self, k, v) with self.name_scope(): self.embed = nn.Embedding(self.vocab_size, self.emb_dim) self.g_fc1 = nn.Dense(self.hidden_dim,activation='relu') self.g_fc2 = nn.Dense(self.hidden_dim,activation='relu') self.attn = nn.Dense(1, activation = 'tanh') def forward(self, x): embeds = self.embed(x) # batch * time step * embedding x_i = embeds.expand_dims(1) x_i = nd.repeat(x_i,repeats= self.sentence_length, axis=1) # batch * time step * time step * embedding x_j = embeds.expand_dims(2) x_j = nd.repeat(x_j,repeats= self.sentence_length, axis=2) # batch * time step * time step * embedding x_full = nd.concat(x_i,x_j,dim=3) # batch * time step * time step * (2 * embedding) # New input data _x = x_full.reshape((-1, 2 * self.emb_dim)) # Network for attention _attn = self.attn(_x) _att = _attn.reshape((-1, self.sentence_length, self.sentence_length)) _att = nd.sigmoid(_att) att = nd.softmax(_att, axis = 1) _x = self.g_fc1(_x) # (batch * time step * time step) * hidden_dim _x = self.g_fc2(_x) # (batch * time step * time step) * hidden_dim # add all (sentence_length*sentence_length) sized result to produce sentence representation x_g = _x.reshape((-1, self.sentence_length, self.sentence_length, self.hidden_dim)) _inflated_att = _att.expand_dims(axis = -1) _inflated_att = nd.repeat(_inflated_att, repeats = self.hidden_dim, axis = 3) x_q = nd.multiply(_inflated_att, x_g) sentence_rep = nd.mean(x_q.reshape(shape = (-1, self.sentence_length **2, self.hidden_dim)), axis= 1) return sentence_rep, att
我們將為特徵提取和注意力機制運用獨立的網路。最終得到的注意力向量的規模為 T*1,提取出的特徵向量的規模為 T*d,其中 d 為超引數。為了將二者相乘,我們只需要將注意力向量擴充套件到與提取出的特徵向量的規模相匹配。我們在這裡提供的只是一個小例子,其它的實現可能會更好。
完整的實現程式碼可以從以下連結獲得:http://210.121.159.217:9090/kionkim/stat-analysis/blob/master/nlp_models/notebooks/text_classification_RN_SA_umich.ipynb。
結果
下面是 9 個隨機選擇的注意力矩陣:
當對文字進行分類時,我們可以知道演算法將把注意力放在那些單詞上。正如預期的那樣,在分類過程中,「love」、「awesome」、「stupid」、「suck」這樣表達情感的單詞受到了重點關注。
參考連結:https://medium.com/@kion.kim/self-attention-a-clever-compromise-4d61c28b8235
ofollow,noindex" target="_blank">入門 卷積神經網路 自注意力
相關資料
Attention mechanism
我們可以粗略地把神經注意機制類比成一個可以專注於輸入內容的某一子集(或特徵)的神經網路. 注意力機制最早是由 DeepMind 為影象分類提出的,這讓「神經網路在執行預測任務時可以更多關注輸入中的相關部分,更少關注不相關的部分」。當解碼器生成一個用於構成目標句子的詞時,源句子中僅有少部分是相關的;因此,可以應用一個基於內容的注意力機制來根據源句子動態地生成一個(加權的)語境向量(context vector), 然後網路會根據這個語境向量而不是某個固定長度的向量來預測詞。
來源:機器之心
Neural Network
(人工)神經網路是一種起源於 20 世紀 50 年代的監督式機器學習模型,那時候研究者構想了「感知器(perceptron)」的想法。這一領域的研究者通常被稱為「聯結主義者(Connectionist)」,因為這種模型模擬了人腦的功能。神經網路模型通常是通過反向傳播演算法應用梯度下降訓練的。目前神經網路有兩大主要型別,它們都是前饋神經網路:卷積神經網路(CNN)和迴圈神經網路(RNN),其中 RNN 又包含長短期記憶(LSTM)、門控迴圈單元(GRU)等等。深度學習是一種主要應用於神經網路幫助其取得更好結果的技術。儘管神經網路主要用於監督學習,但也有一些為無監督學習設計的變體,比如自動編碼器和生成對抗網路(GAN)。
來源:機器之心
Convolutional neural network
卷積神經網路(Convolutional Neural Network, CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型影象處理有出色表現。卷積神經網路由一個或多個卷積層和頂端的全連通層(對應經典的神經網路)組成,同時也包括關聯權重和池化層(pooling layer)。這一結構使得卷積神經網路能夠利用輸入資料的二維結構。與其他深度學習結構相比,卷積神經網路在影象和語音識別方面能夠給出更好的結果。這一模型也可以使用反向傳播演算法進行訓練。相比較其他深度、前饋神經網路,卷積神經網路需要考量的引數更少,使之成為一種頗具吸引力的深度學習結構。 卷積網路是一種專門用於處理具有已知的、網格狀拓撲的資料的神經網路。例如時間序列資料,它可以被認為是以一定時間間隔取樣的一維網格,又如影象資料,其可以被認為是二維畫素網格。
來源:Goodfellow, I.; Bengio Y.; Courville A. (2016). Deep Learning. MIT Press. 維基百科
Hyperparameter
在機器學習中,超引數是在學習過程開始之前設定其值的引數。 相反,其他引數的值是通過訓練得出的。 不同的模型訓練演算法需要不同的超引數,一些簡單的演算法(如普通最小二乘迴歸)不需要。 給定這些超引數,訓練演算法從資料中學習引數。相同種類的機器學習模型可能需要不同的超引數來適應不同的資料模式,並且必須對其進行調整以便模型能夠最優地解決機器學習問題。 在實際應用中一般需要對超引數進行優化,以找到一個超引數元組(tuple),由這些超引數元組形成一個最優化模型,該模型可以將在給定的獨立資料上預定義的損失函式最小化。
來源: Wikipedia
Relation extraction
關係抽取任務需要檢測和分類一組工件中的語義關係提及,通常來自文字或XML文件。該任務與資訊提取(IE)的任務非常相似,但是IE另外需要去除重複關係(消歧),並且通常指的是提取許多不同的關係。
text classification
該技術可被用於理解、組織和分類結構化或非結構化文字文件。文字挖掘所使用的模型有詞袋(BOW)模型、語言模型(ngram)和主題模型。隱馬爾可夫模型通常用於詞性標註(POS)。其涵蓋的主要任務有句法分析、情緒分析和垃圾資訊檢測。
來源:機器之心
Word embedding
詞嵌入是自然語言處理(NLP)中語言模型與表徵學習技術的統稱。概念上而言,它是指把一個維數為所有詞的數量的高維空間嵌入到一個維數低得多的連續向量空間中,每個單詞或片語被對映為實數域上的向量。
來源: 維基百科
Deep learning
深度學習(deep learning)是機器學習的分支,是一種試圖使用包含複雜結構或由多重非線性變換構成的多個處理層對資料進行高層抽象的演算法。 深度學習是機器學習中一種基於對資料進行表徵學習的演算法,至今已有數種深度學習框架,如卷積神經網路和深度置信網路和遞迴神經網路等已被應用在計算機視覺、語音識別、自然語言處理、音訊識別與生物資訊學等領域並獲取了極好的效果。
來源: LeCun, Y., Bengio, Y., & Hinton, G. (2015). Deep learning. nature, 521(7553), 436.
Long Short-Term Memory

機器之心是國內領先的前沿科技媒體和產業服務平臺,關注人工智慧、機器人和神經認知科學,堅持為從業者提供高質量內容和多項產業服務。
推薦文章