确定该遗传算法的基因型; GA 初始化神经网络以实现快速高效的学习
Posted
技术标签:
【中文标题】确定该遗传算法的基因型; GA 初始化神经网络以实现快速高效的学习【英文标题】:Determining genotype for this genetic algorithm; GA to initialize neural network for quick and effcient learning 【发布时间】:2015-01-28 04:14:05 【问题描述】:我正在做一个学校项目,我想将遗传算法应用于神经网络。专门为给定的问题构建一个好的神经网络。我注意到为神经网络选择正确的参数存在一些挑战,以便它可以快速有效地训练一些数据,并且基本上可以归结为猜谜游戏。我想以遗传算法的方式构建多个神经网络,以找到对给定数据集进行分类的最佳初始设置。
我正在考虑使用 Java library Neuroph,专门扩展多层感知器实现。在库中,在路径org.neuroph.nnet
下有文件MultilayerPerceptron.java
,它有方法createNetwork
。这是该方法的实现
private void createNetwork(List<Integer> neuronsInLayers, NeuronProperties neuronProperties)
// set network type
this.setNetworkType(NeuralNetworkType.MULTI_LAYER_PERCEPTRON);
// create input layer
NeuronProperties inputNeuronProperties = new NeuronProperties(InputNeuron.class, Linear.class);
Layer layer = LayerFactory.createLayer(neuronsInLayers.get(0), inputNeuronProperties);
boolean useBias = true; // use bias neurons by default
if (neuronProperties.hasProperty("useBias"))
useBias = (Boolean)neuronProperties.getProperty("useBias");
if (useBias)
layer.addNeuron(new BiasNeuron());
this.addLayer(layer);
// create layers
Layer prevLayer = layer;
//for(Integer neuronsNum : neuronsInLayers)
for(int layerIdx = 1; layerIdx < neuronsInLayers.size(); layerIdx++)
Integer neuronsNum = neuronsInLayers.get(layerIdx);
// createLayer layer
layer = LayerFactory.createLayer(neuronsNum, neuronProperties);
if ( useBias && (layerIdx< (neuronsInLayers.size()-1)) )
layer.addNeuron(new BiasNeuron());
// add created layer to network
this.addLayer(layer);
// createLayer full connectivity between previous and this layer
if (prevLayer != null)
ConnectionFactory.fullConnect(prevLayer, layer);
prevLayer = layer;
// set input and output cells for network
NeuralNetworkFactory.setDefaultIO(this);
// set learnng rule
//this.setLearningRule(new BackPropagation(this));
this.setLearningRule(new MomentumBackpropagation());
// this.setLearningRule(new DynamicBackPropagation());
this.randomizeWeights(new NguyenWidrowRandomizer(-0.7, 0.7));
因此,我看到许多因素可以在网络构建中进行调整。我正在尝试确定我可能对我的算法进行基因分型。
所以我认为可以调整的因素首先是隐藏层的数量和隐藏层神经元的数量;输入和输出层的大小由问题决定。网络中神经元的神经元属性,(具体来说,不同的神经元可以有不同的激活函数吗?)。可能是神经元之间的连接;是否所有神经元都必须与上层和下层中的所有其他神经元连接,有些可以跳过一层吗?使用的学习规则的学习率,可能对不同的神经元使用不同的学习规则(很确定这是一个愚蠢的问题)。
总的来说,神经网络的哪些因素可以在初始设置上进行调整,这些因素会影响网络学习的速度和效率?我想非常特别地,神经网络中的所有神经元都必须在操作上相同吗?
编辑:通过一些搜索,我发现我猜这种网络的名称是compositional pattern producing network CPPN。主要思想被称为neuroevolution。实现这些想法的算法是neuroevolution of augmenting topiologies NEAT。我正在更多地研究这些页面和论文的链接,以尝试回答我上面的主要问题。但这个问题仍然大部分是开放的。
【问题讨论】:
【参考方案1】:您可以使用神经网络调整一百万种不同的东西。它们不是严格的算法。你提到的所有事情都是有效的。您可以调整层数和大小、混合和匹配激活函数、跳过层连接以及调整学习率。
这些东西被称为“超参数”,以区别于常规参数,即神经网络的权重和连接。它们是通过大量实验确定的,以查看最有效的方法。
但是很容易意外过度拟合。获得一个在训练或验证数据上效果很好但在新数据上效果不佳的 NN。使用交叉验证之类的方法将数据拆分为不同的部分,并在每个不同的部分上进行测试。
主要参数是层的数量和大小,以及正则化参数(例如权重衰减或抖动。)
【讨论】:
以上是关于确定该遗传算法的基因型; GA 初始化神经网络以实现快速高效的学习的主要内容,如果未能解决你的问题,请参考以下文章
uniform crossover(均匀交叉),遗传算法(Genetic Algorithm,GA),python