5

Я хотел бы знать, улучшает ли результат тренировку нервной сети с прямой связью с генетическими алгоритмами, оптимизацией роя частиц и имитированным отжигом, прежде чем использовать устойчивое обучение распространению.Использовать несколько методов обучения для обучения 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.

Thanks

ответ

1

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

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

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