1,概述
語言模型可以說是NLP中最基本的任務,無論是詞向量,預訓練模型,文本生成等任務中都帶有語言模型的影子。語言模型本質上是對一個自然世界中存在的句子建模,描述一個句子發生的概率,因此語言模型也是一個自回歸的任務。語言模型是一個上下文強依賴的任務,不僅需要捕獲長距離的信息,還需要學到詞之間的位置關系,從目前的技術來看,RNN系的模型在語言模型任務上的表現要優於transformer,主要原因還是因為Transformer在學習詞位置關系時的能力弱於RNN,畢竟RNN是嚴格的從前到后循環依賴的。本系列將從AWD-LSTM開始,看看這之后的比較優質的語言模型的論文,以及transformer在語言模型中的表現。
2,論文解讀
作為系列的第一篇,先從最經典的AWD-LSTM開始,因為AWD-LSTM內容較多,且之后的很多論文都是在其基礎上改進的,所以詳細介紹它。
論文:Regularizing and Optimizing LSTM Language Models
RNN在語言模型任務中的表現是非常優秀的,而且RNN的結構和語言模型的任務特性也很好的切合。但RNN的循環連接容易過擬合。本片論文就是圍繞這一點展開的研究,提出了很多中解決RNN過擬合的技術,這一類技術不僅可以用在語言模型中,也可以用在其他RNN建模的任務中,LSTM作為RNN系列中最優秀的代表變體,論文就是在不改變LSTM的原有結構上,引入各種正則化技術,提升模型的泛化能力,改善語言模型的性能。接下來將詳細介紹論文中的正則化技術。
1)weighte-dropped LSTM
首先來看下LSTM的公式:
Dropout是神經網絡中常用的正則化技術,也可以使用在LSTM的隱層連接中,但通常效果不佳,因為Dropout會破壞LSTM的長距離能力,因為Dropout會隨機丟掉一些神經元,即把一些神經元的節點值設置為0。直覺上來看在計算$h_t$的時候,因為$h_{t - 1}$中被drop掉一些神經元,在計算$h_t$的時候就丟掉了一些之前的信息。作者在這里使用DropConnect替換Dropout來對隱層(即$U^i, U^f, U^o, U^c$)權重正則化,那DropConnect為什么又會比Dropout要好,DropConnect是在計算$h_t$時刻的某個神經元的值時只使用$h_{t-1}$中部分的神經元,那么在$h_t$時刻的所有神經元的計算中基本上會 用到$h_{t-1}$的所有神經元的值。一般來說Dropout和DropConnect並沒有說哪個正則化技術更好,只看適用的場景,在DNN中來說,使用Dropout正則類似於badding的思想,但是在LSTM中每一次迭代,$h_t$時刻是強依賴$h_{t-1}$,使用Dropout就破壞了時間序列上的信息流動,Dropout和DropConnect正則化的粒度不一樣,Dropout是對整個網絡正則,而DropConnect是對每次連接正則,所以在LSTM中使用DropConnect更適合。
因為LSTM中的權重在時間步上是共享的,所以每個時間步上可以使用相同的DropConnect mask。類似於variational dropout。
2)Variable length backpropagation sequences
一般在訓練語言模型時是將整個語料看作一個連續的很長很長的句子,然后將句子截斷成batch size個,然后又按照固定長度對這batch size個序列截斷,作者認為固定長度的階段影響了模型的性能,假設一個長度為100的序列,分成10個固定長度為10的序列,則這里面又1/10的詞在反向傳播中沒有任何信息輸入,其實也就是截斷后的序列的最后一個詞,有8/10的詞只能使用部分輸入。我感覺這個策略用處不會特別大,你可以把序列長度設長一點,這樣序列的依賴就變長了,但也不用太長,因為太長了Lstm也cover不住,句首的信息會因為梯度消失而丟失。
3)Variational dropout
一般的Dropout是每一次連接時都會通過dropout 函數(伯努利分布采樣)得到一個dropout mask,但是在LSTM中參數是共享的,作者希望在不同的時刻共享的參數也共享同一套dropout mask,這就是variational dropout,在隱層作者使用了共享mask的dropConnect,而在輸入和輸出中,作者使用共享mask的variational dropout。但是請注意在不同的mini-batch中,mask是不共享的,所以mask的共享和參數共享還是有區別的,dropout mask的共享是在每一個迭代中發生的,不同的迭代輸入的數據不同,為了體現數據的差異性,要保證dropout mask不一致。
4)Embedding dropout
對嵌入層引入dropout,實際上是在詞級上操作的,即隨機將一些詞給去掉,這些被去掉的詞的向量值就全為0,並且在前向和反向傳播中都保持這樣的操作。對其余沒有丟掉的詞,用$\frac{1}{1 - p_e}$縮放其向量值,$p_e$為dropout 的比例。
5)Weight tying
共享embedding層和output層,因為語言模型的最后輸出也是vocab size維,是預測vocab中每個詞的概率,從模型設計上來看嵌入層和最后輸出層的參數矩陣的維度是很容易保證一致的,而從語言模型的特性上來看兩個矩陣之間也是有一定的聯系,所以作者選擇共享嵌入層和輸出層的權重矩陣,這種方法在seq2seq中也經常用到。
6)Independent embedding size and hidden size
在RNN系列的模型中,參數量通常集中在embedding層,作者選擇減小embedding size,並且讓第一層LSTM的輸入和最后一層LSTM的輸出的維度等於embedding size。
7)Activation Regularization (AR) and Temporal Activation Regularization (TAR)
除了Dropout正則化技術,作者還引入了L2正則化,在這里主要是對兩部分,一是對輸出層$h_t$(這個是我沒想到的,一般L2都是對權重),稱為AR。另一個是對$h_{t + 1}$ 和$h_t$之間的差值,稱為TAR,這個其實還是比較好理解的,$h_{t + 1}$是即包含了當前的信息,也包含了之前的信息,所以較$h_t$不應該有較大的差異,這種就類似於滑動平均一樣,因為涵蓋了大量之前的信息,所以當前的輸入值也不應該對結果有太大的改變。兩者的公式分別如下:
上述都是從正則化,或者去其他提升模型泛化的技術上去改善模型的性能,下面將介紹作者提出的一種新的優化方法,專門為語言模型准備的。
NT-ASGD
研究發現,對於特定的語言建模任務,SGD的效果要優於帶動量的,或者自適應學習速率的優化算法,如動量法,Adagrad,RMSProp,Adam等優化算法。作者在這里沒有直接使用SGD,而是調研了ASGD(averaged SGD),發現ASGD的有着更好的效果。ASGD中有這么一項,即對過去的權重求均值,ASGD中用過去的參數的均值替換上一步的參數:
代碼中參數$K$是當前迭代次數,$T$是一個閾值,在這里$T$是要預先設置的值,$lr_t$是有學習調配器決定的,然而$T$值,以及學習調配器並不好設定,所以作者提出了NT-ASGD,首先使用恆定的學習速率。具體算法如下:
作者用非單調條件來觸發ASGD,即用語言模型中的度量值perplexity來判斷在一個非單調區間內,perplexity沒有得到改善,就觸發ASGD,而這個單調區間的大小設置為n=5效果最佳。
實驗設置
實驗使用的數據集是PTB和WT2,WT2數據集大約是PTB數據集的兩倍,WT2的vocab size是30000,包含了大小寫,標點符號,數字等字符,PTB的vocab size是10000,去除了標點符號,數字等字符,所以在測試機存在大量的OOV問題。
網絡結構是3層lstm,隱層大小1150,embedding size是400。NT-ASGD中T=750,n=5。batch size設置為WT2=80,PTB=40,大的batch size比使用10-20的batch size效果要好,其實這是顯而易見的,太小的batch size,每個batch的特異性太大,不利於網絡收斂。並且在完成上述訓練后,作者還用ASGD進一步fine-tuning網絡。其余如梯度截斷,學習速率,動態BPTT的序列長度,dropout的比例見論文。
實驗結果
表一是作者在PTB上的測試結果
這里有個很有意思的地方,就是上面的Melis的結果,Melis使用自動超參搜索在較小的網絡中也能取得很好的表現,而且也證明了語言模型對超參數是非常敏感的(深有感觸,目前遇到的最難煉的丹,小數據集上極容易過擬合)。
表2展示了在WT2上的表現
上面這兩張表都沒什么好看的,就是AWD-LSTM取得了當前最佳的效果,來看看下面這張表:
上面表格展示的是當去掉某個策略后的性能,variable sequence lengths是最不重要的,其實這個也正常,一是有隱層狀態在傳遞信息,二是即使增大長度,長度也是有限的,並不會有明顯提升,三是語料本身也不一定具備很強的連續性,像從Wiki中抽取出來的數據,不同的文章之間並不會有什么聯系。fine-tuning只有微量提升,WT2的驗證集上反而有副作用,最重要的當屬weight-dropping,這也是自然,畢竟隱層的循環是LSTM的核心,也是語言模型任務的核心。另外值得注意的是NT-ASGD也是有很明顯的提升,大多數任務用Adam就能取得很好的效果,但語言模型就是不一樣,只能說語言模型是很難煉的丹。
參考文獻:
Regularizing and Optimizing LSTM Language Models