天天看點

遞歸神經網絡 RNN 原理(上)

了解 RNN 的原理過程是怎樣操作的, 着重是 W 複用 和損失函數 交叉熵的應用.

前篇對于 RNN 前奏, 或者說是 NLP 的基礎, 語言模型 (Language Model) 有了一點認識. LM 的應用場景為 在詞庫中, 搜尋出 符合目前給定 句子的 下一個單詞, 的所有可能單詞的機率. 栗子還是還是 那個: students opened their __ 的空缺地方應該填啥 (從詞庫中搜尋) . 主要呢是有聊到兩種方式:

  • n-gram
  • fixed window

結論是, 都很菜. 真的很難去對詞進行靈活選取的同時, 能有類似 "語義上下文分析" 的感覺在. 機器終究不是人呀. 人很輕易的做到, 但機器卻始終是沒有思維的. 但探索也不能停止不前哦.

RNN

于是呢, 在神經網絡上, 深度遞歸就是可用來搞這些事情的.

遞歸神經網絡 RNN 原理(上)

RNN 的核心思想是: Apply the same weights W repeatedly 重複地使用權值矩陣 W.

相當于是, \(Wx^{(1)}\) 作為一個全連接配接層的輸出, 也可以是 目前的狀态, 也可以一起結合 \(x^{(2)}\)

RNN 作為一語言模型

遞歸神經網絡 RNN 原理(上)

假如還是這4個單詞, "the students opened their __ "

首先對每個詞,其進行 onehot 編碼, 會得到一個稀疏向量, 然後對其進行 encoding (圖中的 E) 可以是 word2vec , 以達到将這個系數的長向量給, 變成 "稠密"的 新向量 e. (如圖中)

然後用這稠密的向量 e 跟 W 相乘. 同時 給 h (隐含層) 進行一個初始化, 假設就全是0也可.計算方式是:

先走流程, 不用管 這些 W 是怎麼來的.

\(We + Wh + bias\) 再在外面套一個激活函數(映射到 [0,1] 得到 \(h^{(1)}\)

然後, x2, x3, .. . 也都是同樣的操作. 到了最後的 \(h^{(4)}\) 再将其與矩陣 U 相乘, 這個最終輸出的向量作為 機率分布.

還是圖結合公式更加直覺一點呀:

(1) words / onehot vectors : \(x^{(t)} \in R^{|v|}\)

**(2) word embeddings: ** \(e^{(t)} = Ex^{(t)}\)

**(3) hidden states: ** \(\sigma(h^{(t)} = W_e e^{(t)} + W_h h^{(t-1)} + b_t)\) 注: \(h^{(0)}\)

(4) output distribution: \(y^{(t)} = softmax(Uh^{(t)} + b_t) \in R^v\)

最後得到的 \(y^{(t)}\) 就是一個機率分布嘛. 值得注意的一點是, 這個 \(W_e\) 是複用的, 同樣, 上面的 \(W_h\)

RNN 優劣勢

優:

  • Can process any length
  • 可以利用 many steps back 的資訊
  • 對輸入的長度 不論是 3個還是4個還是多個單詞, 起決定作用的是 W. 跟輸入多, 少沒啥關系的
  • 對相同的單詞, 因為 W 是複用的嘛, 是以相同單詞, 盡管不同位置, 計算出來的值相同, 有種 "對稱性"

劣:

  • 遞歸地計算, 非常緩慢 (slow) 因為它要把上一個的輸出,作為下一個的輸入 (不斷地 向量* 矩陣, 向量* 矩陣)..
  • In practice, difficult to access information from many steps back. 實驗上, 還是更多隻利用了, 離它較為近的詞的資訊多一點, 雖然從公式上是看到所有的, 資訊都輸入了.

如何訓練 RNN - LM

  • Get abig corpus of text (大的語料庫) which is a sequence of words \(x1, x^{(2)}...x^{(T)}\)
  • Feed into RNN-LM; compute output distribution \(y^{(t)}\)for every step t (計算出每個狀态的機率分布)
  • i.e. predict probability dist of every word, given words so far (給定前面單詞, 去預測下一個單詞, 然後再将前面的單詞給加進去, 再繼續預測下一個單詞, 這樣一直操作...)
  • Loss function on step t is cross-entropy between predicted probability distribution \(y^{(t}\) and the true next word \(y^{(t)}\) (one hot for \(x^{(x+1)}\)) (在 t 時刻采用 交叉熵的方式) 相當于一個分類問題, 每個單詞看作是一個獨立的類别 , 将預測類别(最大機率) 和實際類别(語料庫中) 的詞是否能對得上. 跟前面的神經網絡一樣的做法, 将這個 誤差 向後傳遞即可.

交叉熵

用來度量兩個機率分布的差異資訊.

在資訊論中,交叉熵是表示兩個機率分布p,q,其中p表示真實分布,q表示非真實分布,在相同的一組事件中,其中,用非真實分布q來表示某個事件發生所需要的平均比特數。

假設現在有一個樣本集中兩個機率分布p,q,其中p為真實分布,q為非真實分布。假如,按照真實分布p來衡量識别一個樣本所需要的編碼長度的期望為:

H(p)=

遞歸神經網絡 RNN 原理(上)

但是,如果采用錯誤的分布q來表示來自真實分布p的平均編碼長度,則應該是:

H(p,q)=

遞歸神經網絡 RNN 原理(上)

此時就将H(p,q)稱之為交叉熵。交叉熵的計算方式如下:

對于離散變量采用以下的方式計算:H(p,q)=

遞歸神經網絡 RNN 原理(上)
對于連續變量采用以下的方式計算:
遞歸神經網絡 RNN 原理(上)

交叉熵可在神經網絡(機器學習)中作為損失函數,p表示真實标記的分布,q則為訓練後的模型的預測标記分布,交叉熵損失函數可以衡量p與q的相似性。

交叉熵作為損失函數還有一個好處是使用sigmoid函數在梯度下降時能避免均方誤差損失函數學習速率降低的問題,因為學習速率可以被輸出的誤差所控制。

在特征工程中,可以用來衡量兩個随機變量之間的相似度。

在語言模型中(NLP)中,由于真實的分布p是未知的,在語言模型中,模型是通過訓練集得到的,交叉熵就是衡量這個模型在測試集上的正确率。

此處的損失函數就可以寫成:

\(J^{(t)}(\theta) = CE (y^{(t)}, \hat y^{(t}) = -\sum \limits _{w \in V} y_w^{(t)} log \ \hat y_w^{(t)} = -log \ y^{(t)}_{x(t+1)}\)

這裡V代表Vocabulary,語料庫詞彙

W代表權重參數,相當于 \(y^{(t)}\)是通過訓練好的參數預測出來的。

這裡交叉熵代表下一個詞預測是分類任務,預測詞彙表中哪一個詞是下一個詞

Average this to get overall loss for entire training set:

\(J^{(\theta)} = \frac {1}{T} \sum\limits _{t=1} ^T J^{(t)}(\theta) = \frac{1}{T} \sum\limits_{t=1}^T -log \ y^{(t)}_{x(t+1)}\)

還是蠻好了解的其實, 從整個過程來看.

RNN 過程

  • Computing loss and gradients acrossentire corpus \(x^{(1)}, x^{(2)}, ...x^{(t)}\) is To expensive
  • \(J^{(\theta)} = \frac {1}{T} \sum\limits _{t=1} ^T J^{(t)}(\theta)\)
  • In practice, consider \(x^1, x^{(2)}...x^{(t)}\) as asentence or a document. 降低計算量, 不通過逐字,一段一段整
  • Recall: 可以用 SGD (随機梯度下降法) allow us to compute loss and gradients for small chunk of data, and update
  • Compute loss \(J(\theta)\) for a sentence (actually a batch(小批量) of sentences),compute gradients and update weights. Repeat.

先到這吧, 下篇再接着來整, RNN 如何來做預測和 誤差是如何 BP傳播和RNN的應用場景等的認識.

繼續閱讀