iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
AI & Data

時間序列分析與預測方法大全系列 第 11

[Day11] 以神經網絡進行時間序列預測 — RNN

  • 分享至 

  • xImage
  •  

本篇詳細介紹 RNN 並使用它進行時間序列預測

本日大綱

  • RNN 介紹
    • 激活函數
    • RNN 的分類
  • 時間序列預測實作
    • 資料集介紹/目標
    • 套件導入
    • 資料前處理
    • RNN 架構

RNN(遞歸神經網絡)介紹

傳統神經網絡(DNN)無法對時間序列建模,上層神經元的輸出只能傳遞給下層神經元。
而在遞歸神經網絡(RNN)中,神經元的輸出在下一時刻是可以傳遞給自身的,同時還輸出一個隱藏層狀態,給當前層在處理下個樣本時使用,可以看成是自循環反饋的全連接神經網絡。當任務的時序信息很重要(樣本中前後輸入的信息是有關聯的),就很適用使用 RNN 家族的模型

激活函數

激活函數為神經元引入非線性因素,使神經網絡可以逼近任意非線性函數,這樣神經網絡就可以應用到眾多的非線性模型中。

常見的激活函數有 sigmoid、tanh、relu、softmax:

  1. sigmoid
    將取值為(−∞,+∞)的數據映射到(0,1)之間,
    取 −∞ 的時候映射為 0,取 +∞ 的時候映射為 1,取 0 的時候映射為 0.5。
    一階導數取值範圍為 0~0.25,
    數據越趨近 0,導數越趨於 0.25,數據越趨近 ∞,導數越趨於 0。
    sigmoid_formula

  2. tanh
    相比於 sigmoid 函數,tanh 函數是關於 0 中心對稱的。
    將取值為(−∞,+∞)的數據映射到(-1,1)之間,
    取 −∞ 的時候映射為 -1,取 +∞ 的時候映射為 1,取 0 的時候映射為 0。
    一階導數取值範圍為 0~1,
    數據越趨近 0,導數越趨於 1,數據越趨近 ∞,導數越趨於 0。
    tanh_formula

  3. relu
    relu 函數則是為了解決神經網絡中梯度消失的問題,是深度學習中使用最廣泛的激活函數。
    relu_formula

    • 優點:
      • 分段函數(本身是非線性函數,由兩個線性分段函數組成)
      • 解決 sigmoid、tanh 的梯度消失問題(當輸入為正,梯度恆為 1;當輸入為負,梯度恆為 0)
      • 相比於 sigmoid、tanh,relu 函數計算因為是線性的,運算速度增快很多
    • 缺點:
      • 當輸入為負的時候,神經元不會被激活,會造成梯度消失問題;因此也出現其他改進版,如 Leaky Relu
  4. softmax
    歸一化指數函式,將一個含任意實數的 K 維向量「壓縮」到另一個 K 維實向量中,使得每一個元素的範圍都在 (0, 1) 之間
    softmax_formula

RNN 的分類

  1. 單層 RNN:從輸入到輸出,只有一層隱藏層,是最基本的 RNN 模型
  2. 多層 RNN:透過增加隱藏層的數量,增加遞歸神經網絡的深度
  3. 雙向 RNN:由兩層遞歸神經網絡組成,輸入相同但信息傳遞的方向不同,來捕捉序列前後的資訊

RNN 實作

資料集介紹

使用公共自行車某個站點可借車輛數量的數據,顆粒度為每分鐘一筆。

目標

透過神經網絡訓練捕捉時序特徵,預測下個時間點會有多少可借車輛數量

引入相關套件
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(98)
import time
import csv
import tensorflow as tf
from tf.keras import Sequential
from tf.keras.layers import Dense, Activation, Dropout, RNN
載入資料集
with open(path_to_dataset) as f:
    data = csv.reader(f, delimiter=';')
    bike = []
    for line in data:
        try:
            bike.append(float(line[0]))
        except ValueError:
            pass
數據格式轉換
RNN 架構示範
def model():
    model = Sequential()
    model.add(RNN(128))
    model.add(Dropout(0.2))
    model.add(Dense(10))
    model.summary()

(還在更新中)


上一篇
[Day10] 以深度學習進行時間序列預測 — 概論
下一篇
[Day12] 以神經網絡進行時間序列預測 — LSTM
系列文
時間序列分析與預測方法大全13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言