李宏毅:conditional generation by RNN & attention

1、Generation

生成句子或者文章。

在生成好的RNN模型裏,我們輸入開頭,模型可以輸出一系列的輸出,如下圖,我們根據輸出得到了“牀”,然後把“牀”作爲下一個時間點的輸入,得到“前”,依次類推。這是測試時的一種做法,並不是唯一做法。在訓練RNN模型的時候,並不是拿上一時刻的輸出當作下一時刻的輸入,而是拿句子真正的序列當作輸入的。

2、condition generation

我們希望根據一些情景來生成我們的句子而不是隨機生成一些句子,比如對話系統,需要根據問題來生成我們的答案,再比如翻譯系統,我們要根據給出的句子得到對應的翻譯。

比如下圖:input一個image,通過CNN得到image的vector,把vector當做input丟給RNN,丟進去的input(image)不一樣的話,它的output也會不一樣,可能你的input影響不夠大,網絡在後面會遺忘之前看到的東西,我們需要在每次RNN output之前的時間點丟一個image(vector),RNN就會反覆的複習看到的這張image。就不會讓句子忘記自己要說什麼了。

再比如下面的機器翻譯:

首先,我們把問題或者需要被翻譯的句子通過一個RNN或者LSTM進行Encoder,最後一個的輸出就包含了這個句子的全部信息,然後把這個句子當作初始輸入丟到另一個RNN或者LSTM中,然後通過這個得到對應的輸出。encoder和decoder的LSTM或者RNN裏的參數可以一樣也可以不一樣。

3、attention(dynamic(動態) conditional generation)

當使用attention的時候,它只會關注“機器”這一個詞的vector,在decoder中能更好地學習到“機器”這一個詞的特徵,輸出會更加準確。

下圖中的match是一個function,可以自己設計,“機”,“器”,“學”,“習”通過RNN得到各自的vector,z0是一個parameter。α10,上標1表示z0和h1到底有多match,下標0表示時間是0這個時間點,α表示相匹配程度。

z1可以是c0丟到RNN以後,hidden layer的output,也可以是其他,z1再去算一次match的分數

time爲1的時候:

得到的c1就是下一個decoder的input,此時只關注“學”,“習”。

得到的z2再去match得到c2。。。

4、memory network

application:reading comprehension

如下圖所示:把一個document用N個句子來表示,每個句子對應一個vector(這裏需要用到其它的neural network),question也用一個vector來表示,將每個句子與question進行match,得到對應的α。做∑相當於針對這一個question,跟它有關的句子的集合。接着把 question和相關的部分都丟到DNN裏面,最後得到答案。

memory network複雜版本(下圖所示):

算match的部分與information的部分不見得是一樣的,同一個句子可以分別抽取不同的兩組vector,一組是x,一組是h。用兩組不同的vector會得到更好的performance。query對x這組vector算attention,但是它是用h表示每一個句子的information。然後將attention得到的α和information相乘,得到extracted information(vector)。這個vector可以放入DNN(deep neural network)得到answer,也可以Hopping,把這個vector和q加在一起得到一個新的q,再去match--->extracted information--->...可以跑好多個循環。

Hopping:

首先:一篇document用兩組vector來表示它;接着一個query進來,和藍色的vector計算attention,橙色的是從document中抽出來的information,將抽出來的information和q 進行∑;得到的結果再去計算attention。。。重複。

下圖中的橙色和橙色的vector可以相同也可以不同,藍色同理。

5、neural turing machine(神經圖靈機)

neural turing machine不僅可以從memory中讀出information,還可以修改memory。

你有一個memory(m...),是vector sequence,還會有一組初始的attention的weight(α...),根據vector和weight可以extracted information得到r0。r0和第一個時間點的input x1丟到f(f這個function可以自己設計,可以是DNN,LSTM,GRU...)

這個f就會output幾個vector,這些vector就是去操控memory。k1就是去產生attention,k1和m計算得出α,再做softmax,就得到新的attention的distribution。新的attention和e1和a1就會去修改memory。e1的作用就是把原來memory裏的值清空(e1範圍是0-1),a1就是把新的值寫到memory中去。經過上述步驟,得到下一個時間點的同一個位置的新的memory。

但其實k和m產生新的attention是很複雜的,有很多步驟。

6、tips for generation

(1)不要讓attention過度關注於一個field,可以設置一個regularization term,使attention可以關注到其它的field。相當於加大其它component的權重 。

(2)

把condition和begin of sentence 丟進去,然後output一個distribution,顏色越深表示產生的機率越大,再把產生的作爲下一個的input。。。這裏有一個注意的是,在training的時候,放入下一個的input其實是reference,但在testing的時候,是沒有reference的,並不知道output的是什麼,可能輸出的完全不同,這就是exposure bias。

在training的時候犯了一個錯,可能會導致testing的時候totally wrong(一步錯,步步錯)。

改進方法:在training的時候,如果output的值與reference不一樣,也要把output的值放到下一個時間點的input,這樣training和test就會是match的。但是這樣在實際操作中是train不起來的。比如下圖:在training的時候,與reference不同,假設你的gradient告訴你要使A上升,B上升,如果讓A的值上升,它的output就會改變,即第二個時間點的input就會不一樣,那它之前學的讓B上升就沒有意義了,可能反而會得到奇怪的結果。

改進方法plus:schedule sampling

就是用綜合的方法來training network,現在我們糾結的點就是,training的時候,下一個時間點的input到底是從reference來還是model的output來,這裏就用到了一個schedule sampling,給它們一個機率,隨機選擇。這樣比總是看reference的結果要好。

7、beam search(集束搜索)

beam search是一個介於greedy search(貪心搜索)和暴力搜索之間的方法。

貪心搜索:直接選擇每個輸出的最大概率;

暴力搜索:枚舉當前所有出現的情況,從而得到需要的情況;

beam search:在搜索的時候,設置beam size=2,就是每一次保留分數最高的兩條路徑,走到最後的時候,哪一條分數最高,就輸出哪一條。如下圖所示:一開始,可以選擇A和B兩條路徑,左邊的第一個A點有兩條路徑,右邊第一個B點有兩條路徑,此時一共有四條路徑,選出分數最高的兩條,再依次往下走 。。。

example:beam size=3,假設一個句子丟進去只有三個單詞和一個表示句末的符號(共4個),輸出分數最高的三個X,Y,W,再分別將三個丟進去,比如將X丟進去得到X,Y。。。將Y丟進去得到W,Y。。。將W丟進去得到。。。這樣就得到三組不同的distribution(一共4*3條路徑),選出分數最高的三條放入。。。

下圖提出另一種idea:不用考慮input的東西到底從哪裏來,直接把一整個output的東西放到input中,這樣可能會有一個問題:比如下圖右邊所示:把高興和難過都input進去,得到的可能就是“高興想哭”,“難過想笑”,句子雜糅了。

8、object level vs component level

object level是根據整個句子的好壞進行評價,比如下面的句子:the dog is is fast,本來它的loss值應該是很小了,但是實際上它的效果並不好,用object level可以使它的loss值變大。假設下圖中的R是衡量兩個句子之間的差異,但是不可以做gradient descent,而cross entropy是可以gradient descent的。

如何改進:Reinforcement learning(強化學習)

在reinforcement learning中,一旦你take action了,就會改變你的observation。總而言之就是調整你的參數去maximize你的reward。

 

 

這裏補充一篇講的比較通俗易懂的Attention Model:https://blog.csdn.net/malefactor/article/details/50550211

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章