如何在进化策略中计算成本梯度?

时间:2019-03-18 13:31:30

标签: java optimization gradient

我一直在尝试通过openAI实现this paper中描述的算法。我的实现是在Java中进行的,并且我使用their GitHub repo作为参考框架。

我的算法执行以下操作:

  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;
}

然后将此梯度近似值传递给优化器,在这种情况下,我使用Adam来计算策略的参数更新。最后,我更新策略重复该周期。这与我上面链接的GitHub存储库中this file中OpenAI的Python实现紧密相关。

我尝试在从购物车杆到人口只有1000名工人的Flappy Bird的许多不同环境中运行此程序,发现随着时间的推移,它甚至无法实现很小的进步。

我的问题是:应该如何计算梯度?在我看来,我似乎在每个时期都正确地近似了渐变,但是显然我不是。

0 个答案:

没有答案