1. Language Models
1.1 Introduction
語言模型表示句子中的詞共現的概率:
關於語言模型這一塊的具體內容,可以參考我的另一篇博客:word2vec原理剖析
1.2 n-gram Language Models
原始的語言模型計算量非常大,因此有了n-gram語言模型,下圖分別表示bigram和trigram模型:
n-gram語言模型存在兩個問題:稀疏性和存儲空間大。
for example,公式3的分子要求三個詞同時出現,但更多情況情況是,這些詞共現的次數爲0,那這時候需要做平滑處理;當分母兩個詞沒有同時出現時,此時不能計算概率,需要做回退(backoff)。
存儲空間大是指,我們需要存儲很多n-gram詞組,當n很大,這個存儲空間呈指數級增長。
1.3 Window-based Neural Language Model
神經語言模型是Bengio提出的第一次將深度學習用於自然語言處理模型:
公式:
2. Recurrent Neural Networks (RNN)
RNN是指循環神經網絡,如下圖:
公式:
值得注意的是,在每個時間步中的權重和都是參數共享的。這樣做有兩個好處:一個是減少模型需要學習的參數量,另一個是可以使得模型對語料的輸入長度不敏感。
2.1 RNN Loss and Perplexity
RNN的損失函數也是交叉熵:
困惑度:
困惑度越低,表示預測結果的置信度越高。
2.2 Advantages, Disadvantages and Applications of RNNs
優點:
- 輸入可以是任意長度(過長截斷,過短補齊);
- 模型大小並不會因爲長度的增加而增大(因爲參數共享);
- 計算第t個時間步可以使用很多步之前的信息(理論上);
- 相同的權重應用於輸入的每個時間步,因此在處理輸入時存在對稱性;
缺點: - 計算過程很慢(序列化模型,沒辦法做並行計算);
- 當序列很長時,會出現梯度消失或梯度爆炸的問題。
2.3 Vanishing Gradient & Gradient Explosion Problems
梯度消失/梯度爆炸問題是因爲RNN在反向傳播過程中,更早的時間步的梯度存在累乘步驟,因而很容易導致梯度爲0或者無窮大。具體可以看以下的反向傳播過程:
計算RNN對權重W的梯度:
使用鏈式法則可以得到:
因爲W是參數共享的,所以對於W的梯度必須是前t個時刻的梯度之和,所以纔有上述公式的求和過程。其中,
這個公式怎麼理解呢?我們可以先回顧下與的關係:
一個個解釋,首先,累乘是因爲鏈式法則,例如:
其次,
即
當激活函數爲sigmoid時,
當激活函數爲tanh時,
因此,總的導數爲:
其中,
和分別表示兩個矩陣2範式的上界;
因此,
當t-k足夠大是,小於1會出現梯度消失,大於1會出現梯度爆炸。
在實驗中,當出現梯度爆炸時,會導致計算流中出現NaN,所以比較檢測出來;仔細看上述的分析,我們可以知道,梯度消失在計算過程中不會報錯,只是在較前時間步的梯度貢獻很少(或者爲0),因此比較難察覺出來。
2.4 Solution to the Exploding & Vanishing Gradients
爲了解決梯度爆炸問題,當梯度比較大時,我們設定一個閾值,使梯度不大於這個值,具體如下:
爲了解決梯度消失問題,可以使用的方法有:1. 初始化權重爲單位矩陣代替隨機初始化(優化指數衰減的第一項);2. 使用ReLU激活函數代替sigmoid, tanh等(因爲ReLU導數爲1,優化指數衰減的第二項);3. 從根本上修改,RNN模型改爲LSTM(後面會介紹該模型)。
2.5 Deep Bidirectional RNNs
雙向RNN是指從左到右以及從右到左兩個方向的RNN模型,如下圖:
公式:
深度雙向RNN顧名思義就是多層的雙向RNN,如下圖:
公式:
2.6 Application: RNN Translation Model
這一小節將RNN應用於機器翻譯模型,包括encoder, decoder兩個階段,如下圖:
公式:
第一條公式表示encoder階段,第二三條公式表示decoder階段。
上述例子只能產生一個輸出結果,且模型的解碼能力有限,更通常的,我們使用以下的編解碼方式:
一些tricks:
1. encoder和decoder階段使用不同的RNN權重;
2. decoder階段使用三個類型的輸入(入上圖所示),包括前一個時刻的隱藏層,encoder變量,上一個時刻的預測輸出;
3. 訓練多層的RNN模型(前提是要有足夠大的語料);
4. encoder階段訓練雙向的RNN模型;
5. 使用倒序的方法訓練RNN模型。(ABC->XY改爲CBA->XY)。
3 Gated Recurrent Units
GRU是在隱藏層到的過程中,使用了複雜的門控激活函數來修正RNN結構,具體如下:
結構圖:
每個結構的解析:
- New memory generation(新的記憶單元): 新的記憶單元是新輸入詞與過去的隱藏狀態的合併。從人類學的角度來看,這一階段是將新觀察到的詞與過去的隱藏狀態結合起來以根據上下文過去作爲向量;
- Reset Gate(重置門): 負責確定對於有多重要。如果重置門發現與新的記憶單元的計算無關,則它有能力完全消除過去的隱藏狀態;
- Update Gate(更新門): 負責確定應將多少結轉到下一狀態。例如,如果≈1,則幾乎全部複製到ht。相反,如果≈0,則大多數新的記憶單元將轉發到下一個隱藏狀態;
- Hidden state:最終更新門的建議下, 使用過去的隱藏輸入和新的記憶單元生成隱藏狀態。
4 Long-Short-Term-Memories
LSTM有點類似於GRU,只是隱藏層到的門控激活函數有一些不同,具體如下:
結構圖:
每個結構的解析:
- New memory generation(新的記憶單元): 此階段類似於我們在GRU中看到的新的記憶單元生成階段。我們實質上是使用輸入詞和過去的隱藏狀態來生成一個新的記憶單元,其中包括新詞的各個方面;
- Input Gate(輸入門): 我們看到,新的記憶單元生成階段不會在生成新的記憶單元之前檢查新單詞是否重要-這正是輸入門的功能。輸入門使用輸入詞和過去的隱藏狀態來確定輸入是否值得保留,因此用於門控新記憶單元。因此,它將其作爲此信息的指示;
- Forget Gate(忘記門): 該門與輸入門相似,不同之處在於它不確定輸入詞的有用性,而是評估過去的記憶單元是否對當前記憶單元的計算有用。因此,忘記門查看輸入的單詞和過去的隱藏狀態併產生;
- Final memory generation: 該階段首先接受遺忘門的建議,並因此遺忘過去的記憶單元。類似地,它接受輸入門的建議,將其選通,並相應地選通新的記憶單元。然後,將這兩個結果相加,以生成最終記憶;
- Output/Exposure Gate: 這是GRU中未明確存在的門。目的是將最終記憶與隱藏狀態分開。最終記憶單元包含很多信息,這些信息不一定需要以隱藏狀態保存。在LSTM的每個單獨的門中都使用了隱藏狀態,因此,此門將對記憶單元ct的哪些部分需要在隱藏狀態中進行暴露/呈現進行評估。