1. LSTM模型 輸入參數理解
(Long Short-Term Memory)
lstm是RNN模型的一種變種模式,增加了輸入門,遺忘門,輸出門。
LSTM也是在時間序列預測中的常用模型。
小白我也是從這個模型入門來開始機器學習的坑。
LSTM的基本概念與各個門的解釋已經有博文寫的非常詳細:推薦博文:【譯】理解LSTM(通俗易懂版)
這篇文章寫的非常詳細,生動,概念解釋的非常清楚。我也是從這個博文裏開始理解的。
2. 模型參數
- 模型的調參是模型訓練中非常重要的一部分,調整參數前的重要一步就是要理解參數是什麼意思,才能幫助更好的調整參數。
- 但是發現在一些實戰模型將代碼直接放在那裏,但是基本參數只是把定義寫在哪裏,沒有生動的解釋,我一開始看的時候也是一臉懵逼。
- 在我尋找着寫參數的額定義的時候,往往看不到讓小白一眼就能明白的解釋。
- 希望從一個小白的角度來講解我眼中的這些參數是什麼意思,如果有不對,還請指出交流。
3. LSTM 的參數輸入格式
1. 一般表示爲[batch_size, time_step, input_size]
2. 中文解釋爲[每一次feed數據的行數,時間步長,輸入變量個數]
3.1 分開講解,input_size
- 如果你使用7個自變量來預測1個因變量,那麼input_size=7,output_size=1
- 如果你使用8個自變量來預測3個因變量,那麼input_size=8,output_size=3
這個還是比較好理解的,你的輸入數據,想要通過什麼變量預測什麼變量應該是比較清楚的。
難點是另外兩個參數的區別。
3.2 分開講解,batch_size
- 如果你的數據有10000行,訓練100次把所有數據訓練完,那麼你的batch_size=10000/100=100
- 如果你的數據有20000行,同樣訓練100次把所有數據訓練完,那麼你的batch_size=20000/100=200
- 如果你的數據有20000行,訓練50次把所有數據訓練完,那麼你的batch_size=20000/50=400
- 以此類推
- 不過只是舉個例子,實際的情況要看你的數據樣本,一般的batch_size小於100,來使你的訓練結果更好,一次feed太多行數據,模型容易喫撐,消化不良,可能需要健胃消食片,哈哈哈哈
3.3 分開講解, time_step
最最最最難理解的就是這個time_step了,我也是琢磨了好久。
- 首先要知道,time_step是指的哪個過程?
是不是看到的圖都是在畫,輸入了什麼,遺忘了什麼,輸出了什麼,以爲每個細胞狀態都是1個time_step?
如果這樣的話,那麼恭喜你,你和我一樣,都是想錯了,其實那些一串的流程細胞狀態圖都是在1個time_step!都是在1個time_step!都是在1個time_step! - 是不是很驚訝,很奇怪?
- 那講的是time_step的內部進行的,而不是在time_step之間。
- 換句話說,所謂的t-1的遺留狀態也是在一個time_step裏面的事情,t多少取決於time_step的取值。
此時,再來看看time_step的本身含義,時間步長,時間步長,那麼一定是是和時間有關係啊!!!
4. 重點
4.1 batch_size與time_step
- 之前的batch_size中只是規定了一個每次feed多少行數據進去,並沒有涵蓋一個時間的概念進去,
- 而這個參數剛好就是對於時間的限制,畢竟你是做時間序列預測,所以纔多了這個參數。
- 換句話說,就是在一個batch_size中,你要定義一下每次數據的時間序列是多少?
- 如果你的數據都是按照時間排列的,batch_size是100的話,time_step=10
- 在第1次訓練的時候,是用前100行數據進行訓練,而在這其中每次給模型10個連續時間序列的數據。
- 那你是不是以爲應該是1-10,11-20,21-30,這樣把數據給模型?還是不對,請看下圖。
4.2 [batch_size, time_step, input_size]=[30,5,7]
time_step=n, 就意味着我們認爲每一個值都和它前n個值有關係
- 如果 [batch_size, time_step, input_size]=[30,5,7]
- 那麼,上圖中,黑色框代表的就是一個batch_size中所含有的數據的量。
- 那麼,從上到下的3個紅色框就爲 time_step爲5的時候,每次細胞輸入門所輸入的數據量。
- 那麼,列B~列H,一共7列,就爲 input_size
4.3 舉例
再看下圖
time_step=n, 就意味着我們認爲每一個值都和它前n個值有關係
- 假如沒有time_step這個參數, [input_size=7,batch_size=30],一共只需要1次就能訓練完所有數據。
- 如果有,那麼變成了 [input_size=7,batch_size=30, time_step=5],需要30-5+1=26,需要26次數據連續餵給模型,中間不能停。
- 在26次中每一次都要把上一次產生的y,與這一次的5行連續時間序列數據一起feed進去,再產生新的y
- 以此往復,直到此個batch_size 結束。
結語
1. input_size 是根據你的訓練問題而確定的。
2. time_step是LSTM神經網絡中的重要參數,time_step在神經網絡模型建好後一般就不會改變了。
3. 與time_step不同的是,batch_size是模型訓練時的訓練參數,在模型訓練時可根據模型訓練的結果以及loss隨時進行調整,達到最優。
非常感謝以下作者,讓我慢慢理解了參數意義,纔有了以上學習筆記!
參考資料:
菜雞的自我拯救,RNN 參數理解
視覺弘毅,RNN之多層LSTM理解
MichaelLiu_dev,理解LSTM(通俗易懂版)
Andrej Karpathy,The Unreasonable Effectiveness of Recurrent Neural Networks