Я делаю школьный проект и хотел применить генетические алгоритмы к нейронным сетям. В частности, построение хорошей нейронной сети для данной задачи. Я заметил, что есть некоторые проблемы, связанные с выбором правильных параметров для нейронной сети, чтобы она могла быстро и эффективно обучаться на некоторых данных, и что это в основном сводится к игре в угадайку. Я хотел построить несколько нейронных сетей в стиле генетического алгоритма, чтобы найти наилучшую начальную настройку для классификации заданного набора данных.
Я рассматриваю возможность использования Java библиотеки Neuroph, специально расширяющей реализацию многоуровневого персептрона. В библиотеке есть файл MultilayerPerceptron.java
по пути org.neuroph.nnet
и у него есть метод 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));
}
Итак, я вижу много факторов, которые можно изменить при построении сети. Я пытаюсь определить, что я мог бы сделать генотипом моего алгоритма.
Таким образом, факторы, которые я вижу, которые я могу настроить, — это, во-первых, количество скрытых слоев и количество нейронов скрытого слоя; размер входного и выходного слоя определяется задачей. Нейронные свойства нейронов в сети (в частности, могут ли разные нейроны иметь разные функции активации?). Возможно, связи между нейронами; все ли нейроны должны быть связаны со всеми остальными в слоях выше и ниже, могут ли некоторые пропускать слой? Скорость обучения используемого правила обучения, возможно, использует другое правило обучения для разных нейронов (почти уверен, что это глупый вопрос).
Итак, в целом, какие факторы нейронной сети, которые можно настроить при начальной настройке, повлияют на скорость и эффективность обучения сети? Я предполагаю, что все нейроны в нейронной сети должны работать одинаково?
РЕДАКТИРОВАТЬ: с помощью некоторого поискового фу я нашел, что я предполагаю, что имя этого типа сети представляет собой композиционный шаблон, создающий сеть CPPN. Основная идея называется нейроэволюция. Алгоритм, реализующий эти идеи, представляет собой нейроэволюцию увеличивающих топологий NEAT. Я больше изучаю эти страницы и ссылки на документы, чтобы попытаться ответить на мои основные вопросы выше. Но вопрос по большей части остается открытым.