我一直在尝试通过openAI实现this paper中描述的算法。我的实现是在Java中进行的,并且我使用their GitHub repo作为参考框架。
我的算法执行以下操作:
然后,我通过以下代码从噪声矢量和居中秩计算出梯度近似值:
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;
}
然后将此梯度近似值传递给优化器,在这种情况下,我使用Adam来计算策略的参数更新。最后,我更新策略重复该周期。这与我上面链接的GitHub存储库中this file中OpenAI的Python实现紧密相关。
我尝试在从购物车杆到人口只有1000名工人的Flappy Bird的许多不同环境中运行此程序,发现随着时间的推移,它甚至无法实现很小的进步。
我的问题是:应该如何计算梯度?在我看来,我似乎在每个时期都正确地近似了渐变,但是显然我不是。