2

пытался внедрить алгоритм глубокого обучения 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 

} 

Любая помощь оценили.

+0

Отступы упрощают чтение кода. –

+0

Спасибо за это –

ответ

1

Судя связанного изображения, при условии, что это так же, как лабиринт игры где у вас есть входы для позиции игрока и выход в качестве направления, в которое игрок должен двигаться (вверх, вниз, влево или вправо).

Вот компьютерный механизм обучения, который способен решить именно это и многое другое - Ryskamp Learning Machine (RLM). У RLM есть другой подход по сравнению с типичными машинами для машинного обучения, которые вы, возможно, попробовали далеко, поэтому я предлагаю вам перейти к ссылке, которую я предоставил, чтобы узнать больше об этом и что отличает ее.

Это написано на C#, и у нас есть пример игры в лабиринт, как и тот, который вы пытаетесь найти, с помощью которого вы можете просматривать наш Github page или даже попробовать сами, клонируя/загружая исходный код вместе с примерами приложений предоставлена.

Для документации вы можете обратиться к Documentations files или даже через github wiki.

RLM также доступен через Nuget.