馬 林
(商丘職業(yè)技術(shù)學(xué)院 河南 商丘 476100)
循環(huán)神經(jīng)網(wǎng)絡(luò)[1]大多應(yīng)用于對(duì)序列數(shù)據(jù)的處理上,神經(jīng)元可以將某一刻輸出的數(shù)據(jù)作為另一刻的輸入輸進(jìn)神經(jīng)元,由于其網(wǎng)絡(luò)結(jié)構(gòu)具有較好的串聯(lián)性,可以很好地和時(shí)間序列數(shù)據(jù)相適應(yīng),從而使二者保持良好的依賴性。因?yàn)镽NN 展開以后,能夠獲得重復(fù)的結(jié)構(gòu)和共享的參數(shù),網(wǎng)絡(luò)參數(shù)在很大程度上較少,使復(fù)雜性相對(duì)降低。此外,由于共享參數(shù)還可以使網(wǎng)絡(luò)模型在長(zhǎng)度不等的數(shù)據(jù)上得以擴(kuò)展,使得RNN 輸入的數(shù)據(jù)長(zhǎng)度可以是非定長(zhǎng)的。起初,RNN 的設(shè)計(jì)目標(biāo)是針對(duì)學(xué)習(xí)長(zhǎng)期的依賴性,但很多實(shí)踐證明,標(biāo)準(zhǔn)的RNN 在數(shù)據(jù)的長(zhǎng)期保存中面臨很大的困難。
為解決長(zhǎng)期依賴的問題,學(xué)者們選擇在實(shí)踐中效果較好的LSTM[2-3]。此后,門控循環(huán)單元[4-5]在LSTM 的基礎(chǔ)上進(jìn)行了改進(jìn)。LSTM 和GRU 均通過門控機(jī)制來保證長(zhǎng)期依賴的。雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(Bi-directional LSTM,BLSTM)的提出使其在音頻識(shí)別上取得一定成果[6]。
本文主要對(duì)RNN、LSTM 和GRU 3 種模型的結(jié)構(gòu)特點(diǎn)、各個(gè)計(jì)算組件的功能進(jìn)行了介紹,并加入目前流行的注意力機(jī)制,增強(qiáng)模型的性能,設(shè)置實(shí)驗(yàn)進(jìn)行對(duì)比。
雖然LSTM 記憶能力較長(zhǎng),又不易發(fā)生梯度彌散現(xiàn)象,但因?yàn)長(zhǎng)STM 結(jié)構(gòu)較為復(fù)雜,計(jì)算代價(jià)成本較高。學(xué)者發(fā)現(xiàn),通過設(shè)置LSTM 中遺忘門的門控可以達(dá)到更好的效果。其中,GRU 就是其中之一,見圖1。
傳統(tǒng)的RNN 只能作用于同步的序列到序列模式。作為RNN 的變種,Seq2Seq 模型[7]被提出用于解決輸入和輸出序列不等長(zhǎng)的問題。Seq2Seq 模型包括編碼器和解碼器兩部分,編碼器用于編碼序列的信息,將任意長(zhǎng)度的序列信息編碼到一個(gè)向量c 里,而解碼器得到上下文信息向量c之后可以將信息解碼,并輸出為序列。
單獨(dú)的RNN 模型雖然可以得到翻譯結(jié)果,但由于在翻譯某個(gè)詞的時(shí)候沒有針對(duì)性,導(dǎo)致翻譯結(jié)果不準(zhǔn)確,尤其在句子較長(zhǎng)的時(shí)候,翻譯結(jié)果往往不理想。注意力機(jī)制[8]通過算法對(duì)生物注意力進(jìn)行模擬,在機(jī)器翻譯領(lǐng)域有較好的應(yīng)用[9-10]。它可以動(dòng)態(tài)調(diào)整特征的權(quán)重,改變不同特征對(duì)輸出的貢獻(xiàn)率,得到更好的預(yù)測(cè)結(jié)果。
模型Seq2Seq 包含了Encoder、Decoder 和中間狀態(tài)向量。具體來說,Encoder 通過讀取源序列來構(gòu)建一個(gè)向量,即處理后表示句子含義的數(shù)字向量,Decoder 對(duì)這個(gè)表示句子含義的數(shù)字向量進(jìn)行處理,產(chǎn)生一個(gè)輸出向量。
由于長(zhǎng)序列信息量較多,傳統(tǒng)的Encoder-Decoder 模型的效果欠佳。對(duì)此,可通過注意力機(jī)制,增加編碼器和解碼器的信息傳遞通道,解碼時(shí)會(huì)再次使用編碼階段GRU單元的每個(gè)輸出狀態(tài)。通過注意力機(jī)制,神經(jīng)機(jī)器翻譯能處理更長(zhǎng)的序列。引入注意力機(jī)制的Encoder-Decoder 模型,解碼時(shí),會(huì)分散部分注意力不同的單詞,而不會(huì)改變編碼階段模型。但除保留最終的隱藏層狀態(tài)向量外,還要保留每個(gè)單詞的輸出向量。
本文模型采用雙向GRU 加注意力機(jī)制的Encoder-Decoder 模型,使用spacy 分詞處理源序列的德文語(yǔ)句和目標(biāo)序列的英文語(yǔ)句。將文本轉(zhuǎn)化為詞語(yǔ)序列,使用了PyTorch 中embedding 函數(shù)將每個(gè)單詞轉(zhuǎn)換為256 維的詞向量,作為德文和英文嵌入層參數(shù)的初始值。
模型的構(gòu)建需要以此實(shí)現(xiàn)其嵌入層、編碼器、解碼器、softmax 損失層、參數(shù)梯度計(jì)算與優(yōu)化等。下面以Python3.6+PyTorch1.8.0 為例,給出了各部分的核心代碼,編碼器代碼如下。
Step1 進(jìn)行詞嵌入
Step2 送入到雙向GRU 網(wǎng)絡(luò)中進(jìn)行前向傳播,并接受返回結(jié)果
Step3 對(duì)隱藏層的輸出結(jié)果進(jìn)行一次全連接
在編碼器代碼步驟中,Step1 將每個(gè)句子的單詞使用256 維的一個(gè)向量來標(biāo)識(shí);在Step2 中,返回結(jié)果有兩個(gè),一個(gè)是每個(gè)句子對(duì)應(yīng)單詞的輸出,另一個(gè)是GRU 網(wǎng)絡(luò)針對(duì)每個(gè)句子的隱藏層結(jié)果;在Step3 中,因?yàn)樵诰幋a器中使用的是雙向網(wǎng)絡(luò),隱藏層狀態(tài)的維度和解碼器維度不同,所以要進(jìn)行一次全連接,將隱藏層的輸出結(jié)果的維度轉(zhuǎn)換為解碼器中隱藏層需要的維度。解碼器的代碼如下。
Step1 進(jìn)行詞嵌入
Step2 使用注意力機(jī)制計(jì)算編碼器輸出狀態(tài)的系數(shù)
Step3 使用Step2 中計(jì)算出的系數(shù)與編碼器輸出的狀態(tài)進(jìn)行加權(quán)相乘操作
Step4 將Step3 得到的匯總狀態(tài)和第一步中得到的詞向量進(jìn)行連接,得到最終送入GRU 網(wǎng)絡(luò)的輸入值
Step5 將連接好的數(shù)據(jù)送入GRU 網(wǎng)絡(luò)
Step6 全連接層得到預(yù)測(cè)結(jié)果
在解碼器代碼中,Step1 將每個(gè)句子的單詞使用256維的一個(gè)向量來標(biāo)識(shí);在Step5 時(shí),隱藏層狀態(tài)使用編碼器最后一次輸出的狀態(tài),然后進(jìn)行計(jì)算,并接受網(wǎng)絡(luò)計(jì)算結(jié)果,包括網(wǎng)絡(luò)輸出值和下一次解碼器隱藏層輸出狀態(tài)值;在Step6 中,將編碼器匯總的輸出狀態(tài)值、當(dāng)前的詞向量值和解碼器GRU 網(wǎng)絡(luò)輸出的狀態(tài)值進(jìn)行連接,送入全連接層,得到當(dāng)前解碼器層預(yù)測(cè)的結(jié)果值,并返回。損失計(jì)算與優(yōu)化訓(xùn)練代碼如下。
for epoch in range(N_EPOCHS):
for i,batch in enumerate(iterator):
Step1 當(dāng)前批次中獲取源句子和翻譯后的句子
Step2 使用編碼器對(duì)源句子進(jìn)行前向傳遞
for t in range(1,max_len):
Step3 對(duì)翻譯后句子的每個(gè)單詞調(diào)用解碼器進(jìn)行前向傳遞,并接受預(yù)測(cè)結(jié)果
Step4 使用交叉熵?fù)p失函數(shù)計(jì)算預(yù)測(cè)值和翻譯句子目標(biāo)值之間的誤差
Step5 依據(jù)計(jì)算的誤差,進(jìn)行反向傳播并更新梯度操作
在以上代碼中,Step3 在解碼器的測(cè)試階段,以貪心算法每一步輸出概率最大的詞作為最終結(jié)果;但在訓(xùn)練階段,由于有真實(shí)標(biāo)簽值作為金標(biāo)準(zhǔn),比貪心算法得到的結(jié)果更為準(zhǔn)確,所以在解碼器的訓(xùn)練階段,每一步輸出以真實(shí)結(jié)果和貪心算法各0.5 的概率得到最終進(jìn)入下個(gè)隱藏層的輸入值。以下為注意力層代碼。
Step1 擴(kuò)展隱藏層狀態(tài)值維度,并對(duì)句子長(zhǎng)度進(jìn)行復(fù)制
Step2 將隱藏層狀態(tài)值,和編碼器輸出的狀態(tài)值進(jìn)行相連
Step3 將上一步得到的數(shù)據(jù)送入兩個(gè)全連接層
Step4 對(duì)得到的編碼器狀態(tài)值的系數(shù)進(jìn)行一次softmax 操作然后輸出
在以上代碼中,Step2 中,第1 個(gè)全連接層隱藏層神經(jīng)元個(gè)數(shù)為解碼器隱藏層個(gè)數(shù),第2 個(gè)全連接隱藏層個(gè)數(shù)為1,這樣計(jì)算每個(gè)編碼器輸出狀態(tài)值的系數(shù)。
在訓(xùn)練網(wǎng)絡(luò)時(shí),本文采取最小驗(yàn)證誤差法,使訓(xùn)練與驗(yàn)證交替進(jìn)行來防止網(wǎng)絡(luò)的過擬合現(xiàn)象。當(dāng)網(wǎng)絡(luò)開始進(jìn)入過擬合時(shí),訓(xùn)練誤差會(huì)繼續(xù)下降,而驗(yàn)證誤差則會(huì)呈上升趨勢(shì)。對(duì)此,保存驗(yàn)證誤差取最小值時(shí)的網(wǎng)絡(luò)參數(shù)作為最終的訓(xùn)練結(jié)果,以保證網(wǎng)絡(luò)性能。
本文使用Python3.6 和PyTorch1.8.0 進(jìn)行模型構(gòu)建,模型在CPU Intel Core i5 機(jī)器上進(jìn)行訓(xùn)練。實(shí)驗(yàn)選取了機(jī)器翻譯中經(jīng)常使用的torchtext 自帶的標(biāo)準(zhǔn)數(shù)據(jù)集Multi30k德英文翻譯數(shù)據(jù)集作為實(shí)驗(yàn)數(shù)據(jù),其中包含了2.9萬條德英文翻譯(平均長(zhǎng)度約13 個(gè)單詞),使用spycy創(chuàng)建分詞器,將一個(gè)句子轉(zhuǎn)換為組成該句子的單個(gè)符號(hào)。實(shí)驗(yàn)運(yùn)用Multi30k德英文翻譯數(shù)據(jù)集的訓(xùn)練集進(jìn)行訓(xùn)練,并在校驗(yàn)集上對(duì)模型進(jìn)行選擇,選擇最優(yōu)的模型對(duì)測(cè)試集進(jìn)行測(cè)試,并匯報(bào)測(cè)試結(jié)果。實(shí)驗(yàn)采用BLEU 指標(biāo)值作為評(píng)價(jià)指標(biāo)。
本文使用的Seq2Seq 模型中,編碼器選擇單層雙向GRU 網(wǎng)絡(luò),解碼器選擇單層GRU 網(wǎng)絡(luò),并在運(yùn)行過程中,分別比較使用和不使用注意力機(jī)制。模型其他參數(shù)如下:隱藏層的維度為512,設(shè)置詞嵌入層維度為256,訓(xùn)練一共使用3 000 個(gè)句子對(duì),每一批訓(xùn)練128 個(gè),訓(xùn)練輪數(shù)設(shè)定為50 次(為了節(jié)省時(shí)間,僅以10%的句子進(jìn)行訓(xùn)練:GRU 模型的單輪訓(xùn)練時(shí)間約為20 min,加入注意力機(jī)制后,訓(xùn)練一輪約為50 min)。為防止模型計(jì)算中出現(xiàn)過擬合現(xiàn)象,在訓(xùn)練的過程中還引入dropout 策略,其值設(shè)定為0.5。
分別使用雙向GRU 和RNN,并對(duì)比使用和不使用注意力機(jī)制后,不同條件下的模型損失函數(shù)曲線見圖2,評(píng)估指標(biāo)BLEU 見圖3。
從上圖可以看出,在不使用注意力機(jī)制的情況下,使用GRU 網(wǎng)絡(luò)和RNN 網(wǎng)絡(luò)相比,在最初的EPOCH 訓(xùn)練中,損失函數(shù)收斂速度基本一致,但是當(dāng)在往后進(jìn)行訓(xùn)練的時(shí)候,使用GRU 網(wǎng)絡(luò)的損失函數(shù)收斂速度明顯加快。同時(shí),從圖3 中可以看出,BLEU 的指標(biāo)也要明顯高于RNN 網(wǎng)絡(luò),說明在Seq2Seq 模型中,使用GRU 網(wǎng)絡(luò)的效果要優(yōu)于使用RNN網(wǎng)絡(luò),這是因?yàn)镚RU 網(wǎng)絡(luò)可以避免梯度消失的問題,特別對(duì)較長(zhǎng)的翻譯。
對(duì)比使用注意力機(jī)制和不使用注意力機(jī)制可以看出,無論是GRU 網(wǎng)絡(luò)還是RNN 網(wǎng)絡(luò),在引入注意力機(jī)制后,模型的效果都得到了很大提高,損失函數(shù)收斂的速度更快,BLEU 的指標(biāo)更高,這是因?yàn)樽⒁饬C(jī)制解決了傳統(tǒng)編碼器解碼器模型的一些傳統(tǒng)缺陷。在模型上,解碼器利用了更多編碼器的結(jié)果,在翻譯的過程中,利用了全部編碼器的輸出結(jié)果,并對(duì)這些結(jié)果依據(jù)一定的機(jī)制賦予一定的權(quán)重,使得在對(duì)單詞進(jìn)行翻譯的時(shí)候,可以有選擇地從源句子中選擇某些更重要的單詞進(jìn)行翻譯。這些就是注意力機(jī)制能大幅提高翻譯系統(tǒng)性能的主要原因[11]。從圖中還可以看出,在同時(shí)引入注意力機(jī)制的情況下,GRU 網(wǎng)絡(luò)依然優(yōu)于RNN 網(wǎng)絡(luò)的效果。
綜合上面的實(shí)驗(yàn)結(jié)果可以看出,在Seq2Seq 模型中,GRU 網(wǎng)絡(luò)由于可以有效解決梯度消失問題,其性能要好于RNN 網(wǎng)絡(luò)。在Seq2Seq 模型中,引入注意力機(jī)制,可以大幅度提升翻譯系統(tǒng)的性能。
隨著互聯(lián)網(wǎng)的高速發(fā)展,機(jī)器翻譯成為當(dāng)前的研究熱點(diǎn)。本文將注意力機(jī)制和雙向GRU 應(yīng)用到Seq2Seq 模型中,并通過實(shí)驗(yàn)驗(yàn)證其對(duì)提高機(jī)器翻譯性能的有效性,克服了傳統(tǒng)Seq2Seq 模型無法解決長(zhǎng)距離依賴的問題,并加入注意力機(jī)制,增加翻譯的準(zhǔn)確度,損失函數(shù)收斂加快,BLEU性能有較大提高。今后,會(huì)進(jìn)一步加大訓(xùn)練的信息量,對(duì)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)做更深層次的優(yōu)化,并結(jié)合更開闊的方法,實(shí)現(xiàn)對(duì)翻譯效果的更高要求。