神經翻譯筆記4擴展b. RNN的正則化方法

神經翻譯筆記4擴展b. RNN的正則化方法

本系列筆記前文介紹了若干神經網絡常用的泛化方法,本文將延續這一話題,介紹若干適用於RNN的泛化/正則化方法

層歸一化

[Ba2016]認爲批歸一化(BN)雖然原理簡潔能有效提升收斂速度,但是很難適用於RNN上。因爲RNN的輸入是變長的,因此需要對不同的時間步保存不同的統計量。但是對序列到序列任務,很難保證測試時句子會有多長,因此分時間步保存統計量不是一個好的選擇。此外,實驗證明當每個小批量樣本的數據量太小時,BN的效果不好,而訓練RNN時基本都是使用小批量樣本(這段存疑)。基於以上考量,該文章提出了層歸一化的方法,核心思想是在統計量裏不使用跟每批樣本個數相關的信息,只考慮隱藏單元的個數。具體說,對神經網絡的第ll層,假設該層共有HH個隱藏節點,輸入是hl\boldsymbol{h}^l,激活前經線性變換Wl\boldsymbol{W}^l得到的向量是al\boldsymbol{a}^l,該層第ii個隱藏節點的的輸入權重是wil\boldsymbol{w}_i^l(因此ail=wilThla_i^l = {\boldsymbol{w}_i^l}^\mathsf{T}\boldsymbol{h}^l),則層歸一化使用的統計量爲
μl=1Hi=1Hailσl=1Hi=1H(ailμl)2 \begin{aligned} \mu^l &= \frac{1}{H}\sum_{i=1}^H a_i^l \\ \sigma^l &= \sqrt{\frac{1}{H}\sum_{i=1}^H\left(a_i^l - \mu^l\right)^2} \end{aligned}
可見各統計量與樣本個數完全無關,因此對每次只處理一條樣本的情況(例如在線學習)也適用。使用層歸一化後RNN隱藏單元的計算如下所示
a(t)=Ux(t)+Wh(t1)μ(t)=1Hi=1Hai(t)σ(t)=1Hi=1H(ai(t)μ(t))2h(t)=tanh[γσt(a(t)μ(t))+β] \begin{aligned} \boldsymbol{a}^{(t)} &= \boldsymbol{U}\boldsymbol{x}^{(t)} + \boldsymbol{W}\boldsymbol{h}^{(t-1)} \\ \mu^{(t)} &= \frac{1}{H}\sum_{i=1}^H a_i^{(t)} \\ \sigma^{(t)} &= \sqrt{\frac{1}{H}\sum_{i=1}^H\left(a_i^{(t)} - \mu^{(t)}\right)^2} \\ \boldsymbol{h}^{(t)} &= \tanh\left[\frac{\boldsymbol{\gamma}}{\sigma^t}\odot\left(\boldsymbol{a}^{(t)}-\mu^{(t)}\right)+\boldsymbol{\beta}\right] \\ \end{aligned}

下圖比較直觀地解釋了批歸一化與層歸一化的區別。圖自(Weight Normalization and Layer Normalization Explained (Normalization in Deep Learning Part 2)
批歸一化與層歸一化的區別

層歸一化被提出背後的直覺是,由於RNN通常使用ReLU做激活函數,而ReLU的取值範圍爲[0,+)[0, +\infty),因此前一層的某個神經元可能產生特別大的值。爲了避免這種情況產生的共變量偏移(covariance shift,批歸一化首先提出來的概念),可以對神經元的結果做歸一化,避免很大值的出現,進而穩定訓練過程。原文還說明了層歸一化同時具有權重不變性(整個權重矩陣乘以某個係數再偏移以後,對結果沒有影響——這個證明過程我沒太看懂),以及數據不變性(輸入乘以某個係數再偏移,對結果沒有影響)。根據stats stackexchange的回答,這使得網絡可以1. 對權重的初始化不敏感,2. 對異常的數據不敏感

在批歸一化被NeurIPS2018的兩篇文章重新分析以後,時隔一年,層歸一化也被[XuJingjing2019]做了進一步討論。文章通過實驗提出瞭如下觀點

  • 層歸一化中的係數γ\boldsymbol{\gamma}和偏置項β\boldsymbol{\beta}作用不大,在各benchmark任務上,扔掉這兩項對結果影響不大,在英語-越南語翻譯上甚至有正面影響。文章認爲帶上這兩個參數甚至會提高模型過擬合的風險,因爲“這些統計數據從訓練集得來,忽略了測試集的輸入分佈”(但是這個結論本文持保留意見)
  • 在上一步的基礎上,文章將各維度(神經元)的期望和方差從可學習的參數修改爲一個變量,使正向傳播邏輯不變,但是反向傳播不攜帶這兩者的梯度(這樣的歸一化稱爲DetachNorm)。實驗表明DetachNorm的效果比原始層歸一化(實際上是不帶係數和偏置的層歸一化)要差。這說明LN起作用的不是前向歸一化,而是統計量的導數:均值的導數將反向傳播的梯度的期望重新置爲0,而方差的導數則縮小了梯度的方差,即這兩項對梯度也有歸一化的作用。前向計算的歸一化和反向傳播梯度的歸一化一起使得層歸一化更加有效

對dropout的擴展

在RNN出現的早期,人們使用的結構通常都比較小,因爲實踐中發現大的RNN比較容易過擬合。Dropout問世以後不久,[Zaremba2014]對其進行了修改並加在了RNN上,取得了不錯的效果。該工作認爲,如果將dropout加在RNN的狀態傳遞(從上一個時間步傳到下一個時間步的連接),會影響網絡的記憶力,因此只將dropout加在了RNN各層的輸入-輸出上

之後,[Gal2015]指出[Zaremba2014]的做法並不能從根本上解決過擬合問題,並使用變分推斷提出了一種新的dropout方法——變分dropout(variational dropout)。該方法的核心思路包括如下兩點

  • 對RNN,輸入、輸出和狀態傳遞在各個時間步使用相同的dropout
  • 如果輸入是離散的(例如單詞),則對詞向量也做dropout,這使得模型不會依賴於某個單詞。例如"the dog and the cat"如果dropout “the”對應的詞向量,實際上就變成了"__ dog and __ cat"

更具體地,以LSTM爲例,使用之前神經翻譯筆記4擴展a第一部分. RNN在TF1.x中的實現方法略覽中各個門計算方式緊湊形式的記法,並略去偏置項和激活函數,原始計算方式爲

[i(t)c~(t)f(t)o(t)]=σ([x(t)h(t1)][UiUcUfUoWiWcWfWo]) \left[\begin{matrix}\boldsymbol{i}^{(t)} & \tilde{\boldsymbol{c}}^{(t)} & \boldsymbol{f}^{(t)} & \boldsymbol{o}^{(t)}\end{matrix}\right] = \sigma\left(\left[\begin{matrix}\boldsymbol{x}^{(t)} & \boldsymbol{h}^{(t-1)}\end{matrix}\right] \cdot \left[\begin{matrix}\boldsymbol{U}_i & \boldsymbol{U}_c & \boldsymbol{U}_f & \boldsymbol{U}_o \\ \boldsymbol{W}_i & \boldsymbol{W}_c & \boldsymbol{W}_f & \boldsymbol{W}_o \end{matrix}\right] \right)

引入變分dropout則變爲
[i(t)c~(t)f(t)o(t)]=σ([x(t)zxh(t1)zh][UiUcUfUoWiWcWfWo]) \left[\begin{matrix}\boldsymbol{i}^{(t)} & \tilde{\boldsymbol{c}}^{(t)} & \boldsymbol{f}^{(t)} & \boldsymbol{o}^{(t)}\end{matrix}\right] = \sigma\left(\left[\begin{matrix}\boldsymbol{x}^{(t)} \circ \boldsymbol{z}_x & \boldsymbol{h}^{(t-1)} \circ \boldsymbol{z}_h \end{matrix}\right] \cdot \left[\begin{matrix}\boldsymbol{U}_i & \boldsymbol{U}_c & \boldsymbol{U}_f & \boldsymbol{U}_o \\ \boldsymbol{W}_i & \boldsymbol{W}_c & \boldsymbol{W}_f & \boldsymbol{W}_o \end{matrix}\right] \right)

其中zx\boldsymbol{z}_xzh\boldsymbol{z}_h是兩個dropout mask矩陣,不隨時間步的變化而變化

目前,大部分框架都使用了變分dropout來作爲RNN dropout的實現

(變分dropout的理論推導比較複雜,這裏就不記錄了)

[Krueger2016]提出了另一種dropout的變種zoneout。與dropout隨機丟棄神經元不同,zoneout是隨機將某個神經元的激活值替換爲其前一個時間步神經元的激活值(ht=ht1h_t = h_{t-1})。這種方案可以保留前面時間步的狀態,因此更適合於RNN。對於LSTM,注意其向下一個時間步傳遞的是兩個值ctc_thth_t,對應地,zoneout通常對兩者分別使用不同的mask

集大成的方法:AWD-LSTM

正則WD-LSTM[Merity2017]自提出以後在Penn Treebank和WikiText-2這兩個數據集上長期處於"霸榜"的狀態(直到GPT-2出現之前)。其主要貢獻是爲基於LSTM的RNN提供了一套組合的z化方法,以及一種新的優化方法

正則化方法

不同形式的dropout

對RNN做正則化的一個常見方向是在其循環連接上做文章。前人的工作通常是針對傳遞進來的隱藏狀態ht1\boldsymbol{h}_{t-1},例如在時間步之間加入dropout,或者對更新ct\boldsymbol{c}_t的操作做dropout。這種做法破壞了RNN的黑盒性,可能導致底層做的一些針對硬件的優化無效。文章採取了一種DropConnect方法,在隱層和隱層之間傳遞的權重矩陣[Wc,Wi,Wf,Wo][\boldsymbol{W}_c, \boldsymbol{W}_i, \boldsymbol{W}_f, \boldsymbol{W}_o]上加dropout。由於多個時間步共享這四個權重,因此在整個正向和反向傳播過程中被丟棄掉的權重都相同,結果就有點像變分dropout了。當然DropConnect也可以用在[Ui,Uf,Uo][\boldsymbol{U}_i, \boldsymbol{U}_f, \boldsymbol{U}_o]上,但是本文的目的還是防止循環連接用的參數過擬合

對其它權重矩陣,文章使用了變分dropout來做正則化,以保證每個矩陣在不同時間步被掩蓋掉的部分都相同。不過這裏沒有把一個dropout掩碼矩陣從頭用到尾,而是每一小批數據使用相同的掩碼。此外,對嵌入矩陣,文章也加入了dropout,丟棄概率爲pep_e,因此剩下的詞向量值要乘11pe\frac{1}{1-p_e}倍。詞嵌入端加入dropout,如前所述,相當於在這一次正向和反向傳播中這個詞所有本該出現的地方都被抹去了,也就等價於在獨熱嵌入和embedding lookup之間的連接加變分dropout

變長的反向傳播

當RNN的時間步比較多時,BPTT需要很大的計算量。因此對於比較長的文本序列,通常方法是將其截斷成若干節,把每一節看作是單獨的一批數據。正向傳播時,每節最後一個數據產生的隱藏狀態會傳給下一節數據,作爲下一節數據的初始狀態;但是反向傳播時,每一節最後一個時間步的節點不會收到後面數據傳來的梯度更新。這種做法稱作"被截斷的反向傳播" (Truncated BPTT),是訓練語言模型常用的手段之一

這種做法存在的最大問題是總有一部分元素不會收到隱藏層後續節點傳進來的梯度更新。假設BPTT的窗口長度爲nn,那麼有1n\frac{1}{n}的元素不會被後續節點更新,對於語言模型問題,其只能收到輸出層傳回的梯度。另外n2n\frac{n-2}{n}的元素只能收到1,,n21, \cdots, n-2個元素的梯度,效率比較低

文章的對策是隨機選取BPTT的序列長度,採用如下策略:首先設計一個"基序列長度",記爲bptt\rm bptt,以概率pp將其設計爲seq\rm seq,以概率1p1-p設計爲seq2\frac{\rm seq}{2},其中pp是一個接近1的值。然後,每個batch都根據正態分佈N(bptt,s)\mathcal{N}({\rm bptt}, s)採樣一個實際使用的BPTT窗口長度len\rm len (這裏ss是一個超參數,默認爲5)。對應地,每個batch也會根據len\rm len的值動態調整學習率
γ=γlenseq \gamma' = \gamma \cdot \frac{\rm len}{\rm seq}
這是因爲對於短序列來說,損失值在每個時間步上分攤的值更大。如果將每個時間步對應的標記符看做是一個樣本(當然這樣可能不是很科學),那麼根據[Goyal2017],對大批量的數據,訓練時需要增大學習率。也就是對長序列學習率應該更大。(對此的一個解釋可參考如何評價Facebook Training ImageNet in 1 Hour這篇論文? - 廉相如的回答 - 知乎)

嵌入共享

嵌入共享 (原文weight typing) 是將輸入詞嵌入矩陣和softmax層矩陣共享的技術。這種方案可以降低模型參數數量,而且[Inan2016]證明這種方法可以提高模型效果

嵌入維度與隱藏層維度分離

本文使用的另一個方案是減小詞向量維度,同時不再將隱藏層維度與詞向量維度綁定,而是單獨設置

激活單元正則化與時序激活單元正則化

L2正則化除了可以用來約束權重,也可以用在每個獨立的激活單元上,或者用在RNN不同時間步的輸出之間的差值上。這兩種策略分別稱爲"激活單元的正則化" (activation regularization, AR)和"時序激活單元的正則化" (temporal activation regularization, TAR)

AR對那些顯著大於0的激活值施加懲罰,以此達到正則化網絡的目的。具體定義爲
α2(mht) \alpha \ell_2(m \odot \boldsymbol{h}_t)
其中mm是dropout掩碼,2()=2\ell_2(\cdot) = \|\cdot\|_2ht\boldsymbol{h}_t是RNN在時刻tt的輸出,α\alpha是縮放因子

TAR則是懲罰模型讓其不要在隱藏狀態發生突變。使用上面相似的記號,TAR定義爲
β2(htht+1) \beta \ell_2(\boldsymbol{h}_t - \boldsymbol{h}_{t+1})
AR和TAR都只對RNN最後一層的輸出使用

優化方法

深度網絡的優化問題可以抽象爲
minW1Ni=1Nfi(W) \min_{\boldsymbol{W}}\frac{1}{N}\sum_{i=1}^Nf_i(\boldsymbol{W})
其中fif_i是第ii個數據點的損失函數,W\boldsymbol{W}是網絡權重,最小化的目標函數實際上就是損失值在整個數據集上的期望。常見的優化方法是SGD,形式爲
Wk+1=Wkγkf(Wk) \boldsymbol{W}_{k+1} = \boldsymbol{W}_k - \gamma_k \nabla f(\boldsymbol{W}_k)
理論證明其可以有線性收斂性,可避開鞍點,而且有更好的泛化性能。對神經語言模型來說,無動量的SGD比其它優化方法效果都要好。對SGD的一種改進策略是使用平均SGD (Averaged SGD, ASGD) 的方法,即對最後KT+1K-T+1個迭代得到的參數求平均,返回1KT+1i=TKWi\frac{1}{K-T+1}\sum_{i=T}^K \boldsymbol{W}_i。這種方法儘管有一些很好的理論性質 (例如收斂過程近似於使用二階導數的收斂過程),但是在實際應用中卻用得比較少,究其原因是人們還不太清楚該如何調優γk\gamma_k和觸發計算平均值的時刻TT:太早求均值會影響算法效果,太晚的話又需要很多步額外的迭代來收斂

本文的策略是使用了一種ASGD的變體,稱爲"非單調觸發的ASGD" (Non-monotonically Triggered variant of ASGD, NT-ASGD),免去了調優TT的過程,而且使用的是常量學習率,也不涉及學習率的動態調整

NT-ASGD算法原理

上圖給出了NT-ASGD的實現思路。論文采用的策略是將LL設爲每個epoch迭代的次數,n=5n = 5。因此在這樣的參數設置下,NT-ASGD的思想爲:每個epoch結束以後計算一次驗證集上的困惑度ppl,記爲vv。如果已經訓練了超過5個epoch,且此時vv不是最好的驗證集ppl,那麼就從這一時刻開始對之後迭代得到的所有參數求平均

從經驗上看,NT-ASGD需要比較大的batch size

其它技術與實驗

NT-ASGD還嘗試了使用神經緩存模型來改善語言模型的預測效果。實驗表明使用連續緩存指針後模型對罕見詞的預測效果有明顯提升,但是對常見詞的預測效果降低很多

文章還通過對比實驗的方法試圖找出引用進來的所有技術哪一種起的作用比較關鍵。實驗表明移除隱藏層之間傳遞的權重矩陣上DropConnect對模型效果影響最大。將嵌入矩陣的維度與隱藏層維度對齊不僅增大了參數數量,同時也降低了模型的效果 (增大約8個ppl點)。去掉嵌入層dropout、AR/TAR和權重遞減會增大約2-6個ppl點,如果使用定長的反向傳播也會增大約1個ppl點

參考文獻

[Ba2016] Lei Ba, J., Kiros, J. R., & Hinton, G. E. (2016). Layer normalization. arXiv preprint arXiv:1607.06450.
[XuJingjing2019] Xu, J., Sun, X., Zhang, Z., Zhao, G., & Lin, J. (2019). Understanding and Improving Layer Normalization. In Advances in Neural Information Processing Systems, (NeurIPS 2019) (pp. 4383-4393).
[Zaremba2014] Zaremba, W., Sutskever, I., & Vinyals, O. (2014). Recurrent neural network regularization. arXiv preprint arXiv:1409.2329.
[Gal2015] Gal, Y., & Ghahramani, Z. (2016). A theoretically grounded application of dropout in recurrent neural networks. In Advances in neural information processing systems (NeurIPS 2016) (pp. 1019-1027).
[Krueger2016] Krueger, D., Maharaj, T., Kramár, J., Pezeshki, M., Ballas, N., Ke, N. R., Goyal, A., Bengio, Y., Courville, A. & Pal, C. (2016). Zoneout: Regularizing rnns by randomly preserving hidden activations. arXiv preprint arXiv:1606.01305 (Accepted by ICLR 2017).
[Merity2017] Merity, S., Keskar, N. S., & Socher, R. (2017). Regularizing and optimizing LSTM language models. In Proceedings of the Sixth International Conference on Learning Representations, ICLR 2018.

[Wan2013] Wan, L., Zeiler, M., Zhang, S., Le Cun, Y., & Fergus, R. (2013, February). Regularization of neural networks using dropconnect. In International conference on machine learning, ICML 2013 (pp. 1058-1066).

[Goyal2017] Goyal, P., Dollár, P., Girshick, R., Noordhuis, P., Wesolowski, L., Kyrola, A., … & He, K. (2017). Accurate, large minibatch sgd: Training imagenet in 1 hour. arXiv preprint arXiv:1706.02677.

[Inan2016] Inan, H., Khosravi, K., & Socher, R. (2016). Tying word vectors and word classifiers: A loss framework for language modeling. In Proceedings of the Fifth International Conference on Learning Representations, ICLR 2017.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章