【深度學習之美】LSTM長短記,長序依賴可追憶(入門系列之十四)

14.1 遺忘是件好事還是壞事?

如果我問你,遺忘,是件好事,還是壞事?
或許你會說,當然是件壞事啊,我可羨慕記憶力好的人了。
可我要告訴你,如果你到現在還記得,兩歲時,隔壁家的小女孩“橫刀奪愛”,搶了你的棒棒糖,估計你現在還可能單身。如此“記”仇的人,不孤獨也難啊?
的確,有時候,遺忘是好事,它會讓大腦清理無用“內存”,讓你能得以重新起航。其實從腦科學的角度來看,記憶是一種生物運算,它需要消耗能量的。從進化論的角度來看,如果大腦一直長時間運算着用不着的“子程序”,是極不經濟的。在物資並不豐裕的遠古時代,這樣的生物,會被“物競天擇”掉的!因此,遺忘,在某種程度上,是生物的一種自我保護機制。

那遺忘,是件好事咯?或許你會問。
如果是好事,爲什麼當年背幾個英文單詞,都要絞盡腦汁,家人還不得不都無辜地“光榮”一大半:Bus(爸死)、Yes(爺死)、Nice(奶死),都Cheese(氣死)。
嗯,是的。過猶都不及。我們既需要記憶,也需要遺忘。我們既需要短期記憶(short-term memory),必要時,還要將這些短記憶拉長(long short-term memory),留存下來,以備後用。
聰慧如你,一定猜到了。我要引入本章的主題:長短期記憶(Long Short-Term Memory,簡稱LSTM)。這個名字有點怪,難道是又長又短的記憶?當然不是,請注意“Short-term”中間有一個短橫線“-”連接。這表明,在本質上,LSTM還是短期記憶(short-term memory),只是它歷經的時序較長而已。

14.2 施密德胡伯是何人?

“LSTM”,名稱很拗口啊,爲了記憶,我把它記做“老(L)師(S)太(T)忙(M)”。如果于爾根•施密德胡伯(Jürgen Schmidhuber)知道我這麼玩笑地稱呼他的“寶貝”,會不會懟我啊?

施密德胡伯(名字太長,以下簡稱“胡伯”)又是何許人也?他可來頭不小。我們常說深度學習有三大巨頭,約書亞•本吉奧(Yoshua Bengio)、揚•勒丘恩(Yann LeCun,又譯作“嚴樂春”)和傑弗裏•辛頓(Geoffrey Hinton)。如果把“三大巨頭”擴展爲“四大天王”的話,這位胡伯應可入圍。論開創性貢獻,他也算得上深度學習的先驅人物之一。其中他最傑出的貢獻,莫過於他於1997年和Hochreiter合作提出的LSTM[1]。因此,胡伯也被尊稱爲“LSTM之父”。

在前面,之所以我會問胡伯會不會懟我?並不是說他真的會懟一個無名小輩。而是想說,這位老伯本領大,脾氣也大啊。
有例爲證。2015年,前面提及的深度學習三巨頭在著名學術期刊《Nature》上發表了一篇《Deep Learning》綜述[2],隨後胡伯就站出來指責,你們沒有充分肯定自己工作的價值。而綜述第一作者嚴樂春亦不甘示弱,隨後霸氣發文反駁,你丫就值這麼多。
有道是,有人的地方,就有江湖。有江湖的地方,就有紛爭。
還有一例,值得說道一下。近幾年,由伊恩•古德費勒(Ian Goodfellow)等人提出“生成對抗網絡”(Generative Adversarial Networks,GANs),在人工智能領域非常火爆,可稱爲非監督深度學習的典範之作。這位“好小夥(Goodfellow)”又是誰呢?他就是深度學習三巨頭之一的本吉奧(Bengio)的博士生,現就職於谷歌的人工智能團隊。嚴樂春對GAN交口稱讚,稱其爲“20年來機器學習領域最酷的想法”。


3269cc54b65518efc50cd0b2c0848f4af2987662


圖14-1 胡伯與好小夥(Goodfellow)真情互懟

可有人不這麼看。2016年12月,在知名的NIPS(Neural Information Processing Systems)大會上,Goodfellow正在做關於GAN的培訓宣講,就發生了尷尬的一幕。不待Goodfellow臺上講完,有位聽衆就迫不及待,站起來說,自己在1992年提出了一個叫做Predictability Minimization(可預測性最小化,簡稱 PM)的模型[4],說它如何有效工作,然後話鋒一轉,問臺上的Goodfellow:“你覺不覺得,我的這個PM,跟你的GAN有沒有什麼類似之處啊?”

來者不善,善者不來。這個來者就是前面提到的胡伯。1987年出生的好小夥Goodfellow初生牛犢不怕虎,當時就有點火大,和胡伯懟上了(感興趣的讀者,可前往視頻圍觀)。爲何Goodfellow會惱火?原因很簡單,因爲胡伯的言外之意就是,你丫的創新並不新鮮,不過是拾我20多年之牙慧罷了。

在這裏,我之所以會這麼花點筆墨來說胡伯的故事,原因有二:第一他是本章議題LSTM的提出者。二是想介紹一個“二元學習”的方法論。嚴伯鈞老師曾說,如果你沒有太多精力,但又想快速建立對一個新領域的感覺,那麼最好的辦法就是使用“二元學習法”。具體來說,就是找到兩位這個領域的代表性人物,最好是針鋒相對的代表人物,高手對決,精彩就會紛呈。比如說,在古典音樂領域,聽到莫扎特的音樂,就該去找貝多芬的經典欣賞一下;在經濟學領域,看到凱恩斯的著作,就該去找哈耶克的書看看。再比如,如果你想了解Goodfellow的GAN,也該找找胡伯的PM模型瞭解一番。

14.3 爲什麼需要LSTM?

言歸正傳,讓我們回到LSTM的討論上。近年來,循環神經網絡(RNN)在很多自然語言處理項目中取得突破。如果光靠第一代的RNN功力,自然是辦不到的。我們知道,傳統RNN多采用反向傳播時間(BPTT)算法。這種算法的弊端在於,隨着時間的流逝,網絡層數的增多,會產生梯度消失或梯度爆炸等問題。
“梯度消失”說的是,如果梯度較小的話(<1),多層迭代以後,指數相乘,梯度很快就會下降到對調參幾乎就沒有影響了。想一想,(0.99)^100是不是趨近於0?
“梯度爆炸”說的是,反過來,如果梯度較大的話(>1),多層迭代以後,又導致了梯度大的不得了。想一想,(1.01)^100是不是也很大?
權重爆炸可能引起權重振盪。梯度消失又導致網絡調參失去方向感。這些場景都會讓BPTT望“參”興嘆。於是,它在呼喚一個新的策略讓RNN復活。

這個策略就是胡伯在1997年提出的(Long Short-Term Memory,LSTM)。由於獨特的設計結構,LSTM特別適合於處理時序間隔和延遲非常長的任務,而且性能奇佳。比如說,2009年,用改進版LSTM,贏過ICDAR手寫識別比賽冠軍。再後來,2014年,Bengio團隊提出了一種更加好用的LSTM變體GRU (Gated Recurrent Unit,門控環單元) [6],從而使得RNN的應用,如洪水氾濫,一發不可收拾。2016年,谷歌公司利用LSTM來做語音識別和文字翻譯[7]。同年,蘋果公司使用LSTM來優化Siri應用[8]。作爲非線性模型,LSTM非常適合於構造更大型深度神經網絡。
下面,我們就來剖析一下LSTM結構。

14.4 拆解LSTM

14.4.1 傳統RNN的問題所在

只有定位好問題所在,才能找到機會解決問題。因此,在講解LSTM原理之間,讓我們首先重溫一下第一代RNN的問題所在。
讓我們考察一下,在原始RNN隱層中的神經元,它只有一個狀態,記爲h,它對短期輸入非常敏感。在第13章中,我們已說明,RNN可利用歷史信息(或說上下文信息),把過去的輸出,再次循環作爲輸入,從而可達到更好的預測效果。比如說,“天空中飛來一隻__”,這個句子比較短,對於RNN來說,構建的網絡層數比較淺,因此我們可以充分利用歷史信息,能以較大概率來預測空白區可能是“鳥”或“蜻蜓”之類的飛行動物。


c77ee738eea0d027d011dcc4c15a15bc0eb469c9


圖14-2 上下文較長,無法利用歷史信息

但是,如果我們再接着預測如下句子的空白處,句子爲“我在中國北京長大,我兄弟5人,我哥叫牛A,我還有三個弟弟分別叫牛C、牛D和牛F,我排名老二,因此大家都叫我牛B,我們都能說一口流利的__”。距離空白處最近的信息提示我們,該處可能要預測一個語言名稱。
但世界上的語言上百種,如果我們想縮小語言名稱的範圍,自然需要利用這個詞的上下文信息,但我們很快就會發現,關鍵詞“中國北京”距離“說一口流利的__”這個詞彙之間,距離太過遙遠。的確,我們也可把RNN的結構做深一點,但限於前文提到的缺點,如梯度彌散等問題,前面網絡層的信息如 x0x0 、x1x1,..., 等,“流淌”到當前層,有用的信息已所剩無幾。或者說,過去的信息已經被拋棄(“遺忘”)了。有時,這樣有用但又爲拋棄的神經單元,也稱爲泄漏單元(leaky unit)。

14.4.2 改造的神經元

從上面的分析可知,第一代RNN的問題,出在神經元的功能不健全上,它把該記住的遺忘了,又把該遺忘的記住了。那如何來改造它呢?這個時候,就要體現胡伯提出的LSTM的工作了。LSTM的核心本質在於,通過引入巧妙的可控自循環,以產生讓梯度能夠得以長時間可持續流動的路徑 。
假如我們在原有神經元的基礎上再增加一個狀態,即cc,讓它“合理地”保存長期的狀態,不就解決問題了嗎?其結構如圖14-3所示.


c5d879868e1a88fefb5c7083bd6eda3840431869


圖14-3 調整神經的功能

假設新增加的狀態c,稱爲記憶單元態(cell state),亦稱爲“記憶塊(memory block)”,用以取代傳統的隱含神經元節點。它負責把記憶信息從序列的初始位置,傳遞到序列的末端。下面我們把圖14-3按照時間步展開,得到如圖14-4所示的示意圖。


91d5c2b389e27f6ba9d3b9b9f64e8a166ee87951


圖14-4 按時間步展開的RNN網絡

從示意圖14-4可看出,在LSTM結構中,在t時刻,當前神經元(粗紅線標識)的輸入有三個:當前時刻輸入值 xtxt、前一時刻輸出值 st1st−1 和前一時刻的記憶單元狀態 ct1ct−1。輸出有兩個:當前時刻LSTM輸出值 stst 和當前時刻的記憶單元狀態ctct。需要注意的是,這裏的xxsscc都是向量,裏面都包含多個參數值。
現在LSTM關鍵之處來了,那就是如何有效控制這個長期狀態c而爲我所用呢?這裏,LSTM的設計思路是設計3把控制門開關(gate),從而打造一個可控記憶神經元,如圖14-5所示。


fe33915f04770e3de88282be280241b9d433b8e7


圖14-5 長期狀態c的控制門的三把開關

這第一把門開關,就是負責決定把前一個長期記憶 ct1ct−1 在多大程度上保留到ctct中,它可選擇性地遺忘部分之前積累的信息;第二把門開關,就是負責控制以多大程度把當前即時狀態存入到長期記憶狀態ctct中;第三把開關,負責控制是否把長期狀態cc,作爲當前LSTM的輸出。有了這三把好用的開關,記憶就如是酒保手中的酒,是“勾兌”可調的。
接下來,讓我們要聊聊,在記憶單元中,內部狀態cc和輸出ss是如何計算的。

14.5 LSTM的前向計算

前文描述的門開關,實際上是一個比喻。在真正的算法中,哪有什麼所謂的“開關”?這裏的“門開關”,實際上就是一個全連接網絡層,它的輸入是一個複雜的矩陣向量,而輸出是一個0到1之間的實數向量。請注意,由於“門”和“層”的關係是,一個是比喻,一個是實現,所以後文中我們可能混搭表述。
LSTM實際上通過調控某些全連接層網絡參數,來達到調控輸出的目的。如果輸出可控,那麼“門”的開和關,就可以模擬出來了。
假設W是門的權重向量,b爲偏置向量,這個“門”可表示爲公式(14-1)。
gongs14_1

這裏,激活函數σ可用擠壓函數sigmoid函數的輸出來控制門的開與關。由於sigmoid函數的值域被控制在0和1之間。那麼,激活函數輸出爲0時,任何向量與之相乘,結果爲0,這就相當於“門”關上了;那如果輸出爲1時,任何向量與之相乘都不會改變,這就相當於“門”完全開啓。當輸出值在0至1之間呢,這相當於門是半掩半開的,就可以調控“記憶”的留存程度。
還記得嗎?在第13章中,我們說過,人們通常都不具備“馬爾科夫鏈思維”,言外之意,就是說,我們當前的內心感受,都是歷史的投射和當下的輸入,疊加在一起的結果。這就好比一個場景,“一巴掌挨在臉上(當前輸入),新仇舊恨涌上心頭(歷史記憶)”。
類似地,LSTM也設計兩個門控制記憶單元狀態c的信息量:一個是遺忘門(forget gate)。所謂的“遺忘”,也就是“記憶的殘缺”。它決定了上一時刻的單元狀態有多少“記憶”可以保留到當前時刻;另一個是輸入門(input gate),它決定了當前時刻的輸入有多少保存到單元狀態。
在圖14-5中,我們說過,LSTM是由三個門來實現的。實際上,爲了表述方便,很多文獻還添加了一個門,叫候選門(Candidate gate),它控制着以多大比例融合“歷史”信息和“當下”刺激。
最後,LSTM還設計了一個輸出門(output gate),來來控制單元狀態有多少信息輸出。下面對這4個門分別進行詳細介紹。

14.5.1 遺忘門

如前所述,遺忘門的目的在於,控制從前面的記憶中,丟棄多少信息,或者說要繼承過往多大程度的記憶。以音樂個性化推薦爲例[9],用戶對某位歌手或某個流派的歌曲感興趣,那麼諸如“點贊”、“轉發”和“收藏”等這樣的正向操作,作爲“記憶”,就需要得到加強(換句話說,就需要遺忘得少點)。反之,如果發生了刪除、取消點贊或收藏等這類負向操作,對於推薦功能來說,它的信息就應該被“遺忘”得多一些。
遺忘門可通過公式(14-2)所示的激活函數來實現。
gongs14_2
在公式(14-2)中,σ表示激活函數,這裏通常爲sigmoid。 WTfWfT表示遺忘門權重矩陣, UTfUfT是遺忘門輸入層與隱層之間的權重矩陣,bfbf表示遺忘門的偏置,這裏的下標ff是“遺忘(forget)”的首字母,爲了增強可讀性而已,下同。
從公式(14-2)可看出,遺忘門是通過將前一隱層的輸出 st1st−1 與當前的輸入xtxt進行了線性組合,然後利用激活函數,將其輸出值壓縮到0到1的區間之內。當輸出值越靠近1,表明記憶體(cell block)保留的信息就越多。反之,越靠近0,表明保留的就越少。遺忘門的工作過程可用圖14-6表示。


444757d97ffd580dac2570dcdadecdb386e69a22


圖14-6 遺忘門邏輯設計

輸入門的作用在於,它決定了當前時刻的輸入信息xt,以多大程度添加至記憶信息流中,它的計算公式幾乎和遺忘門完全一致(除了下標和標識不同外),激活函數σ也使用sigmoid,如公式(14-3)所示。
gongs14_3

由於和遺忘門功能類似,因此它們的示意圖也是類似的,結合遺忘門在一起,如圖14-7所示。


6e39135450ab1ad855a5389c5338746a5f2ec5b9


圖14-7 輸入門邏輯設計

14.5.3 候選門

候選門它可視爲一個“勾兌門”,它主要負責“勾兌”當前輸入信息和過去記憶信息,也就是候選門負責計算當前輸入的單元狀態 ,如公式(14-4)所示。
gongs14_4
在這裏激活函數換成了tanh,它可以把輸出值規整到-1和1之間。示意圖如圖14-8所示。


f350bac128e4a38435958fb7bd9ebe9d55034196


圖14-8 計算LSTM的內部的候選門

接下來,我們需要把記憶體中的狀態從Ct1Ct−1更新到CtCt。記憶的更新可由兩部分組成:(1) 通過遺忘門過濾掉不想保留得部分記憶,大小可記爲:ft×Ct1ft×Ct−1;(2)添加當前新增的信息,添加的比例由輸入門控制,大小可記爲:it×Ctit×Ct′。然後將這兩個部分線性組合,得到更新後的記憶信息CtCt,如公式(14-5)所示。

14_5_1

圖14-9爲輸入門與候選門的組合示意圖。


f82e57fd6237be5f3efe73afac890384847de70e


圖14-9 輸入門與候選門的組合示意圖

現在,我們來小結一下遺忘門和輸入門的作用。由於遺忘門的存在,它可以控制保存多久之前的信息。由於輸入門的存在,它又可以避免當前無關緊要的內容進入到記憶當中。這樣一來,該忘記的把它遺忘,該記住的把它記牢,二者相得益彰。

14.5.4 輸出門

內部的記憶狀態更新完畢之後,下面就要決定是不是輸出了。輸出門的作用在於,它控制着有多少記憶可以用於下一層網絡的更新中。輸出門的計算可用公式(14-6)表示。
gongs14_6

這裏激活函數依然是用sigmoid。通過前面的介紹可知,sigmoid會把 Ot規則化爲一個0到1之間權重值。
有道是,“話不能說得太滿,滿了,難以圓通;調不能定得太高,高了,難以合聲”。這裏的輸出,也需要“悠着點”,不能太“任性”的輸出,因此還要用激活函數tanh把記憶值變換一下,將其變換爲-1至+1之間的數。負值區間表示不但不能輸出,還得壓制一點,正數區間表示合理的輸出。這樣有張有弛,方得始終。最終輸出門的公式如(14-7)所示。
14_7

最後,結合前面的門路設計,完整的記憶神經元如圖14-10所示。


a67a30753366442cf4c3ff7c298390fd51b1d34b


圖 14-10 LSTM隱層單元的完整邏輯設計

到此爲止,我們剖析了LSTM網絡的標準設計流程。但請注意,這並不是唯一的設計方式。事實上,很多文獻都會對標準的設計流程有所變更。比如說,Chung等人提出的門控循環單元(Gated Recurrent Unit, GRU)[10]就是其中的佼佼者。GRU在LSTM的基礎上進行了簡化,它主要做了連個方面的改造:(1)提出了更新門的概念,也就是把輸入門和遺忘門合併。(2)把記憶單元Ct和隱層單元st實施了統一。模型的簡化,就意味運算上的簡化,調參上的便捷。特別是在訓練數據很大的情況下,GRU能節省更多時間,從而更能爲用戶所接受。

14.6 LSTM訓練

前面我們花了大量的篇幅討論了LSTM的結構,實際上只是討論了它的前向傳播工作原理,事實上,我們還缺一個LSTM訓練算法框架,來調整網絡參數。LSTM的參數訓練算法,依然是我們熟悉的反向傳播算法。對於這類反向傳播算法,它們遵循的流程都是類似,簡單說來,主要有如下三個步驟:
(1)前向計算每個神經元的輸出值。對於LSTM而言,依據前面介紹的流程,按部就班地分別計算出ftftititctctototstst
(2)確定優化目標函數。在訓練早期,輸出值和預期值會不一致,於是可計算每個神經元的誤差項值,藉此構造出損失函數。
(3)根據損失函數的梯度指引,更新網絡權值參數。與傳統RNN類似,LSTM誤差項的反向傳播包括兩個層面:一個是空間上層面的,將誤差項向網絡的上一層傳播。另一個是時間層面上的,沿時間反向傳播,即從當前t時刻開始,計算每個時刻的誤差。 
然後跳轉第(1)步,重新做(1)、(2)和(3)步,直至網絡誤差小於給定值。
這裏,限於篇幅,我們沒有給出詳細的求導過程,感興趣的讀者,推薦閱讀胡伯的開創新性論文[1]和兩篇非常優秀的英文博客 [11](國內大部分介紹LSTM的網絡文章,都或多或少借鑑了這篇經典博客)和[12](裏面有詳細的LSTM的前向和後向傳播的詳細推導過程)。

14.7 小結與思考

現在,我們小結一下本章主要內容。由於傳統的RNN存在梯度彌散問題或梯度爆炸問題,導致第一代RNN基本上很難把層數提上去,因此其表徵能力也非常有限,應用上性能也有所欠缺。於是,胡伯提出了LSTM,通過改造神經元,添加了遺忘門、輸入門和輸出門等結構,讓梯度能夠長時間的在路徑上流動,從而有效提升深度RNN的性能。
通過本章的學習,請你思考如下問題:
(1)LSTM是如何避免梯度彌散的?它都使用了那些手段?
(2)根據“無免費午餐原理(No free lunch theorem)”,在任何一個方面的性能提升,都是以犧牲另一個方面性能爲代價的,請問LSTM付出的代價(或者說缺點)又是什麼?

14.8 致謝

由於工作較爲繁忙,加之每篇博客都耗時不菲,從構思、查閱資料、撰寫和繪圖,每一篇文章都得花上好幾天。因此,關於深度學習的入門系列,到本章爲止,暫時不再更新(或者說第一季結束)。感謝讀者朋友這幾個月的捧場閱讀。
博客能寫到14章,首先要感謝雲棲社區的支持,特別是阿里雲張勇老師的關照(花名:身行;網名:我是主題曲哥哥),感謝他“容忍”我天馬行空的寫作風格。自然,也得感謝很多論文和網絡資源的提供者,沒有你們的先行探路,這個系列博客我也是寫不出來的。
這個系列博客文章會集結成書,原因是博客文章有如下三個不足,暫時沒有辦法彌補。
(1)博客內容淺嘗輒止。爲了迎合讀者的碎片化閱讀習慣,每篇博客都儘可能精簡。讀者看到每篇博客,基本上都是原文的閹割版。比如說,很多公式就難以給出詳細推導過程。
(2)博客範圍覆蓋不全。雖然更新到第14篇,但深度學習博大精深,很多內容還沒有涉及。比如說,Dropout、經典機器學習等有價值的內容都沒有講。
(3)最重要的是,目前博客沒有涉及實戰環節。目前博客文章僅涉及理論入門,停留在“坐而論道”階段,實戰環節(如TensorFlow等)一概沒有提及。
其實,還有第4個原因,有點私心吧。那就是,出書多少能掙點稿費,以補貼我付出的時間和精力。如果讀者認可我的工作並手頭寬裕的話,希望你到時能賞光買一本。
書名:《深度學習之美》,600多頁(添加部分基礎和實戰,涵蓋Hinton最新提出的神經膠囊網絡)。
出版社:電子工業出版社(聯繫郵件:[email protected])。
出版時間:2018年6月。
京東購買鏈接

參考文獻

[1] Hochreiter S, Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8):1735.
[2] Lecun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015, 521(7553):436-444.
[3] Goodfellow I J, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[C]// International Conference on Neural Information Processing Systems. MIT Press, 2014:2672-2680.
[4] Schmidhuber J. Learning Factorial Codes by Predictability Minimization[J]. Neural Computation, 1992, 4(6):863-879.
[5] Liwicki, Fernandez, Bertolami, et al. A Novel Connectionist System for Improved Unconstrained Handwriting Recognition[J]. Physics Letters B, 2008, 450(4):332-338.
[6] Chung J, Gulcehre C, Cho K H, et al. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling[J]. Eprint Arxiv, 2014.
[7] Wu Y, Schuster M, Chen Z, et al. Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation[J]. 2016.
[8] Smith, Chris (2016-06-13). "iOS 10: Siri now works in third-party apps, comes with extra AI features". BGR. Retrieved 2017-06-27.
[9] 黃安埠. 深入淺出深度學習.中國工信出版社.2017.6 
[10] Chung J, Gulcehre C, Cho K H, et al. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling[J]. Eprint Arxiv, 2014.
[11] Colah. Understanding LSTM Networks,2015
[12] Arun. LSTM Forward and Backward Pass

文章作者:張玉宏,著有《品味大數據》一書。
本文節選自《深度學習之美》一書,電子工業出版社2018年7月出版

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