基於Keras/Python的深度學習:遞迴神經網路速成大法

周建丁發表於2016-07-19

原文:Crash Course in Recurrent Neural Networks for Deep Learning
作者:Jason Brownlee
編譯:GawainGao 校審:KK4SBB
責編:周建丁(zhoujd@csdn.net)

正在統治諸如輸入序列等機器學習難題的一種神經網路型別,是遞迴神經網路(Recurrent Neural Networks)。

隨著時間的推移,遞迴神經網路已經擁有包含迴圈、增加反饋和記憶網路的連線。記憶可以使這種型別的網路能夠學習和歸納輸入序列而不是單個模式。

遞迴神經網路中有一類強大的類別——長短期記憶網路(LSTM),目前被證實在一個深度結構中進行堆操作是特別有效的,在從語言翻譯到自動識別圖片及視訊字幕的多樣向量化問題中取得最先進的成果。

通過這篇文章,你將學習到關於深度學習的遞迴神經網路速成課程,並在基於Keras使用Python編寫LSTM網路方面獲得足夠多的知識。

讀完這篇文章,你就會了解:

  • 多層感知器的侷限性被遞迴神經網路解決。
  • 一些問題必須被解決以使遞迴神經網路更有效。
  • 應用於深度學習的長短期記憶網路的細節。

讓我們開始吧。

神經網路對序列的支援

有一些包含序列輸入和序列輸出的最優框架問題。

例如,考慮一個單變數時間序列問題,就像考慮一個隨著時間推移的股票價格。此資料集可以被設計成一個可預知問題,這個問題可以通過定義一個視窗大小(例如大小為5的視窗)並訓練網路去學習對固定大小的視窗輸入的資料進行短期預測,來實現一個傳統的前饋多層感知網路。

這是可行的,但效果非常有限。輸入視窗需要為這個問題增加記憶體,但這僅限於一個固定數量的點,而且被選擇的這些點還必須與該問題有足夠緊密的聯絡。一個單純的視窗在經過幾分鐘,幾小時或幾天後,不可能獲取到更廣泛的趨勢來做預測。從一個預測到下一個,該網路只知道它所提供的特定輸入。

單變數時間序列預測很重要,但涉及序列還有更有趣的問題。

考慮到如下分類的序列問題需要從一個輸入對映到一個輸出(出自Andrej Karpathy)。

  • 一對多:用於影像字幕的序列輸出
  • 多對一:用於情感類分類的序列輸入
  • 多對多:用於機器翻譯的序列輸入和輸出
  • 同步多對多:用於視訊分類的同步序列輸入和輸出

我們還可以看到,輸入到輸出的一對一的例子,是像影像分類的預測任務的一個經典的前饋神經網路的例子。

神經網路對序列的支援是一類重要的問題,深度學習領域近來顯示出了不俗的成果,最先進的專為序列問題設計的網路就是遞迴神經網路。

遞迴神經網路

遞迴神經網路(RNNs)是一種專門為序列問題設計的神經網路型別。

給定一個標準的前饋多層感知網路和遞迴神經網路,可以將其看作是結構上的相加回路。例如,在一個給定的層,每個神經元除了轉發資訊之外,還可以傳遞其最近的訊號(側向)到下一層。該網路的輸出可以作為網路的下一輪輸入向量。 以此類推。

遞迴連線可以在網路上新增狀態和記憶,並允許它從輸入序列中學習更廣泛的抽象結果。

遞迴神經網路領域現在已經可以用流行的方法很好地建立起來。要想讓這些技術在實際問題上也同樣有效,需要解決兩個對網路有用的主要問題。

  1. 如何用反向傳播演算法訓練網路
  2. 如何在訓練過程中避免梯度消失(gradient vanishing)和梯度膨脹(gradient explosion)

如何訓練遞迴神經網路

訓練前饋神經網路的主要技術就是反向傳播演算法和更新網路權重。由於遞迴和loop連線,遞迴神經網路中的反向傳播演算法被打破了。這已經被改良過的反向傳播演算法技術Backpropagation Through Time(BPTT)所解決。

代替上述在遞迴網路中進行反向傳播的演算法在網路結構中是展開的,並建立具有複發性的連線神經元副本。例如單個的神經元用自身中的連線(A->A)可以表示為兩個具有相同權重值的神經元(A->B)。

這允許遞迴神經網路的迴圈圖轉變為像一個典型的前饋神經網路的非迴圈影像,並可以將反向傳播演算法用於其中。

如何在訓練中保持一個穩定的梯度

當反向傳播演算法在深度神經網路中和展開的遞迴神經網路中使用的時候,為了更新權重值計算的梯度就會變得不穩定。

他們可以變成非常大的數,這種數被稱為exploding gradients,也可以變成非常小的數,稱為vanishing gradient問題。這些大量的梯度值被輪流用來更新網路中的權重,使得訓練變得不穩定,網路變得不可靠。

這個問題在深度多層感知器網路中有所緩解,通過使用Rectifier傳遞函式,甚至更奇特的非主流方法,使用的是無監督的預訓練層。

在遞迴神經網路結構中,這個問題在採用了新型的長短期記憶網路架構後已經有所緩解,使深度遞迴網路可以被訓練。

長短期記憶網路

長短期記憶網路(LSTMs)是一種遞迴神經網路,採用BPTT訓練並克服梯度消失的問題。

由於它可以用於建立大的(棧式)遞迴網路,所以反過來它也可以用來解決在機器學習中困難的序列問題並實現最先進的成果。

LSTM網路在層與層的連線中用記憶模組(memory blocks)來代替神經元。

A block has components that make it smarter than a classical neuron and a memory for recent sequences. A block contains gates that manage the block’s state and output. A unit operates upon an input sequence and each gate within a unit uses the sigmoid activation function to control whether they are triggered or not, making the change of state and addition of information flowing through the unit conditional.

一個模組具有比傳統神經元和最近序列的記憶更聰明的元件。模組包含管理模組的狀態和輸出的門(gates)。一個單元的操作取決於輸入序列,各個門使用sigmoid啟用函式控制它們觸發與否,使得狀態和額外流經單元的條件資訊發生變化。

單元內有三種型別的門:

  • Forget Gate:有條件地決定丟棄某些資訊。
  • Input Gate:有條件地決定哪些輸入值可以更新到記憶狀態中。
  • Output Gate:有條件決定輸出基於輸入和記憶單元中的某些內容。

每個單元就像是一個小型的狀態機,單元的門的權重值在訓練過程中都會被學習。

你可以看到如何從LSTMs的層實現複雜的學習和記憶,而且不難想象高階抽象可以以多個這樣的層進行分層。

學習資源

在這篇文章中我們已經涵蓋了大量的內容。下面是一些可以用來更深入學習關於深度學習和遞迴神經網路的資源(注:以下資料均為英文)。

瞭解更多關於遞迴神經網路和LSTMs的資料:

關於實現LSTMs的流行教程:

關於LSTMs的主要資源:

關注為LSTMs做出突出貢獻的幾位大牛:

Python深度學習程式碼下載

想要入門深度學習嗎?你可以通過短短几行Python程式碼來開發和評價深度學習模型。你需要:

  1. 免費下載本文作者提供的Python深度學習入門教程(英文)。
  2. 進行14天的自學過程和7個端到端專案,覆蓋關於多層感知器、卷積神經網路、物體識別等方面的知識。

圖片描述

不過,後續的學習資料售價47美刀,包含如下內容,連結就不貼了。

  • 256 Page PDF Ebook.
  • 66 Python Recipes.
  • 18 Step-by-Step Lessons.
  • 9 End-to-End Projects.
  • Code You Can Directly Use.

總結

在這篇文章中你會了解序列問題,而遞迴神經網路可以用來解決它們。

具體來說,你學會了:

  • 經典前饋神經網路的侷限性以及遞迴神經網路如何克服這些問題。
  • 訓練遞迴神經網路的實際問題以及如何克服這些問題。
  • LSTMs常常用於建立深度遞迴神經網路。

如果你有關於深度遞迴神經網路、LSTMs或者這篇文章的任何問題,都可以在評論裡寫出來,我將盡力解答。

作者簡介:

Jason Brownlee,MachineLearningMastery.com總編輯。一位好丈夫,值得驕傲的父親,學術研究者,作家,專業開發者和機器學習實踐者。他獲得了人工智慧的碩士和博士學位,出版過機器學習方面的書籍,寫過執行於生產環境的實操程式碼。


CCAI 2016中國人工智慧大會將於8月26-27日在京舉行,AAAI主席,多位院士,MIT、微軟、大疆、百度、滴滴專家領銜全球技術領袖和產業先鋒打造國內人工智慧前沿平臺,6+重磅大主題報告,4大專題論壇,1000+高質量參會嘉賓,探討人機互動、機器學習、模式識別及產業實戰。門票限時六折優惠中

圖片描述

相關文章