記憶網絡之Neural Turing Machines

記憶網絡之Neural Turing Machines

前面介紹了Memory Networks相關的幾篇文獻,接下來讓我們從新回到Memory的起點,也就是DeepMind在14年發表的“Neural Turing Machines”這篇論文。這是第一篇提出使用外部memory模塊來增強神經網絡記憶能力的論文,我將結合Tristan Deleu的博客對該論文進行介紹。(因爲論文很長,前面兩章都是從歷史根源或者神經學發展論述的,感興趣的可以直接從論文第三章看,然後第四章就已經是實驗驗證了==)。

在開始介紹NTM之前,我們先來看一下其與LSTM的區別。首先LSTM通過輸入門、忘記門、輸出門來控制hidden state中保存的信息,門控方法改進了RNN的梯度彌散和梯度爆炸現象,從而實現長期記憶的功能。但是其在每一步更新過程中所有的隱層向量都會被更新,h的頻繁更新,導致其無法記錄更長久的信息。而且hidden_size也限制了模型記憶信息的容量。而memory-augmented的網絡通常只對某些相關的memory進行修改(通過特定的尋址讀寫機制),而不會同時修改所有的memory的值,這就使memory networks可以記錄更長的依賴關係,而且外部的記憶矩陣可以方便的擴大模型的記憶空間,從而存儲更多的信息量。舉個最簡單的例子,下面第一個圖是NTM的結果,第二個圖是LSTM的結果,每個子圖下面的是預測,上面的是真實值。對比可以發現LSTM在序列長度爲30的時候就已經無法正常預測,而NTM在序列長度爲50的時候還可以預測的很好。

NTM的架構很簡單,就是有一個controller和一個memory矩陣,controller主要負責根據輸入對memory進行讀寫操作,從而實現記憶的更新,可以使用簡單的前向神經網絡或者RNN來作爲controller的模型,前向神經網絡計算複雜度較低,而且更加透明,但是因爲比較簡單所以會限制NTM模型在每個time step裏的計算類型。而選用RNN作爲controller的話,其本身就存在一個內部記憶,如果將其比作計算機的話,LSTM就是CPU,其內部hidden state就是寄存器,負責對內存進行讀寫,而memory矩陣就是內存。使用RNN的好處是通過內部記憶擴展讀寫規模,不會受到每個時間步都被單次讀寫的限制。結構圖如下所示:

controller主要負責將輸入轉變爲中間表示,然後根據該向量選擇出應該要讀寫的memory location即可,下面我們看一下addressing尋址機制。本文提出了兩種addressing機制,content-based addressing和location-based addressing,後者主要是針對在某些情況下變量是任意的但仍然需要尋址和表示,所以引入location-based addressing以增強模型的適用範圍和泛化效果。整個addressing的流程如下圖所示,包含content addressing,Interpolation,Convolutional shift, Sharpening四個部分。

首先在content addressing中,計算kt與相應memory Mt之間的相似度(使用餘弦相似度進行度量),然後根據權重bate計算歸一化的重要性得分,如下圖所示:

然後對前一時刻的權重wt-1按照門控值g進行差值(Interpolation),公式如下所示:

經過插值之後對新的權重向量進行循環卷積,這裏實現的功能主要是對權重進行旋轉位移,比如當前的權重值關注於某一個location的memory,經過此步就會擴展到其周圍的location,使得模型對周圍的memory也會做出少量的讀和寫操作。循環卷積(關於循環卷積的解釋可以看一下這個博客,有比較直觀的例子進行介紹)的公式如下所示:

但是循環卷積往往會造成權重的泄漏和分散,爲了解決這個問題,需要在經過一層銳化(sharpening)操作,其公式如下所示;

這樣就得到了新的權重向量,可以根據該向量進行相應的讀寫操作,對記憶進行修改。我們可以結合下圖對上面四個操作的功能有一個直觀的理解和認識,第一個操作是根據輸入得到每個memory location的相關性計算,後面三個操作是爲了實現location-based addressing的作用,也就是將content-based得到的向量進行一定的旋轉位移。具體的插值是爲了將前一時刻的權重引入進來,對新的權重進行一定修正,然後卷積是爲了將每個位置的權重值向兩邊分散,也就是所謂的旋轉位移,最後的銳化操作是將權重在進行突出化,大的值更大,小的值更小:

有了該權重向量之後,具體的讀寫操作就很簡單了,讀就是一個加權求和的操作,而寫被分爲忘記和添加兩部分,分別使用兩個向量參數來指定要抹去和添加信息的量。

這樣我們就分析完了模型的主要部分,可見其餘Memory Networks思路上還是一致的,都是使用外部的記憶來擴展模型能力,而且都包含對memory的讀取和修改功能。本文的實現方案可以參考https://github.com/carpedm20/NTM-tensorflow,不過我感覺該方案有些地方寫的比較多餘,個人看法==就不具體介紹代碼了,感興趣的可以看一下,跑跑試試~~

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