LSTM/ BPTT / GRU / Attention / Transform / Bert


LSTM

LSTM結構示意

LSTM有兩個傳輸狀態,一個 \(c^t\)(cell state),和一個 \(h^t\)(hidden state)

\(c^t\)保存模型的長期記憶,在訓練過程中改變的速度較慢, 而\(h^t\)在訓練過程中變化的速度則比較快。

計算過程

首先使用LSTM的當前輸入\(x_t\)和上一個狀態傳遞下來的\(h_{t-1}\)拼接計算得到四個中間變量:

\(z = tanh(W\cdot[h_{t-1},x_t] + b)\)
\(z^i = \sigma(W_i\cdot[h_{t-1},x_t] + b_i)\)
\(z^f = \sigma(W_f\cdot[h_{t-1},x_t] + b_f)\)
\(z^o = \sigma(W_o\cdot[h_{t-1},x_t] + b_o)\)

這里的\(i,f,o\)分別代表input gate, foget gate, output gate。運算符\([a,b]\)表示把a和b拼接成一個大的矩陣。

接下來:

LSTM計算過程

上圖中 \(\bigodot\) 代表Hadamard Product,也就是操作矩陣中對應的元素相乘。 運算符 \(+\) 表示矩陣加法。

首先,\(z^f\)作為遺忘門控,篩選上一個\(c^{t-1}\)中哪些內容需要遺忘。

接着,\(z^i\)作為輸入門控,對模型輸入\(z\) 中的內容進行篩選,然后把篩選后的結果合並到\(c^t\)中。

最后,使用 \(tanh()\)\(c^t\)進行放縮,然后經輸出門控\(z^o\)過濾,再通過一個全鏈接layer,得到模型輸出。

peephole connections

在原本\([h_{t-1},x_t]\)拼接的基礎上,再拼上cell state,即:

peephole計算示意

這樣使得各個門結構可以看到cell state中的信息,在某些場景下提高了模型訓練效果

BPTT

BPTT算法本質還是BP算法,BP算法本質還是梯度下降法,那么求各個參數的梯度便成了此算法的核心。

以RNN為例:

圖片.png-90kB

這里的\(E\)代表損失函數,\(\hat y\)代表模型預測值,\(y\)代表測試樣本提供的真實值

左欄第二個公式表示:模型最后輸出的損失等於之前每一個時間片的損失之和

左欄第三個公式開始展開推導,右欄第一行中的\(s\)代表隱層輸出,右欄第二行中的\(U\)\(W\)分別代表輸入權重和隱層權重

圖片.png-75.9kB

之后就是不斷地運用鏈式法則展開計算,最終得到權重更新公式。

從上面的權重更新公式中,我們會發現里面有非常多的連乘。那么這就會帶來一個很大的問題:梯度彌散 / 梯度消失. 這也意味着像DNN一樣,隨着層次增多,它的訓練效率會急劇降低。為了解決梯度消失,於是乎就有LSTM;梯度爆炸 需要用另外的技術(比如梯度裁剪)來處理。

GRU

由於LSTM的參數過多,所以其訓練難度相對較大。因此,我們往往會使用效果和LSTM相當但參數更少的GRU來構建大訓練量的模型。

GRU的輸入同樣是隱藏層\(h^{t-1}\)和樣本輸入\(x^t\),把他們拼接(兩個列向量拼成一個更長的列向量)后通過sigmoid函數獲得中間變量:

\(r = \sigma (W^r \cdot [h^{t-1}, x^t])\)
\(z = \sigma (W^z \cdot [h^{t-1}, x^t])\)

這里的\(r\)reset gate變量,\(z\)update gate變量

圖片.png-96.5kB

接下來,用reset gate重置隱藏層:\(h^{{t-1}'} = h^{t-1} \odot r\)
再將\(h^{{t-1}'}\)與輸入\(x^t\)拼接,通過一個全連接層得到:\(h' = \tanh (W\cdot [x^t, h^{{t-1}'}])\)

這一步類似LSTM中的'選擇記憶'階段,下一步是'更新記憶':

\(h^t = (1-z)\odot h^{t-1} + z\odot h'\)

上式中:

  • \((1-z)\odot h^{t-1}\)表示對原本隱藏狀態的選擇性“遺忘”。這里的\((1-z)\)可以想象成遺忘門(forget gate),忘記\(h^{t-1}\)維度中一些不重要的信息。
  • \(z\odot h'\)表示對包含當前節點信息的\(h'\)進行選擇性”記憶“。
  • 這里的遺忘\(z\)和選擇\((1-z)\)是聯動的。也就是說,對於傳遞進來的維度信息,我們會進行選擇性遺忘。針對遺忘的權重程度(\(z\)),我們會使用包含當前輸入的\(h'\)中所對應的權重進行彌補\((1-z)\)。以保持一種”恆定“狀態。

所以GRU只使用了一個門控\(z\)就實現了同時的選擇遺忘和選擇記憶(LSTM則要使用多個門控)

雙向RNN

論文:Bidirectional recurrent neural networks

u=199233699,1108022898&fm=173&app=49&f=JPEG.jpg-17.8kB

由於模型在理解句子時,常常需要完整的句子信息(既包含輸入詞前面的內容,也包含輸入詞后面的內容),因此雙向RNN誕生了。

雙向RNN有兩種類型的連接,一種是向前的,這有助於我們從之前的表示中進行學習,另一種是向后的,這有助於我們從未來的表示中進行學習。

正向傳播分三步完成:

  • 我們從左向右移動,從初始時間步驟開始計算值,一直持續到到達最終時間步驟為止;
  • 接我們從右向左移動,從最后一個時間步驟開始計算值,一直持續到到達最終時間步驟為止;
  • 最后我們根據剛才算得的兩個方向的\(h_t\),來計算模型的最終輸出

v3deg9eg79.png-169.9kB

這里的分號代表把兩個向量連接在一起

vkkonaid8r.png-217.4kB

Attention

由淺入深的科普:https://easyai.tech/ai-definition/attention/

論文:Attention Is All You Need

CS224n 從機器翻譯到Attention 這個從45:28開始看


基於RNN的機器翻譯模型存在一個問題,就是模型在翻譯時依賴於輸入序列最后傳遞的隱藏層參數(如下圖中的\(h_4\)),如果前面輸入的句子是個長句,則模型在翻譯時很容易遺忘前面輸入的句子。

15573329-25bdb43b18fbd18f.png-52.6kB

Attention機制讓模型在翻譯時可以讀到輸入序列的所有隱藏層狀態(\(h_1,h_2,h_3,h_4\))並且自由地選擇哪些是它需要關注的東西,因此在一定程度上解決了上述問題。

360截圖175711226567100.png-265.2kB

因此,我們可以說,attention機制使得翻譯系統可以利用更多的上下文信息(數據也證明了這一點,因為帶有attention的模型在長句的翻譯上表現得更加出色)

360截圖175711188610784.png-422.8kB

self-attention機制可以理解為一個新的layer,它和RNN一樣,輸入一個sequence,輸出一個sequence:

微信截圖_20200509085829.png-236kB

它出自谷歌2017年發布的paper:Attention Is All You Need

那么它具體是怎么工作的呢?

微信截圖_20200509090621.png-299.7kB

首先,\([x^1, x^2, ..., x^n]\)是一串輸入序列,對於每一個\(x^i\),我們讓它通過一個全鏈接層得到embedding:\(a^i\),也就是\(a^i = Wx^i\), 接下來,讓\(a^i\)分別乘以三個不同的矩陣\(W^q\), \(W^k\), \(W^v\)得到\(q^i\), \(k^i\), \(v^i\)三個不同的向量,它們分別代表query, key和information to be extracted

接下來,拿每一個\(q\)對每一個\(v\)做attention,以\(q^1\)為例:

微信截圖_20200509092324.png-227.7kB

這里展示的\(a_{1,i}=q^1\cdot k^i/\sqrt{d}\)只是一種attention的做法(Scaled Dot-Product Attention),除此之外,還有很多種計算Attention的方法,包括:

scores.png-39.1kB

它們有一個共同的特征:都是吃兩個向量,然后輸出一個值,代表由這兩個向量計算出的得分

接下來,讓得到的\([a_{1,1},...,a_{1,n}]\)通過一個softmax layer,得到\([\hat{a}_{1,1},...,\hat{a}_{1,n}]\):

微信截圖_20200509093214.png-202.6kB

然后,我們把\(\hat{a}_{1,i}\)和每一個\(v^i\)相乘,並把結果累加起來,得到\(b^1 = \sum_i a_{1,i}v^i\):

微信截圖_20200509093828.png-202.5kB

以此類推,得到的\([b^1, b^2,..,b^n]\)就是self-attention的輸出序列了。與一般的RNN不同的是,模型輸出的每一個\(b^i\)都考慮了從輸入序列\([x^1, x^2,...,x^n]\)中獲取的全部信息。

讓我們用矩陣乘法總結一下整個過程:

微信截圖_20200509103140.png-199.6kB

首先,輸入序列通過一個全鏈接層轉換成embedding I, 然后分別乘上三個不同的矩陣\(W^q,W^k,W^v\)得到矩陣\(Q, K, V\),接着對矩陣\(K\)\(Q\)進行運算得到Attention,並對Attention中的每一列進行softmax得到\(\hat{A}\),最后,用\(V\)\(\hat{A}\)相乘,得到輸出序列\(O\)

Multi-head attention

attenion有一個變體叫Multi-head,它與原版本主要的差異就是針對每一個q,k,v,算法會讓它們再乘上n個不同的矩陣得到\([q_1,q_2,...,q_n]\)\([k_1,k_2,...,k_n]\)\([v_1,v_2,...,v_n]\),它們分別進行attention運算,得到\([b_1,b_2,...,b_n]\),最后我們可以對\([b_1,b_2,...,b_n]\)進行降維(比如再加一個全鏈接層),得到輸出序列\(B\)

微信截圖_20200509104304.png-177.3kB

微信截圖_20200509104744.png-182.1kB

Multi-head的好處

  • 不同的head將關注不同的特征,類似CNN中的多個kernel

Transformer

關於Transformer,這篇文章(https://www.cnblogs.com/ylHe/p/10193166.html)講的非常好

Transformer就是引入attention機制的seq2seq模型:

微信截圖_20200509112717.png-334.1kB

在Encoder中,我們先把輸入序列轉化成embedding,然后加上positional encoding(關於這個向量的具體意義,可參考李宏毅-Transformer[27:59-33:47]中的介紹)

接着,執行Multi-Head Attention,接着把Attention Layer的輸入\(a\)和輸出\(b\)相加,得到\({b}'\),再對\({b}'\)做一個Layey Norm,然后再通過Feed Forward然后再做Add&Norm,把這整個過程重復N次,最終得到Encoder的輸出結果

在Decoder中,我們使用了Masked Multi-Head Attention,這里的解釋是:

訓練的時候我們知道全部真實label,但是預測時是不知道的。可以首先設置一個開始符s,然后把其他label的位置設為pad,然后對這個序列y做masked attention,因為其他位置設為了pad,所以attention只會用到第一個開始符s,然后用masked attention的第一個輸出做為query和編碼層的輸出做普通attention,得到第一個預測的label y,然后把預測出的label加入到初始序列y中的相應位置,然后再做masked attention,這時第二個位置就不再是pad,那么attention層就會用到第二個位置的信息,依此循環,最后得到所有的預測label y。其實這樣做也是為了模擬傳統attention的解碼層(當前位置只能用到前面位置的信息)。

Bert

  • 什么是Bert?
    • BERT的全稱是Bidirectional Encoder Representation from Transformers,是Google2018年提出的預訓練模型,即雙向Transformer的Encoder
  • Bert最大的創新是什么?
    • 模型的主要創新點都在pre-train方法上,即用了Masked LM(MLM)和Next Sentence Prediction(NSP)兩種方法分別捕捉詞語和句子級別的representation
  • Bert的使用方式?
    • 一般采用兩階段模式:首先是語言模型預訓練;然后是使用Fine-Tuning模式解決下游任務。

微信截圖_20200509144905.png-297.8kB

Bert的模型架構就是Transformers,它抽取的embedding就是Encoder的輸出。

Bert通過兩個任務進行訓練:1. Masked LM,2. Next Sentence Prediction

Masked LM是指:在句子中隨機挑選15%的詞匯,然后把Encoder對這些詞得到的embedding輸給一個線性分類器,判斷這個分類器的預測准確率。這意味着,只有當bert抽取出的embedding足夠好時,線性分類器才能有較高的分類准確率:

微信截圖_20200509145737.png-134.3kB

Next Sentence Prediction是指:預測兩個句子是否是前后相鄰的。在這個任務中需要引入兩個特殊符號,一個是:[SEP],它代表兩個句子的分界;另一個是[CLS],它代表之后的兩個句子需要進行Next Sentence Prediction預測:

微信截圖_20200509152126.png-160.5kB

這兩個任務將同時進行訓練


參考:

  1. Attention原理和源碼解析
  2. 李宏毅 seq2seq
  3. 李宏毅 transformer
  4. 李宏毅 bert/elmo/gpt
  5. Bidirectional RNN (BRNN)
  6. 人人都能看懂的LSTM
  7. 人人都能看懂的GRU
  8. 理解LSTM(通俗易懂版)
  9. Self Attention需要掌握的基本原理
  10. RNN/LSTM/GRU/seq2seq公式推導
  11. 循環神經網絡(二)-極其詳細的推導BPTT


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM