1. 程式人生 > >神經進化學的簡單介紹和一個簡單的CPPN(Compositional Pattern Producing Networks)DEMO

神經進化學的簡單介紹和一個簡單的CPPN(Compositional Pattern Producing Networks)DEMO

最近迷上神經進化(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圖為