遞歸神經網絡(recursive neural network)是具有樹狀階層結構且網絡節點按其連接順序對輸入信息進行遞歸的人工神經網絡,是深度學習算法之一。
遞歸神經網絡提出於1990年,被視為循環神經網絡(recurrent neural network)的推廣。當遞歸神經網絡的每個父節點都僅與一個子節點連接時,其結構等價於全連接的循環神經網絡。遞歸神經網絡可以引入門控機制(gated mechanism)以學習長距離依賴。遞歸神經網絡具有靈活的拓撲結構且權重共享,適用於包含結構關係的機器學習任務,在自然語言處理(Natural Language Processing, NLP)領域有重要應用。
因為神經網絡的輸入層單元個數是固定的,因此必須用循環或者遞歸的方式來處理長度可變的輸入。循環神經網絡實現了前者,通過將長度不定的輸入分割為等長度的小塊,然後再依次的輸入到網絡中,從而實現了神經網絡對變長輸入的處理。一個典型的例子是,當我們處理一句話的時候,我們可以把一句話看作是詞組成的序列,然後,每次向循環神經網絡輸入一個詞,如此循環直至整句話輸入完畢,循環神經網絡將產生對應的輸出。如此,我們就能處理任意長度的句子了。然而,有時候把句子看做是詞的序列是不夠的,比如下面這句話『兩個外語學院的學生』:
上圖顯示了這句話的兩個不同的語法解析樹。可以看出來這句話有歧義,不同的語法解析樹則對應了不同的意思。一個是『兩個外語學院的/學生』,也就是學生可能有許多,但他們來自於兩所外語學校;另一個是『兩個/外語學院的學生』,也就是只有兩個學生,他們是外語學院的。為了能夠讓模型區分出兩個不同的意思,我們的模型必須能夠按照樹結構去處理信息,而不是序列,這就是遞歸神經網絡的作用。當面對按照樹/圖結構處理信息更有效的任務時,遞歸神經網絡通常都會獲得不錯的結果。
遞歸神經網絡可以把一個樹/圖結構信息編碼為一個向量,也就是把信息映射到一個語義向量空間中。這個語義向量空間滿足某類性質,比如語義相似的向量距離更近。也就是說,如果兩句話(儘管內容不同)它的意思是相似的,那麼把它們分別編碼後的兩個向量的距離也相近;反之,如果兩句話的意思截然不同,那麼編碼後向量的距離則很遠。如下圖所示:
從上圖我們可以看到,遞歸神經網絡將所有的詞、句都映射到一個2維向量空間中。句子『the country of my birth』和句子『the place where I was born』的意思是非常接近的,所以表示它們的兩個向量在向量空間中的距離很近。另外兩個詞『Germany』和『France』因為表示的都是地點,它們的向量與上面兩句話的向量的距離,就比另外兩個表示時間的詞『Monday』和『Tuesday』的向量的距離近得多。這樣,通過向量的距離,就得到了一種語義的表示。
上圖還顯示了自然語言可組合的性質:詞可以組成句、句可以組成段落、段落可以組成篇章,而更高層的語義取決於底層的語義以及它們的組合方式。遞歸神經網絡是一種表示學習,它可以將詞、句、段、篇按照他們的語義映射到同一個向量空間中,也就是把可組合(樹/圖結構)的信息表示為一個個有意義的向量。比如上面這個例子,遞歸神經網絡把句子"the country of my birth"表示為二維向量[1,5]。有了這個『編碼器』之後,我們就可以以這些有意義的向量為基礎去完成更高級的任務(比如情感分析等)。如下圖所示,遞歸神經網絡在做情感分析時,可以比較好的處理否定句,這是勝過其他一些模型的。
在下圖中,藍色表示正面評價,紅色表示負面評價。每個節點是一個向量,這個向量表達了以它為根的子樹的情感評價。比如"intelligent humor"是正面評價,而"care about cleverness wit or any other kind of intelligent humor"是中性評價。我們可以看到,模型能夠正確的處理doesn't的含義,將正面評價轉變為負面評價。
計算
1前向計算
遞歸神經網絡的輸入是兩個子節點(也可以是多個),輸出就是將這兩個子節點編碼後產生的父節點,父節點的維度和每個子節點是相同的。如下圖所示:
分別是表示兩個子節點的向量,P是表示父節點的向量。子節點和父節點組成一個全連接神經網絡,也就是子節點的每個神經元都和父節點的每個神經元兩兩相連。我們用矩陣W表示這些連接上的權重,它的維度將是d×2d ,其中,d 表示每個節點的維度。父節點的計算公式可以寫成:
在上式中,tanh是激活函數(當然也可以用其它的激活函數),b 是偏置項,它也是一個維度為d 的向量。
然後,我們把產生的父節點的向量和其他子節點的向量再次作為網絡的輸入,再次產生它們的父節點。如此遞歸下去,直至整棵樹處理完畢。最終,我們將得到根節點的向量,我們可以認為它是對整棵樹的表示,這樣我們就實現了把樹映射為一個向量。在下圖中,我們使用遞歸神經網絡處理一棵樹,最終得到的向量 ,就是對整棵樹的表示:
舉個例子,我們使用遞歸神將網絡將『兩個外語學校的學生』映射為一個向量,如下圖所示:
最後得到的向量 就是對整個句子『兩個外語學校的學生』的表示。由於整個結構是遞歸的,不僅僅是根節點,事實上每個節點都是以其為根的子樹的表示。比如,在左邊的這棵樹中,向量 是短語『外語學院的學生』的表示,而向量 是短語『外語學院的』的表示。
式1就是遞歸神經網絡的前向計算算法。它和全連接神經網絡的計算沒有什麼區別,只是在輸入的過程中需要根據輸入的樹結構依次輸入每個子節點。需要特別注意的是,遞歸神經網絡的權重和偏置項在所有的節點都是共享的。
2 訓練
遞歸神經網絡的訓練算法和循環神經網絡類似,兩者不同之處在於,前者需要將殘差δ 從根節點反向傳播到各個子節點,而後者是將殘差δ 從當前時刻 反向傳播到初始時刻 。
誤差項的傳遞
首先,先推導將誤差從父節點傳遞到子節點的公式,如下圖:
上圖是在樹型結構中反向傳遞誤差項的全景圖,反覆應用式2,在已知 的情況下,我們不難算出 為:
權重梯度的計算
根據加權輸入的計算公式:
式3就是第l層權重項的梯度計算公式。我們知道,由於權重W是在所有層共享的,所以和循環神經網絡一樣,遞歸神經網絡的最終的權重梯度是各個層權重梯度之和。即:
把上式擴展為矩陣的形式:
(式5)
式5是第l層偏置項的梯度,那麼最終的偏置項梯度是各個層偏置項梯度之和,即:
應用
自然語言和自然場景解析
兩種不同的場景,可以用相同的遞歸神經網絡模型來實現。我們以第一個場景,自然語言解析為例。
我們希望將一句話逐字輸入到神經網絡中,然後,神經網絡返回一個解析好的樹。為了做到這一點,我們需要給神經網絡再加上一層,負責打分。分數越高,說明兩個子節點結合更加緊密,分數越低,說明兩個子節點結合更鬆散。如下圖所示:
一旦這個打分函數訓練好了(也就是矩陣U的各項值變為合適的值),我們就可以利用貪心算法來實現句子的解析(貪心算法的基本思路是從問題的某一個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得局部最優解。每一步只考慮一個數據,他的選取應該滿足局部優化的條件。若下一個數據和部分最優解連在一起不再是可行解時,就不把該數據添加到部分解中,直到把所有數據枚舉完,或者不能再添加算法停止)。第一步,我們先將詞按照順序兩兩輸入神經網絡,得到第一組打分:
我們發現,現在分數最高的是第一組,The cat,說明它們的結合是最緊密的。這樣,我們可以先將它們組合為一個節點。然後,再次兩兩計算相鄰子節點的打分:
現在,分數最高的是最後一組,the mat。於是,我們將它們組合為一個節點,再兩兩計算相鄰節點的打分。這時,我們發現最高的分數是on the mat,把它們組合為一個節點,繼續兩兩計算相鄰節點的打分.最終,我們就能夠得到整個解析樹: