我一直在尝试实现一个Q深度学习算法,虽然有一个问题,但它不起作用,在玩了10万次游戏并使用1000次迭代来训练每一步之后(尽管我已经尝试了更低的数字),它仍然不是学习。网络和游戏在链接的图像中,http://imgur.com/a/hATfB是在每个训练步骤中发生的事情:
double maxQval;
double[] inputvec;
int MaxQ = GetRandDir(state, out maxQval, out inputvec);//input vec is board
double[] QtarVec = new double[] { 0, 0, 0, 0 };
double r = GetR((int)state[0], (int)state[1]); // GetR is reward
QtarVec[MaxQ] = Qtar(r, maxQval); // backprop vector of 0's except Qtar replaces a value
associator.Train(50, new double[][] { inputvec }, new double[][] { QtarVec });backprop的训练数据对是(输入I链接在图像中,QTarget =r+γ* MaxQ),MaxQ是最大网络输出层激活或随机激活(epsilon greedy)。R是从每次移动中获得的奖励,障碍为-10,目标为10。(尽管我只尝试了10个目标,其他所有的都是0。这是训练代码。
public void Train(int nTrails)
{
double[] state = new double[] { 1, 1 }; // inital position
int its = 0;
for (int i = 0; i < nTrails; i++)
{
while (((state[0] < 4) && (state[1] < 4))&&((state[0] * 100 >0) && (state[1] * 100 >0)) && (state[0] != 3 && state[1] != 3))//while on board and not at goal postion
{
double temp = r.NextDouble();
int next = -1;
lines.Add(new Vector2((float)(state[0] * 100), (float)(state[1] * 100)));
if (temp < epsilon)
{
next = TrainRandIt(state); // move random direction, backprop
}
else
{
next = TrainMaxIt(state); // move in max activation direction, backprop
}
if (next == 0) .//updating postion
{
state[0]++;
}
else if (next == 1)
{
state[0]--;
}
else if (next == 2)
{
state[1]++;
}
else if (next == 3)
{
state[1]--;
}
}
}
state[0] = 1;
state[1] = 1; // resetting game
}感谢您的帮助。
发布于 2017-04-18 15:18:13
从您提供的链接图像来看,它就像是一个迷宫游戏,其中有玩家位置的输入和玩家应该移动到的方向(上、下、左或右)的输出。
这里有一个机器学习引擎,它能够准确地解决这一问题,甚至更多问题-- Ryskamp Learning Machine。与您到目前为止可能尝试过的典型机器学习引擎相比,RLM有一种不同的方法,所以我建议您转到我提供的链接,了解更多关于它的信息以及它的不同之处。
它是用C#编写的,我们有一个迷宫游戏的例子,就像你正在尝试的那个一样,你可以通过我们的Github page浏览,甚至可以通过克隆/下载源代码和提供的示例应用程序来亲自尝试。
有关文档,您可以参考提供的Documentations files,甚至可以通过github wiki获取文档。
RLM也可以通过Nuget获得。
https://stackoverflow.com/questions/41056103
复制相似问题