1

我正在开发简单的游戏程序来展示线性函数逼近的 q-learning。 截屏

在这个游戏中,有不可数的状态。我必须考虑很多因素,比如玩家的位置、速度和敌人的位置(有 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];
        }
4

1 回答 1

1

看来您使用的是没有正则化的线性回归,并且存在共线特征。尝试添加 L1 或 L2 正则化(使用 Ridge、Lasso 或 Elastic Net 模型)。

于 2016-11-05T16:52:35.860 回答