Neural network 如何用Q-学习训练神经网络

Neural network 如何用Q-学习训练神经网络,neural-network,reinforcement-learning,q-learning,Neural Network,Reinforcement Learning,Q Learning,我只是在没有神经网络的情况下实现了Q学习,但我一直在用神经网络实现Q学习 我将为您提供一个伪代码,说明我的Q-Learning是如何实现的: train(int iterations) buffer = empty buffer for i = 0 while i < iterations: move = null if random(0,1) > threshold: move = random_mov

我只是在没有神经网络的情况下实现了Q学习,但我一直在用神经网络实现Q学习

我将为您提供一个伪代码,说明我的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
列车(整数次迭代)
缓冲区=空缓冲区
当i<迭代次数时,对于i=0:
move=null
如果随机(0,1)>阈值:
移动=随机移动()
其他的
移动=网络计算移动()
输入到网络=game.getInput()
网络的输出=网络。计算(网络的输入)
游戏。移动(移动)
奖励=游戏。获取奖励()
max\u next\u q\u value=max(network.calculate(game.getInput()))
如果奖励为1或-1://则为输赢
_网络的输出_[移动]=奖励
其他:
网络[移动]的输出=奖励+折扣系数*最大值
添加(输入到网络,输出网络)
如果缓冲区已满:
buffer.remove_oldest()
列车网络()
列车网络(缓冲器b):
批次=b.提取随机批次(批次大小)
对于每个输入,批量输出:
网络训练(输入、输出、学习率)//一次向前/向后传球
我现在的问题是,这段代码适用于小于200的缓冲区大小。 对于任何超过200的缓冲区,我的代码不再工作,因此我有几个问题:

  • 这个实现正确吗?(理论上)
  • 批量大小与缓冲区大小相比应该有多大
  • 人们通常如何训练网络?要多久?直到达到整个批次的特定MSE
  • 这个实现正确吗?(理论上)

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

    批量大小与缓冲区大小相比应该有多大

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

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

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

    人们通常如何训练网络?要多久?直到 是否达到整批的特定MSE

    网络通常经过训练,直到它们“汇聚”,这意味着在不同的情节之间,Q表中反复没有有意义的变化

    这个实现正确吗?(理论上)

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

    批量大小与缓冲区大小相比应该有多大

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

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

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

    人们通常如何训练网络?要多久?直到 是否达到整批的特定MSE

    网络通常经过训练,直到它们“汇聚”,这意味着在不同的情节之间,Q表中反复没有有意义的变化