iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0

引言

在前一天的文章裡,我們實作了一個最簡單的前饋神經網路(Feedforward Neural Network, FNN)。我們先把整段文字轉換成詞向量,然後再把所有詞向量取平均,得到一個代表 這段文本的整體向量,最後丟進神經網路裡。
這樣的方法雖然簡單,但其實藏著一個很大的問題,就是它完全忽略了 「詞語的順序」

舉例來說,以下有兩個句子:

  • 比起狗,我更喜歡貓
  • 比起貓,我更喜歡狗

這兩句話是用一模一樣的詞組合而成的,但「狗」跟「貓」的出現順序,就導致了這兩句話有截然不同的意義~
而在我們的 FNN 模型裡,這兩個句子會得到幾乎一樣的向量表示,結果就是模型根本分不清楚你到底是「貓派 🐱」還是「狗派 🐶」。

為了解決這個問題,我們需要一種可以「辨認順序」還有「記住前後文」的模型。它要能夠隨著每個詞語的輸入,逐步更新自己對整句話的理解。這就是 循環神經網路(Recurrent Neural Network, RNN) 登場的原因!

RNN

在 RNN 的世界裡,序列和時間是一個核心概念。我們不像 FNN 一次把整個文本壓成一個向量送進去,而是希望模型能依序閱讀每個詞,逐步累積上下文資訊。所以我們要介紹「時間步」和「循環結構」的概念。

時間步(Time Step)

「時間步」指的是序列中每個元素的位置。對 NLP 來說,一個時間步通常對應一句話中的一個詞。所以一個文本當中有多少詞,就會有多少的時間步,每一個時間步都有一組 輸入向量 𝑥𝑡
這樣的架構讓模型可以依序處理每個詞,而不是一次性看完整篇文章。也讓模型有了「捕捉詞序」的能力~


圖片來源:https://www.kdnuggets.com/comparing-natural-language-processing-techniques-rnns-transformers-bert

總之,時間步並不代表實際的時間,而是序列中元素的 順序位置。原本 FNN 處理整篇文本只用一個向量,RNN 則是 「一詞一向量」,逐步處理。

循環結構(Recurrent Structure)

那麼內部神經元是怎麼做運算的,前一個時間步又是如何影響到下一個時間步呢?
可以回想我們前面介紹的神經網路架構:輸入層(Input Layer)→ 隱藏層(Hidden Layers)→ 輸出層(Output Layer)

在 RNN 中,中間的隱藏層會計算出一個數值,稱作 隱藏狀態 。每個時間步的計算,不僅使用當前輸入,還會參考上一個時間步的隱藏狀態


圖片來源:https://techs0uls.wordpress.com/2020/02/29/rnn-recurrent-neural-networks/

當前時間步隱藏狀態

  • :當前時間步的隱藏狀態
  • :當前時間步的輸入向量
  • :上一時間步的隱藏狀態
  • :輸入權重矩陣
  • :隱藏狀態權重矩陣
  • :隱藏層偏置
  • :激活函數(例如:tanh、ReLU)

當前時間步輸出

  • :當前時間步的輸出,可以用來做預測(例如分類或回歸)
  • :當前時間步的隱藏狀態
  • :輸出層權重矩陣
  • :輸出層偏置
  • :輸出層的激活函數(例如:多分類用 Softmax,二分類用 Sigmoid)

這就是 RNN 的循環結構運算,讓模型能把過去時間步的訊息「記住」,並影響當前的輸出,使得序列中的上下文關係得以保留,讓模型有了「理解語境」的能力~

結語

今天介紹的 RNN 之所以會說它有「記憶」,就是因為它的循環結構,每一步都把之前的訊息參考進來,讓模型能在一定程度上「記住」過去的內容,比傳統 FNN 更適合處理文本、語音或時間序列資料。

但是 RNN 要從頭到尾記住這麼長的內容,可能會「忘東忘西」,也就是有 梯度消失 問題,對過長的序列就沒辦法記得太多。
這時候就輪到下一位角色登場 — LSTM(Long Short-Term Memory)。它就是為了解決長期記憶問題的循環神經網路。

明天會介紹 LSTM,來看看它是怎麼同時保留「短期訊息」和「長期記憶」的~~


上一篇
Day 20|模擬大腦的世界(下):Backpropagation 與 FNN 實作
下一篇
Day 22|長短期記憶:LSTM
系列文
讓電腦聽懂人話:30 天 NLP 入門23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言