《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > 入門 | 什么是自注意力機(jī)制?

入門 | 什么是自注意力機(jī)制?

2018-08-20

注意力機(jī)制模仿了生物觀察行為的內(nèi)部過程,即一種將內(nèi)部經(jīng)驗(yàn)和外部感覺對(duì)齊從而增加部分區(qū)域的觀察精細(xì)度的機(jī)制。注意力機(jī)制可以快速提取稀疏數(shù)據(jù)的重要特征,因而被廣泛用于自然語言處理任務(wù),特別是機(jī)器翻譯。而自注意力機(jī)制是注意力機(jī)制的改進(jìn),其減少了對(duì)外部信息的依賴,更擅長(zhǎng)捕捉數(shù)據(jù)或特征的內(nèi)部相關(guān)性。本文通過文本情感分析的案例,解釋了自注意力機(jī)制如何應(yīng)用于稀疏文本的單詞對(duì)表征加權(quán),并有效提高模型效率。


目前有許多句子表征的方法。本文作者之前的博文中已經(jīng)討論了 5 中不同的基于單詞表征的句子表征方法。想要了解更多這方面的內(nèi)容,你可以訪問以下鏈接:https://kionkim.github.io/(盡管其中大多數(shù)資料是韓文)


句子表征


在文本分類問題中,僅僅對(duì)句子中的詞嵌入求平均的做法就能取得良好的效果。而文本分類實(shí)際上是一個(gè)相對(duì)容易和簡(jiǎn)單的任務(wù),它不需要從語義的角度理解句子的意義,只需要對(duì)單詞進(jìn)行計(jì)數(shù)就足夠了。例如,對(duì)情感分析來說,算法需要對(duì)與積極或消極情緒有重要關(guān)系的單詞進(jìn)行計(jì)數(shù),而不用關(guān)心其位置和具體意義為何。當(dāng)然,這樣的算法應(yīng)該學(xué)習(xí)到單詞本身的情感。


循環(huán)神經(jīng)網(wǎng)絡(luò)


為了更好地理解句子,我們應(yīng)該更加關(guān)注單詞的順序。為了做到這一點(diǎn),循環(huán)神經(jīng)網(wǎng)絡(luò)可以從一系列具有以下的隱藏狀態(tài)的輸入單詞(token)中抽取出相關(guān)信息。

微信圖片_20180820143415.jpg



當(dāng)我們使用這些信息時(shí),我們通常只使用最后一個(gè)時(shí)間步的隱藏狀態(tài)。然而,想要從僅僅存儲(chǔ)在一個(gè)小規(guī)模向量中的句子表達(dá)出所有的信息并不是一件容易的事情。


卷積神經(jīng)網(wǎng)絡(luò)


借鑒于 n-gram 技術(shù)的思路,卷積神經(jīng)網(wǎng)絡(luò)(CNN)可以圍繞我們感興趣的單詞歸納局部信息。為此,我們可以應(yīng)用如下圖所示的一維卷積。當(dāng)然,下面僅僅給出了一個(gè)例子,我們也可以嘗試其它不同的架構(gòu)。

微信圖片_20180820143436.jpg

大小為 3 的一維卷積核掃描我們想要?dú)w納信息的位置周圍的單詞。為此,我們必須使用大小為 1 的填充值(padding),從而使過濾后的長(zhǎng)度保持與原始長(zhǎng)度 T 相同。除此之外,輸出通道的數(shù)量是 c_1。


接著,我們將另一個(gè)過濾器應(yīng)用于特征圖,最終將輸入的規(guī)模轉(zhuǎn)化為 c_2*T。這一系列的過程實(shí)在模仿人類閱讀句子的方式,首先理解 3 個(gè)單詞的含義,然后將它們綜合考慮來理解更高層次的概念。作為一種衍生技術(shù),我們可以利用在深度學(xué)習(xí)框架中實(shí)現(xiàn)的優(yōu)化好的卷積神經(jīng)網(wǎng)絡(luò)算法來達(dá)到更快的運(yùn)算速度。


關(guān)系網(wǎng)絡(luò)


單詞對(duì)可能會(huì)為我們提供關(guān)于句子的更清楚的信息。實(shí)際情況中,某個(gè)單詞往往可能會(huì)根據(jù)其不同的用法而擁有不同的含義。例如,「I like」中的單詞「like」(喜歡)和它在「like this」(像... 一樣)中的含義是不同的。如果我們將「I」和「like」一同考慮,而不是將「like」和「this」放在一起考慮,我們可以更加清楚地領(lǐng)會(huì)到句子的感情。這絕對(duì)是一種積極的信號(hào)。Skip gram 是一種從單詞對(duì)中檢索信息的技術(shù),它并不要求單詞對(duì)中的單詞緊緊相鄰。正如單詞「skip」所暗示的那樣,它允許這些單詞之間有間隔。

微信圖片_20180820143504.jpg

正如你在上圖中所看到的,一對(duì)單詞被輸入到函數(shù) f(?) 中,從而提取出它們之間的關(guān)系。對(duì)于某個(gè)特定的位置 t,有 T-1 對(duì)單詞被歸納,而我們通過求和或平均或任意其它相關(guān)的技術(shù)對(duì)句子進(jìn)行表征。當(dāng)我們具體實(shí)現(xiàn)這個(gè)算法時(shí),我們會(huì)對(duì)包括當(dāng)前單詞本身的 T 對(duì)單詞進(jìn)行這樣的計(jì)算。


需要一種折衷方法


我們可以將這三種不同的方法寫作同一個(gè)下面的通用形式:

微信圖片_20180820143530.jpg

當(dāng)所有的 I_{t,?} 為 1 時(shí),通用形式說明任何「skip bigram」對(duì)于模型的貢獻(xiàn)是均勻的。


對(duì)于 RNN 來說,我們忽略單詞 x_t 之后的所有信息,因此上述方程可以化簡(jiǎn)為:

微信圖片_20180820143554.jpg

對(duì)于雙向 RNN 來說,我們可以考慮從 x_T 到 x_t 的后向關(guān)系。


另一方面,CNN 只圍繞我們感興趣的單詞瀏覽信息,如果我們只關(guān)心單詞 x_t 前后的 k 個(gè)單詞,通用的公式可以被重新排列為:

微信圖片_20180820143616.jpg

盡管關(guān)系網(wǎng)絡(luò)可能過于龐大,以至于我們不能考慮所有單詞對(duì)關(guān)系。而 CNN 的規(guī)模又太小了,我們不能僅僅考慮它們之間的局部關(guān)系。所以,我們需要在這兩個(gè)極端之間找到一種折衷的方式,這就是所謂的注意力機(jī)制。


自注意力機(jī)制


上文提到的通用形式可以被重新改寫為下面更加靈活的形式:

微信圖片_20180820143646.jpg

在這里,α(?,?) 控制了每個(gè)單詞組合可能產(chǎn)生的影響。例如,在句子「I like you like this」中,兩個(gè)單詞「I」和「you」可能對(duì)于確定句子的情感沒有幫助。然而,「I」和「like」的組合使我們對(duì)這句話的情感有了一個(gè)清晰的認(rèn)識(shí)。在這種情況下,我們給予前一種組合的注意力很少,而給予后一種組合的注意力很多。通過引入權(quán)重向量 α(?,?),我們可以讓算法調(diào)整單詞組合的重要程度。

微信圖片_20180820143706.jpg

假設(shè)第 i 個(gè)句子中的 T 個(gè)單詞被嵌入到了 H_{i1},…,H_{iT} 中,每個(gè)詞嵌入都會(huì)被賦予一個(gè)權(quán)重 α_{it},它代表了將單詞歸納到一個(gè)統(tǒng)一的表征中時(shí)的相對(duì)重要性。


我們?cè)谶@里想要擁有的最終結(jié)果是每個(gè)輸入句子的權(quán)重矩陣。如果我們把 10 個(gè)句子輸入到網(wǎng)絡(luò)中,我們會(huì)得到 10 個(gè)如下所示的注意力矩陣。

微信圖片_20180820143727.jpg

自注意力機(jī)制的實(shí)現(xiàn)


自注意力機(jī)制在論文「A structured Self-Attentive Sentence Embedding」中被首次提出,此文作者將自注意力機(jī)制應(yīng)用于雙向 LSTM 的隱層,模型結(jié)構(gòu)如下圖所示:


論文地址:https://arxiv.org/pdf/1703.03130.pdf

微信圖片_20180820143753.jpg



然而,我們并不一定要用 LSTM 來做單詞表征(并不一定是單詞表征,我的意思是句子表征之前的階段),我們將把自注意力機(jī)制應(yīng)用到基于關(guān)系網(wǎng)絡(luò)的單詞表征中。


與原論文中的自注意力機(jī)制不同(如上圖所示,數(shù)學(xué)上的細(xì)節(jié)可以在我的上一篇博文中找到),關(guān)系網(wǎng)絡(luò)的注意力機(jī)制可以被定義為:


參見:https://kionkim.github.io/_posts/2018-07-12-sentiment_analysis_self_attention.md

微信圖片_20180820143821.jpg



為了解釋上面的圖標(biāo),不妨假設(shè)我們想要得到第 i 個(gè)單詞的表征。對(duì)于包含第 i 個(gè)單詞的單詞組合,會(huì)生成兩個(gè)輸出:一個(gè)用于特征提?。ňG色圓圈),另一個(gè)用于注意力加權(quán)(紅色圓圈)。這兩個(gè)輸出可能共享同一個(gè)網(wǎng)絡(luò),但在本文中,我們?yōu)槊總€(gè)輸出使用單獨(dú)的網(wǎng)絡(luò)。在得到最后的注意力權(quán)重之前,注意力(紅色圓圈)的輸出通過需要經(jīng)過 sigmoid 和 softmax 層的運(yùn)算。這些注意力權(quán)重會(huì)與提取出的特征相乘,以得到我們感興趣的單詞的表征。


用 Gluon 實(shí)現(xiàn) 自注意力機(jī)制


在具體實(shí)現(xiàn)部分,我們假設(shè)網(wǎng)絡(luò)結(jié)構(gòu)十分簡(jiǎn)單,有兩個(gè)相連的全連接層用于關(guān)系提取,有一個(gè)全連接層用于注意力機(jī)制。緊跟著是兩個(gè)相連的全連接層用于分類。在這里,關(guān)系提取和注意力提取會(huì)用到下面的代碼片段:


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

我們將為特征提取和注意力機(jī)制運(yùn)用獨(dú)立的網(wǎng)絡(luò)。最終得到的注意力向量的規(guī)模為 T*1,提取出的特征向量的規(guī)模為 T*d,其中 d 為超參數(shù)。為了將二者相乘,我們只需要將注意力向量擴(kuò)展到與提取出的特征向量的規(guī)模相匹配。我們?cè)谶@里提供的只是一個(gè)小例子,其它的實(shí)現(xiàn)可能會(huì)更好。

完整的實(shí)現(xiàn)代碼可以從以下鏈接獲得:http://210.121.159.217:9090/kionkim/stat-analysis/blob/master/nlp_models/notebooks/text_classification_RN_SA_umich.ipynb。


結(jié)果


下面是 9 個(gè)隨機(jī)選擇的注意力矩陣:


微信圖片_20180820143850.jpg

當(dāng)對(duì)文本進(jìn)行分類時(shí),我們可以知道算法將把注意力放在那些單詞上。正如預(yù)期的那樣,在分類過程中,「love」、「awesome」、「stupid」、「suck」這樣表達(dá)情感的單詞受到了重點(diǎn)關(guān)注。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。