RNN & LSTM === ## RNN (Recurrent neural network) RNN 遞歸神經網路的關鍵特點是在設計神經網路時,考量到「時間」的因素,因此模型能把前一個時間點的輸出當作「記憶」帶進下一個時間點。而這樣有「記憶功能」設計目的是為了要處理序列資料,像是語言、音樂、時間序列等。 #### 舉例 下面用晚餐吃什麼來做例子,假設每天的晚餐有三種選項:pizza, sushi, waffles 1. 每天晚餐的選項是會有規律的變換,如下圖: ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*zozKl19nfy2G4nNXym96_g.png =70%x) 2. 除了用昨天的結果來預測今天,還可以用前天的結果預測昨天在拿來預測今天(這裡可以看出時間序列的概念) ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*G-PUfVOVRagPpp1UxBo3Aw.png =70%x) 晚餐的結果可以變成用one-hot vector表示,如下圖: ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*cu0we086yja_xjtFzYbQDw.png =70%x) 3. 前面晚餐選項的圖變成用vector來呈現 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*LeVr4h5bl6aHoR1Hl9Zu4w.png =70%x) 4. 對於今天的預測結果可以再拿來預測明天 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*bVwldULB3M8VerPWGtJvKQ.png =70%x) 5. 每一天的預測結果都可以拿來預測下一天,所有時間串起來的圖會像以下這樣 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*mBV7jxGG6KdnCcC73ljwxg.png =70%x) 以上這樣就是RNN架構的基本概念解釋。用運算式呈現會像以下這樣: ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*NKhwsOYNUT5xU7Pyf6Znhg.png) - 有一串輸入序列 input sequence:$[x₁, x₂, x₃, ..., xₜ]$ - 隨著每個時間步 $t$,只會輸入一個element $xₜ$ - 由上一個 $h_{t-1}$ 和現在的 $x_t$ 綜合計算出隱藏狀態hidden state(memory)$h_t$ - 最後有一個最終輸出 $y_t$ :::info $h_t = tanh(W_x * x_t + W_h * h_{t-1}+ b)$ $y_t = softmax(h_t)$ ::: :::danger RNN在輸入序列很長的狀況下,會有一些問題: - 因為hidden state一層疊一層的關係,導致最一開始(最早)的資訊慢慢被削弱。 - 這樣長期記憶的做法可能會引發梯度消失/爆炸的問題。 因此就有了LSTM的架構。 ::: ## LSTM (Long short-term memory) LSTM 長短期記憶的架構有幾個重要的新元素: - 記憶單元 cell state $C_t$ - 忘記閘 forget gate:決定保留多少舊記憶 - 更新閘 add gate:決定要加入多少新資訊 - 輸入閘 input gate:將新資訊加入記憶中 - 輸出閘 output gate:決定輸出多少記憶為 $h_t$ ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*J5W8FrASMi93Z81NlAui4w.png) 1. **記憶單元 cell state** 可以想像成是一個貫穿所有單元的一條道路,將資訊從一個單元帶到下一個單元 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*HGY8vT3iSpCgqUAR_abe_Q.png) 2. **忘記閘 forget gate** 從前一層的輸出帶進來的資訊 $h_{t-1}$,以及這一層新增加的資訊 $x_i$,去看有多少比例要被忘掉 :::info 使用sigmoid,輸出範圍$0-1$ - 1 → 完全保留 - 0 → 完全忘記 ::: 此時 $C_t$ 先更新為 $C_{t-1}*f_t$ ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*QDX3N93xsmrdJ_T2nMwUgw.png) 3. **更新閘 add gate** 決定什麼要被記錄下來 - $iₜ = σ(W_i * [hₜ₋₁, xₜ] + b_i)$:這個公式是要計算有多少資訊要留下。(跟忘記閘的計算有點像) - $C̃ₜ/g_t = tanh(W_C * [hₜ₋₁, xₜ] + b_C)$:這個是決定有多少資訊 $Ct$ 要用來更新記憶單元。 (重要程度) :::info - 使用sigmoid,輸出範圍$[0,1]$ --> 控管閘門,要不要過去 - 使用tanh,輸出範圍$[-1,1]$ --> 控管重要程度 所以在這裡是資訊的**重要程度**乘上**有沒有存在的必要** - 重要程度:$g_t$ - 存在必要:$i_t$ 課本中的$j_t$ => $j_t = g_t*i_t$ ::: ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*WkYOpvES3nMyypWEMAxunA.png) 4. **輸入閘 inout gate** input gate 是更新記憶單元 $c_t$ --> $c_t = k_t+j_t$ 可以想成:忘記部分舊的 + 加入部分新的 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*gw8I2P_wxF_2NQyMRztQug.png) 5. **輸出閘 output gate** 從上一步驟的結果 $Ct$,再透過 sigmoid & activation function 的調控,來決定最終要用作明天預測的「記憶」是什麼。 ![](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*w8Bgd_Gk5DasRC4GI6woTg.png) ## References 1. [淺談遞歸神經網路 (RNN) 與長短期記憶模型 (LSTM)](https://tengyuanchang.medium.com/%E6%B7%BA%E8%AB%87%E9%81%9E%E6%AD%B8%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-rnn-%E8%88%87%E9%95%B7%E7%9F%AD%E6%9C%9F%E8%A8%98%E6%86%B6%E6%A8%A1%E5%9E%8B-lstm-300cbe5efcc3) 2. [Understanding LSTM Networks](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) 3. [遞歸神經網路(RNN)和長短期記憶模型(LSTM)的運作原理](https://brohrer.mcknote.com/zh-Hant/how_machine_learning_works/how_rnns_lstm_work.html)