今天要來介紹我們的第一個自然語言處理的深度學習模型 - RNN (Recurrent Neural Network) 。在介紹 RNN 之前,先來聊聊 RNN 一個常見的應用 - 語言模型

語言模型


自然語言處理有一個研究主題叫做語言模型,語言模型被用來預測一段話的下一個詞是什麼。舉例來說,給模型看一段話:「我養了一隻_」,模型要去判斷這個_最有可能是什麼字,可以是「貓」、「狗」、「鳥」等等,但如果接「書」,這個語言模型可能就不是很成功了。

生活中用到語言模型的情況還不少,像是打字時自動跳出下一個字、 google 從你目前打的文字推測你可能要查什麼等等,都用到了語言模型。

不難想像語言模型就是在求機率最高的下一個詞,所以更正式一點的定義來語言模型處理的問題: 給定前 t 個詞,求出下一個詞是 Xt 的機率為何

P(Xt+1 | Xt, ..., X2, X1)

在深度學習還做得不是很成功的時期,語言模型的訓練方式是:給模型讀一堆文本,讓模型去計算「我」後面接「養」的次數有多少,或是「隻」後面接「貓」的次數有多少,以計算次數來預測機率。

P(養|我) ~= count(我養) / count (我)
p(貓|隻) ~= count(隻貓) / count (隻)

這樣只看前一個詞去計算下一個詞的方式稱為 「unigram」,當前面看的詞增加為兩個、三個、n 個,其方法就稱為 「bi-gram」, 「tri-gram」,「n-gram」

p(貓|一隻) ~= count(一隻貓) / count (一隻)

NLM - Neural Language Model


OK,介紹完了語言模型與傳統方法,我們要如何利用神經網路建立語言模型呢?我用以下的投影片來說明


圖片出處: Stanford NLP with DL 課程

投影片右下的句子 the students opened their ,每個詞有一個屬於自己的詞嵌入向量 (word embedding),這些向量組合起來,乘以另一個矩陣 W 並加上 bias b,我們就得到了中間層的 hidden layer 。這個 hidden layer 有點像是把詞嵌入向量進一步壓縮,我們可以利用他做接下來的運算。例如中間層的參數繼續乘以另一個矩陣 U 並加上 bias,再通過 softmax 轉換到機率分佈,就是語言模型預測單詞的機率分佈了。

如果對中間機器學習的機制不太熟悉,我推薦從 Stanford NLP with DL 課程的前半部分開始看,或是參考李宏毅教授的機器學習影片

回到剛剛的計算,矩陣 W 在處理 e1, e2, e3, e4 等詞嵌入向量時,可能會乘上非常不同的參數,每個詞嵌入向量都是和 W 中不同的部分做運算。

但是直觀上來想,若這個矩陣處理每個詞不同維度的方式都相同,那是不是可以簡化成同一個向量重複去乘以不同的詞嵌入向量呢?說得更詳細一些,若在詞嵌入完,第一個維度普遍不重要,第二個維度普遍重要(的確容易存在不同維度重要性不同這種現象),使得 W 矩陣和每個詞嵌入向量運算的第一個數字都偏小,第二個數字都偏大。如此一來, W 每行承載的資訊其實是相當重複的,可以簡化成一個維度較小的矩陣重複運算。

於是,模型的架構變成了這樣子,也就是最基本的 RNN 架構。RNN 全名是 Recurrent Neural Network ,Recurrent 代表的就是 RNN 使用同樣的矩陣 Wh, We 重複運算,We 處理詞向量, Wh 則是處理前一個運算結果得出的 hidden state h(t-1)。

圖片出處: Stanford NLP with DL 課程

小結


因為矩陣的重複使用,使得 RNN 具備這些優點:

  • 可以處理任意長度的 input
  • 模型大小不會因為 input 變長而增加
  • 由於使用了上一次計算得到的 hidden state ,理論上訓練後模型可以知道多個步驟(多個字詞)之前的資訊

但是,RNN 仍有一些缺點與無法解決的問題:

  • 計算緩慢(難以平行化以 GPU 加速)
  • 實際上,太多步驟之前的資訊仍然會遺失 (梯度消失)

之後出現的模型可以改善 RNN 的這兩個問題,會在後面的模型介紹更深入的說明。今天的數學與理論的部分又更多了一些,如果我的說明仍有不足的地方(我已盡最大努力了QQ),還請各位多多指教了!

#NLP #ML #machine learning #Nature Language Processing #RNN #Recurrent Neural Network #Language Model







你可能感興趣的文章

變成rule的形狀(4) - ESLint + Prettier + Stylelint 問題集

變成rule的形狀(4) - ESLint + Prettier + Stylelint 問題集

展開與其餘參數

展開與其餘參數

在 ES6 你會遇到的新功能

在 ES6 你會遇到的新功能






留言討論