導航:首頁 > 源碼編譯 > lstm注意力機制應用源碼

lstm注意力機制應用源碼

發布時間:2022-09-05 13:57:31

❶ 多圖+公式全面解析RNN,LSTM,Seq2Seq,Attention注意力機制

我們知道人類並不是從零開始思考東西,就像你讀這篇文章的時候,你對每個字的理解都是建立在前幾個字上面。你讀完每個字後並不是直接丟棄然後又從零開始讀下一個字,因為你的思想是具有持續性的,很多東西你要通過上下文才能理解。

然而傳統的神經網路並不能做到持續記憶理解這一點,這是傳統神經網路的主要缺點。舉個例子,你打算使用傳統的神經網路去對電影里每個時間點發生的事情進行分類的時候,傳統的神經網路先讓不能使用前一個事件去推理下一個事件。

RNN(遞歸神經網路)可以解決這個問題。他們是帶有循環的神經網路,允許信息在其中保留。

這些循環讓遞歸神經網路看起來有點神秘,然而如果你再思考一下,RNN其實和傳統的神經網路並沒有太多的不同。RNN可以看作是一個網路的多次拷貝,其中每次網路的輸出都是下一次的輸入。我們可以思考一下我們如果展開這個循環結構會是什麼樣的:

這種像是鏈狀的網路結構表明RNN和序列以及列表有著天然的聯系,他們是處理這些序列數據的天然的神經網路。而且很明顯我們可以看出,輸入輸出的序列是具有相同的時間長度的,其中的每一個權值都是共享的(不要被鏈式形狀誤導,本質上只有一個cell)。

在最近的幾年,RNN在很多問題上都取得了成功:比如語音識別,語音模型,翻譯,圖片注釋等等,但是RNN存在著梯度消息/爆炸以及對長期信息不敏感的問題,所以LSTM就被提出來了。現在很多問題的成功都必須歸功於LSTM,它是遞歸神經網路的一種,它在許多的任務中表現都比普通的RNN更好,所以接下來我們來探索一下這個神奇的網路。

人們希望RNN可以將一些之前的信息連接到當前的任務中來,比如使用之前的視頻幀來幫助理解當前幀。如果RNN可以做到將會非常有用。那實際RNN能做到嗎?這要視情況而定。

有時候,我們只需要當前的信息來完成當前的任務。舉個例子,一個語音模型試圖基於之前的單詞去預測下一個單詞。如果我們嘗試預測「the clouds are in the sky」,我們不需要太多的上下文信息——很明顯最後一個單詞會是sky。在像這樣不需要太多的相關信息的場合下,RNN可以學習到之前使用的信息。

但是我們要注意,也有很多場景需要使用更多的上下文。當我們試圖去預測「I grew up in France… I speak fluent French」這句話的最後一個單詞,最近的信息會表明這應該是一種語言的名字,但是如果我們需要知道具體是哪一種語語言,我們需要France這個在句子中比較靠前的上下文信息,相關信息和需要預測的點的間隔很大的情況是經常發生的。

不幸的是,隨著間隔變大,RNN變得無法連接到太前的信息。

理論上RNN完全可以處理這種長期依賴(long-term dependencies)的問題。人們可以通過小心地選擇參數來解決這個問題。令人悲傷的是,實踐表明RNN並不能很好地解決這個問題,Hochreiter (1991) [German] and Bengio, et al. (1994)發現了RNN為什麼在這些問題上學習很困難的原因。

而LSTM則沒有這個問題。

長期短期記憶網路-通常叫做LSTM-是一種特殊結構的RNN,它能夠學習長期依賴。它在大量的問題有驚人的效果,現在已經被廣泛使用。

LSTM被明確設計來避免長期依賴問題,記住長時間的信息對LSTM來說只是常規操作,不像RNN那樣費力不討好。

所有的RNN都有不斷重復網路本身的鏈式形式。在標準的RNN中,這個重復復制的模塊只有一個非常簡單的結果。例如一個tanh層:

LSTM也有這樣的鏈式結構,但是這個重復的模塊和上面RNN重復的模塊結構不同:LSTM並不是只是增加一個簡單的神經網路層,而是四個,他們以一種特殊的形式進行交互:

在上圖中,每條線表示一個向量,從一個輸出節點到其他節點的輸入節點。粉紅色的圓圈表示逐點式操作,就像向量加法。黃色的盒子是學習好的神經網路層。線條合代表聯結,線條分叉則表示內容被復制到不同的地方。

LSTM的核心之處就是它的cell state(神經元狀態),在下圖中就是那條貫穿整個結果的水平線。這個cell state就像是一個傳送帶,他只有很小的線性作用,但卻貫穿了整個鏈式結果。信息很容易就在這個傳送帶上流動但是狀態卻不會改變。cell state上的狀態相當於長期記憶,而下面的 則代表短期記憶。

門限是一種讓信息選擇性通過的方式,它們是由sigmoid神經網路層和逐點相乘器做成的。

sigmoid層輸出0和1之間的數字來描述一個神經元有多少信息應該被通過。輸出0表示這些信息全部不能通過,而輸出1則表示讓所有信息都通過。

一個LSTM有三個這樣的門限,去保護和控制神經元的狀態。

LSTM的第一步就是決定什麼信息應該被神經元遺忘。這是一個被稱為「遺忘門層」的sigmod層組成。他輸入 和 (上一次的輸出以及這輪的輸入),然後在 的每個神經元狀態輸出0和1之間的數字。同理1表示完全保留這些信息,0表示完全遺忘這個信息。

讓我們再次回到一開始舉的例子:根據之前的詞語去預測下一個單詞的語言模型。在這個問題中,cell state或許包括當前主語中的性別信息,所以我們可以使用正確的代詞。而當我們看到一個新的主語(輸入),我們會去遺忘之前的性別信息。我們使用下圖中的公式計算我們的「遺忘系數」

在那個語言模型例子中,我們想給cell state增加主語的性別,來替換我們將要遺忘的舊的主語。

我們給舊的狀態乘一個遺忘系數 ,來遺忘掉我們之前決定要遺忘的信息,然後我們增加 。這是新的候選值,由我們想多大程度更新每個狀態的值決定。

在語言模型中,就像上面描述的,這是我們實際上要丟棄之前主語的性別信息,增加新的主語的性別信息的地方。

最後,我們需要決定我們要輸出什麼。這個輸出是建立在我們的cell state的基礎上,但是這里會有一個濾波器。首先,我們使用sigmoid層決定哪一部分的神經元狀態需要被輸出;然後我們讓cell state經過tanh(讓輸出值變成-1到1之間)層並且乘上sigmod門限的輸出,這樣我們就只輸出我們想要輸出的。

對於那個語言模型的例子,當我們看到一個新的主語的時候,或許我們想輸出相關動詞的信息,因為動詞是跟在主語後面的。例如,它或許要輸出主語是單數還是復數的,然後我們就知道主語後動詞的語態了。

上面講的都是一些常規的LSTM,但並不是所有的LSTM都是上面這種形式。實際上現在很多包含LSTM的論文都有小的差異,但是它值得一提。

Gers & Schmidhuber (2000) 引入了一個流行的LSTM變體,它增加了一個窺視孔連接。這意味著我們讓門限層監視cell state的狀態。

另外一個變體是使用組合遺忘和輸入門,而不是分開決定哪些神經元需要遺忘信息,哪些需要增加新的信息,我們組合起來決定。我們只遺忘那些需要被放入新信息的狀態,同樣我們旨在舊信息被遺忘之後才輸入新的信息。

一個更神奇的LSTM變體是門遞歸單元(也就是大家常說的GRU),它組合遺忘門和輸入門為一個更新門,它合並了cell state和隱層狀態,並且做了一些其他的改變。最終這個模型比標準的LSTM更簡單,並且變得越來越流行。

我們一開始提到人們使用RNN取得了卓越的成果,但其實本質上都是使用LSTM取得的,他們的確在多數任務上表現得更好。

寫下來一系列等式以後,LSTM看起來挺嚇人,但在文中一步步解釋後它變得可以理解了。我們不禁想問:是否有比LSTM更好的模型?學者一致認為:那就是attention注意力機制。核心觀點就是讓RNN每一步都監視一個更大的信息集合並從中挑選信息。例如:如果你使用RNN去為一個圖像生成注釋,它會從圖像中挑選一部分去預測輸出的單詞。接下來在講解attention之前,我們會先聊聊Seq2Seq。

我將會結合一個機器翻譯的例子來給大家形象地介紹Seq2Seq。

在這個例子中,我們試圖將英語轉換為德語,這里要注意這里是一個多對多的模型,而且輸入和輸出的長度都不固定。

Seq2Seq有一個編碼器和一個解碼器,編碼器一般是LSTM或者其他模型用於提取特徵,它的最後一個輸出就是從這句話得出的最後的特徵,而其他的隱層輸出都被丟棄。

同樣,我們先把句子輸入到我們的Encoder裡面,Encoder會輸入最後狀態 ,作為這句話的特徵送給Decoder。

Seq2Seq模型有一個encoder網路和一個Decoder網路,在我們的例子中encoder的輸入是英語句子,每輸入一個詞RNN就會更新狀態並記錄下來,encoder最後一個狀態就是這個句子的特徵,並把之前的狀態丟棄。把這個狀態作為decoder的初始狀態,初始化後decoder就知道這個句子了,首先把起始符作為decoder的輸入,然後一步步更新,輸出狀態和概率分布預測下一個字元,再把預測的字元作為下一個輸入,重復這個過程,最後直到預測終止符就返回輸出的這個序列。

我們的encoder和decoder都是LSTM,encoder把所有句子的特徵壓縮到最後一個狀態,理想情況下encoder最後一個狀態包含完整的信息,假如句子很長,那麼句子有些信息就會被遺忘,那麼Decoder就沒有完整的句子信息,那decoder輸出的德語句子就不完整。

一種簡單方法就是使用雙向LSTM,雙向LSTM簡單來說就是用兩條鏈,從左到右這條鏈可能會遺忘最左邊的信息,而從右往左的這條鏈可能會遺忘右邊的信息,這樣結合起來就不容易遺忘句子信息,這里要注意只是encoder用雙向LSTM,decoder是單向LSTM,他要生成正確順序的序列。

另外一種方法改進就是multi-Task learning,我們還可以多加入幾個任務,比如讓英語句子讓他自己翻譯成英語句子,這樣encoder只有一個但是數據多了一倍,這樣encoder就能被訓練的更好,當然你還可以添加其他語言的任務,通過藉助其他語言更好訓練encoder,這樣雖然decoder沒有變得更好,但是因為encoder提取的更好最後效果也會變好。

當然還有一個方法就是使用注意力機制,這個對機器翻譯提高作用很大,我們接下來就講解這個注意力機制。

我們知道Seq2Seq模型有一個缺點就是句子太長的話encoder會遺忘,那麼decoder接受到的句子特徵也就不完全,我們看一下下面這個圖,縱軸BLUE是機器翻譯的指標,橫軸是句子的單詞量,我們可以看出用了attention之後模型的性能大大提升。

用了注意力機制,Decoder每次更新狀態的時候都會再看一遍encoder所有狀態,還會告訴decoder要更關注哪部分,這也是attention名字的由來。但是缺點就是計算量很大。

在encoder結束之後,attention和decoder同時工作,回憶一下,decoder的初始狀態 是encoder最後一個狀態,不同於常規的Seq2Seq,encoder所有狀態都要保留,這里需要計算 與每個狀態的相關性,我使用 這個公式表示計算兩者相關性,把結果即為 ,記做Weight,encoder有m個狀態,所以一共有m個 ,這里所有的值都是介於0和1的實數,全部加起來為1。

這張圖下面是encoder,上面是decoder,attention會把decoder所有狀態與encoder所有狀態計算相似性,也就是 .在這張圖中每條線就對應一個 ,線越粗說明相關性越高。

這次僅僅是從機器翻譯的角度介紹了attention的一個應用,還有一些比如self-attention,Transformer應用,希望以此為印子能夠打開讀者attention的大門。

1.colah's blog http://colah.github.io/posts/2015-08-Understanding-LSTMs/

2.CS583 https://github.com/wangshusen/DeepLearning

❷ 注意力機制加在什麼位置

注意力機制可以加在編碼層和解碼層之間,甚至可以加在Auto-Encoder裡面。

此外,深度殘差收縮網路是一種特殊的注意力機制演算法,實現了注意力機制下的軟閾值化;把注意力機制嵌入到了殘差模塊裡面。

視覺注意力機制:

視覺注意力機制是人類視覺所特有的大腦信號處理機制。人類視覺通過快速掃描全局圖像,獲得需要重點關注的目標區域,也就是一般所說的注意力焦點,而後對這一區域投入更多注意力資源,以獲取更多所需要關注目標的細節信息,而抑制其他無用信息。

這是人類利用有限的注意力資源從大量信息中快速篩選出高價值信息的手段,是人類在長期進化中形成的一種生存機制,人類視覺注意力機制極大地提高了視覺信息處理的效率與准確性。

❸ 一文看懂 Attention(本質原理+3大優點+5大類型)

Attention(注意力)機制如果淺層的理解,跟他的名字非常匹配。他的核心邏輯就是「 從關注全部到關注重點 」。

Attention 機制很像人類看圖片的邏輯,當我們看一張圖片的時候,我們並沒有看清圖片的全部內容,而是將注意力集中在了圖片的焦點上。大家看一下下面這張圖:

我們一定會看清「錦江飯店」4個字,如下圖:

但是我相信沒人會意識到「錦江飯店」上面還有一串「電話號碼」,也不會意識到「喜運來大酒家」,如下圖:

所以,當我們看一張圖片的時候,其實是這樣的:

上面所說的,我們的視覺系統就是一種 Attention機制, 將有限的注意力集中在重點信息上,從而節省資源,快速獲得最有效的信息。

AI 領域的 Attention 機制

Attention 機制最早是在計算機視覺里應用的,隨後在 NLP 領域也開始應用了,真正發揚光大是在 NLP 領域,因為 2018 年 BERT 和 GPT 的效果出奇的好,進而走紅。而 Transformer 和 Attention 這些核心開始被大家重點關注。

如果用圖來表達 Attention 的位置大致是下面的樣子:

這里先讓大家對 Attention 有一個宏觀的概念,下文會對 Attention 機製做更詳細的講解。在這之前,我們先說說為什麼要用 Attention。

之所以要引入 Attention 機制,主要是3個原因:

參數少

模型復雜度跟 CNN、RNN 相比,復雜度更小,參數也更少。所以對算力的要求也就更小。

速度快

Attention 解決了 RNN 不能並行計算的問題。Attention機制每一步計算不依賴於上一步的計算結果,因此可以和CNN一樣並行處理。

效果好

在 Attention 機制引入之前,有一個問題大家一直很苦惱:長距離的信息會被弱化,就好像記憶能力弱的人,記不住過去的事情是一樣的。

Attention 是挑重點,就算文本比較長,也能從中間抓住重點,不丟失重要的信息。下圖紅色的預期就是被挑出來的重點。

Attention 經常會和 Encoder-Decoder 一起說,之前的文章《 一文看懂 NLP 里的模型框架 Encoder-Decoder 和 Seq2Seq 》 也提到了 Attention。

下面的動圖演示了attention 引入 Encoder-Decoder 框架下,完成機器翻譯任務的大致流程。

但是,Attention 並不一定要在 Encoder-Decoder 框架下使用的,他是可以脫離 Encoder-Decoder 框架的。

下面的圖片則是脫離 Encoder-Decoder 框架後的原理圖解。

小故事講解

上面的圖看起來比較抽象,下面用一個例子來解釋 attention 的原理:

圖書管(source)里有很多書(value),為了方便查找,我們給書做了編號(key)。當我們想要了解漫威(query)的時候,我們就可以看看那些動漫、電影、甚至二戰(美國隊長)相關的書籍。

為了提高效率,並不是所有的書都會仔細看,針對漫威來說,動漫,電影相關的會看的仔細一些(權重高),但是二戰的就只需要簡單掃一下即可(權重低)。

當我們全部看完後就對漫威有一個全面的了解了。

Attention 原理的3步分解:

第一步: query 和 key 進行相似度計算,得到權值

第二步:將權值進行歸一化,得到直接可用的權重

第三步:將權重和 value 進行加權求和

想要了解更多技術細節,可以看看下面的文章或者視頻:

「文章」 深度學習中的注意力機制

「文章」 遍地開花的 Attention,你真的懂嗎?

「文章」 探索 NLP 中的 Attention 注意力機制及 Transformer 詳解

「視頻」 李宏毅 - transformer

「視頻」 李宏毅 - ELMO、BERT、GPT 講解

Attention 有很多種不同的類型:Soft Attention、Hard Attention、靜態Attention、動態Attention、Self Attention 等等。下面就跟大家解釋一下這些不同的 Attention 都有哪些差別。

由於這篇文章《 Attention用於NLP的一些小結 》已經總結的很好的,下面就直接引用了:

本節從計算區域、所用信息、結構層次和模型等方面對Attention的形式進行歸類。

1. 計算區域

根據Attention的計算區域,可以分成以下幾種:

1) Soft Attention,這是比較常見的Attention方式,對所有key求權重概率,每個key都有一個對應的權重,是一種全局的計算方式(也可以叫Global Attention)。這種方式比較理性,參考了所有key的內容,再進行加權。但是計算量可能會比較大一些。

2) Hard Attention,這種方式是直接精準定位到某個key,其餘key就都不管了,相當於這個key的概率是1,其餘key的概率全部是0。因此這種對齊方式要求很高,要求一步到位,如果沒有正確對齊,會帶來很大的影響。另一方面,因為不可導,一般需要用強化學習的方法進行訓練。(或者使用gumbel softmax之類的)

3) Local Attention,這種方式其實是以上兩種方式的一個折中,對一個窗口區域進行計算。先用Hard方式定位到某個地方,以這個點為中心可以得到一個窗口區域,在這個小區域內用Soft方式來算Attention。

2. 所用信息

假設我們要對一段原文計算Attention,這里原文指的是我們要做attention的文本,那麼所用信息包括內部信息和外部信息,內部信息指的是原文本身的信息,而外部信息指的是除原文以外的額外信息。

1) General Attention,這種方式利用到了外部信息,常用於需要構建兩段文本關系的任務,query一般包含了額外信息,根據外部query對原文進行對齊。

比如在閱讀理解任務中,需要構建問題和文章的關聯,假設現在baseline是,對問題計算出一個問題向量q,把這個q和所有的文章詞向量拼接起來,輸入到LSTM中進行建模。那麼在這個模型中,文章所有詞向量共享同一個問題向量,現在我們想讓文章每一步的詞向量都有一個不同的問題向量,也就是,在每一步使用文章在該步下的詞向量對問題來算attention,這里問題屬於原文,文章詞向量就屬於外部信息。

2) Local Attention,這種方式只使用內部信息,key和value以及query只和輸入原文有關,在self attention中,key=value=query。既然沒有外部信息,那麼在原文中的每個詞可以跟該句子中的所有詞進行Attention計算,相當於尋找原文內部的關系。

還是舉閱讀理解任務的例子,上面的baseline中提到,對問題計算出一個向量q,那麼這里也可以用上attention,只用問題自身的信息去做attention,而不引入文章信息。

3. 結構層次

結構方面根據是否劃分層次關系,分為單層attention,多層attention和多頭attention:

1)單層Attention,這是比較普遍的做法,用一個query對一段原文進行一次attention。

2)多層Attention,一般用於文本具有層次關系的模型,假設我們把一個document劃分成多個句子,在第一層,我們分別對每個句子使用attention計算出一個句向量(也就是單層attention);在第二層,我們對所有句向量再做attention計算出一個文檔向量(也是一個單層attention),最後再用這個文檔向量去做任務。

3)多頭Attention,這是Attention is All You Need中提到的multi-head attention,用到了多個query對一段原文進行了多次attention,每個query都關注到原文的不同部分,相當於重復做多次單層attention:

最後再把這些結果拼接起來:

4. 模型方面

從模型上看,Attention一般用在CNN和LSTM上,也可以直接進行純Attention計算。

1)CNN+Attention

CNN的卷積操作可以提取重要特徵,我覺得這也算是Attention的思想,但是CNN的卷積感受視野是局部的,需要通過疊加多層卷積區去擴大視野。另外,Max Pooling直接提取數值最大的特徵,也像是hard attention的思想,直接選中某個特徵。

CNN上加Attention可以加在這幾方面:

a. 在卷積操作前做attention,比如Attention-Based BCNN-1,這個任務是文本蘊含任務需要處理兩段文本,同時對兩段輸入的序列向量進行attention,計算出特徵向量,再拼接到原始向量中,作為卷積層的輸入。

b. 在卷積操作後做attention,比如Attention-Based BCNN-2,對兩段文本的卷積層的輸出做attention,作為pooling層的輸入。

c. 在pooling層做attention,代替max pooling。比如Attention pooling,首先我們用LSTM學到一個比較好的句向量,作為query,然後用CNN先學習到一個特徵矩陣作為key,再用query對key產生權重,進行attention,得到最後的句向量。

2)LSTM+Attention

LSTM內部有Gate機制,其中input gate選擇哪些當前信息進行輸入,forget gate選擇遺忘哪些過去信息,我覺得這算是一定程度的Attention了,而且號稱可以解決長期依賴問題,實際上LSTM需要一步一步去捕捉序列信息,在長文本上的表現是會隨著step增加而慢慢衰減,難以保留全部的有用信息。

LSTM通常需要得到一個向量,再去做任務,常用方式有:

a. 直接使用最後的hidden state(可能會損失一定的前文信息,難以表達全文)

b. 對所有step下的hidden state進行等權平均(對所有step一視同仁)。

c. Attention機制,對所有step的hidden state進行加權,把注意力集中到整段文本中比較重要的hidden state信息。性能比前面兩種要好一點,而方便可視化觀察哪些step是重要的,但是要小心過擬合,而且也增加了計算量。

3)純Attention

Attention is all you need,沒有用到CNN/RNN,乍一聽也是一股清流了,但是仔細一看,本質上還是一堆向量去計算attention。

5. 相似度計算方式

在做attention的時候,我們需要計算query和某個key的分數(相似度),常用方法有:

5)用多層感知機也可以:

❹ LSTM與GRU數學推導

RNN 的關鍵點之一就是他們可以用來連接先前的信息到當前的任務上,例如使用過去的視頻段來推測對當前段的理解。如果 RNN 可以做到這個,他們就變得非常有用。但是真的可以么?答案是,還有很多依賴因素。

有時候,我們僅僅需要知道先前的信息來執行當前的任務。例如,我們有一個語言模型用來基於先前的詞來預測下一個詞。如果我們試著預測 「the clouds are in the sky」 最後的詞,我們並不需要任何其他的上下文 —— 因此下一個詞很顯然就應該是 sky。在這樣的場景中,相關的信息和預測的詞位置之間的間隔是非常小的,RNN 可以學會使用先前的信息。

但是同樣會有一些更加復雜的場景。假設我們試著去預測「I grew up in France... I speak fluent French」最後的詞。當前的信息建議下一個詞可能是一種語言的名字,但是如果我們需要弄清楚是什麼語言,我們是需要先前提到的離當前位置很遠的 France 的上下文的。這說明相關信息和當前預測位置之間的間隔就肯定變得相當的大。

不幸的是,在這個間隔不斷增大時,RNN 會喪失學習到連接如此遠的信息的能力。

在理論上,RNN 絕對可以處理這樣的 長期依賴 問題。人們可以仔細挑選參數來解決這類問題中的最初級形式,但在實踐中,RNN 肯定不能夠成功學習到這些知識。Bengio, et al. (1994)等人對該問題進行了深入的研究,他們發現一些使訓練 RNN 變得非常困難的相當根本的原因。

然而,幸運的是,LSTM 並沒有這個問題!

Long Short Term 網路—— 一般就叫做 LSTM ——是一種 RNN 特殊的類型,可以學習長期依賴信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,並在近期被Alex Graves進行了改良和推廣。在很多問題,LSTM 都取得相當巨大的成功,並得到了廣泛的使用。

LSTM 通過刻意的設計來避免長期依賴問題。記住長期的信息在實踐中是 LSTM 的默認行為,而非需要付出很大代價才能獲得的能力!

所有 RNN 都具有一種重復神經網路模塊的鏈式的形式。在標準的 RNN 中,這個重復的模塊只有一個非常簡單的結構,例如一個 tanh 層。

LSTM 同樣是這樣的結構,但是重復的模塊擁有一個不同的結構。不同於 單一神經網路層,這里是有四個,以一種非常特殊的方式進行交互。

不必擔心這里的細節。我們會一步一步地剖析 LSTM 解析圖。現在,我們先來熟悉一下圖中使用的各種元素的圖標。

在上面的圖例中,每一條黑線傳輸著一整個向量,從一個節點的輸出到其他節點的輸入。粉色的圈代表 pointwise 的操作,諸如向量的和,而黃色的矩陣就是學習到的神經網路層。合在一起的線表示向量的連接,分開的線表示內容被復制,然後分發到不同的位置。

LSTM 的關鍵就是細胞狀態,水平線在圖上方貫穿運行。

細胞狀態類似於傳送帶。直接在整個鏈上運行,只有一些少量的線性交互。信息在上面流傳保持不變會很容易。

LSTM 有通過精心設計的稱作為「門」的結構來去除或者增加信息到細胞狀態的能力。門是一種讓信息選擇式通過的方法。他們包含一個 sigmoid 神經網路層和一個 pointwise 乘法操作。

Sigmoid 層輸出 0 到 1 之間的數值,描述每個部分有多少量可以通過。0 代表「不許任何量通過」,1 就指「允許任意量通過」!

LSTM 擁有三個門,來保護和控制細胞狀態。

在我們 LSTM 中的第一步是決定我們會從細胞狀態中丟棄什麼信息。這個決定通過一個稱為忘記門層完成。該門會讀取h_{t-1}和x_t,輸出一個在 0 到 1 之間的數值給每個在細胞狀態C_{t-1}中的數字。1 表示「完全保留」,0 表示「完全舍棄」。

讓我們回到語言模型的例子中來基於已經看到的預測下一個詞。在這個問題中,細胞狀態可能包含當前主語的性別,因此正確的代詞可以被選擇出來。當我們看到新的主語,我們希望忘記舊的主語。

下一步是確定什麼樣的新信息被存放在細胞狀態中。這里包含兩個部分。第一,sigmoid 層稱 「輸入門層」 決定什麼值我們將要更新。然後,一個 tanh 層創建一個新的候選值向量,\tilde{C}_t,會被加入到狀態中。下一步,我們會講這兩個信息來產生對狀態的更新。

在我們語言模型的例子中,我們希望增加新的主語的性別到細胞狀態中,來替代舊的需要忘記的主語。

現在是更新舊細胞狀態的時間了,C_{t-1}更新為C_t。前面的步驟已經決定了將會做什麼,我們現在就是實際去完成。

我們把舊狀態與f_t相乘,丟棄掉我們確定需要丟棄的信息。接著加上i_t * \tilde{C}_t。這就是新的候選值,根據我們決定更新每個狀態的程度進行變化。

在語言模型的例子中,這就是我們實際根據前面確定的目標,丟棄舊代詞的性別信息並添加新的信息的地方。

最終,我們需要確定輸出什麼值。這個輸出將會基於我們的細胞狀態,但是也是一個過濾後的版本。首先,我們運行一個 sigmoid 層來確定細胞狀態的哪個部分將輸出出去。接著,我們把細胞狀態通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)並將它和 sigmoid 門的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。

在語言模型的例子中,因為他就看到了一個 代詞,可能需要輸出與一個 動詞 相關的信息。例如,可能輸出是否代詞是單數還是負數,這樣如果是動詞的話,我們也知道動詞需要進行的詞形變化。

我們到目前為止都還在介紹正常的 LSTM。但是不是所有的 LSTM 都長成一個樣子的。實際上,幾乎所有包含 LSTM 的論文都採用了微小的變體。差異非常小,但是也值得拿出來講一下。

其中一個流形的 LSTM 變體,就是由 Gers & Schmidhuber (2000) 提出的,增加了 「peephole connection」。是說,我們讓 門層 也會接受細胞狀態的輸入。

上面的圖例中,我們增加了 peephole 到每個門上,但是許多論文會加入部分的 peephole 而非所有都加。

另一個變體是通過使用 coupled 忘記和輸入門。不同於之前是分開確定什麼忘記和需要添加什麼新的信息,這里是一同做出決定。我們僅僅會當我們將要輸入在當前位置時忘記。我們僅僅輸入新的值到那些我們已經忘記舊的信息的那些狀態 。

另一個改動較大的變體是 Gated Recurrent Unit (GRU),這是由 Cho, et al. (2014) 提出。它將忘記門和輸入門合成了一個單一的 更新門。同樣還混合了細胞狀態和隱藏狀態,和其他一些改動。最終的模型比標準的 LSTM 模型要簡單,也是非常流行的變體。

這里只是部分流行的 LSTM 變體。當然還有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。還有用一些完全不同的觀點來解決長期依賴的問題,如Koutnik, et al. (2014) 提出的 Clockwork RNN。

要問哪個變體是最好的?其中的差異性真的重要嗎?Greff, et al. (2015) 給出了流行變體的比較,結論是他們基本上是一樣的。Jozefowicz, et al. (2015) 則在超過 1 萬種 RNN 架構上進行了測試,發現一些架構在某些任務上也取得了比 LSTM 更好的結果。

剛開始,我提到通過 RNN 得到重要的結果。本質上所有這些都可以使用 LSTM 完成。對於大多數任務確實展示了更好的性能!

由於 LSTM 一般是通過一系列的方程表示的,使得 LSTM 有一點令人費解。然而本文中一步一步地解釋讓這種困惑消除了不少。

LSTM 是我們在 RNN 中獲得的重要成功。很自然地,我們也會考慮:哪裡會有更加重大的突破呢?在研究人員間普遍的觀點是:「Yes! 下一步已經有了——那就是注意力!」 這個想法是讓 RNN 的每一步都從更加大的信息集中挑選信息。例如,如果你使用 RNN 來產生一個圖片的描述,可能會選擇圖片的一個部分,根據這部分信息來產生輸出的詞。實際上,Xu, et al. (2015)已經這么做了——如果你希望深入探索注意力可能這就是一個有趣的起點!還有一些使用注意力的相當振奮人心的研究成果,看起來有更多的東西亟待探索……

注意力也不是 RNN 研究領域中唯一的發展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起來也是很有前途。使用生成模型的 RNN,諸如Gregor, et al. (2015) Chung, et al. (2015) 和 Bayer & Osendorfer (2015) 提出的模型同樣很有趣。在過去幾年中,RNN 的研究已經相當的燃,而研究成果當然也會更加豐富!

先看一下比較典型的BPTT一個展開的結構,如下圖,這里只考慮了部分圖,因為其他部分不是這里要討論的內容。

對於t時刻的誤差信號計算如下:

這樣權值的更新方式如下:

上面的公式在BPTT中是非常常見的了,那麼如果這個誤差信號一直往過去傳呢,假設任意兩個節點u, v他們的關系是下面這樣的:

那麼誤差傳遞信號的關系可以寫成如下的遞歸式:

n表示圖中一層神經元的個數,這個遞歸式的大概含義不難理解,要求t-q時刻誤差信號對t時刻誤差信號的偏導,就先求出t-q+1時刻對t時刻的,然後把求出來的結果傳到t-q時刻,遞歸停止條件是q = 1時,就是剛開始寫的那部分計算公式了。將上面的遞歸式展開後可以得到:

論文裡面說的是可以通過歸納來證明,我沒仔細推敲這里了,把裡面連乘展開看容易明白一點:

整個結果式對T求和的次數是n^(q-1), 即T有n^(q-1)項,那麼下面看問題出在哪兒。

如果|T| > 1, 誤差就會隨著q的增大而呈指數增長,那麼網路的參數更新會引起非常大的震盪。

如果|T| < 1, 誤差就會消失,導致學習無效,一般激活函數用simoid函數,它的倒數最大值是0.25, 權值最大值要小於4才能保證不會小於1。

誤差呈指數增長的現象比較少,誤差消失在BPTT中很常見。在原論文中還有更詳細的數學分析,但是了解到此個人覺的已經足夠理解問題所在了。

為了克服誤差消失的問題,需要做一些限制,先假設僅僅只有一個神經元與自己連接,簡圖如下:

根據上面的,t時刻的誤差信號計算如下:

為了使誤差不產生變化,可以強制令下式為1:

根據這個式子,可以得到:

這表示激活函數是線性的,常常的令fj(x) = x, wjj = 1.0,這樣就獲得常數誤差流了,也叫做CEC。

但是光是這樣是不行的,因為存在輸入輸出處權值更新的沖突(這里原論文裡面的解釋我不是很明白),所以加上了兩道控制門,分別是input gate, output gate,來解決這個矛盾,圖如下:

圖中增加了兩個控制門,所謂控制的意思就是計算cec的輸入之前,乘以input gate的輸出,計算cec的輸出時,將其結果乘以output gate的輸出,整個方框叫做block, 中間的小圓圈是CEC, 裡面是一條y = x的直線表示該神經元的激活函數是線性的,自連接的權重為1.0

最初lstm結構的一個缺點就是cec的狀態值可能會一直增大下去,增加forget gate後,可以對cec的狀態進行控制,它的結構如下圖:

這里的相當於自連接權重不再是1.0,而是一個動態的值,這個動態值是forget gate的輸出值,它可以控制cec的狀態值,在必要時使之為0,即忘記作用,為1時和原來的結構一樣。

上面增加遺忘門一個缺點是當前CEC的狀態不能影響到input gate, forget gate在下一時刻的輸出,所以增加了Peephole connections。結構如下:

這里的gate的輸入部分就多加了一個來源了,forget gate, input gate的輸入來源增加了cec前一時刻的輸出,output gate的輸入來源增加了cec當前時刻的輸出,另外計算的順序也必須保證如下:

                      1. input gate, forget gate的輸入輸出

                      2. cell的輸入

                      3. output gate的輸入輸出

                      4. cell的輸出(這里也是block的輸出)

我記得當時看論文公式推導的時候很多地方比較難理解,最後隨便谷歌了幾下,找到一個寫的不錯的類似課件的PDF,但是已經不知道出處了,很容易就看懂LSTM的前向計算,誤差反傳更新了。把其中關於LSTM的部分放上來,首先網路的完整結構圖如下:

這個結構也是rwthlm源碼包中LSTM的結構,下面看一下公式的記號:

前向的計算:

誤差反傳更新:

此外,還有GRU結構同樣是解決RNN的缺點,這里將LSTM和GRU進行對比。

LSTM與GRU:

1) LSTM:

2)GRU:

3)概括的來說,LSTM和GRU都能通過各種Gate將重要特徵保留,保證其在long-term 傳播的時候也不會被丟失;還有一個不太好理解,作用就是有利於BP的時候不容易vanishing:

實驗用了三個unit,傳統的tanh,以及LSTM和GRU:

可以發現LSTM和GRU的差別並不大,但是都比tanh要明顯好很多,所以在選擇LSTM或者GRU的時候還要看具體的task data是什麼, 不過在收斂時間和需要的epoch上,GRU應該要更勝一籌:

相關博客和教程:

https://zybuluo.com/hanbingtao/note/581764

http://www.jianshu.com/p/9dc9f41f0b29

http://www.csdn.net/article/2015-06-05/2824880

http://blog.csdn.net/zdy0_2004/article/details/49977423

http://blog.csdn.net/a635661820/article/details/45390671

http://deeplearning.net/tutorial/lstm.html

https://www.hu.com/question/29411132

原文參考:http://www.cnblogs.com/taojake-ML/p/6272605.html

❺ 問答系統介紹

       這是我的第一篇技術博客,也是對近期學習的問答系統進行一個小結,方便回顧所學。文章難免有錯誤之處,歡迎大家批評指正,不勝感激。

下面將從兩個方面對問答系統進行小結:

一、常見的問答系統種類及介紹

二、問答系統中的常用技術

1.根據問題所屬的知識領域來分類:

(1) 開放域閑聊性。        舉例:微軟小冰

(2)  面向FAQ和任務型。舉例:京東JIMI、蘋果Siri

(3)限定域知識型。         舉例:左手醫生(問答模型、信息檢索)

2.根據答案生成階段的技術分類:

(1)檢索式                    (2)生成式

3.依據答案來源分類:

(1)基於知識圖譜問答系統

(2)機器閱讀理解的問答系統

(3)基於問答對的問答系統

        定義:給定自然語言處理問題,通過對問題進行語義理解和解析,進而利用知識庫進行查詢、推理得出答案。對事實性問答任務而言(如政策問題)這種做法依賴於知識圖譜,准確率比較高。要求知識圖譜是比較大規模的,因為KB-QA無法給出在知識圖譜之外的答案。下面給出常見分類:

(1)基於符號表示的KB-QA(傳統的語義解析方法)

(2)基於向量表示的KB-QA(知識表示學習的方法)

評價標准:召回率(Recall)、精確率(Precision)、F1

常用數據集:WebQuestion、SimpleQuestion、NLPCC KBQA數據集(中文)

(1)基於符號表示的KB-QA(傳統的語義解析方法)

        定義:該方法是一種偏語言學的方法,主體思想是將自然語言轉化為一系列形式化的邏輯形式,通過對邏輯形式進行自底向上的解析,得到一種可以表達整個問題語義的邏輯形式,通過相應的查詢語句在知識庫中進行查詢,從而得出答案。

語義解析傳統方法:

               問題->短語檢測->資源映射->語義組合->邏輯表達式

語義解析目前一般做法:

               建圖->主題詞鏈接->確定核心推導鏈->增加約束和聚合函數

  將語義解析簡化為查詢圖生成,將其表述為具有分階段狀態和動作的搜索問題。

(2)基於向量表示的KB-QA(基於表示學習的方法)

        定義:把知識庫問答看做一個語義匹配過程。通過表示學習知識庫以及用戶問題的語義表示,得到低維空間的數值向量,再通過數值計算,直接匹配與用戶問句語義最相似的答案。即問答任務就可以看成問句語義向量與知識庫中實體、邊的語義向量相似度計算的過程。

         隨著深度學習的發展,基於表示學習的知識庫問答取得了較好的效果。

一般做法:

問題和答案映射向量->向量匹配->計算問題-答案score->優化問題->候選答案選擇

詳細過程:

問題和答案映射向量:

         如何學習問題向量:把問題用LSTM進行建模

         如何學習答案向量:答案不能簡單映射成詞向量,一般是利用到答案實體,答案類型,答案路徑,答案關系,答案上下文信息。分別和問句向量做相似度計算,最終的相似度為幾種相似度之和。代表性的論文  [1]Dong, ACL. Question answering over freebase with multi-column convolutional neural networks.2015提出Multi-column CNN,在答案端加入了更多信息,答案類型、答案路徑以及答案周圍的實體和關系三種特徵向量分別和問句向量做相似度計算,最終的相似度為三種相似度之和。

向量匹配、計算問題-答案score:把這些特徵分別映射成不同的向量,作為答案的其中一個向量(而不是直接拼接起來),最後用這些特徵向量依次和問題做匹配,把score加起來作為總的score。

優化問題、候選答案選擇:一般用Margin Loss,極大化問題對正確答案的score,同時極小化問題對錯誤答案的score。當模型訓練完成後,通過score進行篩選,取最高分的作為最終答案。

        早期方法使用記憶網路來做,論文:Bordes, arXiv. Large-scale simple question answering with memory networks.2015.首先通過Input模塊來處理問題,加入知識庫信息,將三元組通過輸入模塊變換為一條一條的記憶向量,再通過匹配主語獲得候選記憶,進行cos匹配來獲取最終記憶,將最終記憶中的賓語輸出作為答案。在WebQuestions上得到了42.4的F1-score,在SimpleQuestions上得到了63.9的Accuracy。

         接著,又有很多位學者提出了其他基於知識表示學習的方法。其中論文[Xie.2018]提出一種基於深度學習的主題實體抽取模型,結合了問句單詞級別和字元級別的嵌入表示來學習問題的序列表示,並利用雙向LSTM對單詞序列編碼,最後使用CNN網路根據單詞的上下文信息預測單詞是否為主題詞。在答案選擇部分,文章提出一種基於自注意力機制的深度語義表示模型。使用雙向LSTM和CNN網路來構建深度語義模型,並提出一種基於局部和全局上下文的自注意力機制用於計算單詞的注意力權重。考慮語義表示學習和實體抽取任務之間的具有相互輔助作用,文章提出深度融合模型,將基於自注意力機制的深度語義表示模型與主題實體抽取模型結合,用多任務學習的方式進行聯合訓練。在NLPCC-ICCPOL 2016數據集上得到了83.45的F1-score。

         今年,Huang, WSDM. Knowledge graph embedding based question answering.2019 提出KEQA模型,不同於以往的直接計算問句和答案語義相似度的方法,本文嘗試通過關系和實體學習模型從問句分別重構出實體和關系的知識表示,並進一步重構出三元組的知識表示,最終答案為知識庫中與重構三元組最接近的三元組。同時文章也評估了不同的知識表示學習方法TransE,TransH, TransR對KEQA模型精度的影響。

1)基於符號的方法,缺點是需要大量的人工規則,構建難度相對較大。優點是通過規則可以回答更加復雜的問題,有較強的可解釋性.

2)基於向量的方法,缺點是目前只能回答簡單問題,可解釋性差。優點是不需要人工規則,構建難度相對較小。

1)復雜問句,目前End2End的模型只能解決簡單問答。

2)多源異構知識庫問答。對於開放域問答,單一的知識庫不能完全回答所有問題。

3)訓練語料,知識庫中有實體和關系,除此之外還可能有描述實體的文本信息,或許可以結合結構化知識和非結構化文本。

4)對話中的自然語言形式回復。傳統的自動問答都是採用一問一答的形式。然而在很多場景下,需要提問者和系統進行多輪對話交互,實現問答過程。這時,需要系統返回用戶的答案不再只是單一實體、概念、關系的形式,而是需要是以自然語言的形式返回答案。這就需要自動生成自然語言的回復。現有方法多利用 sequence-to-sequence 模型進行自然語言生成,在這一過程中,如何與知識庫相結合,將知識庫問答的答案加入自然語言回復中,仍是亟待解決的問題。

         機器閱讀理解在 NLP 領域近年來備受關注,自 2016 年 EMNLP 最佳數據集論文 SQuAD 發表後,各大企業院校都加入評測行列。利用機器閱讀理解技術進行問答即是對非結構化文章進行閱讀理解得到答案,可以分成匹配式QA,抽取式QA和生成式QA,目前絕大部分是抽取式QA。閱讀理解花樣很多,但是基本框架差異不大。

         SQuAD(斯坦福問答數據集):這是一個閱讀理解數據集,由眾包人員基於一系列維基網路文章的提問和對應的答案構成,其中每個問題的答案是相關文章中的文本片段或區間。SQuAD 一共有 107,785 個問題,以及配套的 536 篇文章。

(1)匹配式QA

         給定文章、問題和一個候選答案集(一般是實體或者單詞),從候選答案中選一個score最高的作為答案。這種形式比較像選擇題型,已經基本上沒人做了。

(2)抽取式 QA

          讓用戶輸入若干篇非結構化文本及若干個問題,機器自動在閱讀理解的基礎上,在文本中自動尋找答案來回答用戶的問題。抽取式 QA 的某個問題的答案肯定出現在某篇文章中。抽取式 QA 的經典數據集是 SQuAD。

(3)生成式QA

    目前只有MSRA的MS MARCO數據集,針對這個數據集,答案形式是這樣的:

1)答案完全在某篇原文

2)答案分別出現在多篇文章中

3)答案一部分出現在原文,一部分出現在問題中

4)答案的一部分出現在原文,另一部分是生成的新詞

5)答案完全不在原文出現(Yes / No 類型)

         隨著互聯網技術的成熟和普及, 網路上出現了常問問題(frequent asked questions, FAQ)數據, 特別是在 2005 年末以來大量 的社區問答(community based question answering, CQA)數據(例如 Yahoo!Answer)出現在網路上, 即有了大量的問題答案對數據, 問答系統進入了開放領域、基於問題答案對時期。

一般過程:問題分析 ->信息檢索->答案抽取

問題分析階段:和基於自由文本的問答系統的問題分析部分基本一樣, 不過還多了幾個不同的研究點:

(1)問題主客觀的判斷   

(2)問題的緊急性(通常在CQA數據中)

信息檢索階段:該階段目標是如何根據問題的分析結果去縮小答案 可能存在的范圍,其中存在兩個關鍵問題:

(1)檢索模型(找到和問題類似的問題)

(2)兩個問題相似性判斷(返回答案或返回相似問題列表)

答案抽取部分:在答案抽取部分, 由於問題答案對已經有了答案, 答案抽取最重要的工作就是判斷答案的質量.研究怎麼從問題的眾多答案中選擇一個最好的答案.

下面網址給出了一些論文和近期研究成果:

https://blog.csdn.net/class_guy/article/details/81535287

參考文獻:

[1]Berant.EMNLP.Semantic parsing on freebase from question-answer pairs.2013

[2]Yih.ACL.Semantic Parsing via Staged Query Graph Generation:Question Answering with Knowledge Base.2015

[3]Dong, ACL. Question answering over freebase with multi-column convolutional neural networks.2015

[4]Hao, ACL. An end-to-end model for question answering over knowledge base with cross-attention combining global knowledge.

[5]Bordes, arXiv. Large-scale simple question answering with memory networks.2015

[6]Huang, WSDM. Knowledge graph embedding based question answering.2019

[8]Susht.知乎.一份關於問答系統的小結.2018

❻ 目前主流的attention方法都有哪些

首先是Object Recognition。是因為模型結合了CNN,RNN 和 Reinforcement Learning,來解決問題。並且在其上對它進行很大程度了改進,並引入了weakly supervised的因素;然後是Image Caption。Xu在ICML上的 Show, Attend and Tell: Neural Image Caption Generation with Visual Attention可謂應用Attetion來解image caption的經典。再是NLP中的MachinTranslation. 前面的工作都是用時序地進行Attention來關注一幅圖像的不同位置區域。類比sequence問題,也就順理成章地用在Machine Translation上了。劃重點來說attention機制聽起來高達上,其實就是學出一個權重分布,再拿這個權重分布施加在原來的特徵之上,就可以叫attention。當然這個加權可以是保留所有分量均做加權(即soft attention);也可以是在分布中以某種采樣策略選取部分分量(即hard attention)。

❼ 注意力機制詳解

Attention機制在近幾年來在圖像,自然語言處理等領域中都取得了重要的突破,被證明有益於提高模型的性能。Attention機制本身也是符合人腦和人眼的感知機制,這里我們主要以計算機視覺領域為例,講述Attention機制的原理,應用以及模型的發展。

所謂Attention機制,便是聚焦於局部信息的機制,比如圖像中的某一個圖像區域。隨著任務的變化,注意力區域往往會發生變化。

面對上面這樣的一張圖,如果你只是從整體來看,只看到了很多人頭,但是你拉近一個一個仔細看就了不得了,都是天才科學家。

圖中除了人臉之外的信息其實都是無用的,也做不了什麼任務, Attention機制便是要找到這些最有用的信息 ,可以想見最簡單的場景就是從照片中檢測人臉了。

和注意力機制相伴而生的一個任務便是顯著目標檢測,即salient object detection。它的輸入是一張圖,輸出是一張概率圖,概率越大的地方,代表是圖像中重要目標的概率越大,即人眼關注的重點,一個典型的顯著圖如下:

右圖就是左圖的顯著圖,在頭部位置概率最大,另外腿部,尾巴也有較大概率,這就是圖中真正有用的信息。

顯著目標檢測需要一個數據集,而這樣的數據集的收集便是通過追蹤多個實驗者的眼球在一定時間內的注意力方向進行平均得到,典型的步驟如下:

於是就能得到下面這樣的圖,第二行是眼球追蹤結果,第三行就是顯著目標概率圖。

上面講述的都是空間上的注意力機制,即關注的是不同空間位置,而在CNN結構中,還有不同的特徵通道,因此不同特徵通道也有類似的原理,下面一起講述。

注意力機制的本質就是定位到感興趣的信息,抑制無用信息,結果通常都是以概率圖或者概率特徵向量的形式展示,從原理上來說,主要分為 空間注意力模型,通道注意力模型,空間和通道混合注意力模型 三種, 這里不區分soft和hard attention

不是圖像中所有的區域對任務的貢獻都是同樣重要的,只有任務相關的區域才是需要關心的,比如分類任務的主體,空間注意力模型就是尋找網路中最重要的部位進行處理。

我們在這里給大家介紹兩個具有代表性的模型,第一個就是Google DeepMind提出的STN網路(Spatial Transformer Network[1])。它通過學習輸入的形變,從而完成適合任務的預處理操作,是一種基於空間的Attention模型,網路結構如下:

這里的Localization Net用於生成仿射變換系數,輸入是C×H×W維的圖像,輸出是一個空間變換系數,它的大小根據要學習的變換類型而定,如果是仿射變換,則是一個6維向量。

這樣的一個網路要完成的效果如下圖:

即定位到目標的位置,然後進行旋轉等操作,使得輸入樣本更加容易學習。這是一種一步調整的解決方案,當然還有很多迭代調整的方案,感興趣可以去有三知識星球星球中閱讀。

相比於Spatial Transformer Networks 一步完成目標的定位和仿射變換調整,Dynamic Capacity Networks[2]則採用了兩個子網路,分別是低性能的子網路(coarse model)和高性能的子網路(fine model)。低性能的子網路(coarse model)用於對全圖進行處理,定位感興趣區域,如下圖中的操作fc。高性能的子網路(fine model)則對感興趣區域進行精細化處理,如下圖的操作ff。兩者共同使用,可以獲得更低的計算代價和更高的精度。

由於在大部分情況下我們感興趣的區域只是圖像中的一小部分,因此空間注意力的本質就是定位目標並進行一些變換或者獲取權重。

對於輸入2維圖像的CNN來說,一個維度是圖像的尺度空間,即長寬,另一個維度就是通道,因此基於通道的Attention也是很常用的機制。

SENet(Sequeeze and Excitation Net)是2017屆ImageNet分類比賽的冠軍網路,本質上是一個基於通道的Attention模型,它通過建模各個特徵通道的重要程度,然後針對不同的任務增強或者抑制不同的通道,原理圖如下。

在正常的卷積操作後分出了一個旁路分支,首先進行Squeeze操作(即圖中Fsq(·)),它將空間維度進行特徵壓縮,即每個二維的特徵圖變成一個實數,相當於具有全局感受野的池化操作,特徵通道數不變。

然後是Excitation操作(即圖中的Fex(·)),它通過參數w為每個特徵通道生成權重,w被學慣用來顯式地建模特徵通道間的相關性。在文章中,使用了一個2層bottleneck結構(先降維再升維)的全連接層+Sigmoid函數來實現。

得到了每一個特徵通道的權重之後,就將該權重應用於原來的每個特徵通道,基於特定的任務,就可以學習到不同通道的重要性。

將其機制應用於若干基準模型,在增加少量計算量的情況下,獲得了更明顯的性能提升。作為一種通用的設計思想,它可以被用於任何現有網路,具有較強的實踐意義。而後SKNet等方法將這樣的通道加權的思想和Inception中的多分支網路結構進行結合,也實現了性能的提升。

通道注意力機制的本質,在於建模了各個特徵之間的重要性,對於不同的任務可以根據輸入進行特徵分配,簡單而有效。

前述的Dynamic Capacity Network是從空間維度進行Attention,SENet是從通道維度進行Attention,自然也可以同時使用空間Attention和通道Attention機制。

CBAM(Convolutional Block Attention Mole)是其中的代表性網路,結構如下:

通道方向的Attention建模的是特徵的重要性,結構如下:

空間方向的Attention建模的是空間位置的重要性,結構如下:

首先將通道本身進行降維,分別獲取最大池化和均值池化結果,然後拼接成一個特徵圖,再使用一個卷積層進行學習。

這兩種機制,分別學習了通道的重要性和空間的重要性,還可以很容易地嵌入到任何已知的框架中。

除此之外,還有很多的注意力機制相關的研究,比如 殘差注意力機制,多尺度注意力機制,遞歸注意力機制 等。

從原理上來說,注意力機制在所有的計算機視覺任務中都能提升模型性能,但是有兩類場景尤其受益。

我們知道細粒度分類任務中真正的難題在於如何定位到真正對任務有用的局部區域,如上示意圖中的鳥的頭部。Attention機制恰巧原理上非常合適,使用了注意力機制,對模型的提升效果很明顯。

我們又回到了開頭,沒錯,Attention的本質就是重要/顯著區域定位,所以在目標檢測領域是非常有用的。

上圖展示了幾個顯著目標檢測的結果,可以看出對於有顯著目標的圖,概率圖非常聚焦於目標主體,在網路中添加註意力機制模塊,可以進一步提升這一類任務的模型。

❽ 為什麼說Transformer的注意力機制是相對廉價的注意力機制相對更對於RNN系列及CNN系列演算法有何優勢

QA形式對自然語言處理中注意力機制(Attention)進行總結,並對Transformer進行深入解析。


二、Transformer(Attention Is All You Need)詳解
1、Transformer的整體架構是怎樣的?由哪些部分組成?
2、Transformer Encoder 與 Transformer Decoder 有哪些不同?
3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?
4、multi-head self-attention mechanism具體的計算過程是怎樣的?
5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?

一、Attention機制剖析

1、為什麼要引入Attention機制?

根據通用近似定理,前饋網路和循環網路都有很強的能力。但為什麼還要引入注意力機制呢?

❾ 三不機制是什麼

三不機制是什麼?三不體制機制指的是不敢腐、不能腐、不想腐。不敢腐是紀律、法治、震懾,側重於保持高壓、持續震懾,是不能、不想的前提;不能腐是制度、監督、約束,側重於扎緊籠子、堵塞漏洞,是不敢、不想的保障;不想腐是認知、覺悟、文化,側重於提高思想覺悟、堅定理想信念,是不敢、不能的防線。



一、三不體制機制發布背景

2019年是中華人民共和國成立70周年,是全面建成小康社會、實現第一個百年奮斗目標的關鍵之年。在黨中央堅強領導下,紀檢監察工作堅定穩妥、扎實有效,在高質量發展上取得新的成績。中央紀委國家監委網站與《咬文嚼字》編輯部利用大數據搜索,聯合發布2019年度十大反腐熱詞。

二、三不體制機制內容

2019年1月,黨的十九屆四中全會將構建一體推進「三不」體制機製作為堅持和完善黨和國家監督體系重要內容,單列一條作出部署。一體推進「三不」,凝結著對腐敗發生機理、管黨治黨規律和當前形勢任務的深刻洞察,是適用於全面從嚴治黨各方面的科學思路和有效方法。一年來,紀檢監察機關在嚴厲懲治、形成震懾的同時,扎牢制度籠子、規范權力運行,加強黨性教育、提高思想覺悟,一體推進不敢腐、不能腐、不想腐,反腐敗斗爭壓倒性勝利不斷鞏固發展。

一體推進「三不」揭示了標本兼治的基本規律,不僅是反腐敗斗爭的基本方針,也是新時代全面從嚴治黨的重要方略。一年來,紀檢監察機關注重把懲治震懾、制度約束、提高覺悟結合起來,把「三不」要求貫徹落實到正風肅紀反腐各方面,構建一體推進不敢腐、不能腐、不想腐體制機制,不斷推動紀檢監察工作高質量發展。

❿ BERT - 論文解讀

BERT:【 Pre-training of Deep Bidirectional Transformers for
Language Understanding】

將預訓練語言模型應用在下游任務中,一般有兩種策略:

作者認為影響當前預訓練語言模型的 瓶頸是——「模型是單向的」 。如 GPT 選擇從左到右的架構,這使得每個 token 只能注意到它前面的 token,這對 sentence 級的任務影響還是次要的,但對於 token 級的任務來說影響就很巨大。例如問答任務,從兩個方向結合上下文是至關重要的。

BERT 通過使用受完形填空任務啟發的 Mask Language Model (MLM)緩解了先前模型的單向性約束問題。MLM 隨機 mask 掉一些輸入文本中的 token,然後根據剩下的上下文預測 masked 的 token。除了 Mask Language Model,作者還提出了 Next Sequence Predict 任務,來聯合訓練文本對表示。

論文中BERT的改進如下:

預訓練前的一般語言表徵有著悠久歷史,本節我們簡要回顧一下最廣泛使用的方法。

2.1 基於特徵的無監督方法
幾十年來,學習廣泛適用的詞彙表徵一直是一個活躍的研究領域,包括非神經系統、神經系統方法。預訓練的詞嵌入是現代NLP系統的一個組成部分,與從頭學習的嵌入相比,它提供了顯著的改進(Turian等人,2010)。為了預先訓練單詞嵌入向量,已經使用了從左到右的語言建模目標(Mnih和Hinton,2009),以及在左右上下文中區分正確單詞和錯誤單詞的目標(Mikolov等人,2013)。

這些方法已被推廣到更粗糙的粒度,例如句子嵌入(Kiros等人,2015;Logeswaran和Lee,2018)或段落嵌入(Le和Mikolov,2014)。為了訓練句子表徵,之前的工作已經使用了目標對候選下一個句子進行排序(Jernite等人,2017;Logeswaran和Lee,2018),根據前一個句子的表徵從左到右生成下一個句子單詞(Kiros等人,2015),或去噪自動編碼器衍生的目標(Hill等人,2016)。

ELMo 及其前身(Peters等人,20172018a)從不同的維度概括了傳統的單詞嵌入研究。它們通過從左到右和從右到左的語言模型中提取上下文敏感的特徵。每個標記的上下文表示是從左到右和從右到左表示的 串聯 。在將上下文單詞嵌入與現有任務特定架構相結合時,ELMo推進了幾個主要NLP基準(Peters等人,2018a)的最新技術,包括問答(Rajpurkar等人,2016年)、情感分析(Socher等人,2013年)和命名實體識別(Tjong Kim-Sang和De Meulder,2003年)。Melamud等人(2016年)提出通過一項任務來學習語境表徵,即使用 LSTM 從左右語境中預測單個單詞。與ELMo類似,他們的模型是基於特徵的,而不是深度雙向的。Fes等人(2018)表明,完形填空任務可以用來提高文本生成模型的 穩健性

2.2 無監督微調方法:

基於特徵feature-based 的方法一樣,第一種方法只在未標記文本中預先訓練單詞嵌入參數的情況下才朝這個方向工作。最近,產生上下文標記表示的句子或文檔編碼器已經從未標記的文本和文本中預訓練出來針對受監督的下游任務進行了 微調fine-tuned
這些方法的 優點是 ,很少有參數需要從頭學習。至少部分由於這一優勢,OpenAI GPT在GLUE基準測試的許多句子級任務上取得了之前的最新成果。從左到右的語言建模和自動編碼器目標已用於此類模型的預訓練。

註解 :BERT的整體預訓練和微調程序。除了輸出層之外,在預訓練和微調中使用相同的體系結構。相同的預訓練模型參數用於初始化不同下游任務的模型。在微調過程中,所有參數都會微調。

2.3 基於監督數據的遷移學習:
也有研究表明,在大數據集的監督任務中,如自然語言推理和機器翻譯可以有效地進行轉換。計算機視覺研究也證明了 從大型預訓練模型中進行遷移學習的重要性 ,其中一個有效的方法是對使用ImageNet預訓練模型進行微調。

本節將介紹BERT及其詳細實現。在我們的框架中有兩個步驟:預訓練和微調。

BERT的一個顯著特點是其跨不同任務的統一體系結構 。預訓練的體系結構和最終的下游體系結構之間的差異最小。

BERT 的模型架構是 一種多層的雙向 transformer encoder ,BERT 在實現上與 transformer encoder 幾乎完全相同。

定義:transformer block 的個數為 L ; hidden 大小為 H; self-attentions head 的個數為 A. 作者主要展示了兩種規模的 BERT 模型:

在這項工作中,我們將層數(即Transformer blocks)表示為L,隱藏大小表示為H,自我注意頭的數量表示為A。我們主要報告兩種型號的結果:

為了進行比較,選擇BERT-base與OpenAI GPT具有相同的模型大小。然而,關鍵的是, BERT Transformer使用雙向自注意力機制self-attention ,而 GPT Transformer使用受限自注意力機制constrained self-attention ,其中每個標記只能關注其左側的上下文。

為了使 BERT 能處理大量不同的下游任務,作者將模型的輸入設計成可以輸入單個句子或句子對,這兩種輸入被建模成同一個 token 序列。作者使用了有 30000 個 token 的 vocabulary 詞嵌入。

3.1 Pre-training BERT :
我們不使用傳統的從左到右或從右到左的語言模型來預訓練BERT。相反,我們使用本節所述的兩個無監督任務對BERT進行預訓練。這一步如圖1的左半部分所示。

Task #1: Masked LM
標準的語言模型只能實現從左到右或從右到左的訓練,不能實現真正的雙向訓練,這是因為雙向的條件是每個單詞能直接「看到自己」,並且模型可以在多層上下文中輕松的預測出目標詞。

為了能夠實現雙向的深度預訓練,作者選擇 隨機 mask 掉一些比例的 token ,然後預測這些被 masked 的 token,在這種設置下,被 masked 的 token 的隱向量表示被輸出到詞彙表的 softmax 上,這就與標准語言模型設置相同。作者將 這個過程稱為「Masked LM」,也被稱為「完形填空」

○ Masked LM 預訓練任務的缺點
在於由於 [MASK] 標記不會出現在微調階段,這就造成了預訓練和微調階段的不一致。為了解決該問題,作者提出了 一種折中的方案

○ BERT 的 mask策略:

Task #2: Next Sentence Prediction (NSP)
很多下游任務都是基於對兩句話之間的關系的理解,語言模型不能直接捕獲這種信息。為了訓練模型理解這種句間關系,作者 設計了 next sentence prediction 的二分類任務 。具體來說,就是選擇兩個句子作為一個訓練樣本,有 50% 的概率是下一句關系,有 50% 的概率是隨機選擇的句子對, 預測將 [CLS] 的最終隱狀態 C 輸入 sigmoid 實現

○ Pre-training data
作者選用了BooksCorpus (800M words) 和 English Wikipedia (2,500M words) 作為預訓練的語料庫,作者只選取了 Wikipedia 中的文本段落,忽略了表格、標題等。為了獲取長的連續文本序列,作者選用了 BIllion Word Benchmark 這樣的文檔級語料庫,而非打亂的句子級語料庫。

3.2 Fine-tuning BERT
因為 transformer 中的 self-attention 機制適用於很多下游任務,所以可以直接對模型進行微調。對於涉及文本對的任務,一般的做法是獨立 encode 文本對,然後再應用雙向的 cross attention 進行交互。Bert 使用 self-attention 機制統一了這兩個階段,該機制直接能夠實現兩個串聯句子的交叉編碼。

對於不同的任務,只需要簡單地將特定於該任務的輸入輸出插入到 Bert 中,然後進行 end2end 的fine-tuning。

與預訓練相比,微調相對便宜。從完全相同的預訓練模型開始,本文中的所有結果最多可以在單個雲TPU上復制1小時,或在GPU上復制幾個小時。

在本節中,我們將介紹11個NLP任務的BERT微調結果。
4.1 GLUE:
GLUE (General Language Understanding Evaluation) 是多個 NLP 任務的集合。作者設置 batch size 為 32;訓練 3 個 epochs;在驗證集上從(5e-5, 4e-5, 3e-5, 2e-5)中選擇最優的學習率。結果如下:

結果見表1。 BERT-base和BERT-large在所有任務上都比所有系統表現出色,與現有技術相比,平均准確率分別提高了4.5%和7.0% 。請注意,除了注意掩蔽,BERT-base和OpenAI GPT在模型架構方面幾乎相同。

對於最大和最廣泛報道的GLUE任務MNLI,BERT獲得了4.6%的絕對准確率提高。在官方的GLUE排行榜10中,BERT-lagle獲得80.5分,而OpenAI GPT在撰寫本文之日獲得72.8分。我們發現BERT-large在所有任務中都顯著優於BERT-base,尤其是那些訓練數據很少的任務。

4.2 SQuAD v1.1 :
斯坦福問答數據集(SQuAD v1.1)收集了10萬對眾包問答對。給出一個問題和一段維基網路中包含答案的文章,任務是預測文章中的答案文本。

如圖1所示,在問答任務中,我們將輸入的問題和段落表示為單個壓縮序列,問題使用A嵌入,段落使用B嵌入。在微調過程,我們只引入一個起始向量S和一個端向量E。單詞i作為答案范圍開始的概率計算為Ti和S之間的點積,然後是段落中所有單詞的softmax:

答案范圍結束時使用類似公式。候選人從位置 i 到位置 j 的得分定義為:S·Ti + E·Tj ,最大得分跨度為 j≥ i 被用作預測。訓練目標是正確起始位置和結束位置的對數概率之和。我們微調了3個階段,學習率為5e-5,批量大小為32。

表2顯示了頂級排行榜條目以及頂級發布系統的結果。SQuAD排行榜的前幾名沒有最新的公共系統描述,並且允許在訓練系統時使用任何公共數據。因此,在我們的系統中使用適度的數據擴充,首先在TriviaQA上進行微調,然後再對團隊進行微調。

我們表現最好的系統在ensembling方面的表現優於排名第一的系統,在ensembling方面的表現優於排名第一的系統+1.5 F1,在單一系統方面的表現優於排名第一的系統+1.3 F1得分。事實上,我們的單BERT模型在F1成績方面優於頂級合奏系統。如果沒有TriviaQA微調數據,我們只會損失0.1-0.4 F1,仍然遠遠超過所有現有系統。

其他實驗:略

在本節中,我們對BERT的許多方面進行了消融實驗,以便更好地了解它們的相對重要性。其他消融研究見附錄C。

5.1 預訓練任務的效果

○ 進行了如下消融測試:

○ 結果如下:

5.2 模型大小的影響

○ 結果如下:

作者證明了 :如果模型經過充分的預訓練,即使模型尺寸擴展到很大,也能極大改進訓練數據規模較小的下游任務。

5.3 將 Bert 應用於 Feature-based 的方法

○ feature-based 的方法是從預訓練模型中提取固定的特徵,不對具體任務進行微調
○ 這樣的方法也有一定的優點

作者進行了如下實驗:在 CoNLL-2003 數據集上完成 NER 任務,不使用 CRF 輸出,而是從一到多個層中提取出激活值,輸入到 2 層 768 維的 BiLSTM 中,再直接分類。結果如下:

結果說明:無論是否進行微調,Bert 模型都是有效的。

個人認為 Bert 的意義在於:

由於語言模型的遷移學習,最近的經驗改進表明,豐富的、無監督的預訓練是許多語言理解系統的一個組成部分。特別是,這些結果使得即使是低資源任務也能從深層單向體系結構中受益。我們的主要貢獻是將這些發現進一步推廣到深層雙向體系結構中,使相同的預訓練模型能夠成功地處理廣泛的NLP任務。

閱讀全文

與lstm注意力機制應用源碼相關的資料

熱點內容
卡爾曼濾波演算法書籍 瀏覽:769
安卓手機怎麼用愛思助手傳文件進蘋果手機上 瀏覽:844
安卓怎麼下載60秒生存 瀏覽:803
外向式文件夾 瀏覽:240
dospdf 瀏覽:431
怎麼修改騰訊雲伺服器ip 瀏覽:392
pdftoeps 瀏覽:495
為什麼鴻蒙那麼像安卓 瀏覽:735
安卓手機怎麼拍自媒體視頻 瀏覽:185
單片機各個中斷的初始化 瀏覽:724
python怎麼集合元素 瀏覽:481
python逐條解讀 瀏覽:833
基於單片機的濕度控制 瀏覽:499
ios如何使用安卓的帳號 瀏覽:882
程序員公園采訪 瀏覽:812
程序員實戰教程要多長時間 瀏覽:979
企業數據加密技巧 瀏覽:135
租雲伺服器開發 瀏覽:814
程序員告白媽媽不同意 瀏覽:336
攻城掠地怎麼查看伺服器 瀏覽:601