深度學習做NLP的方法,基本上都是先將句子分詞,然后每個詞轉化為對應的詞向量序列。(https://kexue.fm/archives/4765)

第一個思路是RNN層,遞歸進行,但是RNN無法很好地學習到全局的結構信息,因為它本質是一個馬爾科夫決策過程。

第二個思路是CNN層,其實CNN的方案也是很自然的,窗口式遍歷,比如尺寸為3的卷積,就是

在FaceBook的論文中,純粹使用卷積也完成了Seq2Seq的學習,是卷積的一個精致且極致的使用案例,CNN方便並行,而且容易捕捉到一些全局的結構信息,
Google的大作提供了第三個思路:純Attention!單靠注意力就可以!RNN要逐步遞歸才能獲得全局信息,因此一般要雙向RNN才比較好;CNN事實上只能獲取局部信息,是通過層疊來增大感受野;Attention的思路最為粗暴,它一步到位獲取了全局信息!它的解決方案是:

Attention層
Attention的定義:
Attention顧名思義,是由人類觀察環境的習慣規律總結出來的,人類在觀察環境時,大腦往往只關注某幾個特別重要的局部,獲取需要的信息,構建出關於環境的某種描述,而Attention機制正是如此,去學習不同局部的重要性,再結合起來。
從數學公式上可以理解為加權求和;從形式上可以理解為鍵值查詢;最后,從物理意義上,可以理解為相似性度量。
Google的一般化Attention思路也是一個編碼序列的方案,因此我們也可以認為它跟RNN、CNN一樣,都是一個序列編碼的層。
前面給出的是一般化的框架形式的描述,事實上Google給出的方案是很具體的。首先,它先把Attention的定義給了出來:

其中Q∈R^n×dk,K∈R^m×dk,V∈R^m×dv。如果忽略激活函數softmax的話,那么事實上它就是三個n×dk,dk×m,m×dv的矩陣相乘,最后的結果就是一個n×dvn×dv的矩陣。於是我們可以認為:這是一個Attention層,將n×dkn×dk的序列Q編碼成了一個新的n×dv的序列。

(http://ir.dlut.edu.cn/news/detail/486)
對於傳統的機器翻譯,我們可以使用sequence to sequence(encoder-decoder)模型來進行翻譯,如下圖所示。

這里,我們可以把上圖抽象出來得到下圖。輸入序列{x1, x2, x3, x4},傳入編碼器(encoder)中進行編碼,得到語義編碼c,然后通過解碼器(decoder)進行解碼,得到輸出序列{y1, y2, y3},輸入與輸出的個數可以不相等。對於句子<Source,Target>,我們的目標是給定輸入句子Source,期待通過Encoder-Decoder框架來生成目標句子Target.
Source=<x1,x2,x3,...xm>
Target=<y1,y2,...yn>
Encoder顧名思義就是對輸入句子Source進行編碼,將輸入句子通過非線性變換轉化為中間語義表示C:
C=F(x1,x2,...xm)
對於解碼器Decoder來說,其任務是根據句子Source的中間語義表示C和之前已經生成的歷史信息y1,y2,..yi-1,來生成i時刻要生成的單詞yi:
yi=g(C,y1,y2,y3,..yi-1).
(一般而言,文本處理和語音識別的Encoder一般采用RNN模型,圖像處理的Encoder一般采用CNN模型。)

但是,這種方式會有一個問題:對於長句子的翻譯會造成一定的困難,而attention機制的引入可以解決這個問題。(為什么引入注意力模型?因為沒有引入注意力的模型在輸入句子比較短的時候問題不大,但是如果輸入的句子比較長,此時所有語義完全通過一個中間語義向量來表示,單詞自身的信息已經消失,可想而知會丟失很多的細節信息,所以要引入注意力機制)如下圖所示:

這里,我們可以看到,decoder中有幾個輸出序列,對應的語義編碼c則有相同的數量,即一個語義編碼ci對應一個輸出yi。而每個ci就是由attention機制得到,具體公式如下:

回顧了傳統的attention模型之后,我們看一下google翻譯團隊對attention模型的高度抽取概況。他們將其映射為一個query和一系列<key, value>,最終得到輸出attention value的過程。這里的query相當於decoder中的si-1,key與value都來自於encoder的hj,區別在於前后狀態的hj。然后計算query與keyi的相似度,並與valuei進行相乘,然后求和。
下圖揭示了Attention機制的本質:將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關性,得到每個Key對應Value的權重系數,然后對Value進行加權求和,即得到了最終的Attention數值。所以本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重系數。
理解Attention模型的關鍵就是,由固定的中間語義表示C換成了根據當前輸出單詞來調整成加入注意力模型的變化的Ci.而每個Ci可能對應着不同的源語句子單詞的注意力分配概率分布。

上面提到的query與key之間計算相似度有許多方法,如dot、general、concat和MLP等方式,具體公式如下所示。而attention模型抽象為query、key和value之間的相似度計算,總共有3個階段。第一階段:query與keyi使用特定的相似度函數計算相似度,得到si;第二階段:對si進行softmax()歸一化得到ai;第三階段,將ai與valuei對應相乘再求和,得到最終的attention value。其實對比傳統的attention公式,我們可以看出,這兩套公式還是很像的。

Attention機制:將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關性,得到每個Key對應Value的權重系數,然后對Value進行加權求和,即得到了最終的Attention數值。所以本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重系數。
---------------------
作者:張俊林博客
來源:CSDN
原文:https://blog.csdn.net/malefactor/article/details/78767781?utm_source=copy
(補充:softmax() (https://blog.csdn.net/red_stone1/article/details/80687921)
什么是Softmax?Softmax在機器學習和深度學習中有着非常廣泛的應用。尤其在處理多類(C>2)問題,分類器最后的輸出單元需要Softmax函數進行數值處理。
關於Softmax函數的定義如下:

其中,Vi 是分類器前級輸出單元的輸出。i 表示類別索引,總的類別個數為 C。Si 表示的是當前元素的指數與所有元素指數和的比值。Softmax 將多分類的輸出數值轉化為相對概率,更容易理解和比較。我們來看下面這個例子。
一個多分類問題,C = 4。線性分類器模型最后輸出層包含了四個輸出值,分別是:
經過Softmax處理后,數值轉化為相對概率:

很明顯,Softmax 的輸出表征了不同類別之間的相對概率。我們可以清晰地看出,S1 = 0.8390,對應的概率最大,則更清晰地可以判斷預測為第1類的可能性更大。Softmax 將連續數值轉化成相對概率,更有利於我們理解。
實際應用中,使用 Softmax 需要注意數值溢出的問題。因為有指數運算,如果 V 數值很大,經過指數運算后的數值往往可能有溢出的可能。所以,需要對 V 進行一些數值處理:即 V 中的每個元素減去 V 中的最大值。

補充:
掩膜的用法
2.1 提取感興趣區:用預先制作的感興趣區掩膜與待處理圖像相乘,得到感興趣區圖像,感興趣區內圖像值保持不變,而區外圖像值都為0;
2.2 屏蔽作用:用掩膜對圖像上某些區域作屏蔽,使其不參加處理或不參加處理參數的計算,或僅對屏蔽區作處理或統計;
2.3 結構特征提取:用相似性變量或圖像匹配方法檢測和提取圖像中與掩膜相似的結構特征;
2.4 特殊形狀圖像的制作。
---------------------
作者:bitcarmanlee
來源:CSDN
原文:https://blog.csdn.net/bitcarmanlee/article/details/79132017?utm_source=copy
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
)
