一苛白、RNN的引出(槽位填充問題)
-
槽位填充問題
??槽位填充問題:如下圖所示俱恶,在售票系統(tǒng)中需要將客戶的一句話中的信息提取出來填充到對應(yīng)的槽位下:
- 詞的表示方法
- 1-of-N Encoding(獨熱編碼)
??在知道總共有幾個詞的情況下使用缘琅。
- Beyond 1-of-N encoding
2.2 Word hashing
??詞向量的每一個維度表示一個序列鲸阔,如果詞中出現(xiàn)該序列則標記為1擎场。
- 使用前饋神經(jīng)網(wǎng)絡(luò)解決槽位填充問題
??按照解決多分類問題的思路使用前饋神經(jīng)網(wǎng)絡(luò)來解決槽位填充問題意系,但是使用前饋神經(jīng)網(wǎng)絡(luò)有一定的局限性钾腺。
??輸入:詞向量
??輸出:該詞屬于某一槽位的概率
- 使用前饋神經(jīng)網(wǎng)絡(luò)存在的問題
??由上圖可知徙垫,Taipei一詞屬于哪一個槽位還與其上下文有關(guān),因此解決該問題的神經(jīng)網(wǎng)絡(luò)需要具有記憶放棒,由此引入了具有記憶的神經(jīng)網(wǎng)絡(luò)——循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)姻报。
二、循環(huán)神經(jīng)網(wǎng)絡(luò)(本小節(jié)指的是簡單RNN)
-
RNN直觀的架構(gòu)
??循環(huán)神經(jīng)網(wǎng)絡(luò)相當于在全連接網(wǎng)絡(luò)的隱藏層加入多個“memory”節(jié)點间螟,隱藏層的輸出值被保存在memory中吴旋,由此完成了“記憶”的過程,隱藏層的輸入除了輸入層的輸入以外還包括memory中保存的數(shù)據(jù)厢破,隱藏層的輸出除了要傳播到輸出層以外還會用于更新memory中的值荣瑟。其簡單的架構(gòu)圖如下:
- RNN詳細的架構(gòu)
??循環(huán)網(wǎng)絡(luò)在每一時間有相同的網(wǎng)絡(luò)結(jié)構(gòu),假設(shè)輸入
為
維向量摩泪,隱含層的神經(jīng)元個數(shù)為
笆焰,輸出層的神經(jīng)元個數(shù)為
,則
的大小為
維见坑;
是上一次的
作為這一次輸入的權(quán)重矩陣嚷掠,大小為
維;
是連輸出層的權(quán)重矩陣荞驴,大小為
維不皆。而
、
和
都是向量熊楼,它們各自表示的含義如下:
-
是時刻t的輸入霹娄;
-
是時刻
的隱層狀態(tài)。它是網(wǎng)絡(luò)的記憶鲫骗。
基于前一時刻的隱層狀態(tài)和當前時刻的輸入進行計算犬耻,即
。函數(shù)
通常是非線性的挎峦,如tanh或者ReLU香追。
為前一個時刻的隱層狀態(tài),其初始化通常為
坦胶;
-
是時刻
的輸出坤邪。例如,如果我們想預測句子的下一個詞诚卸,它將會是一個詞匯表中的概率向量,
税弃;
認為是網(wǎng)絡(luò)的記憶狀態(tài),
可以捕獲之前所有時刻發(fā)生的信息凑队。輸出
的計算僅僅依賴于時刻
的記憶则果。
-
使用循環(huán)神經(jīng)網(wǎng)絡(luò)解決槽位填充問題
??將每個詞向量輸入到RNN中,得到的每一個輸出向量表示對應(yīng)的詞屬于某一個槽位的概率漩氨。
??回到上文中提到的“arrive”和“l(fā)eave”問題西壮,由于這兩個詞的詞向量是不同的,因此在獲得“Taipei”一詞的輸出時就不會像前饋神經(jīng)網(wǎng)絡(luò)一樣得到相同的結(jié)果叫惊,說明網(wǎng)絡(luò)的記憶為解決需要考慮上下文的槽位填充問題提供了可能款青。
-
深層RNN
??RNN也可以“deep”,將RNN疊加到一起可以形成深層的RNN霍狰。
- RNN變種
- Elman Network
??上述RNN為Elman Network架構(gòu)抡草,其主要特點是將隱藏層的輸出保存在memory中傳給下一個時間點。
- Jordan Network
??與Elman Network不同的是Jordan Network是將網(wǎng)絡(luò)的輸出層的輸出保存在memory中傳給下一個時間點蔗坯。這樣同Elman Network比起來我們更清楚memory中保存了什么康震。
- Bidirectional RNN(RNN)
??在Elman Network和Jordan Network中網(wǎng)絡(luò)的某一個輸出值只取決于這個輸出對應(yīng)的輸入以及這個輸入之前的輸入的影響,而雙向RNN的每一個輸出值都會受到所有的輸入的影響宾濒,真正地考慮了“上下文”腿短。
三、Long Short-term Memory (LSTM 長短期記憶網(wǎng)絡(luò))
??在簡單RNN中某一個時間點的memory會直接全部清洗掉上一個時間點的memory绘梦,而在LSTM中由于加入了遺忘門使得網(wǎng)絡(luò)的上一個時間點的memory有機會根據(jù)遺忘門的值來保留下一部分答姥。
-
LSTM直觀的架構(gòu)
??LSTM的一個cell有4個輸入和一個輸出,輸入包括3個門結(jié)構(gòu)(輸入門谚咬、輸出門、遺忘門)以及cell的輸入尚粘,其簡單架構(gòu)圖如下:
??門結(jié)構(gòu)的值通常使用sigmoid函數(shù)作為激活函數(shù)择卦,因此其值均會在0-1之間。cell的輸入會與輸入門的值進行相乘來決定輸入有多少可以進入cell郎嫁,遺忘門的值決定原來的memory cell中的“記憶”有多少可以被保留秉继,輸入門的值決定cell中的值有多少可以輸出。其具體的傳播過程如下圖泽铛,其中尚辑、
、
為門結(jié)構(gòu)的輸出值:
??上圖與常見的LSTM架構(gòu)圖的對應(yīng)關(guān)系如下圖所示盔腔,首先要將時刻的輸入向量
乘以四個不同的權(quán)重矩陣得到四個相同維度的向量
杠茬、
月褥、
、
瓢喉,這四個向量分別對應(yīng)下圖右半部分的較直觀的架構(gòu)圖中cell的四個輸入:
-
LSTM詳細的架構(gòu)
??下圖展示了一個LSTM cell的細節(jié)宁赤,在這個圖中將上一個時間點的輸出向量與當前時間點的輸入向量拼接到一起作為當前時間點的輸入:
- LSTM cell不同時間點之間的關(guān)系
??LSTM會以下圖的連接方式連接不同的時間點:
??然而上圖并非LSTM的最終狀態(tài),LSTM還會把上一個時間點的輸出以及存在于memory cell中的值與當前時間點的輸入拼接到一起栓票,通過這種方式使得操控LSTM四個輸入的時候同時考慮了當前時間點的輸入决左、上一個時間點的輸出以及保存在memory cell中的值:
-
深層LSTM
??LSTM也可以“deep”,將LSTM疊加到一起可以形成深層的LSTM走贪。
四佛猛、RNN的訓練
- 反向傳播
??RNN的反向傳播使用一種特殊的方式,叫做Backpropagation through time (BPTT 隨時間反向傳播)坠狡。 - 梯度消失與梯度爆炸
??在訓練RNN時我們希望訓練過程中的loss像藍色的線那樣變化继找,但是不幸的是有時候loss的變化會像綠色的線那樣。
??RNN的loss在有些地方非常陡峭擦秽,有些地方又非常平坦码荔,有時梯度更新到“懸崖”的地方再進行更新就會飛出很遠,即梯度爆炸感挥。使用clipping可以緩解這個問題缩搅,即設(shè)置一個梯度的極限值,當梯度大于這個值時就讓梯度等于這個值触幼。更新梯度的變化圖如下所示:
??舉個例子來說硼瓣,當RNN結(jié)構(gòu)如下所示時,網(wǎng)絡(luò)的最后一個輸出為
:
??此時當參數(shù)w輕微變化時就會對結(jié)果產(chǎn)生明顯影響:
??使用LSTM可以解決梯度消失問題置谦,這是因為與簡單RNN不同的是LSTM更新memory的方式是將上一個時間點的memory保留一部分再與輸入相加堂鲤,因此前面時間點的memory會一直對輸出結(jié)果有影響,這樣就不會產(chǎn)生梯度消失問題媒峡,而簡單RNN會在當前時間點更新memory時完全洗掉上一個時間點的memory瘟栖。簡單RNN和LSTM更新memory的方式如下:
??簡單RNN:
??LSTM:
??另外兩種解決梯度消失問題的網(wǎng)絡(luò)結(jié)構(gòu)如下:
??另外需要注意在簡單RNN中隨機初始化參數(shù)時使用sigmoid激活函數(shù)會比使用ReLU效果更好一些,但是使用單位矩陣初始化參數(shù)時ReLU激活函數(shù)會比sigmoid激活函數(shù)效果要好谅阿。
參考資料
ref:吳茂貴《Python深度學習:基于TensorFlow》