天天看點

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

大家好,又見面了,我是你們的朋友全棧君。

近期讀了一些關于LSTM的文章,但仍舊很難了解,關鍵就是不懂輸入、輸出是什麼,相比于圖像處理的CNN,RNN特别抽象。

昨晚花了很大的精力去了解“遺留狀态”這個概念,現在終于明白了一些,關鍵在timestep這個概念。

一、深入了解timestep

我們看到的所有的RNN結構圖,其實都是在一個timestep中的,而不是整個序列。(這句話很簡單,但真的是花了很長時間才領悟到的)

以下引用自知乎回答:

我的RNN了解

用動圖講RCNN

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

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

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

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

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

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

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

其中,f、g都是激活函數,Ot由隐藏層決定,相當于是一個全連接配接。St是由目前的輸入Xt以及上一個隐藏層共同決定的。這裡介紹的比較簡單,任何一個rnn教程都會對該過程做一個詳細的說明。看到這裡我就不太了解,我這個W的環到底要循環多少次?這是由timestep決定的。timestep的值決定了該rnn的結構,如果timestep為20,那麼這個W的環要循環20次,每一步t都需要一個輸入,同時也會有一個輸出,共有20次輸入和對應的20個輸出。

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

是以說,造成我了解最大的困難就是沒有懂上面的那句話:我們看到的所有的RNN結構,其實是對一個timestep内部來說的,而不是timestep之間。RNN所謂的t-1的遺留狀态也是在一個timestep裡面的事情,t多少取決于timestep的值。

二、timestep示例了解

這一個實戰操作的解釋會有助于了解這一過程:

簡單粗暴LSTM:LSTM進行時間序列預測

LSTM進行預測需要的是時序資料 根據前timestep步預測後面的資料

假定給一個資料集

{

A,B,C->D

B,C,D->E

C,D,E->F

D,E,F->G

E,F,G->H

}

這時timestep為3,即根據前三個的資料預測後一個資料的值。我們所謂的隐藏狀态是這樣的:把A輸入進去,得到隐藏狀态h(1),然後h(1)與B一起輸入,得到h(2),然後h(2)與C一起輸入…

而不是過去以為的[ABC—D]訓練完,得到h(1),再把[BCD—E]和h(1)訓練得到h(2)…

舉一個簡單的情況 假設一個list為[1,2,3,4,5],timestep = 2

我們轉化之後要達到的效果是

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

這部分就需要自己程式設計實作,按照自己設定的timestep建構訓練集:

def create_dataset(dataset, look_back):
#這裡的look_back與timestep相同
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back)]
        dataX.append(a)
        dataY.append(dataset[i + look_back])
    return numpy.array(dataX),numpy.array(dataY)
#訓練資料太少 look_back并不能過大
look_back = 1
trainX,trainY  = create_dataset(trainlist,look_back)
testX,testY = create_dataset(testlist,look_back)           

複制

是以說,timestep的值為n,就意味着我們認為每一個值都和它前n個值有關系。拿來預測時也是如此,如果timestep=n,訓練之後,為了預測第m個值,就要把m的前n個值做輸入。

三、示例:timestep與Batchsize的差別

個人看法:給定一個長序列,序列中的每一個值,也都由一個很長的向量(或矩陣)表示。把序列從前往後了解為時間次元,那麼timestep就是指的這個次元中的值,如果timestep=n,就是用序列内的n個向量(或矩陣)預測一個值。

而對于每一個向量來說,它本身有一個空間次元(如長度),那麼Batchsize就是這個空間次元上的概念。

比如一共有5個字母ABCDE,它們分别如此表示:

A:1 1 1 1 1

B:2 2 2 2 2

C:3 3 3 3 3

D:4 4 4 4 4

E:5 5 5 5 5

如果timestep為2,那麼在訓練過程中就是:

X Y
AB C
BC D
CD E

下面我們隻看第一對資料:AB-C

t=0,A進入訓練,生成h(0)

t=1,B進入訓練,生成h(1)

下面我們隻看t=0,由于A的序列可能也很長(在本例子中是5),是以也不能一次全都帶進去。這就需要分批次了(和過去的所有網絡就一樣了),是以設定Batchsize為2,則就是分成三批次:11、11、1

四、示例:timestep、batchsize、inputsize的差別

下面的例子來自動圖看懂RNN

我們用碎紙做個比方。有一張A4紙,長寬分别為297*210 mm,現在要把紙塞進碎紙機裡。

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

在這個例子中,

A4紙就是資料,總資料量為297*210,

碎紙機是神經網絡

輸出的結果是粉碎的紙,這裡我們先不管輸出是什麼樣,隻關注輸入。

每次塞紙時,都要正拿A4紙,把210的一邊沖着碎紙機的口塞入。

現在開始考慮各個參數的意義。

下圖代表input_size=1,batch=1,喂給碎紙機的是一個1*1的小紙片,訓練1000次代表喂1000次紙;

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

下圖代表資料次元input_size=210,batch=1,也就說,資料本身發生了變化——增加次元了;

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

下圖代表input_size=1,批次batch=297,資料本身沒變,每次訓練時進的資料量多了

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

相應的,下圖就代表input_size=210,batch=297,一共隻需要1次就能訓練完所有資料。

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

以上是我們之前學習的全連接配接神經網絡。

現在引入RNN。RNN保留了之前所有參數,并增加了參數time_step(時間步),對于這個例子,我們應該怎麼了解這個新參數呢?

此刻你手中的紙突然有了厚度(10297210),碎紙機還是那台,紙變厚了,就必須切片才能塞進去,在這個例子中,紙被切成了10層。

1、RNN要求你,每次塞紙時,不管紙是什麼形狀(不管batch等于多少),都必須把10層紙依次、先後、全塞進去,才算一次完整的喂紙,中間不許停(time_step=10)

2、同時,每層紙在進紙時,還需要跟上層産生的碎紙片一起塞進去(h_{t-1}+x_{t})

至此,我們看到,batch依然保留,與time_step分别代表不同意義。

RNN:timestep、inputsize、Batchsize的差別「建議收藏」

其實,從另一個角度也可以區分,time_step是神經網絡的參數,網絡建好了便不會改變;batch是訓練參數,在訓練時可根據效果随時調整。

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/128435.html原文連結:https://javaforall.cn