Я пытался реализовать алгоритм, описанный в этой статье openAI. Моя реализация на Java, и я использую их репозиторий GitHub в качестве системы отсчета.
Мой алгоритм выполняет следующие действия:
- Для каждого работника запустите один эпизод с положительными и отрицательными векторами шума, примененными к параметрам политики.
- Суммируйте все награды, наблюдаемые на каждом временном шаге в эпизоде, для одного скалярного «отрицательного соответствия» и одного скалярного «положительного соответствия».
- Вычислить центрированные ранги каждого работника.
Затем я вычисляю градиентное приближение из векторов шума и центрированных рангов с помощью следующего кода:
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 человек, и обнаружил, что с течением времени он не достигает даже отдаленного прогресса.
У меня такой вопрос: как рассчитать градиент? Мне кажется, что я правильно аппроксимирую градиент в каждую эпоху, но ясно, что это не так.