畢業論文——基於xxLSTM模型的移動對象位置預測
- 2020 年 3 月 3 日
- 筆記
本文簡要概述一下我的畢業論文思路,完整可執行程式碼大概在5月左右開源在Github,主要是為了證明學術誠信,而且太早開源不好,等我快要答辯了再開源
我在一年前寫過一篇論文——基於灰色Markov模型的移動對象位置預測研究
當時論文的側重點主要是研究如何彌補Markov無法揭示整體數據的規律,所以使用了一個簡單的回歸模型。先用這個回歸模型揭示數據的整體規律,然後用Markov對預測結果進行修正,因為Markov能挖掘出相鄰時刻數據之間的關係
這次畢業論文本來是打算研究關於NLP的相關內容。但是和指導老師商量了下,他還是推薦我繼續完善移動位置預測的問題,所以就繼續做這個了
這次論文的大體思路還是不變,依舊採用回歸+Markov,只不過把之前比較low的回歸模型換成循環神經網路RNN的變種——LSTM
RNN存在的問題是不好訓練,很容易產生梯度爆炸或者梯度彌散,具體原因我寫在了這篇部落格
而LSTM由於其內部獨特的結構:遺忘門、輸入門、輸出門可以很好的避免訓練困難的問題,而且由於有這些特殊門的存在,還可以很好的控制記住歷史數據的能力。所以我的回歸模型就選用的LSTM
我使用的數據集是微軟開放的GeoLife,裡面包含的欄位有lat、lng、zero、alt、days、date、time,每個欄位之間的值用逗號分隔,如下圖所示

真正有用的只有lat和lng這兩列的數據
由於Markov無法對二維數據進行操作,所以我將經度和緯度分開進行預測,然後分別用Markov修正
具體細節
細節實在是太多了,想到哪寫到哪
首先,LSTM需要設定一個窗口大小step
,即每次送入幾個數據,預測下一個數據。例如我現在有序列[1,2,3,4,5,6],設定窗口大小為3,那麼整個輸入數據就變為[[1,2,3],[2,3,4],[3,4,5],[4,5,6]],而且他們的輸出分別需要接近y=[4,5,6]。使用的Loss Function是MSELoss
第一個問題就來了,窗口大小應該設為多少,按照很多論文裡面所講的,一般設置為2-6。我先試了一下2,出現了滯後的問題,即預測值比真實值從圖上來看有些滯後。假設$t$時刻真實值是最大值,但是預測值在$t+1$時刻才是最大值,這就是滯後。具體情況見下圖

然後我試了一下6,效果也不好,具體來說就是太平滑,似乎是因為窗口大小太大,導致預測出來的數據時效性變差了,被不相干的數據"平均"了。具體情況見下圖

總結一下就是,窗口太小,會導致預測值比真實值滯後;窗口太大,網路很難學到細節。這個問題首先應該設定一個比較合適的窗口大小,但是你會發現還會出現一點滯後的問題。具體解決方案現在還不能說
其次,從數據上也能看出,基本上是相隔5秒採集一次經緯度點。5秒,一個人根本移動不了多遠,所以也就導致經度和緯度整體變化並不大,最多也只是$10^{-5}$量級的大小。如果不處理一下直接讓網路訓練,Loss很難降下來,效果會很差
解決方法很簡單,將數據做一個標準化即可,這樣所有的值都能壓縮到[0,1]區間內,放大了所有數據間的變化,避免模型不收斂的問題
最後一個細節,LSTM後面肯定要跟一個Fully Connected Layer,主要是做數據的維度變換,我們只需要一個輸出值。那麼問題來了,FC層到底應該怎麼設置?幾層隱藏層比較好?中間要不要Dropout?激活函數選什麼?答案是,一層即可。經過我多次實驗,我發現全連接層像一個"豬隊友",層數越多問題越大,會導致LSTM的訓練功虧一簣。本來LSTM已經把握好了整體數據的規律,最後一個全連接層就行了,你非要設置好幾層的全連接層,給人一種本末倒置的感覺,到底是LSTM學到的規律重要,還是最後全連接層胡亂訓練重要?
一些技巧
在LSTM中我設置了Dropout=0.1
,主要是為了防止在訓練集上過擬合,畢竟LSTM還是很強大的
Linear層我使用何凱明初始化方法,初始化了其中的所有weight,主要是希望能夠訓練的更快,以及避免隨機初始化的一些問題
Epoch=1000
,數據標準化之後,再加上前面的技巧,Loss降得很快,為了避免過擬合,所以Epoch設的比較小
使用了Learning Rate Decay,初始Learning Rate設為lr=1.2e-2
,每隔50個epoch,乘以gamma=0.9
。主要還是上面的原因,Loss降的很快,所以lr也應該慢慢變小,避免Loss出現大幅抖動。最後訓練的Loss如下圖

最終訓練&測試的結果如下圖

展望
其實我還有很多想法,但是由於5月就要答辯了,沒有那麼多時間一個一個做實驗。我分享幾個
- 利用CNN來做時間序列預測。把整個序列畫在圖上,把這張圖作為輸入,進行訓練,訓練出一個相似的圖出來,這樣也可以達到預測的效果。不過我想了一下,由於CNN具有平移不變性,可能"滯後"的問題會更加嚴重,不過如果卷積核的SIze設為1應該會好一些
- 利用EMD將時間序列進行分解,然後對分解的所有序列進行預測,再將這些序列進行疊加
- 修改Loss,使用MSELoss和KLDivLoss(KLDivergence)組合的Loss。MSELoss計算兩個值之間的接近程度,KLDivergence計算兩個曲線分布的接近程度