Ordered Neurons: Integrating Tree Structures Into Recurrent Neural Networks

這是一篇發表在ICLR2019上的論文,並且還是ICLR2019的Best paper之一。該論文提出了能夠學習樹結構信息的ON-LSTM模型,這篇論文的開源代碼可以在GitHub找到。

自然語言都是層次結構的,小的單元(如詞組)堆疊成大的單元(如子句)。當一個大的成分結束時,其內部的所有小成分也要結束。然而標準的LSTM模型無法顯式地建模這種層次結構。因此這篇論文通過對神經元進行排序來加入這種歸納偏置(即學習層次信息),所提出的模型叫做ordered neurons LSTM(ON-LSTM)。

引言

自然語言通常都表現爲序列形式,比如說話與書寫都是序列式表達一個個語言單元。然而語言潛在的結構卻不是嚴格的序列式,而是類似於樹結構(比如語法樹),這種方式也符合人的認知。從實踐的角度看,將樹結構集成到神經網絡語言模型中可能有以下幾個理由:

  • 爲了獲得分層次的語義表示,提升抽象的等級
  • 爲了建模語言的組成以及處理長期依賴問題
  • 爲了通過歸納偏置改進生成效果,同時減少訓練數據量

一種直接的辦法是利用語法解析模型解析句子語法樹,但這類有監督方法同樣存在許多問題:1)缺少標註數據;2)在某些領域,語法規則不是那麼嚴格(比如網絡用語);3)語言在不斷變化,語法規則可能會失效。另一方面,無監督地直接學習語法結構(grammer induction)還是一個沒有很好解決方式的問題,並且往往非常複雜。

循環神經網絡在語言建模方面被證明是相當有效的,它假設數據是序列結構的。但這種假設在語言是非序列結構時可能會出現問題,在捕獲長期依賴或者生成任務上出現問題。同時,通過在LSTM中隱式編碼樹結構也可以實現語法處理機制。

在這篇論文中,作者提出了有序神經元(Ordered Neurons),每個神經元內的信息具有不同的生命週期:高階神經元存儲長期信息,可以保持更多的步數,低階神經元存儲短期信息,可能快速被遺忘。爲了避免硬性的對高階低階神經元劃分,論文還提出了cumax()這種激活函數。最終,模型在Language modeling, unsupervised constituency parsing, targeted syntactic evaluation和logical inference四個任務上進行了實驗,在語法分析上優於先前模型,同時在捕獲長期依賴和長句生成上也優於標準LSTM。

相關工作

目前已經有許多工作將樹結構應用到自然語言處理任務中,並且也證明了在LSTM中引入結構信息對任務十分具有幫助。然而,高效推斷這種結構也成爲了一個問題。有一部分工作直接進行語法歸納(grammer induction),但這類方法過於複雜難以應用。還有一些工作選擇改進循環網絡,使用不同時間尺度的循環機制捕獲層次信息。但這些工作一般會預先定義好層次的深度。

有序神經元

給定一個句子$S=(x_1,\dots,x_T)$,圖中(a)對應於它的成分樹,模型的目標是基於可觀測的序列數據推斷不可觀測的樹結構信息。像圖中(c)中顯示的,在每一個時間步的隱狀態中,既要包含當前輸入(葉子節點)的信息,也要包含更高層次的信息。但隱狀態$h_t$的維度是固定的(c中爲3),在不同的時間步和句子中,各層次的信息又可能有不同的跨度,因此需要動態地將從根節點到葉子節點的每個節點映射到隱狀態的一片神經元上。比如從(a)到(c)剛好層次對應,但也可能樹的層次有4層,而隱狀態的神經元數目只有3。

因此在有序神經元工作中,作者希望高階的神經元(對應於c中上層)包含長期依賴或者全局信息,這些信息可能持續多個時間步甚至整個過程,低階神經元(對應於c中下層)編碼短期記憶或者局部信息,這些信息只持續較少時間步。也就是說低階神經元更新的頻率要比高階神經元更快。

ON-LSTM

標準LSTM可以表示爲: $$ f_t = \sigma(W_fx_t + U_f xh_{t-1} + b_f) \ i_t = \sigma(W_ix_t + U_i xh_{t-1} + b_i) \ o_t = \sigma(W_ox_t + U_o xh_{t-1} + b_o) \ \hat{c}t = \text{tanh}(W_c x_t + U_c h{t-1} + b_c) \ h_t = o_t \circ \text{tanh}(c_t) \ c_t = f_t \circ c_{t-1} + i_t \circ \hat{c_t} $$

ON-LSTM和標準LSTM的區別就在於$c_t$的更新,也就是上面最後的公式。因爲遺忘門$f_t$和輸入門$i_t$控制了記憶單元$c_t$的更新,而且對於每個神經元這些門都是獨立的,因此論文實際上也是改進了遺忘門和輸入門。

激活函數 cumax()

爲了區分高階神經元和低階神經元,並分別對應不同的更新方式,首先需要找到兩者的邊界,即分割點。論文的做法是希望生成一個n-hot向量$g=(0,\dots,0,1,\dots,1)$,這個向量共分爲兩段,一段爲全0,一段爲全1,模型就可以在兩段上實行不同的更新規則。

爲了得到上面的向量,論文首先介紹了cumsum這個函數,它表示累計求和,在一個one-hot向量上進行cumsum對應的效果就是將向量分成0,1組成兩段,比如 $$ \text{cumsum}((0,0,1,0,0)) = (0,0,1,1,1) $$ 因此上面生成n-hot向量就轉換成了生成one-hot向量,即找到一個整數分割點(第一個1的位置)。但是此時分割點取值是離散的,計算梯度是行不通的,因此作者使用了一個軟化的辦法轉而求期望。具體來說,假設位置$d$出現1的概率可以用下式表示: $$ p(d) = \text{softmax}(\dots) $$ 因爲$g$是由cumsum產生的,因此$g$的第$k$個位置爲1的概率應該是前$k$個位置概率的累加和,即 $$ p(g_k=1)=p(d \leq k) = \sum_{i \leq k} p(d=i) $$ 因此最終的向量就可以用作者提出的激活函數cumax()生成,也就是: $$ \hat{g} = \text{cumax}(\dots) = \text{cumsum}(\text{softmax}(\dots)) = \text{cumsum}((p(1), p(2), \dots, p(k), \dots)) $$ 而softmax可以是一個可學習的概率預測網絡,因此論文就把找分界點問題變成了一個概率預測問題。

結構化門機制

基於上面的cumax()激活函數,論文提出了自己的主遺忘門$\tilde{f}t$和主輸入門$\tilde{i}t$: $$ \tilde{f}t = \text{cumax}(W{\tilde{f}}x_t + U{\tilde{f}}h{t-1} + b_{\tilde{f}}) \ \tilde{i}t = 1 - \text{cumax}(W{\tilde{i}}x_t + U_{\tilde{i}}h_{t-1} + b_{\tilde{i}}) $$ 使用上面的式子,主遺忘門和主輸入門生成的向量都是單調的,但主遺忘門是從0到1遞增,主輸入門是從1到0遞減。使用這兩個門後,記憶單元的更新規則如下: $$ w_t = \tilde{f}_t \circ \tilde{i}_t \ \hat{f}_t = f_t \circ w_t + (\tilde{f}_t - w_t) = \tilde{f}_t \circ (f_t \circ \tilde{i}_t + 1 - \tilde{i}_t) \ \hat{i}_t = i_t \circ w_t + (\tilde{i}_t - w_t) = \tilde{i}_t \circ (i_t \circ \tilde{f}_t + 1 - \tilde{f}_t) \ c_t = \hat{f}t \circ c{t-1} + \hat{i}_t \circ \hat{c}_t $$ 接下來我們講怎麼理解上面這個更新規則。爲了簡單起見,我們仍然假設主遺忘門$\tilde{f}_t$是$(0,\dots,1,\dots,1)$類型,對應的主輸入門$\tilde{i}_t$是$(1,\dots,1,0,\dots,0)$類型的向量。

其中$w_t$是$\tilde{i}_t$和$\tilde{f}_t$的交集部分,它的形式應該是$(0,\dots,1,\dots,1,0,\dots,0)$(也可能沒有1)。所以,下面我們來討論一下:

當**$w_t$全爲0**時,也就是說兩個門沒有交集,此時有: $$ \hat{f}_t = \tilde{f}_t \ \hat{i}_t = \tilde{i}_t \ c_t = \hat{f}t \circ c{t-1} + \hat{i}_t \circ \hat{c}_t = \tilde{f}t \circ c{t-1} + \tilde{i}_t \circ \hat{c}_t $$ 此時記憶單元的更新如上圖左邊部分所示,$\tilde{f}t$將$c{t-1}$的高階信息拷貝到$c_t$,$\tilde{i}_t$將$\hat{c}_t$的低階信息拷貝到$c_t$,而中間不相交區域則沒有任何信息。

當**$w_t$不全爲0**時,也就是說兩個門有交集,此時有: $$ c_t = (\tilde{f}t - w_t) \circ c{t-1} + (\tilde{i}_t -w_t) \circ \hat{c}t + [f_t \circ w_t \circ c{t-1} + i_t \circ w_t \circ \hat{c}_t] $$ 此時記憶單元的更新如上圖右邊部分所示,更新被拆分爲三段。主遺忘門和主輸入門的作用還是一樣,但是交集區域,由兩個門共同作用,也就退化成了標準的LSTM形式。

主遺忘門$\tilde{f}_t$控制記憶的擦除,它的分割點是$d_f$。$d_f$較大表示更多的高階信息要被擦除更新掉。主輸入門$\tilde{i}_t$控制記憶的寫入,它的分割點是$d_i$。$d_i$較大表示更多的局部信息生命週期變長。而$w_t$是兩個門的交叉分佈,這部分既包含了先前的信息也包含了當前輸入信息,因此這部分使用標準LSTM處理。

因爲這些主門只是關注於粗粒度的控制記憶,因此使用隱狀態的維度進行計算會帶來很大的計算量,也是沒有必要的。因此實際上論文將門的維度定義爲$D_m=\dfrac{D}{C}$,其中$D$是隱狀態維度,$C$是塊大小因子(chunk size factor)。在和$f_t$與$i_t$逐元素相乘之前,將每個神經元重複$C$次以恢復$D$的維度。這種降維方式能夠有效減少ON-LSTM的參數。用了這種方式後,原先一個神經元對應一個門就變成了連續$C$個神經元共享一個門。

實驗

論文在language modeling,unsupervised constiuency parsing, targeted syntactic evaluation和logical inference四個任務上進行了實驗。在第一個任務中的表現如下圖所示:

這裏重點提一下unsupervised constiuency parsing這個任務,這個任務的評測方法是將模型推斷出來的樹結構和人工標註的結構進行對比。爲了使用預訓練的模型推斷一個句子的樹結構,論文首先將隱狀態初始化爲全零,然後將句子輸入模型。在每個時間步,都對$d_f$計算期望: $$ \hat{d}f = \mathbb{E}[d_f] = \sum{k=1}^{D_m}k p_f (d_t=k) = \sum_{k=1}^{D_m} \sum_{i=1}^k p_f(d_t = k) = D_m - \sum_{k=1}^{D_m} \tilde{f}{tk} $$ 其中$p_f$是主遺忘門分割點的概率分佈,$D_m$是隱狀態的大小。給定$\hat{d}f$,可以使用自頂向下的貪心算法進行解析。首先對${\hat{d}f}$進行排序,對於序列中的第一個$\hat{d}f$,將句子分成$((x{<i}), (x_i, (x{>i})))$,然後對$(x{<i})$和$(x{>i})$兩部分再次運用上述方法,知道每個部分都只包含一個單詞。

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