一、語言模型
語言模型計(jì)算特定序列中多個(gè)單詞的出現(xiàn)概率滩字。一個(gè) m 個(gè)單詞的序列 的概率定義為
漓藕。
傳統(tǒng)的語言模型為了簡化問題,引入了馬爾科夫假設(shè)栗竖,即句子的概率通常是通過待預(yù)測單詞之前長度為n的窗口建立條件概率來預(yù)測:
簡單來說就是每次考慮都當(dāng)前詞前面所有的詞的信息顯然對(duì)是很冗余的,因?yàn)殡x當(dāng)前詞越遠(yuǎn)的詞通常和當(dāng)前詞沒多少聯(lián)系了根资,那么就干脆我們就取離當(dāng)前詞最近的幾個(gè)詞的信息來替代當(dāng)前詞前面所有詞的信息玄帕。嗯委刘,人之常情,很好理解淆珊。
例如,考慮一種情況戳吝,有一篇文章是討論西班牙和法國的歷史,然后在文章的某個(gè)地方且警,你讀到一句話 “The two country went on a battle”;顯然杏头,這句話中提供的信息不足以確定文章所討論的兩個(gè)國家的名稱(法國和西班牙)。
二寓娩、循環(huán)神經(jīng)網(wǎng)絡(luò)
傳統(tǒng)的翻譯模型只能以有限窗口大小的前 n 個(gè)單詞作為條件進(jìn)行語言模型建模,循環(huán)神經(jīng)網(wǎng)絡(luò)與其不同焊夸,RNN 有能力以語料庫中所有前面的單詞為條件進(jìn)行語言模型建模。
下圖展示的 RNN 的架構(gòu)揪阶,其中矩形框是在一個(gè)時(shí)間步的一個(gè)隱藏層 :
如上圖所示:
RNNs包含輸入單元(Input units),輸入集標(biāo)記為{
},是含有 T 個(gè)單詞的語料庫對(duì)應(yīng)的詞向量
輸出單元(Output units)的輸出集標(biāo)記為{
}倦淀,是在每個(gè)時(shí)間步 t 全部單詞的概率分布輸出,用公式表示為
RNNs還包含隱藏單元(Hidden units)科展,{
},表示每個(gè)時(shí)間步 t 的隱藏層的輸出特征的計(jì)算關(guān)系,可以理解成RNN的記憶
準(zhǔn)確來講坞琴,RNN其實(shí)就是一個(gè)網(wǎng)絡(luò)的多次復(fù)用:
其中:
如果將每一個(gè)復(fù)用都展開的話:
RNN的一個(gè)實(shí)際小例子:
三、BPTT
其實(shí)從理解上RNN其實(shí)很好理解羞酗,畢竟很直觀胸竞,因?yàn)橄肽耀@前面所有的信息煎饼,所以每次都計(jì)算一個(gè)(這里使用網(wǎng)絡(luò)得到,但是其實(shí)最簡單的囊獲前面所有信息的方式就是累加沾乘,只是效果不好而已)。
但RNN麻煩的地方就在于它的求導(dǎo)滥崩,由于循環(huán)操作顽决,這就導(dǎo)致更新權(quán)值的時(shí)候會(huì)牽一發(fā)而動(dòng)全身慌烧。
如下圖的RNN:
首先寫出前向公式:
損失函數(shù):
其中:T是序列長度汹粤,在這里就是3(為了好理解,此次的推導(dǎo)會(huì)先按T=3進(jìn)行田晚,然后再推廣到一般)
3.1 對(duì)
的求導(dǎo)
對(duì)于 的求導(dǎo)顯然不難嘱兼,但是要注意的是,由于RNN是循環(huán)的網(wǎng)絡(luò)贤徒,所有導(dǎo)致每一個(gè)時(shí)刻的
都對(duì)
有關(guān)芹壕,所以求導(dǎo)會(huì)變成加和的形式:
矩陣求導(dǎo)的具體矩陣應(yīng)該怎么乘可以根據(jù)左右兩邊的維度來確定,如在上式中睁壁,由于 肯定是(output_num, hidden_num)維度,
是標(biāo)量對(duì)向量的求導(dǎo)备燃,不難得到其維度為(output_num, 1)更耻,那么剩下的
就只能是轉(zhuǎn)置的形式誉己。當(dāng)然疼阔,由于這里不涉及行向量對(duì)行向量求導(dǎo)或者列向量對(duì)列向量求導(dǎo)宾舅,所以可以用簡單的矩陣求導(dǎo)法則得到一樣的結(jié)果,但如果出現(xiàn)行向量對(duì)行向量求導(dǎo)或者列向量對(duì)列向量求導(dǎo)的情況勉吻,還是只能使用這樣的維度匹配踩娘。
3.2 對(duì)
的求導(dǎo)
對(duì)于 的求導(dǎo)就會(huì)變得更復(fù)雜一點(diǎn),因?yàn)椴粌H是
,隱藏層
之間也存在聯(lián)系毙驯。
先考慮最簡單的情況,當(dāng)我們對(duì)求導(dǎo)時(shí),由于沒有其他
和
的牽制,所以可以很簡單地寫出其表達(dá)式:
那么我們將情況拓展到 伍绳,由于
也與其有關(guān),所以最后可以寫出表達(dá)式:
如果我們將對(duì)求導(dǎo)時(shí)的情況帶入的話:
以此類推姿染,我們就可以得到當(dāng)t < 3時(shí)(或者說T時(shí))的通用表達(dá)式:
那么將其他的帶入通用形式變?yōu)椋?/p>
可以看到這里有一個(gè)階乘的項(xiàng)中鼠,這也就是導(dǎo)致RNN更容易產(chǎn)生梯度爆炸和消失的原因天吓。
求出 的通用形式之后,對(duì)
的求導(dǎo)就變得簡單了:
- 防止梯度爆炸:
一種暴力的方法是鹦蠕,當(dāng)梯度的長度大于某個(gè)閾值的時(shí)候冒签,將其縮放到某個(gè)閾值。雖然在數(shù)學(xué)上非常丑陋钟病,但實(shí)踐效果挺好萧恕。其直觀解釋是,在一個(gè)只有一個(gè)隱藏節(jié)點(diǎn)的網(wǎng)絡(luò)中肠阱,損失函數(shù)和權(quán)值w偏置b構(gòu)成error surface票唆,其中有一堵墻如下圖所示,每次迭代梯度本來是正常的屹徘,一次一小步走趋,但遇到這堵墻之后突然梯度爆炸到非常大,可能指向一個(gè)莫名其妙的地方(實(shí)線長箭頭)噪伊。但縮放之后簿煌,能夠把這種誤導(dǎo)控制在可接受的范圍內(nèi)(虛線短箭頭)。但這種trick無法推廣到梯度消失鉴吹,因?yàn)槟悴幌朐O(shè)置一個(gè)最低值硬性規(guī)定之前的單詞都相同重要地影響當(dāng)前單詞姨伟。
- 減緩梯度消失
- 不去隨機(jī)初始化
,而是初始化為單位矩陣
- 使用 Rectified Linear(ReLU)單元代替 sigmoid 函數(shù)豆励,ReLU 的導(dǎo)數(shù)是 0 或者 1夺荒。這樣梯度傳回神經(jīng)元的導(dǎo)數(shù)是 1,而不會(huì)在反向傳播了一定的時(shí)間步后梯度變小
3.3 對(duì)
的求導(dǎo)
同理,我們可以輕松地寫出:
到這里般堆,我們基本上完成了RNN的求導(dǎo)在孝,通過如下公式诚啃,便可以對(duì)RNN進(jìn)行訓(xùn)練:
四魔招、雙向RNN
這部分就不展開了,主要因?yàn)槔斫馍掀鋵?shí)不難,就是在原來從左到右進(jìn)行訓(xùn)練的基礎(chǔ)上,又加了一個(gè)從右到左的順序睛挚,整體原理和推導(dǎo)變化不大:
通過總結(jié)過去和未來詞表示來預(yù)測下一個(gè)詞的類別關(guān)系:
雖然看起來復(fù)雜猎唁,不過因?yàn)榇蟛糠謳於家呀?jīng)封裝了雙向的操作逐纬,所以日常使用還是很輕松的,而且推導(dǎo)上其實(shí)也和原來的一樣仪际,只是要求的東西變多了而已。
五纬凤、LSTM
LSTM的全稱是Long-Short-Term-Memories,其在原先RNN的基礎(chǔ)上引入了門機(jī)制:
可以看到一共有4個(gè)門:
Input Gate:我們看到在生成新的記憶之前恋技,新的記憶的生成階段不會(huì)檢查新單詞是否重要拇舀,這需要輸入門函數(shù)來做這個(gè)判斷。輸入門使用輸入單詞和過去的隱藏狀態(tài)來決定輸入值是否值得保留蜻底,從而決定該輸入值是否加入到新的記憶中
Forget Gate:這個(gè)門與輸入門類似骄崩,但是它不能決定輸入單詞是否有用,而是評(píng)估過去的記憶單元是否對(duì)當(dāng)前記憶單元的計(jì)算有用朱躺,因此刁赖,忘記門觀測輸入單詞和過去的隱藏狀態(tài)并生成
用來決定是否使用
New memory generation:生成新的記憶的階段。我們基本上是用輸入單詞
和過去的隱藏狀態(tài)來生成一個(gè)包括新單詞
的新的記憶
(這個(gè)算不算門也因人而異长搀,我個(gè)人是將其計(jì)算成門,所以一共是4個(gè)門)
Output/Exposure Gate:用處是將最終記憶與隱狀態(tài)分離開來鸡典。記憶
中的信息不是全部都需要存放到隱狀態(tài)中源请,隱狀態(tài)是個(gè)很重要的使用很頻繁的東西,因此彻况,該門是要評(píng)估關(guān)于記憶單元
的哪些部分需要顯露在隱藏狀態(tài)
中谁尸。用于評(píng)估的信號(hào)是
,然后與
通過
運(yùn)算得到最終的
(注意纽甘,這里的
和RNN里面其實(shí)不太一樣良蛮,在LSTM里面,其實(shí)
才是真正的
)
其他步驟:
- Final memory generation:這個(gè)階段首先根據(jù)忘記門
的判斷悍赢,相應(yīng)地忘記過去的記憶
决瞳。類似地,根據(jù)輸入門
的判斷左权,相應(yīng)地生成新的記憶
皮胡。然后將上面的兩個(gè)結(jié)果相加生成最終的記憶
。
例子:
如上圖所示赏迟,權(quán)值隨機(jī)初始化屡贺,輸入在右下角,接下來按順序先輸入[3,1,0]:
再輸入[4,1,0]:
接下去以此類推:
整體上來看:
LSTM 如此復(fù)雜锌杀,那么它到底解決了什么問題呢甩栈?
觀察LSTM的前向公式我們可以看到其實(shí)就是我們之前的
。那么如果對(duì)
求導(dǎo)也會(huì)得到類似
的階乘的情況糕再,但是此時(shí)
被換成了
(當(dāng)然和之前求RNN的梯度一樣量没,這里同樣省略了其他東西,但大體上不影響結(jié)論)亿鲜,作為門機(jī)制的
允蜈,它的取值基本上不是0就是1冤吨,但大多時(shí)候是1,(注意饶套,遺忘門并是不為了解決梯度消失而出現(xiàn)漩蟆,在最早的LSTM中是不存在遺忘門,而是直接把這里設(shè)置為1妓蛮,這很有殘差網(wǎng)絡(luò)的味道)所以通過這樣的結(jié)果很好地解決了傳統(tǒng)RNN中梯度消失的問題怠李。
當(dāng)然這里僅僅解決了處的梯度問題,實(shí)際上LSTM在其他的梯度求導(dǎo)上還是容易出問題蛤克,這部分還是有待研究捺癞。至于遺忘門,查到的資料是說Gers 等人(2000)首先發(fā)現(xiàn)如果沒有使記憶單元遺忘信息的機(jī)制构挤,那么它們可能會(huì)無限增長髓介,最終導(dǎo)致網(wǎng)絡(luò)崩潰。為解決這個(gè)問題筋现,他們?yōu)檫@個(gè) LSTM 架構(gòu)加上了另一個(gè)乘法門唐础,即遺忘門。
六矾飞、GRU
GRU全稱為Gated Recurrent Unit一膨,它是LSTM的簡化版變種,就目前的實(shí)驗(yàn)來看洒沦,GRU在性能上幾乎與LSTM持平豹绪,但是在資源消耗方面會(huì)小一些。
GRU對(duì)LSTM的門進(jìn)行了刪減整合申眼,將遺忘門瞒津、輸入門和輸出門換成了更新門和重置門,即下圖中的z和r:
更新門用于控制前一時(shí)刻的狀態(tài)信息被帶入到當(dāng)前狀態(tài)中的程度豺型,更新門的值越大說明前一時(shí)刻的狀態(tài)信息帶入越多仲智。重置門用于控制忽略前一時(shí)刻的狀態(tài)信息的程度,重置門的值越小說明忽略得越多姻氨。
參考
- LSTM如何來避免梯度彌散和梯度爆炸钓辆?
- 三次簡化一張圖:一招理解LSTM/GRU門控機(jī)制
- LSTM如何解決梯度消失問題
- 詳解 LSTM
- 學(xué)界|神奇!只有遺忘門的LSTM性能優(yōu)于標(biāo)準(zhǔn)LSTM
- LSTM詳解 反向傳播公式推導(dǎo)
- CS224n筆記9 機(jī)器翻譯和高級(jí)LSTM及GRU
- CS224n自然語言處理與深度學(xué)習(xí) Lecture Notes Five
- Understanding LSTM Networks
- YJango的循環(huán)神經(jīng)網(wǎng)絡(luò)——實(shí)現(xiàn)LSTM
- GRU神經(jīng)網(wǎng)絡(luò)
- mxnet深度學(xué)習(xí)
- GRU與LSTM總結(jié)
- 李宏毅機(jī)器學(xué)習(xí)