AI入門:循環(huán)神經(jīng)網(wǎng)絡(luò)
今天我們主要討論的循環(huán)神經(jīng)網(wǎng)絡(luò),到底循環(huán)神經(jīng)網(wǎng)絡(luò)能解決什么問題,它的結(jié)構(gòu)是怎樣的?有什么優(yōu)缺點?應(yīng)該在那些領(lǐng)域上上?本文將跟大家一起探討。
講到AI不得不講深度學(xué)習(xí),而講到深度學(xué)習(xí),又不能不講循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network, RNN)。如果把深度學(xué)習(xí)比作中國的互聯(lián)網(wǎng)界,那循環(huán)神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)就是騰訊和阿里級別的地位。
看這篇文章之前,建議大家先看下我前面寫的兩篇文章《深度學(xué)習(xí)到底有多深?》、《入門AI:卷積神經(jīng)網(wǎng)絡(luò)》,本文討論的內(nèi)容跟前面寫的文章有很強(qiáng)的關(guān)聯(lián)性,看完可能更容易理解本文所討論的內(nèi)容。
照例,先給個概述圖:
為了方便,在下文中我們用RNN來表示循環(huán)神經(jīng)網(wǎng)絡(luò)。
一、為什么需要RNN?
我們先來看一個訂票系統(tǒng):
假設(shè)我們在訂票系統(tǒng)中輸入一句話“我將在7月20號去深圳”,那么訂票系統(tǒng)就會這句話中的詞進(jìn)行分類,專業(yè)術(shù)語叫填槽(slot filling)。
那訂票系統(tǒng)會把這些詞分別填到3個槽中:
- 目的地:深圳
- 時間:7月20號
- 其他類型:我、將、在、去
補(bǔ)充下神經(jīng)網(wǎng)絡(luò)的知識,要實現(xiàn)這個分類的話,我們可以搭一個網(wǎng)絡(luò)架構(gòu)。
當(dāng)輸入“深圳”,經(jīng)過網(wǎng)絡(luò)系統(tǒng)后,會判斷出“深圳”屬于目的地槽的概率是多少,然后決定是否屬于目的地槽。
但是,假設(shè)我們再輸入另外一句話“我將在7月20號離開深圳”,機(jī)器能正確處理嗎?
對于普通的神經(jīng)網(wǎng)絡(luò),同樣的輸入,肯定會是同樣的輸出,因此如果同一個網(wǎng)絡(luò)輸入這兩句的“深圳”的話,那機(jī)器肯定會把他們歸到同一個槽,這樣肯定是錯了。
那怎么辦?假設(shè)我們在輸入“深圳”的時候,機(jī)器根據(jù)上下文的詞,再輸出結(jié)果。這樣是不是有可能解決問題了,沒錯,這就是RNN要做的事。
具體RNN怎么工作的,接著往下看。
二、RNN的工作原理
1. RNN的工作原理
RNN的工作原理圖:
在神經(jīng)網(wǎng)絡(luò)里,每一個神經(jīng)元的輸出,都會被記得綠色的方塊里,然后下一次輸入的時候,不僅要考慮紅色的輸入,還要考慮被記在綠色里面的值。
也就是:新的輸出是由新的輸入和被之前所記下來的值所決定的。
這樣的話,我們前面所討論的問題就可以解決了:
當(dāng)輸入第一句話的“深圳”時,我們記住前面輸入的是“去”,然后就把“深圳”歸為目的地。
當(dāng)輸入第二句話的“深圳”時,我們記住前面輸入的是“離開”,然后就把“深圳”歸為出發(fā)地。
因此,我們可以看到RNN最主要的兩個特點:
- 新的輸出是由新的輸入和之前的輸出共同決定的。
- 對于同一個輸入,可能會輸出不同的結(jié)果。
2. RNN的其他架構(gòu)
如上左圖的架構(gòu),是每一個神經(jīng)元的輸出都會被記起來。
如上右圖的架構(gòu),是網(wǎng)絡(luò)的最終輸出的值才會被記起來。
雙向RNN:
假設(shè)我輸入一句 “7月20號,深圳,我來了”,如果用我們之前討論的網(wǎng)絡(luò),就可能有問題。因為之前的網(wǎng)絡(luò)只能考慮輸入在“深圳”之前的內(nèi)容,沒辦法考慮在“深圳”之后的內(nèi)容,而“來”在“深圳之后”,所以網(wǎng)絡(luò)就不知道“深圳”是目的還是出發(fā)地了。
那雙向RNN就可以解決這個問題:
雙向RNN是把同一句話,按正反兩個順序一起丟到網(wǎng)絡(luò)里去訓(xùn)練,然后綜合考慮正反兩個順序再決定輸出結(jié)果。因此,雙向RNN不僅考慮了前文,還考慮的后文。
到此為止,我們討論的都都是最簡單的RNN,但現(xiàn)實可能存在更加復(fù)雜的場景。
我們前面討論的都是輸入“深圳”只會考慮跟它相鄰的那個值,如果跟它相距比較遠(yuǎn),可能就沒辦法處理了,比如:我們輸入“離開了,7月20號,我美麗的深圳”。
那要怎么解決這樣的問題呢?下面我們就來介紹下,RNN中最經(jīng)典,也是現(xiàn)在最常用的模型:LSTM(Long short-term memory)。
三、 LSTM
結(jié)構(gòu)圖:
由四部分組成:輸入門、輸出門、忘記門、記憶單元
- 輸入門(Input gate):決定外界能不能把數(shù)據(jù)寫入記憶單元,只有輸入門打開的時候,才能寫入數(shù)據(jù);
- 輸出門(Output gate):決定外界能不能從記憶單元里讀取數(shù)據(jù),只有輸出門打開的時候打,才能讀取數(shù)據(jù);
- 忘記門(Forget gate):決定什么時候把記憶單元里的數(shù)據(jù)清除,打開的時候是不清除的,關(guān)閉的時候就會清除;
- 記憶單元(Memory?cell):就是存儲數(shù)據(jù)。
每個門什么打開,什么時候關(guān)閉?都是機(jī)器自己學(xué)的。
具體的計算邏輯:
這個是純數(shù)學(xué)邏輯了,大家看下就好,看不明白也沒關(guān)系,入門不必深究。
從上圖我們可以看出,LSTM是需要4個輸入,才會有一個輸出的。
小結(jié):
LSTM最大的特點就是:可以有很長時間或距離的記憶能力,而普通的RNN不能記住間距大的信息。
除此之外,LSTM對還能對梯度消失和梯度爆炸有比較好的處理效果。
備注:對于不知道什么是梯度下降的同學(xué),可以翻下之前的文章。這里簡單介紹下什么是梯度消失和梯度爆炸。
梯度消失:誤差梯度的值變化得太小,沒辦法移動了,導(dǎo)致機(jī)器停止學(xué)習(xí);
梯度爆炸:誤差梯度變化非常大,網(wǎng)絡(luò)參數(shù)大幅更新,導(dǎo)致網(wǎng)絡(luò)不穩(wěn)定。
四、總結(jié)
1. RNN小結(jié)
RNN是根據(jù)“人的認(rèn)知是基于過往經(jīng)驗和記憶”這一觀點提出的,它不僅考慮當(dāng)前時刻的輸入,還考慮對前面內(nèi)容記憶。即RNN 對之前發(fā)生在數(shù)據(jù)序列中的事是有一定記憶的,對處理有序列的問題效果比較好。
2. RNN與CNN的不同點
前一輸入跟下一輸入是否有關(guān)聯(lián):
- CNN :前一個輸入和下一個輸入之間沒有任何關(guān)聯(lián),因此所有的輸出都是獨立的。
- RNN:前一個輸入和下一個輸入之間沒有任何關(guān)聯(lián),共同決定新的輸出
前饋或反饋網(wǎng)絡(luò):
- CNN:屬于前饋神經(jīng)網(wǎng)絡(luò)
- RNN:屬于反饋神經(jīng)網(wǎng)絡(luò)
備注:什么是前饋網(wǎng)絡(luò)?什么是反饋網(wǎng)絡(luò)?
前饋網(wǎng)絡(luò):每一層中的神經(jīng)元接收前一層神經(jīng)元的輸出,并輸出到下一層神經(jīng)元,整個網(wǎng)絡(luò)中的信息是朝著一個方向傳播的,沒有反向的信息傳播;
反饋網(wǎng)絡(luò):反饋神經(jīng)網(wǎng)絡(luò)中神經(jīng)元不但可以接收其他神經(jīng)元的信號,而且可以接收自己的反饋信號。
3. RNN的主要應(yīng)用領(lǐng)域
用RNN處理需要考慮時間先后順序的問題,效果都很不錯,例如:
- 自然語言處理(NLP)
- 語音識別
- 機(jī)器翻譯
- 圖像描述生成
- 文本相識度處理等
好了,到這里就介紹完了RNN。
本文由 @Jimmy 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來自Unsplash,基于CC0協(xié)議。
- 目前還沒評論,等你發(fā)揮!