1: pointer network
Pointer Network是seq2seq模型的一個變種。他們不是把一個序列轉換成另一個序列, 而是產生一系列指向輸入序列元素的指針。最基礎的用法是對可變長度序列或集合的元素進行排序。
傳統的seq2seq模型是無法解決輸出序列的詞匯表會隨着輸入序列長度的改變而改變的問題的。在某些任務中,輸入嚴格依賴於輸入,或者說輸出只能從輸入中選擇。例如輸入一段話,提取這句話中最關鍵的幾個詞語。又或是輸入一串數字,輸出對這些數字的排序。這時如果使用傳統seq2seq模型,則忽略了輸入只能從輸出中選擇這個先驗信息,Pointer Networks正是為了解決這個問題而提出的。
指針網絡是在Seq2Seq模型的基礎上,將attention機制修改得來的。
從Sequence2Sequence模型說起
Seq2Seq模型:
Sequence2Sequence模型,它實現了把一個序列轉換成另外一個序列的功能,並且不要求輸入序列和輸出序列等長。比較典型的如機器翻譯。
seq2seq模型往往使用RNN來構建,如LSTM和GRU。RNN天生適合處理具有時序關系的序列。

在這幅圖中,模型把序列“ABC”轉換成了序列“WXYZ”。分析其結構,我們可以把seq2seq模型分為encoder和decoder兩個部分。encoder部分接收“ABC”作為輸入,然后將這個序列轉換成為一個中間向量C,向量C可以認為是對輸入序列的一種編碼。然后decoder部分,句子是一個個輸出的,第一個元素的輸出時把中間向量C作為自己的輸入,第二個元素的輸出是將中間向量C和第一個輸出的元素一起作為輸入,通過解碼操作得到輸出序列“WXYZ”。
公式描述如下:
用RNN做編碼器和解碼器,訓練對( ,
)
Seq2Seq模型使用參數為 的RNN來計算條件概率
,以估計probability chain rule的項,這里
是n個向量的序列,
是
個索引的序列,

通過最大化訓練集的條件概率來學習模型的參數,即(最大似然估計)

Seq2Seq模型使用參數為θ的RNN來計算條件概率,概率鏈式法則,通過最大化訓練集的條件概率來學習模型的參數,即(最大似然估計)
如果我們輸入的序列非常長,則該系統很容易性能會下降,因它會去處理整個句子,而造成前面的句子信息會被遺忘,attention機制應運而生。
Attention機制:
Attention Mechanism的加入使得seq2seq模型的性能大幅提升。那么Attention Mechanism做了些什么事呢?
Attention通常都是建立在Encoder-Decoder模型上來處理Seq2Seq的。

首先,將input sequences讀入到一個encoder,生成的一個語言編碼(Sequence Embedding)會作為decoder的已知條件,后面decoder每生成一個單詞,都會參考這個固定的語言編碼。
這存在一個問題,decoder生成一個單詞的時候,應該將注意力重點放在那些影響這個單詞的內容上,而不是一概將Input Sequence的embedding整體作為輸出的參考,這會影響輸出的准確性。Attention就是通過給input sequence分配不同的權重來決定每個單詞的輸出。

舉例:
假設輸入為一句英文的話:Tom chase Jerry
那么最終的結果應該是逐步輸出 “湯姆”,“追逐”,“傑瑞”。
如果用傳統Seq2Seq模型,那么在翻譯Tom時,所有輸入單詞對翻譯的影響都是相同的,但顯然“湯姆”的貢獻度應該更高。
引入attention后,每個單詞都會有一個權重:(Tom,0.6)(Chase,0.2) (Jerry,0.2)
Attention機制公式描述:
將編碼器和解碼器對input sequence做embeddeing,分別定義為(e 1,...,e n)和(d 1,...,d m(P))而v,W 1和W 2是模型的可學習參數。

通過Attention Mechanism將encoder的隱狀態和decoder的隱狀態結合成一個中間向量C,然后使用decoder解碼並預測,最后經由softmax層得到了針對詞匯表的概率分布,從中選取概率最高的作為當前預測結果。
Pointer Network=Seq2Seq模型+Attention機制
指針網絡:

對注意力模型的非常簡單的修改,用於解決輸出序列的大小取決於輸入序列中元素的數量這個問題。

這種方法專門針對輸出離散且與輸入位置相對應的問題。
這種方法適用於可變大小的輸入(產生可變大小的輸出序列)
本質上,input Sequence里對生成第i個單詞的影響(相似性,相關性)越大,權重就越大。
為啥叫pointer network呢?對於凸包的求解,就是從輸入序列{P1,....,P1000}中選點的過程。選點的方法就叫pointer,他不像attetion mechanism將輸入信息通過encoder整合成context vector,而是將attention轉化為一個pointer,來選擇原來輸入序列中的元素。
就像指針一樣,ouput將指針(weight)指向對他影響最大的input序列。
這篇文章也解釋的很通俗易通。
2: recursive神經網絡
剛接觸RNN的時候根本分不清recursive network和recurrent network,一個是遞歸神經網絡,一個是循環神經網絡,傻傻分不清。但是實際上,recursive network是recurrent network的一般形式。
如下圖,我們以情感分析為例子,我們輸入一個句子,判斷這個句子的情感,是正面負面中性等等。在Recurrent Structure里面,句子會被表示成word vector,假如說情感有五類,最后輸出的是一個五維向量。

那么如果用Recursive Structure,怎么去解決呢?在這里面,你需要先決定這四個input word






接下來我們將一個比較具體的例子:
假如我們現在要做情感分析,輸入的句子是:not very good,machine要決定not very good是positive還是negative,首先先得到句子的文法結構,這不是我們這節課要討論的;文法結構告訴我們very和good要先合並在一起,合起來的結果再跟not結合;然后我們要把輸入向量(word embedding)輸入到machine,接下來用函數,應用順序和文法結構的結合順序一致;假設word vector的維度是
的話,輸入就是2個
,輸出是
。

那么當我們組合這兩個vector的時候,那么這個意思是不是 "very good"的意思么?這里我們可能要用到神經網絡,因為 very good的vector不會簡單地等於 very的vector和 good的vector的加和,顯然不會是這么單純的: “not”: neutral ,“good”: positive,加和的結果是中性的,然而 “not good”: negative,因此不會是簡單的加和。

所以我們需要一個神經網絡來幫我們處理這個問題。我們希望是這個神經網絡要能處理 not和good放一起變成負面的意思,machine要自動學到假設他看到not所代表的vector,自動反轉另一個輸入的情感;machine也要自動學到假設他看到very所代表的vector,自動強調另一個輸入的情感等等諸如此類。函數

透過training data自動學習出來的:

那么函數


最簡單的就是上圖上半部分所示:把藍色和黃色向量串聯起來,乘以一個權重矩陣


因此我們改裝成下半部分的樣子:加號后面就是上半部分的內容,加號前面是兩次運算,權重矩陣不一樣,得到情感。
注意:后面還是傳統的做法,但是前面加上了一個vector。這個vector的元素就是來學習這些詞之間的interaction,然后將這些interaction變成bias,因為recursive network的function都是不變的,因此這些bias就這樣被傳遞下去了。那么這里有一個需要注意的就是,我們這里有幾個詞,那我們就需要多少個bias,而且每個bias中間的這個矩陣W都是不一樣的。
如下圖是實驗結果:

接下來,他有很多版本:比如下一個 Matrix-Vector Recursive Network
這個模型設計的想法就是:

還有Tree LSTM

這種recursive network模型還有很多應用:句子關聯

Batch Normalization

轉自:https://www.jianshu.com/p/f3ae607d9969