iT邦幫忙

2023 iThome 鐵人賽

DAY 24
1
AI & Data

ML From Scratch系列 第 24

[Day 24] Recurrent Neural Network — 背後理論

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230924/20152821uqxrLKy1nr.jpg

Prerequisite

因為 Recurrent Neural Network (RNN) 的每個時間步都具有一個循環連接,將前一時間步的輸出作為當前時間步的輸入,所以我們必須先理解時間序列的資料是甚麼一回事。

Time Series Data

時間序列數據是按照時間順序收集的數據,通常包括一系列按時間排列的觀測值。

時間序列數據的關鍵特徵是它們具有時間依賴性。

這代表著過去的觀測值會影響未來的觀測值。

RNN 通過其循環神經元(Recurrent Neurons)的結構,能夠捕捉到這種時間相依性,使其適合處理這類數據。

Goal

Recurrent Neural Network (RNN) 用於處理序列數據,例如時間序列、自然語言文本等。

RNN 的主要特點是它具有循環的連接,允許訊息在網路中進行傳遞,以捕捉序列中的時間相依性。

Background

一個基本的 RNN 單元可以表示為以下方程式:

https://chart.googleapis.com/chart?cht=tx&chl=h_t%20%3D%20%5Csigma(W_%7Bih%7Dx_t%20%2B%20W_%7Bhh%7Dh_%7Bt-1%7D%20%2B%20b_h)

https://chart.googleapis.com/chart?cht=tx&chl=y_t%20%3D%20%5Csigma(W_%7Bho%7Dh_t%20%2B%20b_o)

其中,https://chart.googleapis.com/chart?cht=tx&chl=h_t是時間步https://chart.googleapis.com/chart?cht=tx&chl=t的隱藏狀態,https://chart.googleapis.com/chart?cht=tx&chl=x_t是輸入數據,https://chart.googleapis.com/chart?cht=tx&chl=y_t是輸出,https://chart.googleapis.com/chart?cht=tx&chl=W_%7Bih%7Dhttps://chart.googleapis.com/chart?cht=tx&chl=W_%7Bhh%7D是權重矩陣,https://chart.googleapis.com/chart?cht=tx&chl=b_hhttps://chart.googleapis.com/chart?cht=tx&chl=b_o是偏差項,https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma是 activation function(通常使用tanh或sigmoid函數)。

RNN 可以用於各種任務,包括自然語言處理、語音識別、時間序列預測等。

然而,它也存在一些問題,如梯度消失和梯度爆炸問題,導致難以捕捉長序列之間的依賴關係。

為了克服這些問題,一些變種模型,如長短時記憶網路(LSTM)和門控循環單元(GRU),已被提出並廣泛應用。

https://ithelp.ithome.com.tw/upload/images/20230924/201528213Zegj6h7xf.png

LSTM

LSTM(長短期記憶神經網路)是一種循環神經網路(RNN)的變體,它是一種用於處理序列數據的深度學習模型。

LSTM 主要用於解決傳統RNN存在的長期依賴性問題,這種問題使得傳統RNN難以捕捉長序列中的有意義的訊息。

LSTM 通過其特殊的設計來解決這個問題,具有三個主要的閘門單元:

  • 遺忘閘門(Forget gate)

控制哪些訊息應該在記憶單元中被遺忘,以適應長期依賴性。

https://chart.googleapis.com/chart?cht=tx&chl=f_t%20%3D%20%5Csigma(W_f%20%5Ccdot%20%5Bh_%7Bt-1%7D%2C%20x_t%5D%20%2B%20b_f)

  • 輸入閘門(Input gate)

決定哪些新訊息應該被添加到記憶單元中,以捕捉當前時間步的重要訊息。

https://chart.googleapis.com/chart?cht=tx&chl=i_t%20%3D%20%5Csigma(W_i%20%5Ccdot%20%5Bh_%7Bt-1%7D%2C%20x_t%5D%20%2B%20b_i)

https://chart.googleapis.com/chart?cht=tx&chl=%5Ctilde%7BC%7D_t%20%3D%20%5Ctanh(W_C%20%5Ccdot%20%5Bh_%7Bt-1%7D%2C%20x_t%5D%20%2B%20b_C)

  • 輸出閘門(Output gate)

根據當前時間步的輸入和記憶單元的內容,生成輸出。

https://chart.googleapis.com/chart?cht=tx&chl=o_t%20%3D%20%5Csigma(W_o%20%5Ccdot%20%5Bh_%7Bt-1%7D%2C%20x_t%5D%20%2B%20b_o)

更新記憶單元:
https://chart.googleapis.com/chart?cht=tx&chl=C_t%20%3D%20f_t%20%5Ccdot%20C_%7Bt-1%7D%20%2B%20i_t%20%5Ccdot%20%5Ctilde%7BC%7D_t

最終輸出:
https://chart.googleapis.com/chart?cht=tx&chl=h_t%20%3D%20o_t%20%5Ccdot%20%5Ctanh(C_t)

其中,https://chart.googleapis.com/chart?cht=tx&chl=f_thttps://chart.googleapis.com/chart?cht=tx&chl=i_thttps://chart.googleapis.com/chart?cht=tx&chl=o_t分別代表遺忘閘門、輸入閘門和輸出閘門的輸出。

https://chart.googleapis.com/chart?cht=tx&chl=C_t是當前時間步的記憶單元,https://chart.googleapis.com/chart?cht=tx&chl=h_t是當前時間步的輸出。

https://chart.googleapis.com/chart?cht=tx&chl=W_fhttps://chart.googleapis.com/chart?cht=tx&chl=W_ihttps://chart.googleapis.com/chart?cht=tx&chl=W_ohttps://chart.googleapis.com/chart?cht=tx&chl=W_C分別是相應閘門的權重矩陣.

https://chart.googleapis.com/chart?cht=tx&chl=b_fhttps://chart.googleapis.com/chart?cht=tx&chl=b_ihttps://chart.googleapis.com/chart?cht=tx&chl=b_ohttps://chart.googleapis.com/chart?cht=tx&chl=b_C是相應閘門的偏置項,https://chart.googleapis.com/chart?cht=tx&chl=%5Bh_%7Bt-1%7D%2C%20x_t%5D表示將前一時間步的輸出和當前時間步的輸入連接起來。

GRU

Gated Recurrent Unit(GRU)是一種循環神經網路(RNN)的變體,用於處理序列數據。

它在序列建模任務中廣泛應用,如自然語言處理(NLP)和時間序列預測。

GRU的核心特點是它具有 Update Gate 和 Reset Gate,這些門控制了訊息的流動。

GRU單元的運算方式如下:

https://chart.googleapis.com/chart?cht=tx&chl=z_t%20%3D%20%5Csigma(W_z%20%5Ccdot%20%5Bh_%7Bt-1%7D%2C%20x_t%5D%20%2B%20b_z)

https://chart.googleapis.com/chart?cht=tx&chl=r_t%20%3D%20%5Csigma(W_r%20%5Ccdot%20%5Bh_%7Bt-1%7D%2C%20x_t%5D%20%2B%20b_r)

https://chart.googleapis.com/chart?cht=tx&chl=%5Ctilde%7Bh%7D_t%20%3D%20%5Ctanh(W_h%20%5Ccdot%20%5Br_t%20%5Ccdot%20h_%7Bt-1%7D%2C%20x_t%5D%20%2B%20b_h)

https://chart.googleapis.com/chart?cht=tx&chl=h_t%20%3D%20(1%20-%20z_t)%20%5Ccdot%20h_%7Bt-1%7D%20%2B%20z_t%20%5Ccdot%20%5Ctilde%7Bh%7D_t

其中,

  • https://chart.googleapis.com/chart?cht=tx&chl=x_t 是當前時間步的輸入。
  • https://chart.googleapis.com/chart?cht=tx&chl=h_t 是當前時間步的輸出或隱藏狀態。
  • https://chart.googleapis.com/chart?cht=tx&chl=z_t 是 Update Gate,控制了當前輸入是否應該被納入隱藏狀態。
  • https://chart.googleapis.com/chart?cht=tx&chl=r_t 是 Reset Gate,控制了先前的隱藏狀態是否應該被忘記。
  • https://chart.googleapis.com/chart?cht=tx&chl=%5Ctilde%7Bh%7D_t 是候選隱藏狀態,表示新的訊息。
  • https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma 表示 sigmoid 函數,https://chart.googleapis.com/chart?cht=tx&chl=%5Ctanh 表示雙曲正切函數。
  • https://chart.googleapis.com/chart?cht=tx&chl=W_z%2C%20W_r%2C%20W_hhttps://chart.googleapis.com/chart?cht=tx&chl=b_z%2C%20b_r%2C%20b_h 是模型的權重和偏差。

GRU 通過 Update Gate 和 Reset Gate 控制訊息的流動,有助於捕捉長序列中的依賴關係,同時減少了 LSTM 所需的記憶體開銷。

這使得 GRU 成為一種在許多序列建模任務中效果良好的循環神經網路單元。


明天要開始實作 RNN !

敬請期待

/images/emoticon/emoticon12.gif

Reference


上一篇
[Day 23] Autoencoder — 解決真實問題
下一篇
[Day 25] Recurrent Neural Network — 主題實作
系列文
ML From Scratch31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言