Как я могу вычислить градиент затрат в эволюционных стратегиях? - PullRequest
0 голосов
/ 18 марта 2019

Я пытался реализовать алгоритм, описанный в этой статье openAI. Моя реализация на Java, и я использую их репозиторий GitHub в качестве системы отсчета.

Мой алгоритм выполняет следующие действия:

  1. Для каждого работника запустите один эпизод с положительными и отрицательными векторами шума, примененными к параметрам политики.
  2. Суммируйте все награды, наблюдаемые на каждом временном шаге в эпизоде, для одного скалярного «отрицательного соответствия» и одного скалярного «положительного соответствия».
  3. Вычислить центрированные ранги каждого работника.

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

private double[] computeWeightedGradient(ArrayList<ArrayList<Double>> ranks, ArrayList<double[]> noise, int batchSize, int numBatches)
{

    ArrayList<Double> weights = new ArrayList<Double>();
    for(int i=0;i<ranks.size();i++)
    {
        //centered positive fitness scalar - centered negative fitness scalar
        weights.add(ranks.get(i).get(0) - ranks.get(i).get(1));
    }

    ArrayList<ArrayList<double[]>> noiseBatches = constructNoiseBatches(noise,batchSize);
    ArrayList<ArrayList<double[]>> weightBatches = constructWeightBatches(weights,batchSize);

    double[] weightedGradientApproximation = new double[policy.getNumParams()];
    double numSummed = 0;

    numBatches = Math.min(noiseBatches.size(), numBatches);

    //for batch in batches
    for(int i=0;i<numBatches;i++)
    {
        //for entry in batch
        for(int j=0;j<noiseBatches.get(i).size();j++)
        {
            //dot product
            for(int k=0;k<noiseBatches.get(i).get(j).length;k++)
            {
                weightedGradientApproximation[k] += weightBatches.get(i).get(j)[0]*noiseBatches.get(i).get(j)[k];
            }
        }

        numSummed+=weightBatches.get(i).size();
    }
    double[] params = policy.getFlat();

    double l2Coeff = Config.L2_COEFFICIENT;
    for(int i=0;i<weightedGradientApproximation.length;i++)
    {
        weightedGradientApproximation[i] = params[i]*l2Coeff - weightedGradientApproximation[i]/numSummed;
    }
    return weightedGradientApproximation;
}

Это приближение градиента затем передается оптимизатору, в этом случае я использую Адам , чтобы вычислить обновление параметра для политики. Наконец, я обновляю политику повторения цикла. Это тесно связано с реализацией Python OpenAI в этом файле в репозитории GitHub, на который я ссылался выше.

Я пытался выполнить это в различных средах, от Cart Pole до Flappy Bird с населением в 1000 человек, и обнаружил, что с течением времени он не достигает даже отдаленного прогресса.

У меня такой вопрос: как рассчитать градиент? Мне кажется, что я правильно аппроксимирую градиент в каждую эпоху, но ясно, что это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...