1. 程式人生 > >深度學習(四)——RNN, LSTM, 神經元啟用函式進階

深度學習(四)——RNN, LSTM, 神經元啟用函式進階

詞向量

word2vec/doc2vec的缺點(續)

2.雖然我們一般使用word2vec/doc2vec來比較文字相似度,但是從原理來說,word2vec/doc2vec提供的是關聯性(relatedness),而不是相似性(similarity)。這會帶來以下問題:不但近義詞的詞向量相似,反義詞的詞向量也相似。因為它們和其他詞的關係(也就是語境)是類似的。

3.由於一個詞只有一個向量來表示,因此,無法處理一詞多義的情況。

然而關聯性並非都是壞事,有的時候也會起到意想不到的效果。比如在客服對話的案例中,客戶可能會提供自己的收貨地址,顯然每個客戶的地址都是不同的,但是有意思的是,這些地址的詞向量是非常相似的。

總之,只利用無標註資料訓練得到的Word Embedding在匹配度計算的實用效果上和主題模型技術相差不大,它們本質上都是基於共現資訊的訓練。

參考:

Word2Vec如何解決多義詞的問題?

All is Embedding

向量化是機器學習處理非數值資料的必經之路。因此除了詞向量之外,還有其他的Embedding。比如Network Embedding。

NE(Network Embedding)論文小覽

除了自然語言處理,你還可以用Word2Vec做什麼?

參考

word2vec前世今生

文字深度表示模型——word2vec&doc2vec詞向量模型

如何用word2vec計算兩個句子之間的相似度?

NLP之Wrod2Vec三部曲

RNN

RNN的基本結構

RNN是Recurrent Neural Network和Recursive Neural Network的簡稱。前者主要用於處理和時序相關的輸入,而後者目前已經沒落。本文只討論前者。

這裡寫圖片描述

上圖是RNN的結構圖。其中,展開箭頭左邊是RNN的靜態結構圖。不同於之前的神經網路表示,這裡的圓形不是單個神經元,而是一層神經元。權值也不是單個權值,而是權值向量。

從靜態結構圖可以看出RNN實際上和3層MLP的結構,是基本類似的。差別在於RNN的隱藏層多了一個指向自己的環狀結構。

上圖的展開箭頭右邊是RNN的時序展開結構圖。從縱向來看,它只是一個3層的淺層神經網路,然而從橫向來看,它卻是一個深層的神經網路。可見神經網路深淺與否,不僅和模型本身的層數有關,也與神經元之間的連線方式密切相關。

雖然理論上,我們可以給每一時刻賦予不同的U,V,W,然而出於簡化計算和稀疏度的考量,RNN所有時刻的U,V,W都是相同的。

RNN的誤差反向傳播演算法,被稱作Backpropagation Through Time。其主要公式如下:

U=EU=tetUV=EV=tetVW=EW=tetW

從上式可以看出,三個誤差梯度實際上都是時域的積分

正因為RNN的狀態和過去、現在都有關係,因此,RNN也被看作是一種擁有“記憶性”的神經網路。

RNN的訓練困難

理論上,RNN可以支援無限長的時間序列,然而實際情況卻沒這麼簡單。

Yoshua Bengio在論文《On the difficulty of training recurrent neural networks》(http://proceedings.mlr.press/v28/pascanu13.pdf)中,給出瞭如下公式:

||k<ithihi1||ηtk

並指出當η<1時,RNN會Gradient Vanish,而當η>1時,RNN會Gradient Explode。

這裡顯然不考慮η>1的情況,因為Gradient Explode,直接會導致訓練無法收斂,從而沒有實用價值。

因此有實用價值的,只剩下η<1了,但是Gradient Vanish又註定了RNN所謂的“記憶性”維持不了多久,一般也就5~7層左右。

上述內容只是一般性的討論,實際訓練還是有很多trick的。

比如,針對η>1的情況,可以採用Gradient Clipping技術,通過設定梯度的上限,來避免Gradient Explode。

還可使用正交初始化技術,在訓練之初就將η調整到1附近。

參考

遞迴神經網路(RNN)簡介

迴圈神經網路(RNN, Recurrent Neural Networks)介紹

迴圈神經網路

Backpropagation Through Time演算法

Tomas Mikolov詳解RNN與機器智慧的實現

為什麼RNN需要做正交初始化?

RNN的梯度消失/爆炸與正交初始化

看大牛如何覆盤遞迴神經網路!

為何迴圈神經網路在眾多機器學習方法中脫穎而出?

深度理解RNN:時間序列資料的首選神經網路!

“魔性”的迴圈神經網路

手把手教你寫一個RNN

完全圖解RNN、RNN變體、Seq2Seq、Attention機制

LSTM

本篇筆記主要摘自:

理解LSTM網路

LSTM結構圖

為了解決原始RNN只有短時記憶的問題,人們又提出了一個RNN的變種——LSTM(Long Short-Term Memory)。其結構圖如下所示:

這裡寫圖片描述

和RNN的時序展開圖類似,這裡的每個方框表示某個時刻從輸入層到隱層的對映

我們首先回顧一下之前的模型在這裡的處理。

MLP的該對映關係為:

h=σ(Wx+b)

RNN在上式基礎上添加了歷史狀態ht1

ht=σ(W[ht1,xt]+b)

LSTM不僅添加了歷史狀態ht1,還添加了所謂的細胞狀態Ct1,即上圖中影象上部的水平橫線。

步驟詳解

神經網路的設計方式和其他演算法不同,我們不需要指定具體的引數,而只需要給出一個功能的實現機制,然後藉助誤差的反向傳播演算法,訓練得到相應的引數。這一點在LSTM上體現的尤為明顯。

LSTM主要包括以下4個步驟(也可稱為4個功能或門):

決定丟棄資訊

這裡寫圖片描述

這一部分也被稱為忘記門

確定更新的資訊

這裡寫圖片描述

這一部分也被稱為輸入門

更新細胞狀態

這裡寫圖片描述

輸出資訊

這裡寫圖片描述

顯然,在這裡不同的引數會對上述4個功能進行任意組合,從而最終達到長時記憶的目的。

注意:在一般的神經網路中,啟用函式可以隨意選擇,無論是傳統的sigmoid,還是新的tanh、ReLU,都不影響模型的大致效果。(差異主要體現在訓練的收斂速度上,最終結果也可能會有細微影響。)
但是,LSTM模型的上述函式不可隨意替換,切記。

LSTM的變體

這裡寫圖片描述

上圖中的LSTM變體被稱為peephole connection。其實就是將細胞狀態加入各門的輸入中。可以全部新增,也可以部分新增。

這裡寫圖片描述

上圖中的LSTM變體被稱為coupled 忘記和輸入門。它將忘記和輸入門連在了一起。

這裡寫圖片描述

上圖是一個改動較大的變體Gated Recurrent Unit(GRU)。它將忘記門和輸入門合成了一個單一的 更新門。同樣還混合了細胞狀態和隱藏狀態,和其他一些改動。最終的模型比標準的 LSTM 模型要簡單,也是非常流行的變體。

參考

深入淺出LSTM神經網路

迴圈神經網路——scan實現LSTM

LSTM簡介以及數學推導(FULL BPTT)

如何解決LSTM迴圈神經網路中的超長序列問題

從任務到視覺化,如何理解LSTM網路中的神經元

LSTM、GRU與神經圖靈機:詳解深度學習最熱門的迴圈神經網路

LSTM入門必讀:從基礎知識到工作方式詳解

LSTM入門詳解

神經元啟用函式進階

在《深度學習(一、二)》中,我們探討了ReLU相對於sigmoid函式的改進,以及一些保證深度神經網路能夠訓練的措施。然而即便如此,深度神經網路的訓練仍然是一件非常困難的事情,還需要更多的技巧和方法。

啟用函式的作用

神經網路中啟用函式的主要作用是提供網路的非線性建模能力,如不特別說明,啟用函式一般而言是非線性函式。

假設一個神經網路中僅包含線性卷積和全連線運算,那麼該網路僅能夠表達線性對映,即便增加網路的深度也依舊還是線性對映,難以有效建模實際環境中非線性分佈的資料。

加入非線性啟用函式之後,深度神經網路才具備了分層的非線性對映學習能力。因此,啟用函式是深度神經網路中不可或缺的部分。

注意:其實也有采用線性啟用函式的神經網路,亦被稱為linear neurons。但是這些神經網路,基本只有學術價值而無實際意義。

ReLU的缺點

深度神經網路的訓練問題,最早是2006年Hinton使用分層無監督預訓練的方法解決的,然而該方法使用起來很不方便。

而深度網路的直接監督式訓練的最終突破,最主要的原因是採用了新型啟用函式ReLU。

但是ReLU並不完美。它在x<0時硬飽和,而當x>0時,導數為1。所以,ReLU能夠在x>0時保持梯度不衰減,從而緩解梯度消失問題。但隨著訓練的推進,部分輸入會落入硬飽和區,導致對應權重無法更新。這種現象被稱為神經元死亡

ReLU還經常被“詬病”的另一個問題是輸出具有偏移現象,即輸出均值恆大於零。偏移現象和神經元死亡會共同影響網路的收斂性。實驗表明,如果不採用Batch Normalization,即使用MSRA初始化30層以上的ReLU網路,最終也難以收斂。