Используйте несколько методов обучения для обучения ANN с помощью Encog

Я хотел бы знать, действительно ли обучение нейронной сети с прямой связью с помощью генетических алгоритмов, оптимизации роя частиц и имитации отжига перед использованием обучения устойчивому распространению улучшает результат.

Вот код, который я использую:

                    CalculateScore score = new TrainingSetScore(trainingSet);
                    StopTrainingStrategy stop = new StopTrainingStrategy();
                    StopTrainingStrategy stopGA = new StopTrainingStrategy();
                    StopTrainingStrategy stopSIM = new StopTrainingStrategy();
                    StopTrainingStrategy stopPSO = new StopTrainingStrategy();

                    Randomizer randomizer = new NguyenWidrowRandomizer();
                    //Backpropagation train = new Backpropagation((BasicNetwork) network, trainingSet, 0.2, 0.1);
                    //  LevenbergMarquardtTraining train = new LevenbergMarquardtTraining((BasicNetwork) network, trainingSet);
                    int population = 500;
                    MLTrain trainGA =  new MLMethodGeneticAlgorithm(new MethodFactory(){
                        @Override
                        public MLMethod factor() {
                            final BasicNetwork result = createNetwork();
                            ((MLResettable)result).reset();
                            return result;
                        }}, score,population);


                    Date dStart = new Date();

                    int epochGA = 0;
                    trainGA.addStrategy(stopGA);
                    do{
                        trainGA.iteration();
                        if(writeOnStdOut)
                            System.out.println("Epoch Genetic #" + epochGA + " Error:" + trainGA.getError());
                        epochGA++;//0000001
                        previousError = trainGA.getError();
                        Date dtemp = new Date();
                        totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000);
                    } while(previousError > maximumAcceptedErrorTreshold && epochGA < (maxIterations/5) && !stopGA.shouldStop()  && totsecs < (secs/3));

                    NeuralPSO trainPSO = new NeuralPSO((BasicNetwork) network, randomizer, score, 100);

                    int epochPSO = 0;
                    trainPSO.addStrategy(stopPSO);
                     dStart = new Date();
                    do{
                        trainPSO.iteration();
                        if(writeOnStdOut)
                            System.out.println("Epoch Particle Swarm #" + epochPSO + " Error:" + trainPSO.getError());
                        epochPSO++;//0000001
                        previousError = trainPSO.getError();
                        Date dtemp = new Date();
                        totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000);
                    } while(previousError > maximumAcceptedErrorTreshold && epochPSO < (maxIterations/5) && !stopPSO.shouldStop() && totsecs < (secs/3));

                    MLTrain trainSIM = new NeuralSimulatedAnnealing((MLEncodable) network, score, startTemperature, stopTemperature, cycles);

                    int epochSA = 0;
                    trainSIM.addStrategy(stopSIM);
                    dStart = new Date();
                    do{
                        trainSIM.iteration();
                        if(writeOnStdOut)
                            System.out.println("Epoch Simulated Annealing #" + epochSA + " Error:" + trainSIM.getError());
                        epochSA++;//0000001
                        previousError = trainSIM.getError();
                        Date dtemp = new Date();
                        totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000);
                    } while(previousError > maximumAcceptedErrorTreshold && epochSA < (maxIterations/5) && !stopSIM.shouldStop() && totsecs < (secs/3));




                    previousError = 0;
                    BasicTraining train = getTraining(method,(BasicNetwork) network, trainingSet);


                    //train.addStrategy(new Greedy());
                    //trainAlt.addStrategy(new Greedy());
                    HybridStrategy strAnneal = new HybridStrategy(trainSIM);

                    train.addStrategy(strAnneal);
                    //train.addStrategy(strGenetic);
                    //train.addStrategy(strPSO);

                    train.addStrategy(stop);
                    // 
                    //  Backpropagation train = new Backpropagation((ContainsFlat) network, trainingSet, 0.7, 0.3);
                    dStart = new Date();

                    int epoch = 1;

                    do {
                        train.iteration();
                        if(writeOnStdOut)
                            System.out.println("Epoch #" + epoch + " Error:" + train.getError());
                        epoch++;//0000001
                        if(Math.abs(train.getError()-previousError)<0.0000001) iterationWithoutImprovement++; else iterationWithoutImprovement = 0;
                        previousError = train.getError();

                        Date dtemp = new Date();
                        totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000);
                    } while(previousError > maximumAcceptedErrorTreshold && epoch < maxIterations && !stop.shouldStop() && totsecs < secs);//&& iterationWithoutImprovement < maxiter);

Как видите, это последовательность алгоритмов обучения, которые должны улучшить общее обучение.

Пожалуйста, дайте мне знать, если это имеет смысл и если код правильный. Кажется, это работает, но я хочу быть уверен, потому что иногда я вижу, что прогресс, достигнутый GA, сбрасывается из PSO.

Спасибо


person vincenzodentamaro    schedule 19.01.2015    source источник


Ответы (1)


Это кажется логичным, однако это не сработает.

С параметрами RPROP по умолчанию эта последовательность вряд ли будет работать. Причина в том, что после вашего предыдущего обучения веса нейронной сети будут близки к локальному оптимуму. Из-за близости к локальному оптимуму только НЕБОЛЬШИЕ изменения весов будут приближаться к оптимуму (уменьшать частоту ошибок). По умолчанию RPROP использует значение initialUpdate 0,1 для всей матрицы весов. Это огромное значение для сети, столь близкой к оптимальной. В этот момент вы «выпускаете быка в посудной лавке». Первая итерация уведет сеть далеко от оптимума и, по сути, начнет новый глобальный поиск.

Понижение значения initialUpdate ДОЛЖНО помочь. Я не уверен, насколько. Возможно, вы захотите посмотреть на средние значения обновления веса RPROP для поезда с вашими данными, чтобы получить представление. Или попробуйте установить его очень маленьким и вернуться обратно.

person JeffHeaton    schedule 28.01.2015