iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 11
1
自我挑戰組

類神經網路搭配啟發式演算法於時間序列之應用系列 第 11

DAY 10 - 第一部分總結與延伸思考

  • 分享至 

  • xImage
  •  

哇我居然可以連續堅持十一天發文,這真的太神奇了,感謝鐵人賽給我的磨練。儘管其中兩天 DAY5 DAY6 有點塘塞,在這幾天 DAY 8 , DAY 9 也沒什麼精力畫圖(雖然原本畫了已經不太好看哈哈)今天我要簡單總結一下 DAY1 到 DAY9 的內容,並且會提出一些進階的概念,提供大家思考看看,也歡迎任何的討論。

好啦又是一篇廢話連篇的文章哈哈。


輻狀基底類神經網路

在 DAY 1 到 DAY 3 我們談論到了 RBFNN ,也就是輻狀基底函數的類神經網路的一些內容,我覺得在 DAY 1 中我們提到的「訊息含量」的概念是很重要的,也就是說你的資料與中心點之間的距離,會影響到中心點到輸出層的數值大小,資料距離中心點越近,則到RBF值就越大。

這邊需要延伸思考的問題是,如果你的資料原本就有特別的群聚表現,例如 [1, 1.1, 1.2, 100, 100.1, 100.2 ] 很明顯就是聚集在 1 與 100 兩個地方,中心點初始化位置就可以盡量靠近群聚點。然而你需要仔細思考的問題是,時間序列資料會容易出現群聚嗎?

舉例來說,一個公司的股價會出現群聚嗎?原則上應該不太容易,比較是呈現一種「帶狀」的感覺,如果你想要得到群聚的效果,你可以試著將時間序列取變動值,用股價來說就是股價的變動值。但是這邊要注意到一個問題,通常你對時間序列資料,尤其是資料表現像一個波動函數的資料取變動值,變動值可能太小,以至於資料的雜訊會掩蓋掉變動值。

舉例來說,股價收盤 100 到 101 變動 1 元,但是這個股票可能一天內就波動超過 1 元了,所以整個這樣來看你感覺就是得到一串雜訊,所以你可以試著取比較長周期的變動值,這是需要注意的地方。

此外 RBFNN 由於是對整個訓練樣本的資料去計算到中心點距離,所以你的中心點代表的訊息含量時間跨度可能很大,舉例來說,你用 10 年的交通資料來做訓練,假設你有一個輸入量是「某路口車流量」好了,那你選了一個中心點,他會關注車流量 100 萬次/月,那他就會去關注你整個 10 年內有哪些資料的路口車流量接近 100 萬次/月,然後給你一個訊息含量。

然而 10 年前的 100 萬次/月可能很常發生,但是近期 100 萬次/月幾乎沒有發生,所以你可能會對一個太過古早以前的訊息去做匹配,要避免這個問題就是你要適度地去選擇你的資料樣本大小。我的建議是你可以嘗試去算每一筆資料各個維度的非常大週期的移動平均值,舉例來說 2 年的交通車流量移動平均值,如果資料中間發生一個劇變,那你可以嘗試從那個劇變前後做分割,或是添加更多維度的資料,讓這個維度的資訊量會被平均掉。

事實上,我自己最喜歡的做法還是將資料轉換成狀態變數,而不是一昧地只放數值進去模型訓練,舉例來說,我可能會將股價切割成 10-15, 15-20, 20-25 元的區間,分別用 0, 1, 2 來表示,這有一點 Fuzzy 的味道,你也可以嘗試看看。

如果你還想知道更多更新最新的 RBFNN 的應用進展,我推薦你可以關注 Neural Computing and Applications 期刊的文章,目前還是零星可以看到一些 RBFNN 在能源、工業和機器人上的一些實證研究,RBFNN 最重要的一個關鍵就是,他對於函數類的逼近會非常好,因此如果你是一個有循環週期(但是周期不定,類似 sin cos 的不同週期的複合波)或是一個非線性的系統表現(例如機器人行走的平衡系統,工廠裡面很多不同模具器材的組合作用)都可以逼近出一個還不錯的結果,而且你每隔一段時間重新訓練也不會耗費太多成本,也沒有太複雜的計算,因為 RBFNN 是前饋式的類神經網路,而且通常單層的效果就很好。

我個人經驗是,RBFNN 是一個可以和啟發式演算法做很好搭配的類神經網路,他在欠擬合到過擬合的過渡是比較明確的(例如你加中心點加到一個量,可能資料就能訓練起來了)至於和時間序列的搭配,如果你資料維度很大,你可以試著嘗試使用 L2-Norm 或是其他的模(Norm),或是切換你的RBF的函數,不要使用常態,使用一些其他輻狀基底函數。

模型質量標準 vs. 模型匹配能力

關於 DAY4 起我就一直在談模型質量標準和模型匹配能力,我一直強調一定要把這兩著分得很清楚,要搞清楚你使用的類神經網路的模型極限,這是一個很重要的事情,那些你模型辦不到的你就要把它當作限制,在限制底下你的模型輸出會有正、負例,然而實際情況發生、應用場景可能會產生真、假例,這四種可能情況要搞得很清楚:真正、真負、假正與假負。

模型質量標準比起模型匹配能力,我覺得更適合拿來追蹤模型在實際上線之後的好壞,我的建議新手可以先嘗試去提高模型的準確度,然後維持模型準確度在一定比例以上,依據不同問題而定。準確度有了之後,你在試著嘗試去把模型的一些參數去調整到精確度也夠,那這樣你的模型大抵上就搞定了。

那模型下線時間或是重新訓練時間,可以透過查全率來衡量,有時候準確度和精確度都還在一個水準,但是查全率開始掉,你就可以開始準備重新訓練模型了。這種運作邏輯並不是唯一,你可能最後會發現你自己問題最好的三個指標的活用判斷方式,不過我的經驗可以給你在初步做一個參考。

如果你非常長時間在追蹤你的模型,例如我的許多模型都用了非常久了,最長的一個整個類神經網路架構沒改已經用了快十一個月了,你就要更抽象地關注自己的歸納偏置,既然模型是由人產生的,難免還是會有一些主觀偏差,例如「少即是好」、「最近鄰居」你就要一直思考,最近我的資料是否還能讓我有這樣的偏置?是否資料內涵複雜度開始提高?是否需要考量其他新的維度進來,還是說你的模型可以再更簡化?

如果你的資料是時間序列資料,我推薦你還是可以考慮傳統的時間序列分析法,例如 ARMA 或 GARCH 的模型,這些還是能幫助你判斷你的資料是否有新的複雜度出現,有時候我還會算共變異數和高階動差(例如三至四階動差)透過這些來糾正你的歸納偏置,永遠不要把類神經網路當作是萬能的,類神經網路十分好用而且可以燒電腦,但這不代表你不需要付出任何代價。

關於模型的匹配能力,我們在後續的啟發式演算法會在特別強調,目前就是要先有一個欠擬合和過擬合的概念,也就是訓練樣本應該先從欠擬合出發,因為模型的訓練成本最低,然後可以先觀察一些訓練情況,透過加大模型複雜度來使得模型去做更好的匹配,同時觀察測試樣本的表現是否一致,如果訓練的很好但是測試樣本就是沒用,試著降低模型複雜度,如果找不到一個最佳區間,讓你的模型複雜度可以同時在訓練與測試樣本表現良好,那就試著修改樣本的大小或學習速率,甚至說我們後面會提到的,修改你的誤差函數,然後重新跑一遍低複雜度到高複雜度,反正目標就是找到那個最佳複雜度。


又是廢話了一篇(鞠躬致歉),我們趕緊進入啟發式演算法拉~


上一篇
DAY 09 - 模型與應用的困境(下):擬合度
下一篇
DAY 11 - 粒子群演算法簡介
系列文
類神經網路搭配啟發式演算法於時間序列之應用27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言