神经进化学的简单介绍和一个简单的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图为

神经进化学的简单介绍和一个简单的CPPN(Compositional Pattern Producing Networks)DEMO_第1张图片


更为复杂的CPPN生成的图像可以参见  http://picbreeder.org/



神经进化学的简单介绍和一个简单的CPPN(Compositional Pattern Producing Networks)DEMO_第2张图片

你可能感兴趣的:(网络,matlab,神经网络,CPPN,Neuroevolution)