我正在开发简单的游戏程序,以显示具有线性函数近似的q学习。 screen shot
在这场比赛中,有无数状态。我必须考虑许多因素,如球员的位置,速度和敌人的位置(有12~15个敌人物体)。我最终将算法从使用表改为使用线性函数逼近。
我决定了大约20~22个特征。(常数,玩家位置,玩家速度,所有敌人位置)。
实施该算法后,我遇到了一些问题。
运行程序后,重量值会在几秒钟内溢出。我发现我没有将功能和体重标准化。
很容易规范化特征值,因为每个特征都有它们的界限。 但是,仅仅标准化特征值是不够的。 它最终仍然溢出。
我的问题是如何规范我的体重。
以下是我实现规范化功能的代码。
//f is feature
f[0] = 1;
f[1] = this.getNormMinMax(this.player.x,0,cc.winSize.width);
f[2] = this.getNormMinMax(this.player.vel,-80,80);
for(var i=0; i<pooList.length;++i)
{
f[3 + 2*i] = this.getNormMinMax(pooList[i].x,0,cc.winSize.width);
f[3 + 2*i+1] = this.getNormMinMax(pooList[i].y,0,cc.winSize.height*3);
}
以下代码正在更新权重而没有任何规范化。
for(var i=0; i<this.featureSize; ++i)
{
var w = this.weightArray[this.doAction][i];
this.weightArray[this.doAction][i] =
w + this.learningRate*(this.reward + this.discountFactor*maxAction - this.updateQSA) * f[i];
}
答案 0 :(得分:1)
似乎您没有正则化使用线性回归,并且存在共线特征。尝试添加L1或L2正则化(使用Ridge,Lasso或Elastic Net模型)。