自然語言處理 (NLP)問題都是序列化的。前饋神經網絡,在單次前饋中對到來數據處理,假定所有輸入獨立,模式丟失。循環神經網絡(recurrent neural network,RNN)對時間顯式建模神經網絡。RNN神經元可接收其他神經元加權輸入。RNN神經元可與更高層建立連接,也可與更低層建立連接。隱含活性值在同一序列相鄰輸入間被記憶。2006年 LSTM。語音識別、語音合成、手寫連體字識別、時間序列預測、圖像標題生成、端到端機器翻譯。
RNN由神經元和連接權值構成任意有向圖。輸入神經元(input neuron)擁有「到來」連接,活性值由輸入數據設置。輸出神經元(output neuron)是數據流圖一組可讀取預測結果神經元。所有其他神經元為隱含神經元(hidden neuron)。每個時間步,通過設置輸入神經元為網絡提供輸入序列下一幀。隱含活性值作為下一個時間步附加輸入。RNN當前隱含活性值為狀態。序列最開始設置值0空狀態。RNN狀態依賴當前輸入和上一狀態。狀態與序列所有前輸入都間接相關,工作記憶(woring memory)。RNN權值矩陣定義執行程序,決定隱含活性值輸入,不同活性值整合新活性值輸出。sigmoid激活函數 RNN 2006年被證明圖錄完備(Turing-complete)。給定正確權值,RNN可完成任意計算程序相同計算。不存在找到完美權值方法,可用梯度下降法得到次好結果。
優化RNN,沿時間輸展開,用優化前饋網絡相同方式優化。複製序列神經元,連接在副本傳遞,移除循環邊接而不改計算語義。相鄰時間步權值相同強度。隨時間反向傳播(Back-Propagation Through Time,BPTT),返回時間相關誤差對權值(包括聯結相鄰副本權值)偏導。聯結權值(tied weight)梯度相加。
循環神經網絡常見映射:序列分類、序列生成、序列標註、序列翻譯。序列標註(sequential labelling),序列作為輸入,訓練網絡為每幀數據產生正確輸出,一個序列到另一個序列等長映射。序列分類(sequential classification),每個序列輸入對應一個類別標籤,可僅選擇上一幀輸出訓練RNN,更新權值時誤差流經所有時間步收集集成有用信息。序列生成(sequential generation),給定一個類別標籤,輸出反饋給網絡作為下一步輸入,生成序列。單個向量視為信息稠密表示。序列翻譯(sequential translation),域中序列編碼,最後隱含活性值解碼為另一個域中序列。輸入輸出概念層次有差異,兩個不同RNN,第一個模型最後活性值初始化第二個模型。單個網絡,序列後傳入特殊符號輸入,通知網絡停止編碼,開始解碼。
帶輸出投影RNN網絡結構,全連接隱含單元,映射輸入輸出。所有隱含單元都為輸出,堆疊前饋層。隱含單元和輸出單元不同激活函數。
TensorFlow支持RNN各種變體,tf.nn.rnn_cell。tensor flow.models.rnn中tf.nn.dynamic_rnn實現RNN動力學。接收循環網絡定義,輸入序列批數據。所有序列等長。返回保存每個時間步輸出和隱含狀態兩個張量。從tensor flow.models.rnn導入rnn_cell和rnn。輸入數據維數為batch_size*sequence_length*frame_size。不希望限制批次大小,第1維尺寸可以設None。rnn_cell.BasicRNNCell 創建基礎RNN。rnn.dynamic_rnn 定義sequence_length步模擬RNN運算。定義RNN,沿時間軸展開,加載數據,選擇TensorFlow優化器訓練網絡,tf.train.RMSPropOptimizer、tf.train.AdamOptimizer。
長時依賴性,網絡記住含有許多後續不相關幀的序列第一幀。長序列,基礎RNN展開網絡深度非常大,層數非常多,每一層反向傳播算法將來自網絡上一層誤差乘以局部偏導。如果大多數局部偏導遠小於1,梯度每層變小,指數衰減,最終消失。如果很多偏導大於1,梯度值急劇增大。誤差項包含相乘項權值矩陣轉置。RNN相鄰時間步聯結一起,權值局部偏導都小於1或大於1,RNN每個權值都向相同方向縮放,梯度消失、爆炸問題突出。數值優化,浮點精度對梯度值產生影響。長短時記憶網絡(long-short term memory,LSTM)RNN架構解決方案。
LSTM專門解決梯度消失、爆炸問題。學習長時依賴關係的RNN事實標準。將RNN普通神經元替換為內部擁有少量記憶LSTM單元(LSTM Cell)。聯結一起,內部狀態記憶時間步誤差。LSTM內部狀態有固定權值為1自連接,線性激活函數,局部偏導始終為1。反向傳播,常量誤差傳輸子(constant error carousel)在時間步攜帶誤差不發生梯度消失或爆炸。內部狀態隨時間步傳遞誤差,LSTM環繞門(surrounding gates)負責學習,非線性激活函數(sigmoid)。原始LSTM單元,一種門學習對到來活性值縮放,另一種門學習輸出活性值縮放,學習包含或忽略新輸入,學習給其他單元傳遞特徵。單元輸入送入不同權值門。可以把循環神經網絡用為規模更大網絡架構組成部分。
LSTMCell類可替換BasicRNNCell類,一個完整的LSTM層。輸入非線性->輸入門->狀態->輸出非線性->輸出門。
LSTM流行變種,添加對內部循環連接比例縮放遺忘門(forget gate),網絡學會遺忘,內部循環連接局部偏導變成遺忘門活性值,可取非1值。當上下文重要,遺忘門保持關閉狀態。輸入非線性->輸入門->狀態->遺忘門->輸出非線性->輸出門。
添加窺視孔連接(peephole connection),門能看到單元狀態。當精確時間選擇和間隔時有益。TensorFlow LSTM層傳入use-peepholes=Trues標記激活窺視孔連接。
門限循環單元(Gated Recurrent Unit,GRU),架構簡單,更少計算量,沒有輸出門,輸入和遺忘門整合單獨更新門(update gate)。更新門決定內部狀態與候選活性值融合比例。重置門(reset gate)和新輸入確定部分隱含狀態計算得到候選活性值。TensorFlow GRU層對應GRUCell類。只需要單元數目參數。輸入->候選活性值->更新門->重置門->狀態。
全連接隱含單元RNN,訓練期間把不需要權值置0。最常見做法,兩層或多層全連接RNN相互堆疊,信息只能在兩層之間向上流動,多層RNN權值數目少,學習到更多抽象特徵。
參考資料:
《面向機器智能的TensorFlow實踐》
歡迎加我微信交流:qingxingfengzi
我的微信公眾號:qingxingfengzigz
我老婆張幸清的微信公眾號:qingqingfeifangz