研究動機
變分自編碼器(Variational Auto-Ecnoders, VAEs)在自然語言處理的很多工中都有應用。VAEs 的標的函式包括兩項:1)重建項;2)KL 正則項。這兩項可以用一個權重繫數 beta 來調節平衡,通常情況下 beta 設定為常數 1。
當 VAEs 用到自然語言處理時,它的解碼器 decoder 通常由一個自回歸模型(auto-regressive model)實現。然而這樣往往會導致訓練過程中出現一個糟心的難題:KL 正則項會消失趨近 0。在實踐中,這意味著學習到的特徵將不再能夠表達觀測到的資料。本文的目的是希望能夠找到一種策略去解決 KL 消失問題。
研究方法
本文提出一種只需要在訓練過程中動態調節 beta 就能緩和 KL 消失的策略:Cyclical Annealing Schedule。它週期性地調節 beta ,在每一個週期內有兩個階段:1)beta 值從 0 增加 1;2)併在 beta=1 的時候訓練 VAEs。以此多次重覆這個週期 M 次(註意是多次)。
舉個例子:下圖的黑線就是 M=4 個週期,註意,當 M=1 時,我們就回歸了以前的單調增加 beta 的方法,如下圖的紅線。
實驗結果
兩方面:1)我們可以透過視覺化學習到的特徵來洞察不同方法在訓練中的表現,發現週期性調節 beta 可以循序漸進地讓結果變好;2)我們在三個自然語言處理的任務上驗證了演演算法的有效性,包括語言建模,對話生成,無監督特徵學習。
創新點
1. 我們首先提出兩條資訊流惡性競爭去產生資料(two-path competition)的觀點去闡釋 KL 消失的問題。
2. 根據這個理論,我們可以解釋為什麼前面的固定或者調整 beta 的方法會有各自所對應的現象。在此基礎上,我們提出一種簡單重覆週期性調整 beta 的策略去或者 KL 消失問題 。
3. 請註意,我們的方法並沒有增加額外計算量,在實踐中很容易去實用,或者其它改變模型的方法去結合。比如,可以透過呼叫下麵的函式來實現本文的 beta 策略:
def frange_cycle_linear(n_iter, start=0.0, stop=1.0, n_cycle=4, ratio=0.5):
L = np.ones(n_iter) * stop
period = n_iter/n_cycle
step = (stop-start)/(period*ratio) # linear schedule
for c in range(n_cycle):
v, i = start, 0
while v <= stop and (int(i+c*period) L[int(i+c*period)] = v
v += step
i += 1
return L
個人點評
先貼程式碼和部落格連結:
Code:
https://github.com/haofuml/cyclical_annealing
MSR Blog:
Less pain, more gain: A simple method for VAE training with less of that KL-vanishing agony
個人覺得兩點比較有意思:1)對於 KL 消失的做出了的兩條資訊流競爭的闡釋;2)演演算法簡單,易用,有效。希望大家能從本文能有所收穫,做出更加有效的方法。
朋友會在“發現-看一看”看到你“在看”的內容