如何用Q-Learning训练神经网络

时间:2018-05-17 14:25:46

标签: neural-network q-learning

我刚刚在没有神经网络的情况下实现了Q-Learning,但我坚持用神经网络实现它们。

我会给你一个伪代码,显示我的Q-Learning是如何实现的:

train(int iterations)
    buffer = empty buffer
    for i = 0 while i < iterations:

         move = null
         if random(0,1) > threshold:
             move = random_move()                 
         else
             move = network_calculate_move()

         input_to_network = game.getInput()
         output_of_network = network.calculate(input_to_network)

         game.makeMove(move)
         reward = game.getReward()

         maximum_next_q_value = max(network.calculate(game.getInput()))

         if reward is 1 or -1:            //either lost or won
             output_of_network[move] = reward
         else:
             output_of_network[move] = reward + discount_factor * max


         buffer.add(input_to_network, output_of_network)
         if buffer is full: 
             buffer.remove_oldest()
             train_network()


train_network(buffer b):
     batch = b.extract_random_batch(batch_size) 
     for each input,output in batch:
          network.train(input, output, learning_rate)  //one forward/backward pass

我现在的问题是这段代码适用于小于200的缓冲区大小。 对于超过200的任何缓冲区,我的代码不再起作用,所以我有几个问题:

  1. 此实施是否正确? (理论上)
  2. 批量大小与缓冲区大小相比有多大
  3. 通常如何训练网络?多长时间?直到达到整批的特定MSE?

1 个答案:

答案 0 :(得分:1)

  

此实施是否正确? (理论上)

是的,你的伪代码确实有正确的方法。

  

将批量大小与缓冲区大小进行比较

从算法上讲,在随机梯度下降中使用较大的批次可以减少随机梯度更新的方差(通过获取批次中梯度的平均值),这反过来又可以让你采取更大的步长,这意味着优化算法将加快进度。

体验重放缓冲区存储固定数量的最近记忆,随着新记忆的进入,旧的记忆被删除。到了训练的时候,我们只需从缓冲区中抽取一批统一的随机记忆,并用它们训练我们的网络。

虽然相关,但批量大小与缓冲区大小没有标准值。尝试使用这些超参数是深度强化学习的乐趣之一。

  

通常如何训练网络?多长时间?直到   达到整批的特定MSE?

网络通常经过培训,直到它们“收敛”,这意味着剧集之间 Q -table一再没有有意义的变化