RNN训练方法介绍-BPTT
生活随笔
收集整理的這篇文章主要介紹了
RNN训练方法介绍-BPTT
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
url:http://blog.csdn.net/sysstc/article/details/75333008
Training RNN——BPTT
由于RNN和時(shí)間序列有關(guān),因此我們不能通過(guò)Backpropagation來(lái)調(diào)參,我們使用的是Backpropagation through time(BPTT)
回顧Backpropagation
?
Backpropagation through Time(BPTT)
我們可以將RNN變成如下形式:?
參照之前的BP我們發(fā)現(xiàn),反向傳播其實(shí)就是一個(gè)梯度* 矩陣 * 激活函數(shù)的微分(放大器)。由于an-1和xn同時(shí)會(huì)影響到an,而an-1又會(huì)被an-2和xn-1影響,并且依次傳遞下去,a1的值會(huì)被x1和memory cell initial影響。因此,我們可以把RNN看成一個(gè)非常深的DNN,將input看成:Init,x1,x2,…,xn,output是yn,也就是如果n=100,那么就有100個(gè)hidden layer。
- 如何計(jì)算Cn這項(xiàng)的gradient呢?
BPTT同樣等于Backward pass + forward pass,forward pass 可以直接當(dāng)做是一個(gè)DNN來(lái)計(jì)算,而backward pass可以看成如下所示,通過(guò)一個(gè)hidden layer,就相當(dāng)于乘以一個(gè)個(gè)的放大器(activation function)?
如何更新參數(shù)呢,我們看到上面黃色的箭頭都是相同的weights,而上面藍(lán)色的箭頭也都是相同的weights。因此我們根據(jù)如下方式修改。?
- 如何計(jì)算所有的gradient呢?其實(shí)也是一個(gè)forward pass和一個(gè)backward pass?
RNN中train可能遇到的問(wèn)題
- DNN:gradient vanish是因?yàn)閎ackward pass時(shí),每經(jīng)過(guò)一層都要經(jīng)歷一個(gè)activation function的微分,那這時(shí)如果我們使用的activation function是sigmoid,由于sigmoid的微分最大值為1/4,那么error signal就會(huì)越來(lái)越小,最后可能會(huì)出現(xiàn)梯度消失的情況。我們之前提到的解決方式是將activation function由sigmoid改成relu。
- RNN:?
- 從一個(gè)小案例分析:參考下面圖,我們要計(jì)算gradient,下面是一個(gè)RNN,Input都是1,output都是1,hidden layer 里面就一個(gè)神經(jīng)元,這里我們將hidden layer設(shè)置為一個(gè)linear。那么由于是一個(gè)linear,是不是我們就不會(huì)出現(xiàn)gradient vanish的情況呢?答案是否定的:?
我們發(fā)現(xiàn)w的不同,yn變化忽大忽小。這樣就會(huì)變得非常難處理。就式子和函數(shù)圖像來(lái)分析原因:?
這種情況就造成我們?cè)谒鉭radient的時(shí)候,大多都是一些極端值。?
那么從這個(gè)角度來(lái)看我們發(fā)現(xiàn)如果你這時(shí)候?qū)ctivation function設(shè)置為sigmoid或tanh,這種微分值小于1的activation function,反而能在某種程度上保護(hù)rnn,而用relu則不會(huì)削減這些大爆炸的情況。所以在處理RNN的時(shí)候還是應(yīng)該采用tanh或者sigmoid - 從一般情況來(lái)分析,今天為了簡(jiǎn)化分析,我們將activation function都認(rèn)為是linear activation function,底下的error signal 沒(méi)有考慮activation function,如果error signal對(duì)應(yīng)到的Wn-1是小于1的話,那么值就會(huì)變得很小,如果error signal對(duì)應(yīng)到的Wn-1大于1的話,那么值就會(huì)變得很大。?
- 從一個(gè)小案例分析:參考下面圖,我們要計(jì)算gradient,下面是一個(gè)RNN,Input都是1,output都是1,hidden layer 里面就一個(gè)神經(jīng)元,這里我們將hidden layer設(shè)置為一個(gè)linear。那么由于是一個(gè)linear,是不是我們就不會(huì)出現(xiàn)gradient vanish的情況呢?答案是否定的:?
- Clipped Gradient:設(shè)置一個(gè)threshold,clip(x,min,max)
- NAG:Momentum進(jìn)化版。?
- Momentum是一個(gè)模范物體運(yùn)動(dòng)的方法,update方向取決于所在位置的Gradient的反方向+上次的movement,這樣就可能會(huì)照成數(shù)值波動(dòng)。
- NAG的update方向取決于從現(xiàn)在所在的位置沿著movement再走一步所在的Gradient的反方向+上一次的movement。這樣可能會(huì)避免產(chǎn)生震蕩的情形?
- RMSProp:Adagrad的進(jìn)化版?
- Adagrad:除去這個(gè)參數(shù)過(guò)去所有算出來(lái)的gradient的平方和再開(kāi)根號(hào)(即對(duì)二次微分的估算)。這樣就可以動(dòng)態(tài)調(diào)整learning rate
- RMSProp:?
過(guò)去的gradient會(huì)乘上α(0<α<1),那么越過(guò)去的gradient我們考慮的權(quán)重就會(huì)更小,這樣二次微分對(duì)同一個(gè)參數(shù)也會(huì)產(chǎn)生變化。?
LSTM解決Gradient vanishing problem
- LSTM的forward pass過(guò)程:?
- 只需要把data帶進(jìn)去就可以求每個(gè)neural的output
- LSTM的backward pass過(guò)程:?
- 遇到了一個(gè)”+”,我們可以把這個(gè)看成一個(gè)activation function。input:a/b,output:a+b,微分值為1。
- 遇到了一個(gè)”x”,我們也把這個(gè)看成一個(gè)activation function。input:a/b,output:axb,微分值為b/a,底下圖片上的點(diǎn)乘代表的是element-wise。?
?
如果我們今天從yt+1做bptt,假設(shè)forget gate是開(kāi)啟狀態(tài),那么我們發(fā)現(xiàn),從yt+1開(kāi)始的error signal在通過(guò)灰色matrix時(shí)會(huì)乘以一個(gè)W的transposition,在通過(guò)activation function時(shí)可能會(huì)乘以一個(gè)小于1的數(shù)字之外,error signal就是一路暢行無(wú)阻的,就會(huì)一路保持constant的error signal,這就是Constant Error Carrousel(CEC)。這樣error signal一路保持constant的值的好處有什么呢?如果今天你要update黃色箭頭里的element,那么因?yàn)榧t色箭頭不會(huì)隨時(shí)間衰減太多,所以藍(lán)色的值也不會(huì)太小,那么拿來(lái)update黃色箭頭的error signal不會(huì)太小。?
?
因此LSTM可以解決gradient vanish的問(wèn)題,但LSTM不能處理gradient explode的問(wèn)題因?yàn)閑rror signal不只走藍(lán)色的箭頭,還有可能走綠色的箭頭,綠色的箭頭再走到藍(lán)色箭頭的部分就會(huì)一直乘以一個(gè)W的transposition,如果W的transposition是小的則沒(méi)關(guān)系,因?yàn)閑rror signal是比較大的(之前提到過(guò),在error signal的流動(dòng)過(guò)程中它減小的很少)。但如果W的transposition是大的,這時(shí)候不斷的乘以W的transposition,值就會(huì)變得越來(lái)越大,就可能會(huì)導(dǎo)致gradient explode的情況。?
- 對(duì)于RNN,每一個(gè)step我們都會(huì)把hidden Layer的output寫到memory里面去,所以memory里面的值每次都會(huì)被完全修正,過(guò)去的東西其實(shí)一點(diǎn)都沒(méi)有存留下來(lái)。這就會(huì)導(dǎo)致當(dāng)你修改模型中某個(gè)參數(shù)的時(shí)候,可能會(huì)造成很大的變化,也有可能沒(méi)有變化。
- 對(duì)于LSTM,如果沒(méi)有forget gate,那么我們過(guò)去得memory都會(huì)保存下來(lái),因?yàn)槲覀冇玫氖恰?#43;”。如果我們的forget gate沒(méi)有被開(kāi)啟,那么這個(gè)memory就會(huì)永遠(yuǎn)的存在。這樣如果我們的memory都會(huì)一直留下來(lái),那么在修改某個(gè)參數(shù)時(shí)造成某個(gè)改變時(shí),這個(gè)改變就不會(huì)消失,這樣我們的gradient就不會(huì)消失,這樣就可以保證我們的gradient不會(huì)特別小。但無(wú)法保證gradient不會(huì)explode。
RNN的變形
Better Initialization
紅色的就是initialized with identity matrix+ReLU?
總結(jié):
在training RNN的時(shí)候可能會(huì)遇到Gradient vanish和Gradient explode的問(wèn)題。?
這里的解決方法:
- 設(shè)置一個(gè)threshold(min,max)
- 優(yōu)化技術(shù)?
- NAG
- RMSprop
- LSTM(或者其他變形)
- 更好的初始化,hidden layer之間的weight初始化用identity matrix,activation function用ReLU.
總結(jié)
以上是生活随笔為你收集整理的RNN训练方法介绍-BPTT的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 药学【7】
- 下一篇: 激光测距误差对激光脚点定位的影响