767
技術社區[雲棲]
零基礎進行神經網絡語言建模
更多深度文章,請關注:https://yq.aliyun.com/cloud
語言模型是自然語言處理領域的基礎問題,其在詞性標注、句法分析、機器翻譯、信息檢索等任務中起到了重要作用。簡而言之,統計語言模型表示為:在詞序列中,給定一個詞和上下文中所有詞,這個序列出現的概率。例如:你手機上鍵盤上方正顯示的三個字,係統試圖預測你要輸入的下一個字詞就是語言建模的用途之一。在下麵所示的情況下,語言模型預測“from”,“on”和“it”在給定句子中具有很高的下一個單詞的可能性。其實輸入法係統內部,語言模型都會計算詞匯中的每個單詞的出現的概率,但是用戶隻能看到前三個最可能的單詞。
語言模型是許多係統的基本部分,它試圖解決機器翻譯和語音識別等自然語言處理任務。目前,所有的最先進的語言模型都是神經網絡。
這篇文章的第一部分提供了一個簡單的前饋神經網絡來解決這個任務。在帖子的第二部分,我們將通過添加一個循序神經網絡(RNN)來改進簡單的神經網絡模型。最後一部分將討論兩種最近提出的改進基於RNN的語言模型的正則化技術。
作為開始,我們將建立一個簡單的模型,給出一個單詞,然後嚐試預測其後的單詞。
我們使用one-hot向量來表示單詞:我們讓詞匯表中單詞任意排序,然後將該n個詞表示為詞匯量為(N)大小的向量。其中絕大多數標記為0,隻有一個標記為 1,代表當前的詞。
該模型可以分為兩部分:
我們從編碼輸入字開始。通過取代表輸入字的one-hot矢量(c在圖中),並將其乘以(N,200),我們稱為輸入embedding(U)的大小矩陣。通過該乘法產生一個大小為200的向量,這也被稱為詞嵌入。該嵌入是當前輸入字的密集式表征(dense representation)。該表示的大小要小於表示相同單詞的單熱矢量,而且它還具有一些其他有趣的屬性。例如,雖然由one-hot向量表示的每兩個詞之間的距離總是相同的,但是這些密集式表征卻具有這樣的屬性,即在意義上接近的詞具有在嵌入空間中接近密集式表征。
第二個組件可以看作是一個解碼器。在編碼步驟之後,我們有輸入字的表示方式。我們將它乘上一個大小的矩陣(200,N),我們稱之為輸出embedding(V)。所得到的矢量大小為N,然後通過softmax函數,將其歸一化為概率分布(意味著每個值都在0和1之間,並且它們的和1)。
解碼器是一個簡單的函數,它接受輸入單詞的表征,並返回一個模型表示對下一個單詞的預測的分布:該模型顯示每個單詞成為序列中下一個單詞的概率。
為了訓練這個模型,我們需要一對輸入和目標輸出字。對於(input, target-output),我們使用Penn Treebank數據集,其中包含來自新聞文章的約40K個句子,並且具有10,000個常用詞匯。為了生成模型學習的單詞對,我們將從文本中獲取每對相鄰單詞,並將第一個作為輸入單詞,將第二個單詞作為目標輸出單詞。因此,例如,對於句子“The cat is on the mat”:我們將提取下列詞對(The, cat),(cat, is),(is, on)等等。
我們使用隨機梯度下降來更新訓練中的模型,所用的損失是交叉熵損失。這種損失測量了模型預測的輸出分布與每次迭代的目標分布之間的差距。每次迭代的目標分布是表示當前目標字的one-hot矢量。
用於表示語言模型性能的度量標準是測試集的困惑度。最佳困惑度為1,而簡單模型的困惑度為183。但,我們可以通過更好的辦法來提升其性能。
使用RNN來提高性能
簡單模型的最大問題是,為了預測句子中的下一個單詞,它隻使用單個前一個單詞。如果我們可以建立一個能夠記住前麵幾句話的模型,那麼它的性能應該會有所提高。我們用一個例子來理解我們為什麼這樣做!想想下麵的例子:詞語“喝”是什麼?你可能會說“咖啡”,“啤酒”和“蘇打水”有可能是它後麵的詞。如果我告訴你這個詞序列實際上是“奶牛喝”,那麼你就會完全改變你的答案。
我們可以通過使用循環神經網絡(RNN)來增加我們模型的記憶,如下所示。
該模型與簡單的模型類似,隻是在對當前輸入字進行編碼之後,我們將所得到的大小為200
矢量式提供給兩層LSTM,然後輸出一個也是大小為200
的向量(在每個時間步長內LSTM也會接收到一個向量表示其以前的狀態,這在圖中未表示出)。然後,我們使用解碼器將這個輸出向量轉換成概率值的向量。(LSTM隻是一個更好地記住過去愛好的RNN,它的“API”與RNN的“API”相同,每個時間步長內的LSTM接收到一個輸入及其以前的狀態,並使用這兩個輸入計算輸出向量。)
現在我們有一個模型,在每個時間步驟內不僅獲得當前的單詞表示,而且還獲取了上一個時間步長中LSTM的狀態,並使用它來預測下一個單詞。LSTM的狀態是以前看到的單詞的表示(注意,我們最近看到的單詞對這個狀態的影響比我們以前看到的有更大的影響)。
正如預期的那樣,RNN模型的困惑度為114,性能有所提高,Tensorflow中提供了此模型的實現以及詳細的說明。
利用RNN雖然能夠提高模型的性能,但是我們依然可以做得更好。在本節中,我將介紹一些改進RNN語言模型性能的最新進展。
Dropout:
我們可以通過增加嵌入層和LSTM層來改進模型網絡,但是隨著層數的不斷增加,很快就會停止增加性能,因為網絡超出了訓練數據的需求。通過規範模型來解決這個問題的一個方法是使用Dropout。
Dropout是指在深度學習網絡的訓練過程中,對於神經網絡單元,按照一定的概率將其暫時從網絡中丟棄。關於Dropout的介紹:深度學習網絡大殺器之Dropout——深入解析Dropout。
下圖是基於RNN模型的可視化,展示了三個時間步驟。x
是輸入序列和y
是
輸出序列,灰色框表示LSTM層。垂直箭頭表示來自相同時間步長層的輸入,水平箭頭表示攜帶先前時間步長信息的連接。
我們可以在垂直(同一時間步)連接上應用Dropout:
著色箭頭代表我們應用Dropout的地方。某個層的缺陷掩碼表示那個層被激活歸零。在這種情況下,我們對不同的層使用不同的Dropout掩碼(這由圖中的不同顏色表示)。
將Dropout應用於循環連接會損害性能,因此在初始使用Dropout時,我們僅在同一時間段內的連接上使用它。使用兩個LSTM層,每層包含1500個LSTM單元,我們實現了一個困惑度為78的模型創建。
最近引入的variational dropout 解決這個問題,並且通過在每個時間步長使用相同的dropout masks來提高模型的性能(模型困惑度75)。
Weight Tying(權重綁定):
輸入嵌入和輸出嵌入有幾個共同的屬性。它們共同的第一個屬性是它們都是相同的大小(在我們的具有Dropout的RNN模型中,它們的大小都是(10000,1500)
)。
他們共有的第二個屬性有點微妙。在輸入嵌入中,具有相似含義的詞由相似的向量(與餘弦相似度相似)表示。這是因為該模型得知它需要以類似的方式對類似的單詞做出反應(“快速”這個詞之後的單詞與“極速”一詞相似)。
這個屬性也出現在輸出嵌入中。輸出嵌入接收關於下一個輸出字(RNN的輸出),必須將其轉換成概率分布。來自給定RNN的表征,解碼器判斷單詞的概率主要取決於其在輸出嵌入中的表示。因為模型想要提升RNN輸出性能,就會將類似的概率值分配給類似的單詞,類似的單詞由相似的向量表示。(再者,如果給定一定的RNN輸出,單詞“快速”的概率相對較高,我們也預計單詞“極速”的概率相對較高)。
這兩個相似之處使我們最近提出了一個非常簡單的方法:weight tying,以降低模型的參數並提高其性能。我們簡單地把輸入嵌入和輸出嵌入聯係在一起(即我們設置U
= V,這意味著我們現在有一個單獨的嵌入矩陣,既用作輸入嵌入和有可以用作輸出嵌入)。這使得使用Dropout的RNN模型的困惑度降到了73
。
為什麼weight tying(權重綁定)可以工作?
變化的dropout RNN模型在測試集上的困惑度是75
。相同的模型在訓練集上實現了困惑度24
的成績
。這意味著它已經開始記住僅在訓練集中的某些模式或序列,並且不會讓模型涉及到數據集不可見的數據。應對這種過度配合的一個方法就是通過降低模型的容量(參數數量)來降低模型的“記憶”能力。通過應用權重綁定(weight
tying),我們刪除了大量的參數。
除了權重綁定(weight tying)的正規化效果之外,我們提出了改進結果的另一個原因。那就是我們發現輸出嵌入中的單詞表示的質量遠遠高於無語言模型的輸入嵌入中的表示。在一個權重綁定模型中,因為在每個訓練迭代中綁定的嵌入參數更新與未解模型的輸出嵌入的更新非常相似,所以綁定的嵌入與未解開的模型的輸出嵌入相似。所以在綁定的模型中,我們在模型中使用單個高質量的嵌入矩陣。這有助於提高綁定模型性能(tied model)。
總結:這篇文章介紹了如何通過首先添加一個RNN,然後添加可變化的Dropout和權重綁定來改進一個非常簡單的前饋神經網絡語言模型。
近幾個月來,我們已經看到RNN語言建模方麵的最新進展。目前最新的結果由Melis等人最近的兩篇論文。這些模型利用上麵所示的大多數方法,並通過使用更好的優化技術,如新的正則化方法以及通過為現有模型找到更好的參數來擴展它們。這些方法中的一些將在本指南的第二部分中介紹。
本文由北郵@愛可可-愛生活老師推薦,@阿裏雲雲棲社區組織翻譯。
文章原標題《Neural-Language-Modeling-From-Scratch》
譯者:袁虎 審閱:主題曲哥哥
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-09-09 00:02:37