пытался внедрить алгоритм глубокого обучения Q, имея проблему, хотя и не работает, после 100 000 игр и использования 1000 итераций для обучения каждому шагу (хотя я попытался использовать более низкие цифры для обоих) он все еще не учится. Сеть и игра в связанном изображении, http://imgur.com/a/hATfB здесь то, что происходит на каждом этапе обучения:Q алгоритм глубокого обучения не работает
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 является (вход я связан в образе, QTarget = г + гамма * MaxQ), MaxQ является максимальная активация уровня сетевого выхода или случайная (epsilon greedy). r - вознаграждение, полученное от каждого хода, -10 за препятствие и 10 для цели. (Althogh я попытался только 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
}
Любая помощь оценили.
Отступы упрощают чтение кода. –
Спасибо за это –