Используйте несколько методов обучения для обучения 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.
Спасибо
1 ответ
Это кажется логичным, однако это не будет работать.
С параметрами по умолчанию RPROP эта последовательность вряд ли будет работать. Причина в том, что после вашей предыдущей тренировки веса нейронной сети будут близки к локальному оптимуму. Из-за близости к локальному оптимуму только МАЛЫЕ изменения весов будут приближаться к оптимуму (уменьшать частоту ошибок). По умолчанию RPROP использует значение initialUpdate, равное 0,1 по всей весовой матрице. Это огромная ценность для сети, близкой к оптимальной. На данный момент вы "отпускаете быка в посудной лавке". Первая итерация переместит сеть далеко от оптимальной и по сути начнет новый глобальный поиск.
Понижение значения initialUpdate ДОЛЖНО помочь. Я не уверен, насколько. Возможно, вы захотите взглянуть на средние значения обновления веса RPROP для поезда с вашими данными, чтобы получить представление. Или попробуйте установить его очень маленьким и вернуться обратно.