主要內(nèi)容
上節(jié)學(xué)習(xí)了語(yǔ)言模型和循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)。這一節(jié)主要討論RNN存在的問(wèn)題及其改進(jìn)方法,并介紹更多復(fù)雜的RNN變體。
梯度問(wèn)題梯度消失梯度爆炸梯度剪裁LSTMGRURNN變體雙向RNN多層RNN梯度補(bǔ)充梯度向量化梯度推廣:雅可比矩陣鏈?zhǔn)椒▌t重要等式下節(jié)預(yù)告閱讀更多
梯度問(wèn)題
梯度消失
梯度消失
根據(jù)鏈?zhǔn)椒▌t:
梯度可以分解成若干中間梯度的乘積。現(xiàn)在的問(wèn)題是,如果,,這三項(xiàng)數(shù)值量級(jí)都很小,那么反向傳播越遠(yuǎn),則梯度信號(hào)越弱!這就是梯度消失問(wèn)題!
形式化表述:
由于:
所以:
考慮第i步損失,對(duì)之前的某步j(luò)的隱層狀態(tài)求梯度。表示如下:
考慮矩陣的L2范數(shù):
這里的關(guān)鍵是矩陣。Pascanu等人證明,如果的最大特征值小于1,經(jīng)過(guò)多次自乘后,梯度會(huì)表現(xiàn)出指數(shù)級(jí)縮小。由于使用sigmoid非線性激活函數(shù),上界恰好是1,所以會(huì)出現(xiàn)梯度消失。
如果梯度隨距離明顯減弱,則無(wú)法判斷t步和t+n步數(shù)據(jù)之間的依賴關(guān)系。
舉例:
When she tried to print her tickets, she found that the printer was out of toner. She went to the stationery store to buy more toner. It was very overpriced. After installing the toner into the printer, she finally printed her__
RNN語(yǔ)言模型需要學(xué)習(xí)第7步"tickets"和末尾"tickets"之間的依賴關(guān)系。但如果梯度過(guò)小,則模型無(wú)法學(xué)習(xí)這種依賴關(guān)系,進(jìn)而在測(cè)試時(shí)也無(wú)法預(yù)測(cè)長(zhǎng)距離的依賴關(guān)系。
再來(lái)看一個(gè)例子:
The writer of the books __
現(xiàn)在有兩個(gè)選項(xiàng):(is) (are)。正確的應(yīng)該是is。語(yǔ)義上,"is"和"writer"的距離更近;但順序上,"are"和"books"的距離更近。由于梯度消失的問(wèn)題,RNN語(yǔ)言模型更善于學(xué)習(xí)順序距離近的關(guān)系,這可能導(dǎo)致學(xué)習(xí)錯(cuò)誤,從而導(dǎo)致預(yù)測(cè)錯(cuò)誤。
梯度爆炸
同梯度消失相對(duì)的是梯度爆炸,這是由于矩陣最大特征值>1。如果梯度過(guò)大,則會(huì)導(dǎo)致SGD更新過(guò)大:這不利于參數(shù)調(diào)整(損失較大)。
在極端情況下,如果步長(zhǎng)過(guò)大,還會(huì)導(dǎo)致訓(xùn)練中出現(xiàn)Inf或NaN。
梯度剪裁
梯度爆炸的解決辦法是,如果梯度范數(shù)超過(guò)某個(gè)閾值,則進(jìn)行縮小,然后再SGD更新。相當(dāng)于,方向不變,調(diào)小步子。
梯度剪裁示意
LSTM
RNN的主要問(wèn)題是無(wú)法學(xué)會(huì)保存很多時(shí)間步前的信息。
1997年Hochreiter和Schmidhuber提出Long Short-Term Memory(LSTM),這也是一種RNN,用以解決梯度消失的問(wèn)題。
與RNN只有一種狀態(tài)相比,LSTM在第t步,共有兩種狀態(tài):hidden state 和 cell state ?
兩者都是n維向量
cell用于存儲(chǔ)長(zhǎng)距離信息,亦稱為記憶單元
LSTM可以擦除、寫入和讀取 cell信息
信息的擦/寫/讀由相應(yīng)的門進(jìn)行控制
gate也是n維向量
每一步t,gate各個(gè)元素可以是open(1), closed(0),或二者之間。如果門打開(kāi),則表示信息通過(guò);如果門關(guān)閉,則表示信息不能通過(guò)
gate是動(dòng)態(tài)的,其值根據(jù)當(dāng)前語(yǔ)境計(jì)算
現(xiàn)根據(jù)t步輸入,計(jì)算hidden state 和 cell state ?:
遺忘門:決定保留或忘記之前cell state的哪些內(nèi)容
輸入門:決定當(dāng)前cell的哪些內(nèi)容寫入cell
輸出門:決定當(dāng)前cell的哪些內(nèi)容輸出到hidden state
新cell內(nèi)容:要寫入cell的新內(nèi)容
cell state:擦掉(忘記)上個(gè)cell state的部分內(nèi)容,寫入(輸入)新cell內(nèi)容
hidden state:讀取(輸出)cell的某些內(nèi)容
具體如下圖所示:
LSTM cell
LSTM結(jié)構(gòu)讓RNN更容易保存很多步以前的信息
LSTM并不保證不出現(xiàn)梯度消失/梯度爆炸
LSTM實(shí)際上是非常成功的
2013-2015年,LSTM取得了一流的效果
手寫識(shí)別、語(yǔ)音識(shí)別、機(jī)器翻譯、句法分析、看圖說(shuō)話
LSTM由于效果好,成為主流方法
2019年,在某些領(lǐng)域,其他方法(如Transformer)成為了主流方法
WMT 2016,總結(jié)報(bào)告出現(xiàn)RNN 44次
WMT 2018,總結(jié)報(bào)告出現(xiàn) RNN 9次,Transformer 63次。
GRU
2014年Cho 等人提出GRU(Gated Recurrent Units),在保留LSTM優(yōu)點(diǎn)的同時(shí),去除其不必要的繁雜。在每一步t,只有輸入和hidden state ,沒(méi)有cell state:
update gate:決定更新hidden state的哪些部分內(nèi)容,相當(dāng)于LSTM中的遺忘門和輸入門。
reset gate:決定前一hidden state哪些部分用于計(jì)算新hidden state的內(nèi)容
新hidden state內(nèi)容:reset gate選擇前一hidden state的有用信息,并輸入新的hidden state
hidden state:綜合了前一hidden state和當(dāng)前hidden state的內(nèi)容,并在兩者之間尋找平衡點(diǎn)
和LSTM一樣,GRU也更容易保存長(zhǎng)期信息。
除此之外,研究人員提出了很多門控RNN,但LSTM和GRU使用最為廣泛。
LSTM和GRU的最大區(qū)別是,后者計(jì)算速度更快,參數(shù)更少。但并沒(méi)有嚴(yán)格證據(jù)表明孰優(yōu)孰劣。所以在實(shí)踐中,可以先使用LSTM,然后再試試GRU。
RNN變體
梯度爆炸/消失不僅僅是RNN存在的問(wèn)題。由于鏈?zhǔn)椒▌t和非線性激活函數(shù),所有神經(jīng)網(wǎng)絡(luò)(包括前向和卷積神經(jīng)網(wǎng)絡(luò)),尤其是深度神經(jīng)網(wǎng)絡(luò),都會(huì)出現(xiàn)梯度消失/爆炸問(wèn)題。這導(dǎo)致低層網(wǎng)絡(luò)訓(xùn)練非常緩慢。那么解決辦法就是在神經(jīng)網(wǎng)絡(luò)之間添加直接連接,使梯度傳播更順暢。
例如:
殘差連接,亦稱ResNet。它直接將輸入信息原封不動(dòng)地加在其他隱層上。
殘差網(wǎng)絡(luò)構(gòu)件
稠密連接,亦稱DenseNet,把所有層都連接起來(lái)。效果更好。
稠密連接:每一層以之前所有層feature-maps為輸入
高速連接,亦稱HighwayNet,類似于殘差連接,但identity連接和transformation層由動(dòng)態(tài)門控制
結(jié)論:雖然梯度消失/爆炸是個(gè)普遍存在的問(wèn)題,但由于相同矩陣連續(xù)相乘導(dǎo)致RNN尤其不穩(wěn)定。
雙向RNN
在情緒分類任務(wù)中,假如輸入是某個(gè)影評(píng),我們希望了解是好評(píng)還是差評(píng)。一般可以使用簡(jiǎn)單RNN進(jìn)行情緒分類。RNN可以編碼句子。RNN的隱層狀態(tài)就是句子表示。
下圖藍(lán)色方框的隱藏狀態(tài)可以看作詞"terribly"的語(yǔ)境表示。
情緒分析任務(wù)
但是這些語(yǔ)境表示僅僅考慮了詞的左側(cè)語(yǔ)境。很明顯,"terribly"右側(cè)的"exciting"修改了"terribly"的詞義,將整個(gè)句子的負(fù)面情緒扭轉(zhuǎn)為正面情緒。右側(cè)語(yǔ)境同樣重要!這導(dǎo)致了雙向RNN的出現(xiàn)。
雙向RNN由兩個(gè)RNN組成:正向RNN和反向RNN。反向RNN和正向RNN一樣,只不過(guò)它從右到左開(kāi)始編碼。在隱層狀態(tài),則將兩個(gè)RNN輸出進(jìn)行拼接。
雙向RNN
在第t步:
正向RNN:
反向RNN:
隱層狀態(tài)拼接:
通常正向RNN和反向RNN權(quán)重不同。
下面是雙向RNN簡(jiǎn)化圖。
雙向RNN簡(jiǎn)化圖
注意:只有當(dāng)輸入序列完整時(shí),才適用雙向RNN。例如語(yǔ)言模型就不能使用雙向RNN,因?yàn)樵谡Z(yǔ)言模型中,只能使用左側(cè)語(yǔ)境。
最近很火的BERT(BidirectionalEncoder Representations from Transformers)就使用了雙向信息。后面還會(huì)談到BERT。
多層RNN
雖然RNN展開(kāi)后在一個(gè)維度已經(jīng)很深了,我們還可以在另外一個(gè)維度增加深度,這就是多層RNN。
多層RNN可以實(shí)現(xiàn)更加復(fù)雜的表示。低層RNN計(jì)算低層特征;高層RNN計(jì)算高層特征。
多層RNN
在實(shí)踐中,高性能RNN通常都是多層RNN(但一般達(dá)不到前向網(wǎng)絡(luò)或卷積網(wǎng)絡(luò)的深度)。
例如,在2017年的論文中,Britz 等人發(fā)現(xiàn),在神經(jīng)機(jī)器翻譯中,encoder RNN 最好使用2-4層,decoder RNN 最好使用4層。要訓(xùn)練更深的RNN,則需要跨層連接或稠密連接。
基于Transformer的神經(jīng)網(wǎng)絡(luò)(如BERT)則高達(dá)24層。
總結(jié):
LSTM效果很好,GRU速度很快
梯度剪裁可以避免NaN
如果有完整信息,盡量使用雙向RNN
如果有計(jì)算資源,盡量使用多層RNN,層數(shù)過(guò)多時(shí),則需要跨層/稠密連接。
梯度補(bǔ)充
以下作為CS224N-2019-3的補(bǔ)充。梯度計(jì)算是神經(jīng)網(wǎng)絡(luò)訓(xùn)練的核心。逐個(gè)推導(dǎo)神經(jīng)網(wǎng)絡(luò)各個(gè)參數(shù)的梯度冗長(zhǎng)復(fù)雜,因此有必要使用矩陣/向量形式進(jìn)行計(jì)算。
梯度向量化
給定1個(gè)輸出和n個(gè)輸入的函數(shù):其梯度就是每個(gè)輸入的偏導(dǎo)的向量:
梯度推廣:雅可比矩陣
給定m個(gè)輸出和n個(gè)輸入的函數(shù):其偏導(dǎo)數(shù)就是mxn矩陣,即雅可比梯度矩陣。:
其中單個(gè)元素就是普通的標(biāo)量梯度:雅可比矩陣非常有用。
鏈?zhǔn)椒▌t
一元函數(shù):導(dǎo)數(shù)相乘
多元函數(shù):雅可比矩陣相乘
重要等式
矩陣乘以列向量,對(duì)列向量求梯度(,?)
行向量乘以矩陣,對(duì)行向量求梯度(,?)
對(duì)向量本身求梯度
(,?)使用鏈?zhǔn)椒▌t時(shí),該項(xiàng)會(huì)消掉,因?yàn)榫仃嚮蛳蛄砍艘詥挝痪仃?,還是原矩陣或向量。
對(duì)向量各個(gè)元素施加同一函數(shù)后,對(duì)向量求梯度
(,?)
矩陣乘以列向量,對(duì)矩陣求梯度(,,?)
行向量乘以矩陣,對(duì)矩陣求梯度(,,?)
交叉熵?fù)p失,對(duì)logits求梯度
(,,?)
這些等式可用于快速計(jì)算很多神經(jīng)網(wǎng)絡(luò)的梯度。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4734瀏覽量
100420 -
梯度
+關(guān)注
關(guān)注
0文章
30瀏覽量
10302 -
rnn
+關(guān)注
關(guān)注
0文章
76瀏覽量
6868
原文標(biāo)題:梯度消失和神奇RNN(CS224N-2019-7)
文章出處:【微信號(hào):gh_b11486d178ef,微信公眾號(hào):語(yǔ)言和智能】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論