神經進化學的簡單介紹和一個簡單的CPPN(Compositional Pattern Producing Networks)DEMO
阿新 • • 發佈:2019-01-07
最近迷上神經進化(Neuroevolution)這個方向,感覺是Deep Learning之後的一個很不錯的研究領域。該領域的一個主導就是仿照人的遺傳機制來進化網路引數與結構。注意,連網路結構都可以進化,就是不像是傳統的神經網路,結構是提前定義好的。
最近這個領域研究的比較多的是 弗羅裡達大學的Stanley教授,主要的貢獻有NEAT,HyperNEAT以及Novelty Search,有興趣的可以去google之。
NEAT與HyperNEAT都是一種indirect coding演算法,目的在更新神經網路的拓撲結構以及引數,而Novelty Search是指引NEAT與HyperNEAT如何更新的一個演算法。其中NEAT,HyperNEAT與神經網路的關係是這樣的:
我們用於決策與分類的神經網路(ANN)的引數是被一個叫做Compositional Pattern Producing Networks(CPPN)的網路來決定,而CPPN的拓撲結構由NEAT與HyperNEAT演算法進行進化,Novelty Search則指導NEAT與HyperNEAT演算法的優化。
CPPN網路跟傳統的神經網路差不多,只不過啟用函式比較特別,更為豐富,而且網路結構沒有層的概念,輸入是座標值x, y,具體可以參考2009年提出HyperNEAT的那篇文章第5頁的figure 2.
下面是一個非常簡單的CPPN的demo,用Matlab寫的
clear;clc wid = 32; hei = 32; map = zeros(hei, wid); for h = 1 : hei for w = 1 : wid %map(h, w) = sin((h^2 + w^2)*pi/100) ;%+ exp(((h-hei/2)^2 + (w-wid/2)^2)/8000) + h + w; %map(h, w) = exp(((h-hei/2)^2 + (w-wid/2)^2)/8000); map(h, w) = sin((h^2 + w^2)*pi/100) + exp(((h-hei/2)^2 + (w-wid/2)^2)/800); end end map = map - min(map(:)); map = 255 * map / max(map(:)); imshow(uint8(map))
可以從程式碼看出,輸入是座標值,而網路結構很簡單:就是一個高斯函式+正弦函式。最後形成的map圖為