1. 程式人生 > >李理:遞迴神經網路RNN扼要

李理:遞迴神經網路RNN扼要

1. 內容簡介

前面我們介紹了CNN,這對於Image Caption來說是基礎的特徵提取部分,或者說是對影象的“理解”部分,而接下來需要用一句話來“描述”影象的內容,這就要藉助RNN了。

我們這幾篇文章首先會介紹RNN/LSTM的基本概念和實現方法。這一部分的主要內容翻譯自這裡。也會包括一些我自己的理解內容。

2. RNN簡介

這個tutorial會介紹用RNN來實現一個語言模型(Language Model)。

2.1 語言模型補充介紹

語言模型是在自然語言處理處理中非常常見的一個模型。它在語音識別,機器翻譯等任務中都有應用。它解決的問題之一就是給定一個字串,用了判斷這是一個“合理”句子的概率。比如在語音識別中,聲學模型會把聲學訊號轉換成音素【當然也是概率而不是絕對的】,但是同音的詞很多,而組成的句子就更多了。

語言模型需要解決的問題是:給定一個句子,計算它出現的可能性(概率)。比如“今天天氣不錯”的概率就比“今天天啟不錯”的概率大。最常見的語言模型就是n-gram語言模型,它是在假設當前的詞只依賴於之前的n-1個詞,比如二元語法(bi-gram)它假設當前詞只依賴於之前的詞,因此一個句子的概率P(w1w2…wn)=P(w1)P(w2|w1)…P(wn|wn−1)。我們可以使用訓練語料來估計:

圖片描述

當然還有很多問題,比如沒有在訓練語料出現的詞對概率就是零了,這需要通過平滑等方法解決。有興趣的讀者參考N-gram wiki

2.2 什麼是RNN?

RNN的特點是利用序列的資訊。之前我們介紹的神經網路假設所有的輸入是相互獨立的。但是對於許多工來說這不是一個好的假設。如果你想預測一個句子的下一個詞,知道之前的詞是有幫助的。RNN被成為遞迴的(recurrent)原因就是它會對一個序列的每一個元素執行同樣的操作,並且之後的輸出依賴於之前的計算。另外一種看待RNN的方法是可以認為它有一些“記憶”能捕獲之前計算過的一些資訊。理論上RNN能夠利用任意長序列的資訊,但是實際中它能記憶的長度是有限的。下圖是一個典型的RNN的樣子:

圖片描述

上圖顯示了怎麼把一個RNN展開成一個完整的網路。比如我們考慮一個包含5個詞的句子,我們可以把它展開成5層的神經網路,每個詞是一層。RNN的計算公式如下:

  1. xt是t時刻的輸入。例如,x1是句子可以是句子第二個【下標從0開始】詞的one-hot表示。
    注:one-hot表示簡單解釋是:假設有3000個詞,我們可以給他們從0到2999的一個編號,每個詞對應的位置為1,其它為0。比如“你好”這個詞,假設它的編號是2,那麼“你好”的one-hot表示為 (0,0,1,0,….,0)T,相對於word embedding的低維“稠密”表示方法,one-hot是一種高維稀疏的表示方法。它的缺點是如果用這個向量來計算相似度,如果兩個詞相同,距離是0,否則就是1,因此它不能capture同義詞這樣的特徵。有興趣的讀者可以參考:

    斯坦福cs224d的slides

  2. st 是t時刻的隱狀態。它是網路的“記憶”。 st的計算依賴於前一個時刻的狀態和當前時刻的輸入: st=f(Uxt+Wst−1)。函式f通常是諸如tanh或者ReLU的非線性函式。s−1,這是用來計算第一個隱狀態,通常我們可以初始化成0。

  3. ot是t時刻的輸出。比如我們想預測的句子的下一個詞,那麼它可以是生成每一個詞的概率【比如生成3000個詞中的一個】,那麼我們可以把它定義為softmax這樣的函式,因為它加起來等於1。ot=softmax(Vst)

有一些事情值得注意:

  1. 你可以把 st 看成是網路的“記憶”。 st 捕獲了從開始到前一個時刻的所有(感興趣)的資訊。輸出 ot 只基於當前時刻的記憶。之前也提過,實際應用中 st 很難記住很久以前的資訊。

  2. 和傳統的深度神經網路不同,這些傳統的網路每層使用不同的引數,RNN的引數(上文的U, V, W)是在所有時刻共享(一樣)的。這反映這樣一個事實:我們每一步都在執行同樣的操作,只不過輸入不同而已。這種結構極大的減少了我們需要學習的引數【同時也讓資訊得以共享,是的訓練變得可能】

  3. 上圖每一個時刻都有輸出,但是也不一定要這樣。比如我們預測一個句子的情感傾向是我們只關注最後的輸出,而不是每一個詞的情感。類似的,我們也不一定每個時刻都有輸入。RNN最主要的特點是它有隱狀態(記憶),它能捕獲一個序列的資訊。

2.3 RNN能做什麼?

RNN在很多NLP任務中都取得了很好的效果。我這裡所說的RNN指的最常見的是LSTM,它和最原始(vanilla)的RNN相比能夠捕獲更長距離的依賴。不要擔心,LSTM和原始RNN的不同之處只是在於計算隱狀態的方法。我們在之後會詳細介紹LSTM的細節。這是RNN用於NLP的一些例子(當然不是所有)

1. 語言模型和文字生成

給定一個詞的序列,我們可以預測給定之前的所有詞時當前詞出現的概率。語言模型讓我們可以計算一個句子的可能性,這對於機器翻譯是很重要的輸入。這個模型的一個意外收穫是我們得到了一個產生式的模型它可以預測下一個詞,這可以幫助我們用取樣的方式生產文字【先根據概率取樣生成第一個詞,然後根據第一個詞計算第二個詞的概率,取樣第二個詞,…】。根據不同的訓練資料我們可以生成各種各樣的東西。在語言建模這個任務,我們的輸入通常是一個詞的序列(可以使用one-hot的向量表示方法),我們的輸出是需要預測的詞。我們在t時刻讓它預測下一個詞 xt+1 ,因此我的預測的輸出 ot=xt+1

語言建模和文字生成的論文包括:

2. 機器翻譯

機器翻譯和語言建模的相似之處是輸入是源語言(比如德語)的一個詞序列。我們想輸出目標語言(比如英語)的一個詞序列。不同之處在於,我們只有在看到完整的輸入之後才開始輸出,因為我們想翻譯的第一個詞可能需要後面句子的資訊才能翻譯出來【比如多義詞,它的具體含義依賴於整個句子】。

圖片描述

【上圖我們首先用一個RNN來“記憶”源語言的句子,當它結束後再用一個RNN“翻譯”成另外一種語言】

關於機器翻譯的論文:

3. 語音識別

給定一個序列的語音波形的聲學訊號,我們想預測音素序列。

【注:這裡作者指的是聲學模型部分,但是實際的語音識別需要藉助前面的語言模型,使用解碼器結合聲學模型和語言模型把聲音變成文字。傳統的語音識別使用HMM-GMM來對聲學特徵建模,使用n-gram來建模語言,使用WFST把聲學模型,發音詞典和語言模型結合起來實現解碼器。因此做一個語音識別系統需要很多模組,後來慢慢的用DNN替代了GMM而變成了HMM-DNN的聲學模型,也有用RNNLM來替代傳統的n-gram語言模型,但仍然需要解碼器融合聲學模型,發音詞典和語言模型。到最近,End-to-end的語音識別系統開始出現,直接輸入是聲學特徵,輸出是詞序列,完全拋棄了之前分模組的方法】

語音識別的論文:

4. 生產圖片描述

【這正是我們這個系列教程的內容,讀者這下明白我們為什麼要介紹RNN/LSTM了吧】

通過結合卷積神經網路,RNN可以給一個圖片生產一段描述。這看起來非常神奇。這樣的模型甚至能夠告訴我們生產的詞對於圖片的那些地方(特徵)【attention機制可以更好的實現這一點,我們後面會介紹】

圖片描述

【上圖就是根據圖片生成文字同時還告訴我們每個詞對應於圖片的哪個部分】

2.4 RNN的訓練

訓練RNN好普通的神經網路類似,我們也是使用反向傳播演算法,但是有一些麻煩的地方。因為每個時刻的引數是共享的,因此引數的梯度不只依賴當前時刻的輸出,還依賴於之前的時刻。比如為了計算t=4的梯度,我們需要把錯誤往前傳遞3個時刻。這就是所謂的Backpropagation Through Time(BPTT)。如果現在不明白,不用擔心,我們後面會詳細介紹。現在我們只需要知道對於原始的RNN,BPTT很難學會長距離的依賴,原因在於梯度消失/梯度爆炸。【我們之前在學習很深的卷積網路時也會有梯度消失和爆炸的問題,我們之前是通過Batch Normalization,ResNet等方式來緩解這個問題】。有一些機制可以解決這個問題,比如特定的RNN(如LSTM)可以緩解【不是完全解決】這個問題。

2.5 RNN的擴充套件

經過多年的探索,研究者提出了根據複雜的RNN來克服原始RNN的一些問題。我們會在後面詳細介紹,但是這裡先給出一個簡單的介紹,讓讀者能夠熟悉這些模型的分類方法。

雙向RNN(Bidirectional RNNs)的思想是t時刻的輸出不但依賴於之前的元素,而且還依賴之後的元素。比如,我們做完形填空,在句子中“挖”掉一個詞,我們想預測這個詞,我們不但會看之前的詞,也會分析之後的詞。雙向RNN很簡單,它就是兩個RNN堆疊在一起。輸出依賴兩個RNN的隱狀態。

【對於語言模型來說,計算句子的概率是可以使用雙向RNN的,但是生成一個句子就不行了,因為我們必須按照順序一個一個取樣,當然還有一種方法是兩個方向都生成一些candidate,然後用雙向RNN打分。】

圖片描述

雙向RNN

深度(雙向)RNN(Deep (Bidirectional) RNNs)和雙向RNN類似,不過多加幾層。當然它的表示能力更強,需要的訓練資料也更多。

圖片描述

深度雙向RNN

LSTM網路是如今非常留下的RNN。LSTM本質也是一種RNN,不過它計算隱狀態的方法有所不同。LSTM的記憶叫做cell,你可以把它們當成一個黑盒,這個黑盒的輸入是之前的狀態 ht−1 和當前輸入 xt 。在LSTM內部,這些cell會決定保持哪些記憶同時擦除另外一些記憶。然後它會把之前的狀態,當前的記憶好輸入來計算當前當前的cell。這種結構可以非常有效的捕獲長距離的依賴。LSTM對於初學者來說可能非常難以理解,不過 這篇文章 是一個非常好的解釋。

3. 總結

這一部分簡單的解釋了什麼是RNN以及它能做什麼。下一部分講話介紹使用Python和Theano來實現一個RNN的語言模型,敬請關注!

圖片描述

圖片描述