机器学习笔记 RNN初探 LSTM
1 引入
一個input的屬性 會受到其前后文的影響——>神經網絡需要記憶
這里“Taipei”的屬性(destination還是source)受到前面的動詞“arrive”和“leave”的影響。所以為了更好地預測"Taipei",神經網絡必須記住前面的動詞時arrive還是leave。
2 圖示RNN
每一次隱藏層的輸出將被保存起來,作為下一時間片的另外一個輸入。
2.1 實例
假設圖上所有的箭頭表示的運算都是求和運算。一開始我們沒有歷史記憶,隱藏層狀態為0。那么隱藏層的兩個輸出都是1+1=2(這個2被儲存起來),然后輸出層的輸出都是2+2=4。
我們將此時的input(1,1)和上一時刻的隱藏層輸出(2,2)一起作為本輪的輸入,那么隱藏層狀態分別為2+2+1+1=6(存起來),輸出的內容為6+6=12
之后的同理。RNN的輸出結果和順序有關,順序不同,最終的output也會不同
RNN相當于同樣的一個network,被不斷地使用。隱藏層狀態h在各個時間片內傳遞。
2.2 RNN計算圖
?2.2.1 many to many
2.2.2? many to one
只有最有一個有輸出
?
?2.2.3 one to many
只有第一個輸入是x+hidden state,之后的都是只有hidden state作為輸入
?2.2.4 seq2seq
many to one + one to many
2.3 RNN的優劣
2.3.1 優勢
- 可以處理任意長度的input
- 模型參數的大小不會隨著input尺寸而增加
- 時刻t的計算可以使用很多時間片之前的信息
2.3.2 劣勢
- 計算較慢
- 無法并行操作
- 很難處理很多很多步之前的信息
2.4 RNN language model的訓練
2.4.1 損失函數
比如我們對每個時間步t,計算輸出分布
?我們用交叉熵來計算損失函數‘
(因為實際的是one-hot 編碼,所以只會有ground truth的的預測概率)
整個訓練集的損失函數是整體平均:
2.4.2? 語言模型的perplexity?
?
?2.4.3?圖示
?
?
?
?
?但是,如果sequence很長的話,我們計算整個預料的loss是很昂貴的,所以在實際問題中,我們一般固定一個大小的sequence length(類似于mini-batch SGD)
2.5 RNN的反向傳播(BPTT)
?這里是因為RNN中參數共享,所以鏈式法則中的一項為1(紫色框起來的部分),可以去掉?
3?word2vector
3.1?one hot encoding
由于詞匯很多,所以我們需要一個表示“other”這一層意思的one hot encoding。
3.2 n-gram
將每個單詞分為多個小的連續塊,如果單詞里面出現了這個連續塊,對應的這一位設置為1。
上面這個例子為3-gram,就是因為apple里面出現了"app","ppl","ple",所以這三個3-gram對應的位為1,其他的為0。
那么這樣就只需要一個26^3的一維向量,比one-hot節省空間。
4 Elman Network & Jordan Network
二者的區別在于,傳遞給下一時間片的memory是隱藏層還是輸出層的output。
5 Bidirectional RNN
兩個方向隱藏層的信息合并起來,喂給下一個時間片,然后得到輸出。
雙向 RNN 僅適用于可以訪問整個輸入序列的情況。 它們不適用于語言建模,因為未來的單詞不可訪問。
6 RNN Gradient Flow
?我們看一下,如果要反向傳播的話,誤差是一個什么樣的流向
但如果RNN對應的這個W矩陣設置不當的話,可能會出現梯度爆炸/梯度消失的問題:?
對于梯度爆炸的情況,我們可以設置一個梯度的上界:
而對于梯度消失,我們則需要改變RNN的結構了(模型并沒有看到足夠的信息,并沒有充分學習數據的特征)
?下面的LSTM,就是一種改進:
7 LSTM
lstm有四個輸入(神經網絡的輸入,輸入門信號,遺忘門信號,輸出門信號)
注:LSTM不能保證它一定沒有梯度下降/梯度消失,但是它確實提供了一個更好地學習長距離關聯性的方法
7.1 原理
z是神經網絡的輸入,zi是輸入門信號(z經過線性變換而來)。zi通過激活函數(比如sigmoid)得到一個0~1的值f(zi),表示我們的輸入信號保留多少比例g(z)*f(zi)
同理,zf是遺忘門的信號,他表示我們的memory保留的比例c*f(zf)
將這一輪的輸入和之前的memory加總:c'=g(z)*f(zi)+c*f(zf)
對c'進行一層線性變換,得到h(c')
zo是輸出門,控制我們輸出的比例
7.2 舉例
假設參數【weight+bias】已經學習完畢
1,先考慮第一個輸入(3,1,0,1)[最后一個對應的是wx+b的b]。因為輸入和三個門的權重已經有了,我們就通過權重計算各個門的比例,得到輸入門和遺忘門為1,輸出們為0。又輸入為3,所以按下圖方式更新權重:
然后是(4,1,0,1)
(2,0,0,1),此時輸入門關閉,那么記憶部分本輪不更新。
(1,0,1,1),此時輸出門打開,記憶存儲的7被輸出
(3,-1,0,1)
7.3 幾點補充
李宏毅教授之后的可見又補充了一些細節
7.3.1 傳遞狀態
????????相比RNN只有一個傳遞狀態 ?,LSTM有兩個傳輸狀態,一個??(cell state),和一個??(hidden state)。(Tips:RNN中的??對于LSTM中的??)
????????其中對于傳遞下去的改變得很慢,通常輸出的??是上一個狀態傳過來的??加上一些數值。
?????????而則在不同節點下往往會有很大的區別。?
7.3.2 門信號的處理
使用LSTM的當前輸入和上一個狀態傳遞下來的??拼接,然后得到三個門信號+輸入信號z
8 RNN的缺陷
8.1 RNN不太容易訓練
8.2?rnn的loss function會很曲折
假設圖中最右方的橙色點表示初始值,由于剛開始error surface比較flat,gradient也比較小,learning rate比較大;經過多次的訓練后,如果這時候剛好到達懸崖和平原的交接處,這一次的gradient就超級大,再加上之前很大的learning rate,loss可能就會直接‘飛’出去了。
改進措施是clipping,當gradient大于15的時候,就看做是15,不再繼續增加,這時gradient的移動方向就是上圖中的藍色虛線部分,就不會再飛出去了,仍然可以繼續做RNN training。
8.2.1 可能的原因?
8.2.2 解決方案
LSTM可以把一些很平坦的地方拿掉,使error surface不再有那么平坦的地方;可以解決gradient vanishing問題,但并不能解決gradient exploding的問題,有的地方還是會特別崎嶇,因此在使用LSTM時,需要設置很小的learning rate。
LSTM可以解決gradient vanishing的原因:如果forget gate是打開的狀態,一旦weight可以影響memory里面的值,這個影響就會永遠存在,每次都會有新的東西加進來,不會被直接覆蓋掉,除非forget gate打算把memory cell的值忘掉;但RNN是直接覆蓋,前面的影響就消失了。(換句話說,RNN是直接把本輪hidden_layer的輸出作為memory的,但是LSTM在此基礎上,還融合了之前的memory,相當于一個“慣性”)
9 RNN應用
9.1 情感分析?sentiment analysis
輸入一些vector組成的sequence,輸出情感。
這個sequence最后一個vector的隱藏層接上輸出,因為這時候整個句子都看到了。
9.2?語音識別 speech recognition
給一段語音,每隔一段時間采一個樣,辨識它聽到的聲音。
9.3?機器翻譯 machine translation
首先先讀入這個完整的sequence,然后讀完sequence之后,輸出第一個翻譯的word“機”。
根據上一個時間點的memory和上一個時間點的輸出“機”,RNN就可以學習到輸出為“器”。
如果不停止的話,rnn可能會一直生成下去,因此要加入一個“斷“字,停止生成。
9.4?attention-based model
首先機器會讀取一堆sequence,作為它的memory。
然后我們輸入一些東西(比如一句問句什么的),input經過一些神經網路后,生成一個reading head controller,告訴我們應該去machine memory的哪里尋找到我們的答案,我們把reading head對應的memory提取出來,再經過神經網路,生成output。
機器閱讀理解machine reading comprehension就是這個原理。
當然可以多次生成reading head controller,提取多次信息。
藍色表示每一個hop,我們reading head controller指向的是誰。
總結
以上是生活随笔為你收集整理的机器学习笔记 RNN初探 LSTM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用pytorch实现简易RNN
- 下一篇: 文巾解题 523. 连续的子数组和