寫在前面:本篇文章集中介紹了前饋神經網路模型、卷積神經網路模型、遞歸神經網路模型在自然語言處理領域的應用。對於模型本身,在《深度學習綜述》一文中,已經有了一個比較細緻和全面的介紹,這裡將不做過多的介紹。

1 前饋神經網路在自然語言領域中的應用

這裡要介紹的任務是一個分類問題,也可以認為是一個序列標註問題。自然語言處理中有一個很重要的基本問題,就是分詞和詞性標註問題。在處理分詞問題,一個常見的處理方法是將單詞標註為BIO類型。 BIO標註是將每個元素標註為「B-X」、「I-X」或者「O」。其中,「B-X」表示此元素所在的片段屬於X類型並且此元素在此片段的開頭,「I-X」表示此元素所在的片段屬於X類型並且此元素在此片段的中間位置,「O」表示不屬於任何類型。

這裡採用的前饋神經網路模型結構如下:

前饋神經網路模型的輸入是窗口大小為 2*WINDOW\_SIZE+1 的中心詞及其上下文。值得一提的是,這裡會對句子進行padding操作。以句子「it is a cat.「為例,假設窗口大小為3,對於第一個詞「it」而言,其窗口的內容應該是["<DUMMY>", 「it」,「is」],其思想和卷積神經網路中的圖像擴展類似。

經過處理後的數據形式如下:

[(Sao, Paulo, (, Brasil, ), ,, 23, may, (, EFECOM, ), .), (B-LOC, I-LOC, O, B-LOC, O, O, O, O, O, B-ORG, O, O)]

經過padding操作後的窗口訓練集舉例:

[<DUMMY>, <DUMMY>, Sao, Paulo, (], B-LOC]

其經過神經網路得到一個類別 y^{pred} , 與其標籤『B-LOC』在損失函數中進行誤差計算,通過反向傳播調整神經網路參數。

2 卷積神經網路在自然語言處理領域中的應用

下圖是一個單層CNN實例,卷積操作的數學公式表示如下:

經過上式的卷積操作得到了feature map,對 c 進行池化操作得到 c=max{c[i]}

通過一個實例介紹卷積神經網路是如何應用在自然語言處理領域的。在如下圖的模型中,首先,將每個單詞編碼為一個5維的詞向量,該句子被表示為了一個7*5的矩陣。接著,使用3個大小分別為2*5、3*5、4*5的卷積濾波器(每組各兩個,即通道數out_channels為2)進行卷積操作,經過激活函數得到尺寸分別為6、4、4的特徵向量,對得到的特徵向量進行池化操作併合並每一組特徵向量。最後對池化操作得到的向量組合作為softmax層的輸入進行分類處理。

卷積實現:

kernel_size = (2,3,4)
kernel_dim = 2
self.convs = nn.ModuleList([nn.Conv2d(in_channels=1, out_channels=kernel_dim, kernel_size = (K, embedding_dim)) for K in kernel_sizes])

Conv2d的參數解釋:in_channels表示輸入層的深度,這裡是1。此外對於圖像來說,黑白圖像的in_channels為1,而彩色圖像的in_channels為3(RGB三通道))。out_channels表示輸出的通道數。

#註:Github中的卷積神經網路模型結構和該例子的模型並不一致。

此外,介紹一個字元級的卷積神經網路模型。模型架構如下圖所示:

在該模型中,Highway network是一個新的概念,其旨在減少深層網路出現的梯度消失問題。其數學公式的描述如下:可以看出,輸出 y 主要由原輸入 x 和經過非線性變換的函數 H(x) 共同決定。

3 循環神經網路在自然語言處理領域中的應用

在介紹RNN模型之前,談一談語言模型的類型。Bi-RNN是一種考慮了全文信息的語言模型,前面談到的Skip-Gram和CBOW屬於基於窗口上下文的語言模型。n-gram模型和GloVe模型則屬於基於計數的語言模型。

與傳統的翻譯模型不同,傳統的翻譯模型只考慮先前單詞的有限窗口來調節語言模型,而遞歸神經網路(RNN)能夠在語料庫中的所有先前單詞上調節模型。上圖介紹了RNN架構,其中每個垂直矩形框是時間步t的隱藏層。 每個這樣的層保持多個神經元,每個神經元對其輸入執行線性矩陣運算,然後進行非線性運算。 運算過程如下式所示:

h_t=sigma(W^{(hh)}h_{t-1}+W^{(hx)}x_{[t]})

y_t=softmax(W^{(S)}h_t)

下圖展示了一個雙向的RNN模型:

下圖展示了RNN翻譯模型,其中前三個隱含層單元屬於源語言模型編碼器,最後兩個屬於目標語言模型解碼器。在這裡,德語短語Echt dicke Kiste被翻譯成Awesome sauce。 前三個隱藏層時間步驟將德語單詞編碼為一些語言單詞特 h_3 征,最後兩個時間步驟將 h_3 解碼為英文單詞輸出。

下式展示了上述模型的數學原理,第一個式子表示編碼範圍的關係,後兩個式子表示解碼範圍的關係。

事實上,只是用上述的模型很難達到一個令人滿意的結果,下面給出一些擴展模型的建議:

I)為編碼器和解碼器訓練不同的RNN權重參數。

II)考慮下面的模型: h_t=phi(h_{t-1},c,y_{t-1})

III)增加RNN模型的深度,這意味著語料庫應該會很大。

IV)使用雙向的RNN提高預測的精度。

V)給定的德語單詞序列A、B、C,預測英語序列X、Y。使用C、B、A的序列作為訓練集的輸入。這是因為A更可能被轉換為X.因此,考慮到前面討論的消失梯度問題,反轉輸入詞的順序可以幫助降低生成輸出短語的錯誤率。

值得注意的是,.對於RNN而言,相同的權重應用於輸入的每個時間步。此外RNN模型存在以下問題:

  1. 計算很慢 ,因為它是順序的,所以無法並行化。
  2. 在實踐中,由於諸如消失和爆炸的梯度等問題,很難從許多步驟中獲取信息。

儘管RNN理論上可以捕獲長期依賴性,但實際上很難進行訓練。 門控循環單元的設計具有更持久的內存,從而使RNN更容易捕獲長期依賴。下面介紹 Gated Recurrent Units的結構,LSTM前面已有詳細介紹,這裡就不再贅述。在Gated Recurrent Units結構中,Reset Gate負責確定 h_{t-1} 對於 h_t 的重要性。Update Gate負責確定應將多少 h_{t-1} 轉移到下一狀態。New Memory是對 h_{t-1}x_t 的一個合併。

分類,卷積,循環神經網路完整版實現代碼:

zhangtao-seu/cs224n?

github.com
圖標

推薦閱讀:
相关文章