一直在尝试实现 Q 深度学习算法,虽然有一个问题,但它不起作用,在玩了 100 000 次游戏并使用 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 + gamma * 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
}
感谢任何帮助。
最佳答案
从您提供的链接图像来看,它就像一个迷宫游戏,您输入玩家的位置,输出玩家应该移动的方向(上、下、左或右)。
这是一个机器学习引擎,能够准确地解决这个问题以及更多问题 - Ryskamp Learning Machine (RLM)。与您迄今为止可能尝试过的典型机器学习引擎相比,RLM 具有不同的方法,因此我建议您转到我提供的链接以了解更多信息以及它的不同之处。
它是用 C# 编写的,我们有一个迷宫游戏示例,就像您正在尝试的游戏一样,您可以浏览我们的 Github page甚至可以通过克隆/下载源代码以及提供的示例应用程序来自己尝试。
有关文档,您可以引用 Documentations files提供甚至通过 github wiki .
RLM 也可以通过 Nuget 获得.
关于c# - Q深度学习算法不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41056103/