概括:RNN 適用於處理序列數據用於預測,但卻受到短時記憶的制約。LSTM 和 GRU 采用門結構來克服短時記憶的影響。門結構可以調節流經序列鏈的信息流。LSTM 和 GRU 被廣泛地應用到語音識別、語音合成和自然語言處理等。
1. RNN
RNN 會受到短時記憶的影響。如果一條序列足夠長,那它們將很難將信息從較早的時間步傳送到后面的時間步。 因此,如果你正在嘗試處理一段文本進行預測,RNN 可能從一開始就會遺漏重要信息。在反向傳播期間,RNN 會面臨梯度消失的問題。 梯度是用於更新神經網絡的權重值,消失的梯度問題是當梯度隨着時間的推移傳播時梯度下降,如果梯度值變得非常小,就不會繼續學習。
(1)圖中的 U W V三種權重參數是共享的;
(2)S_t = f(U*Xt + W*St-1),此處沒有寫b,有的地方還需要加一個b,f函數一般為tanh;
(3)Ot = softmax(V*St)
隨后就是帶入數據,更新權重。但這里有一個問題W與U使用bp更新時會有St-1的輸入於是乎就有了BPTT的更新算法
圖:RNN 的工作模式, 第一個詞被轉換成了機器可讀的向量,然后 RNN 逐個處理向量序列。
(1)逐一處理矢量序列 處理時,RNN 將先前隱藏狀態傳遞給序列的下一步。 而隱藏狀態充當了神經網絡記憶,它包含相關網絡之前所見過的數據的信息. |
![]() |
(2)計算隱藏狀態 首先,將輸入和先前隱藏狀態組合成向量, 該向量包含當前輸入和先前輸入的信息。 向量經過激活函數 tanh之后,輸出的是新的隱藏狀態或網絡記憶.
|
![]() |
激活函數 Tanh:激活函數 Tanh 用於幫助調節流經網絡的值。 tanh 函數將數值始終限制在 -1 和 1 之間. | ![]() |
BPTT算法(Back Propagation Through Time)
BPTT其實就是因為輸入變量為時間序列所以需要進行進一步的迭代。核心原理還是bp的鏈式法則。對w的推導:
最終就是我們的權重更新公式。
從上面的權重更新公式中,我們會發現里面有非常多的連乘。那么這就會帶來一個很大的問題:梯度彌散 / 梯度消失. 這也意味着像DNN一樣,隨着層次增多,它的訓練效率會急劇降低。為了解決梯度消失,於是乎就有LSTM;梯度爆炸 需要用另外的技術來處理,技術上相比梯度消失好解決,因此,很少有人大篇幅去論證這個問題。
2. LSTM
LSTM 和 GRU 是解決短時記憶問題的解決方案,它們具有稱為“門”的內部機制,可以調節信息流。
LSTM 的核心概念在於細胞狀態以及“門”結構。細胞狀態相當於信息傳輸的路徑,讓信息能在序列連中傳遞下去。你可以將其看作網絡的“記憶”。理論上講,細胞狀態能夠將序列處理過程中的相關信息一直傳遞下去。其實,LSTM 的記憶能力也沒有很高,好像也就 100 來個單詞的樣子。
門的激活函數:Sigmoid 門結構中包含着 sigmoid 激活函數。Sigmoid 激活函數與 tanh 函數類似,不同之處在於 sigmoid 是把值壓縮到 0~1 之間而不是 -1~1 之間。這樣的設置有助於更新或忘記信息,因為任何數乘以 0 都得 0,這部分信息就會剔除掉。同樣的,任何數乘以 1 都得到它本身,這部分信息就會完美地保存下來。這樣網絡就能了解哪些數據是需要遺忘,哪些數據是需要保存。 |
![]() |
LSTM 有三種類型的門結構:遺忘門、輸入門和輸出門 |
![]() |
遺忘門 遺忘門的功能是決定應丟棄或保留哪些信息。來自前一個隱藏狀態的信息和當前輸入的信息同時傳遞到 sigmoid 函數中去,輸出值介於 0 和 1 之間,越接近 0 意味着越應該丟棄,越接近 1 意味着越應該保留。 |
![]() |
輸入門 輸入門用於更新細胞狀態。首先將前一層隱藏狀態的信息和當前輸入的信息傳遞到 sigmoid 函數中去。將值調整到 0~1 之間來決定要更新哪些信息。0 表示不重要,1 表示重要。 其次還要將前一層隱藏狀態的信息和當前輸入的信息傳遞到 tanh 函數中去,創造一個新的侯選值向量。最后將 sigmoid 的輸出值與 tanh 的輸出值相乘,sigmoid 的輸出值將決定 tanh 的輸出值中哪些信息是重要且需要保留下來的。 |
![]() |
細胞狀態 下一步,就是計算細胞狀態。首先前一層的細胞狀態與遺忘向量逐點相乘。如果它乘以接近 0 的值,意味着在新的細胞狀態中,這些信息是需要丟棄掉的。然后再將該值與輸入門的輸出值逐點相加,將神經網絡發現的新信息更新到細胞狀態中去。至此,就得到了更新后的細胞狀態。 |
![]() |
輸出門 輸出門用來確定下一個隱藏狀態的值,隱藏狀態包含了先前輸入的信息。首先,我們將前一個隱藏狀態和當前輸入傳遞到 sigmoid 函數中,然后將新得到的細胞狀態傳遞給 tanh 函數。 最后將 tanh 的輸出與 sigmoid 的輸出相乘,以確定隱藏狀態應攜帶的信息。再將隱藏狀態作為當前細胞的輸出,把新的細胞狀態和新的隱藏狀態傳遞到下一個時間步長中去。 |
![]() |
具體公式:
下圖是Recurrent NN的結構圖
如果將每個時間步的網絡稱為A,並且每個網絡換成LSTM的gated cell,則得到以下兩個圖的LSTM結構。這里的LSTM cell指的是一層cells,即A;而不是MLP中的一個節點。
num_units指的是一層的output size(hidden size),可以不與xt的維度相等。因為LSTM cell
還會有一個非線性變換,即Wt的權重矩陣會變換input dim為output size,故權重矩陣使得在timestep t的x的dim變換為output hidden size。
LSTM的參數數量:以seq2seq的encoder-decoder結構的LSTM網絡為例
假設:encoder、decoder各只有一層LSTM
cell的units_num(hidden size)=1000
steps=2000
word embedding dim(x_dim)=500
vocab size=50000
(1)Embedding:word embedding dim*vocab size = 50,000*500=25M
(2)Encoder:(hidden size * (hidden size + x_dim) + hidden size) * 4 = (1000 * 1500 + 1000) * 4 = 8M (4組gate)
(hidden size + x_dim )這個即: ,這是LSTM的結構所決定的,注意這里跟time_step無關,
(3)Decoder:同encoder=8M
(4)output:Word embedding dim * Decoder output = Word embedding dim * Decoder hidden size = 50,000 * 1000 = 50M
所以總共有:25M + 8M + 8M + 50M = 91M
總結:
- 權重的計算與time_step無關,LSTM權值共享.
- (hidden size + x_dim )這個亦即:
,這是LSTM的結構所決定的,注意這里跟time_step無關
- 參數權重的數量,占大頭的還是vocab size與embedding dim 以及output hidden size.
- LSTM的參數是RNN 的 一層的4倍的數量。
3. GRU
兩個門:
(1)更新門
更新門的作用類似於 LSTM 中的遺忘門和輸入門。它決定了要忘記哪些信息以及哪些新信息需要被添加。
(2)重置門
重置門用於決定遺忘先前信息的程度。
GRU 的張量運算較少,因此它比 LSTM 的訓練更快一下。很難去判定這兩者到底誰更好,研究人員通常會兩者都試一下,然后選擇最合適的。
具體公式:
4. seq2seq
參考文獻:
【3】LSTM與GRU
【5】LSTM的參數問題?
【6】http://www.huaxiaozhuan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/chapters/6_RNN.html