在最初學習rnn、lstm等模型有很多不理解的地方,現在終於研究明白了,記錄一下我理解的過程。

對於常用的cnn模型,它只能單獨處理每個輸入,每個輸入之間完全沒有聯絡,但是現實中很多情況是需要考慮資料的前後之間的聯絡的,比如:影片的每一幀都是有聯絡的,一段話中每個詞也都是離不開上下文的,那麼可不可以在神經網路輸入的時候把之前的資訊加進去呢?因此提出了RNN模型。

RNN長什麼樣?它和CNN有啥區別?

在提到RNN時,總會遇到這個抽象的圖:

我的rnn理解

這個圖總是讓人一臉矇蔽阿,說白了這就是rnn的一個抽象流程。x代表輸入,o代表輸出,s代表隱藏層。如果把W這個環去掉,就是最普通的網路結構,把這個環擴充套件開,如下圖所示:

我的rnn理解

其實x向量並不是一下子全都輸進去的,是每次輸入一個Xt,並且每次輸出一個Ot。具體公式如下:

我的rnn理解

其中,f、g都是啟用函式,Ot由隱藏層決定,相當於是一個全連線。St是由當前的輸入Xt以及上一個隱藏層共同決定的。這裡介紹的比較簡單,任何一個rnn教程都會對該過程做一個詳細的說明。

看到這裡我就不太理解,

我這個W的環到底要迴圈多少次?

這是由timestep決定的。

timestep的值決定了該rnn的結構

,如果timestep為20,那麼這個W的環要迴圈20次,每一步t都需要一個輸入,同時也會有一個輸出,共有20次輸入和對應的20個輸出。

看到這裡,還是覺得很抽象,

具體的網路流程是什麼樣的呢??

這裡盜用了別人的圖,連結:用「動圖」和「舉例子」講明白RNN

我的rnn理解

這個圖把每次的輸出Yt-1拼接到下次的輸入Xt的過程講的很清楚。

又要偷圖了,下圖把rnn的前向計算過程講的很詳細:

我的rnn理解

我的rnn理解

假如你有一個數據集10條句子,每個句子20個詞,每個詞可以用長度為64的向量表示,那麼每個樣本的輸入為的shape為[1,20,64],假設每次輸入為一個詞(即timestep為20,當然也可以設定為每次輸入多個詞),那麼每個Xt的shape為[1,64]。

對於長度不一樣的資料,需要先編碼成相同大小的,假設編碼後統一shape為[80,110],若batch為16,則shape為[16,80,110],若timestep設定為80,則每次餵給rnn的輸入shape為[16,110],若timestep設定為40,則每次餵給rnn的輸入shape為[16,220]。