李大舟,于廣寶+,高 巍,孟智慧
(1.沈陽化工大學 計算機科學與技術學院,遼寧 沈陽 110142;2.中國移動集團設計院有限公司河北分公司 山西綜合生產所,山西 太原 030000)
語言模型發(fā)展一共經歷3個階段,在第一個階段的統(tǒng)計語言模型中最具特點的是N-gram模型[1]。該模型有結構簡單、時間復雜度低等特點,但也有語言表達能力弱、維度災難和模型泛化能力弱的缺點。第二個階段是前饋神經網絡語言模型,該模型能更好使詞被計算機識別和利用,從而提升接受輸入的長度,但該模型的訓練復雜度高,需要使用特定的語料庫和詞表,并有一定的局限性。第三個階段是深度神經網絡,其代表是循環(huán)遞歸神經網絡,該網絡在語言模型一定的優(yōu)勢,但也存在一定的弊端,如梯度爆炸、梯度消失、訓練速度沒有前饋神經網絡快、需要的硬件要求也更高。
根據之前研究的不足之處,本文提出了時序卷積神經網絡,該網絡的結構特點是可以保證輸入序列和輸出序列相同。這樣就可以解決傳統(tǒng)循環(huán)遞歸網絡結構中的輸入序列和輸出序列不一致的情況。另一方面本文通過使用擴大卷積層,可以保存更多的文本信息,解決了傳統(tǒng)卷積神經網絡因輸入序列過長導致文本信息的丟失,使預測的準確率的降低的問題。
近年來,隨著語言模型的飛速發(fā)展,國內外相繼出現了很多的研究成果,關于語言模型的發(fā)展歷史,先是從傳統(tǒng)的統(tǒng)計型語言模型(n-gram模型)發(fā)展到神經網絡語言模型(NNLM),隨后向循環(huán)神經網絡語言(RNN)的方向進步,由Bengio等提出了前饋神經網絡[2]語言模型,實驗結果表明該模型比傳統(tǒng)的統(tǒng)計型語言模型(n-gram模型)優(yōu)秀。之后,由Bengio等將神經網絡技術應用在高維離散數據的聯合概率分布[3]建模,用于解決維度災難的問題。隨著科學技術的進步,基于深度神經網絡的技術也被廣泛的應用到語言模型中,Mikolov等[4]提出利用循環(huán)神經構建語言模型,將其歷史信息(即上一個隱含層的狀態(tài))也作為輸入,利用好更多的上下文信息進行預測,使語言建模的能力有了很大的提升。Sundermeyer等[5]實現了基于LSTM網絡[6]構建語言模型。該模型通過網絡的門結構可以更好選擇需要保留的上下文信息,在LSTM網絡架構中,詞向量非常重要,詞向量可以表示語言的深層信息,詞向量可以解決傳統(tǒng)one-hot表示帶來的維度災難和詞匯問題[7]。能夠有效地對單詞之間的語義信息進行計算。Le等在詞向量的基礎上嘗試構建句子和短語的向量表示,用來克服詞袋模型的缺點,以及提高信息檢索的能力。
語言模型的一個難點在于如果輸入的序列過長,導致網絡會丟失之前的語義信息。本文提出利用擴大卷積方法來解決這個問題。擴大卷積會增加更大的感受視野,從而保留更多的語義信息,另一個難點是輸入序列和輸出序列的長度不一致,導致計算的難度增加。
為了解決上述問題,本文提出了一種卷積網絡稱為時序卷積網絡,它有兩大特點:①輸入序列和輸出序列保持一致;②預測時不會使用未來的信息而只會使用歷史的信息。為了保證輸入序列和輸出序列相同,在全卷積的時候輸入層和隱含層相同,并且使用0填充來保證使后續(xù)層與先前的層保持相同的長度。為了保證預測時不使用未來的信息,使用因果卷積。為了得到一個較長的歷史信息,本文需要一個非常深的網絡或者非常大的卷積核,本文使用擴大卷積。為了防止模型過擬合,使用Relu激活函數和Dropout。所以本文提出的結構是由擴大卷積層、因果卷積層、RELU層和Dropout層組成,如圖1所示。
因為要處理時序問題,即要考慮時間問題,因果卷積可以考慮時間的問題,對于序列問題,可以把問題抽象成x1…xt和y1…yt-1去預測yt。這里的x1…xt為時刻1至t的輸入序列,yt為t時刻的輸出。y1…yt-1為中間輸出結果,但yt包含之前的所有輸入信息及中間輸出結果的信息。例如,輸入為“I am a good boy”,x1為“I”,x2為“am”,輸入因果卷積中,假設輸出J1為“B”,x2和x3作為輸入,進入網絡后,假設J2輸出為“C”,依次類推,輸出J3和J4,接來下,J1和J2作為輸入,J2和J3也作為輸入,J3和J4也作為輸入,輸出K1、K2和K3,直到最后的輸出結果為“OK”,這個“OK”就包含了之前的x1…x5的所有信息,這就是因果卷積的作用。
如圖2所示。因果卷積總結公式為,設因果卷積函數為F(x),即因果公式如式(1)
y0,…,yt=F(x0,…,xt)
(1)
如上文提到,因果卷積包含的輸入信息很有限,為了得到更長的輸入信息保證預測的準確性,因果卷積需要非常多的層級數來保證它具有更大的感受野或使用較大的卷積核來擴大感受野,而較大的感受野是保證更多的輸入信息的輸入。若不想用增加計算量的辦法,使用擴大卷積可以解決這個問題。擴大卷積最大的特點就是擴大感受野。擴大卷積通過控制擴大因子來增加感受野。在一維的擴大卷積中,擴大因子相當于將卷積核變大,如圖3所示。總結擴大卷積的公式如式(2)
(2)
其中,d為擴大因子、k為卷積核的大小,s-d·i計算了采用上層的某個單元。擴大因子控制了每兩個卷積核間會插入多少零值,當d=1時,擴大卷積就會變?yōu)橐话愕木矸e運算。一般在使用擴大卷積時,我們將隨著網絡深度i的增加而指數級地增大d,如式(3)
d=O(2^i)
(3)
當擴大因子為1時,擴大卷積就退化為因果卷積,感受野為2,當擴大因子為2時,擴大卷積的卷積核變?yōu)?,即感受野為4,當擴大因子為4時,擴大卷積的卷積核為8,即感受野為8,依次類推,最終輸出包含所有輸入信息。通過控制擴大因子,增加卷積核的大小從而達到增加感受野的目的。
圖2 因果卷積作用
圖3 擴大卷積效果
ReLu是神經網絡中的一個常用的激活函數,使用ReLu的原因:第一,傳統(tǒng)的sigmoid等函數,參數反向傳播求誤差的梯度時,求導復雜,會加大計算量,若采用Relu激活函數,在整個過程中會節(jié)省很多的計算量和計算時間。第二,在深層的網絡中,傳統(tǒng)的sigmoid函數參數反向傳播時,梯度消失或梯度爆炸的情況就會很容易出現,以至于深層網絡的訓練無法完成。第三,使用ReLu函數迫使部分神經元的輸出為0,使網絡變得稀疏,而且使參數之間減少了相互依賴,使過擬合的問題得到了緩解。第四,Relu函數更易學習優(yōu)化,因為是分段線性的屬性,使求導更加容易,而傳統(tǒng)的sigmoid函數,由于兩端是飽和的,在傳播過程中容易丟棄語義信息。所以本文選擇了Relu函數作為激活函數。Relu函數公式如式(4)
y=max(0,x)
(4)
在大規(guī)模的神經網絡中有這樣兩個缺點:①太費時;②容易過擬合。而Dropout層可以解決這個兩個問題,Dropout是在模型的訓練中隨機丟失一些隱藏單元,使其剩下的隱藏單元繼續(xù)工作,這樣使網絡更簡單,削弱了隱藏單元之間的依賴性。Dropout的功能是防止所有的特征提取器共同作用,一直放大或者縮小某些特征,若樣本小,則容易出現過擬合和泛化能力弱的現象,使用了Dropout能避免訓練過程中出現的這些問題,增加了網絡的泛化的能力。對于Dropout率的選擇,經過本文驗證,隱含點Dropout率等于0.45的時候效果最好,復雜度最低。所以本文選擇Dropout層用于優(yōu)化網絡。選取結果見表 1。
表1 Dropout選取對比
本文使用PennTreeBank(PTB)數據集進行詞級語言建模,該數據包含3個文件,分別是測試集數據文件、訓練集數據文件和驗證集數據文件,這3個數據集包已經經過預處理,相鄰的單詞之間用空格隔開,數據集含了9998個不同的單詞詞匯,加上稀有詞語的特殊符號和語句結束符在內,一共是10 000個詞匯。做詞級語言語料庫時,包含888 K單詞用于訓練,70 K單詞用于驗證,79 K單詞用于測試,這是一個經過高度研究但相對較小的語言建模數據集。如圖4所示。
圖4 PennTreeBank數據集的部分顯示
3.2.1 數據準備
為了將文本轉化為模型可以讀入的單詞序列,需要將這10 000個單詞分別映射到0-9999之間的編號。按照詞頻順序為每次詞匯分配一個編碼,將詞匯表保存到一個獨立的vocabary的文件中(前6個單詞與ID)ID和單詞對應見表2。
表2 ptb.vocabary
在確定詞匯表后,將訓練文件、測試文件等根據詞匯文件轉化為單詞編號,每個單詞標號就是它在詞匯文件中的行號,單詞編碼見表3。
表3 根據詞匯文件轉化為單詞編碼
當單詞編碼完成后,將數據集中的文本分割成序列,最大長度為50,分成16批,為隨機度下降的需要,需要把數據整理成一系列小的批次,每次為一個批次的數據來更新權重。讓數據進行批處理,這樣既可以節(jié)約時間又加快運算速度。
3.2.2 創(chuàng)建模型
為了使用之前的單詞來預測接下來的單詞,本文將使用時序卷積網絡,該網絡的結構是由一個擴大卷積、一個因果卷積、一個ReLu和一個Dropout的基本結構組成,4個基本結構組成一個卷積網絡的基本單位,而該網絡是由4層基本單位組成,這樣下來時序卷積網絡組裝完成,接下來將一個批量的數據(10 000維)送入編碼器成為一個批量的詞嵌入向量(600維)編碼器的作用是對數據降維,通常將文本信息轉化為向量編碼使用one-hot編碼,然而這樣做的結果會造成維度災難,也無法表示語義的相似性,將數據送入編碼中,編碼器中的隱藏神經元設為600,可以使數據由1 0 000維降成600維,形成詞向量。然后再將詞向量輸入時序卷積網絡中(其中擴大卷積和因果卷積的隱藏單元為600,卷積核大小為3),輸出為一個詞向量(600維),再將詞向量送入解碼器中,輸出為10 000維的數據,解碼為單詞(其中編碼器和解碼器的權重和隱藏單元是相同的),編譯模型。到現在為止,整個模型已經創(chuàng)建完成。模型如圖5所示。
圖5 語言模型結構
3.2.3 訓練模型
訓練模型,本文使用batch(大小為16)進行分批訓練,使訓練的速度加快。在訓練時,先讓模型可以按批次讀取數據,將數據編碼,隨后送入網絡中,在網絡中執(zhí)Dropout,隨機從句子中舍棄詞,迫使模型不依賴于單個單詞完成任務,選擇損失函數(交叉熵)和優(yōu)化器(SGD),網絡使用梯度下降來更新權重,使得模型的預測更加準確。最后將得到的模型應用于測試集,檢驗模型的優(yōu)劣。
3.2.4 評估指標
本文選擇的評估指標是語言模型通常選用的評價標準,即復雜度,復雜度是衡量一個語言模型的好壞,復雜度可以認為是平均分支系數,即預測下一個詞時可以有多少種選擇,若模型的PPL下降到90,可以直觀地理解為,在模型生成下一個詞時有90個合理選擇,可選詞數越少,認為模型越準確。所以復雜度越小,語言模型越好。
因為是語言模型,即預測的出來的詞是否準確,也可以從預測的誤差中看出模型的好壞,若預測的誤差越低,則說明預測的準確。誤差為預測值和真實值做差,所以誤差也作為一個評價指標。
為了驗證時序卷積網絡語言模型的有效性,本文選擇遞歸神經網絡RNN和LSTM神經網絡在相同數據集上做相同的實驗作為比對。
基于LSTM的語言模型使用TensorFlow實現,它使用兩層LSTM網絡,且每層有200個隱藏單元。我們在訓練中截斷的輸入序列長度為50,且使用Dropout和梯度截斷等方法控制模型的過擬合與梯度爆炸等問題。基于RNN的語言模型也是使用TensorFlow實現,由兩層基本的RNN網絡構成,輸入序列長度為50,基于時序卷積網絡的語言模型使用PyTorch實現。實驗完成后比較復雜度的結果如圖6所示。
圖6 3種算法的復雜度比較
圖6可以看到,橫軸代表訓練次數,豎軸代表復雜度,隨著訓練次數的增加,各模型的復雜度在下降,剛開始時序卷積網絡收斂的速度最快,LSTM次之,RNN最慢。由于復雜度的變化在1000之內的變化幅度比較明顯。由圖7可以看出,時序卷積網絡的復雜度始終低于其它兩種算法,而最終的比較結果也是顯示時序卷積網絡的復雜度最低。
圖7 3種算法局部復雜度比較
圖8是3種模型的誤差圖像,可以看出,剛才始時序卷積網絡的誤差比其它兩種模型的誤差低,而且時序卷積網絡的語言模型誤差始終比其它兩種模型的誤差低,收斂速度快,說明模型的學習能力強,能快速的降低誤差。最終同其它兩種模型相比,時序卷積網絡的誤差也是最低的,說明該網絡結構在語言模型優(yōu)于其它兩種結構。
圖8 3種算法的誤差對比
其綜合對比結果見表4。
表4 3種算法綜合對比
由表4可知,3種模型中,時序卷積網絡最好,復雜度達到83.21,其次是LSTM達到96.25,最差的是RNN達到97.778。誤差方面時序卷積網絡最低為3.87。實驗結果表明,基于時序卷積神經網絡的模型在詞級語言建模的任務中和遞歸神經網絡以及LSTM神經網絡相比表現最好。復雜度為83.21,誤差為3.87,是一種有效的詞級語言建模方法。
本文基于時序卷積神經網絡的模型實現了詞級級語言建模,與RNN、LSTM神經網絡模型在PennTreeBank數據集上的實驗結果對比表明,在這幾種方法中時序語言模型的語言建模最好,復雜度為83.21。說明該方法適合處理詞級語言建模的任務,能充分挖掘數據特征,降低復雜度。本文將擴大卷積網絡運用到語言模型的研究中,使用擴大卷積可以保留更多的歷史信息,從而提高語言模型預測的準確率。本文的研究結果會作為接下來語言模型的研究基礎。