http://jlearning.cn/2017/05/29/ESN-basic-tutorial/
最近在看回聲狀態網絡(Echo State Network)的內容,注意到中文搜索引擎搜不到關於有關Echo State Network通俗的講解,打算寫一下關於ESN的一個基本教程。本文先用一小段簡單介紹ESN是什么,然后用公式來表示這種網絡,並說明他的優缺點,最后用一個可執行的簡單例子來演示一下ESN的效果。
由於本人能力有限,如在閱讀過程中有任何疑問或者發現錯誤請在評論中指出。
ESN是RNN的一種,也是由輸入層,隱藏層,輸出層組成,並且在隱藏層到隱藏層之間有一個連接,用來保留前面時刻留下的信息。不同於RNN,ESN的輸入層到隱藏層、隱藏層到隱藏層的連接權值是隨機初始化,並且固定不變。在訓練的過程中,我們只需要去訓練隱藏層到輸出層的連接權值。這就變成了一個線性回歸問題,所以ESN訓練起來非常快。
ESN的神經網絡如圖所示,儲備池就是常規神經網絡中的隱藏層。輸入層到儲備池的連接為Win,儲備池到下一個時刻儲備池狀態的連接為W,儲備池到輸出層的連接為Wout。另外還有一個前一時刻的輸出層到下一個時刻的儲備池的連接Wback,這個連接不是必須的(圖中用虛線表示),由於這是一個入門級的基礎教程,所以在后面的公式和例子代碼中都不會涉及這一個連接。
圖中所示,tt時刻的輸入為u(t)u(t),一共K個節點,儲備池狀態為x(t)x(t),N個節點,輸出為y(t)y(t),L個節點。
每一個時刻輸入u(t)u(t),儲備池都會更新狀態,儲備池的狀態更新方式為:
這個式子里,WinWin和WW都是在最初建立網絡的時候隨機初始化的,並且固定不變。u(t+1)u(t+1)是這個時刻的輸入,x(t)x(t)是上一個時刻的儲備池狀態,在t=0時刻可以用0初始化。ff是一個激活函數,通常使用tanhtanh。
在建模的時候,和一般的神經網絡一樣,會在連接矩陣上加上一個偏置量,所以輸入的uu是一個長度為1+K的向量,WinWin是一個[1+k,N]的矩陣,xx是一個長度為N的向量,WW是一個[N,N]的矩陣。
回聲狀態網絡的輸出方式為:
有了儲備池狀態,再確定了ESN的輸出方式之后,就可以根據目標輸出ytargetytarget來確定WoutWout來讓y(t)y(t)和ytarget(t)ytarget(t)的差距盡可能的小。這是一個簡單的線性回歸問題,計算的方法有很多種,不再贅述。
到這里,我們就完成了ESN的訓練工作。整個網絡只需要訓練WoutWout,所以它的訓練過程非常快,這是ESN的優點之一。另外,對於一維時序數列的處理和預測,ESN有很好的優勢。但對於高維的時序數列,比如說視頻幀處理,ESN就不太能勝任了。
為了讓這個網絡能夠正常的運轉,還有一些地方是需要注意的:
- 之所以叫回聲狀態網絡,是因為前面時刻輸入的信息會通過WW回回盪在儲備池中,就像回聲一樣。為了避免儲備池狀態爆炸,WW的特征值必須要小於等於1。這也就引入了ESN中
譜半徑
的概念:WW的最大特征值。 - 由於網絡中只有WoutWout是可變的,為了盡可能多的表示不同的數據規律,WW必須要設置的非常大,才能從中找出各種不同的特征進行輸出。另一方面,WW的稀疏性也很重要,Hinton在多倫多大學的公開課里解釋是:
建立一個松散的連接,這樣某一信息可以在網絡中的一小部分回盪,而不會迅速的傳播到其他部分。
我不是特別的理解。希望有人解釋一下。
最后引用一個例子來徹底理解最基本的ESN。
在頁面中下載python源碼和數據集,在python2.7環境中運行。
數據就是一維的,代碼中每次輸入長度為1,預測數據中后一位的值,當然長度也是1。