AI入門:循環(huán)神經(jīng)網(wǎng)絡(luò)

JM
0 評論 8781 瀏覽 29 收藏 11 分鐘

今天我們主要討論的循環(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)圖:

由四部分組成:輸入門、輸出門、忘記門、記憶單元

  1. 輸入門(Input gate):決定外界能不能把數(shù)據(jù)寫入記憶單元,只有輸入門打開的時候,才能寫入數(shù)據(jù);
  2. 輸出門(Output gate):決定外界能不能從記憶單元里讀取數(shù)據(jù),只有輸出門打開的時候打,才能讀取數(shù)據(jù);
  3. 忘記門(Forget gate):決定什么時候把記憶單元里的數(shù)據(jù)清除,打開的時候是不清除的,關(guān)閉的時候就會清除;
  4. 記憶單元(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é)議。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發(fā)揮!