遞歸神經網絡

往期回顧

在前面的文章中,咱們介紹了循環神經網絡,它能夠用來處理包含序列結構的信息。然而,除此以外,信息每每還存在着諸如樹結構、圖結構等更復雜的結構。對於這種複雜的結構,循環神經網絡就無能爲力了。本文介紹一種更爲強大、複雜的神經網絡:遞歸神經網絡 (Recursive Neural Network, RNN),以及它的訓練算法BPTS (Back Propagation Through Structure)。顧名思義,遞歸神經網絡(巧合的是,它的縮寫和循環神經網絡同樣,也是RNN)能夠處理諸如樹、圖這樣的遞歸結構。在文章的最後,咱們將實現一個遞歸神經網絡,並介紹它的幾個應用場景。算法

遞歸神經網絡是啥

由於神經網絡的輸入層單元個數是固定的,所以必須用循環或者遞歸的方式來處理長度可變的輸入。循環神經網絡實現了前者,經過將長度不定的輸入分割爲等長度的小塊,而後再依次的輸入到網絡中,從而實現了神經網絡對變長輸入的處理。一個典型的例子是,當咱們處理一句話的時候,咱們能夠把一句話看做是詞組成的序列,而後,每次向循環神經網絡輸入一個詞,如此循環直至整句話輸入完畢,循環神經網絡將產生對應的輸出。如此,咱們就能處理任意長度的句子了。入下圖所示:網絡

然而,有時候把句子看作是詞的序列是不夠的,好比下面這句話『兩個外語學院的學生』:ide

上圖顯示了這句話的兩個不一樣的語法解析樹。能夠看出來這句話有歧義,不一樣的語法解析樹則對應了不一樣的意思。一個是『兩個外語學院的/學生』,也就是學生可能有許多,但他們來自於兩所外語學校;另外一個是『兩個/外語學院的學生』,也就是隻有兩個學生,他們是外語學院的。爲了可以讓模型區分出兩個不一樣的意思,咱們的模型必須可以按照樹結構去處理信息,而不是序列,這就是遞歸神經網絡的做用。當面對按照樹/圖結構處理信息更有效的任務時,遞歸神經網絡一般都會得到不錯的結果。函數

遞歸神經網絡能夠把一個樹/圖結構信息編碼爲一個向量,也就是把信息映射到一個語義向量空間中。這個語義向量空間知足某類性質,好比語義類似的向量距離更近。也就是說,若是兩句話(儘管內容不一樣)它的意思是類似的,那麼把它們分別編碼後的兩個向量的距離也相近;反之,若是兩句話的意思大相徑庭,那麼編碼後向量的距離則很遠。以下圖所示:性能

從上圖咱們能夠看到,遞歸神經網絡將全部的詞、句都映射到一個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的含義,將正面評價轉變爲負面評價。編碼

儘管遞歸神經網絡具備更爲強大的表示能力,可是在實際應用中並不太流行。其中一個主要緣由是,遞歸神經網絡的輸入是樹/圖結構,而這種結構須要花費不少人工去標註。想象一下,若是咱們用循環神經網絡處理句子,那麼咱們能夠直接把句子做爲輸入。然而,若是咱們用遞歸神經網絡處理句子,咱們就必須把每一個句子標註爲語法解析樹的形式,這無疑要花費很是大的精力。不少時候,相對於遞歸神經網絡可以帶來的性能提高,這個投入是不太划算的。atom

咱們已經基本瞭解了遞歸神經網絡是作什麼用的,接下來,咱們將探討它的算法細節。spa

遞歸神經網絡的前向計算

接下來,咱們詳細介紹一下遞歸神經網絡是如何處理樹/圖結構的信息的。在這裏,咱們以處理樹型信息爲例進行介紹。

遞歸神經網絡的輸入是兩個子節點(也能夠是多個),輸出就是將這兩個子節點編碼後產生的父節點,父節點的維度和每一個子節點是相同的。以下圖所示:

c1 c2 分別是表示兩個子節點的向量, p 是表示父節點的向量。子節點和父節點組成一個全鏈接神經網絡,也就是子節點的每一個神經元都和父節點的每一個神經元兩兩相連。咱們用矩陣 W 表示這些鏈接上的權重,它的維度將是 d×2d ,其中, d 表示每一個節點的維度。父節點的計算公式能夠寫成:

p=tanh(W[c1c2]+b)(1)

在上式中,tanh是激活函數(固然也能夠用其它的激活函數), b 是偏置項,它也是一個維度爲 d 的向量。若是讀過前面的文章,相信你們已經很是熟悉這些計算了,在此不作過多的解釋了。

而後,咱們把產生的父節點的向量和其餘子節點的向量再次做爲網絡的輸入,再次產生它們的父節點。如此遞歸下去,直至整棵樹處理完畢。最終,咱們將獲得根節點的向量,咱們能夠認爲它是對整棵樹的表示,這樣咱們就實現了把樹映射爲一個向量。在下圖中,咱們使用遞歸神經網絡處理一棵樹,最終獲得的向量 p3 ,就是對整棵樹的表示:

舉個例子,咱們使用遞歸神將網絡將『兩個外語學校的學生』映射爲一個向量,以下圖所示:

最後獲得的向量 p3 就是對整個句子『兩個外語學校的學生』的表示。因爲整個結構是遞歸的,不只僅是根節點,事實上每一個節點都是以其爲根的子樹的表示。好比,在左邊的這棵樹中,向量 p2 是短語『外語學院的學生』的表示,而向量 p1 是短語『外語學院的』的表示。

式1就是遞歸神經網絡的前向計算算法。它和全鏈接神經網絡的計算沒有什麼區別,只是在輸入的過程當中須要根據輸入的樹結構依次輸入每一個子節點。

須要特別注意的是,遞歸神經網絡的權重 W 和偏置項 b 在全部的節點都是共享的。

遞歸神經網絡的訓練

遞歸神經網絡的訓練算法和循環神經網絡相似,二者不一樣之處在於,前者須要將殘差 δ 從根節點反向傳播到各個子節點,然後者是將殘差 δ 從當前時刻 tk 反向傳播到初始時刻 t1

下面,咱們介紹適用於遞歸神經網絡的訓練算法,也就是BPTS算法。

偏差項的傳遞

首先,咱們先推導將偏差從父節點傳遞到子節點的公式,以下圖:

定義 δp 爲偏差函數E相對於父節點 p 的加權輸入 netp 的導數,即:

δp=defEnetp

netp 是父節點的加權輸入,則

netp=W[c1c2]+b

在上述式子裏, netp c1 c2 都是向量,而 W 是矩陣。爲了看清楚它們的關係,咱們將其展開:

netp1netp2...netpn=wp1c11wp2c11...wpnc11wp1c12wp2c12wpnc12.........wp1c1nwp2c1nwpnc1nwp1c21wp2c21wpnc21wp1c22wp2c22wpnc22.........wp1c2nwp2c2nwpnc2nc11c12...c1nc21c22...c2n+b1b2...bn(1)

在上面的公式中, pi 表示父節點p的第i個份量; c1i 表示 c1 子節點的第i個份量; c2i 表示 c2 子節點的第i個份量; wpicjk 表示子節點 cj 的第k個份量到父節點p的第i個份量的的權重。根據上面展開後的矩陣乘法形式,咱們不難看出,對於子節點 cjk 來講,它會影響父節點全部的份量。所以,咱們求偏差函數E對 cjk 的導數時,必須用到全導數公式,也就是:

Ecjk=iEnetpinetpicjk=iδpiwpicjk(2)(3)

有了上式,咱們就能夠把它表示爲矩陣形式,從而獲得一個向量化表達:

Ecj=Ujδp(4)

其中,矩陣 Uj 是從矩陣W中提取部分元素組成的矩陣。其單元爲:

ujik=wpkcji

上式看上去可能會讓人暈菜,從下圖,咱們能夠直觀的看到 Uj 究竟是啥。首先咱們把W矩陣拆分爲兩個矩陣 W1 W2 ,以下圖所示:

顯然,子矩陣 W1 W2 分別對應子節點 c1 c2 的到父節點 p 權重。則矩陣 Uj 爲:

Uj=WTj

也就是說,將偏差項反向傳遞到相應子節點 cj 的矩陣 Uj 就是其對應權重矩陣 Wj 的轉置。

如今,咱們設 netcj 是子節點 cj 的加權輸入, f 是子節點c的激活函數,則:

cj=f(netcj)(5)

這樣,咱們獲得:

δcj=Enetcj=Ecjcjnetcj=WTjδpf(netcj)(6)(7)(8)

若是咱們將不一樣子節點 cj 對應的偏差項 δcj 鏈接成一個向量 δc=[δc1δc2] 。那麼,上式能夠寫成:

δc=WTδpf(netc)(2)

式2就是將偏差項從父節點傳遞到其子節點的公式。注意,上式中的 netc 也是將兩個子節點的加權輸入 netc1 netc2 連在一塊兒的向量。

有了傳遞一層的公式,咱們就不難寫出逐層傳遞的公式。

上圖是在樹型結構中反向傳遞偏差項的全景圖,反覆應用式2,在已知 δ(3)p 的狀況下,咱們不難算出 δ(1)p 爲:

δ(2)δ(2)pδ(1)δ(1)p=WTδ(3)pf(net(2))=[δ(2)]p=WTδ(2)pf(net(1))=[δ(1)]p(9)(10)(11)(12)

在上面的公式中, δ(2)=[δ(2)cδ(2)p] [δ(2)]p 表示取向量 δ(2) 屬於節點p的部分。

權重梯度的計算

根據加權輸入的計算公式:

net(l)p=Wc(l)+b

其中, net(l)p 表示第l層的父節點的加權輸入, c(l) 表示第l層的子節點。 W 是權重矩陣, b 是偏置項。將其展開可得:

netlpj=iwjicli+bj

那麼,咱們能夠求得偏差函數在第l層對權重的梯度爲:

Ew(l)ji=Enet(l)pjnet(l)pjw(l)ji=δ(l)pjc(l)i(13)(14)

上式是針對一個權重項 wji 的公式,如今須要把它擴展爲對全部的權重項的公式。咱們能夠把上式寫成矩陣的形式(在下面的公式中,m=2n):

EW(l)=Ew(l)11Ew(l)21...Ew(l)n1Ew(l)12Ew(l)22Ew(l)n2.........Ew(l)1mEw(l)2mEw(l)nm=δ(l)p1cl1δ(l)p2cl1...δ(l)pncl1δ(l)p1cl2δ(l)p2cl2δ(l)pnlcl2.........δlp1c(l)mδlp2c(l)mδlpnc(l)m=δ(l)(c(l))T(3)(15)(16)(17)

式3就是第l層權重項的梯度計算公式。咱們知道,因爲權重 W 是在全部層共享的,因此和循環神經網絡同樣,遞歸神經網絡的最終的權重梯度是各個層權重梯度之和。即:

EW=lEW(l)(4)

由於循環神經網絡的證實過程已經在零基礎入門深度學習(4) - 卷積神經網絡一文中給出,所以,遞歸神經網絡『爲何最終梯度是各層梯度之和』的證實就留給讀者自行完成啦。

接下來,咱們求偏置項 b 的梯度計算公式。先計算偏差函數對第l層偏置項 b(l) 的梯度:

Eb(l)j=Enet(l)pjnet(l)pjb(l)j=δ(l)pj(18)(19)

把上式擴展爲矩陣的形式:

Eb(l)=Eb
相關文章
相關標籤/搜索