我刚刚在没有神经网络的情况下实现了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的任何缓冲区,我的代码不再起作用,所以我有几个问题:
答案 0 :(得分:1)
此实施是否正确? (理论上)
是的,你的伪代码确实有正确的方法。
将批量大小与缓冲区大小进行比较
从算法上讲,在随机梯度下降中使用较大的批次可以减少随机梯度更新的方差(通过获取批次中梯度的平均值),这反过来又可以让你采取更大的步长,这意味着优化算法将加快进度。
体验重放缓冲区存储固定数量的最近记忆,随着新记忆的进入,旧的记忆被删除。到了训练的时候,我们只需从缓冲区中抽取一批统一的随机记忆,并用它们训练我们的网络。
虽然相关,但批量大小与缓冲区大小没有标准值。尝试使用这些超参数是深度强化学习的乐趣之一。
通常如何训练网络?多长时间?直到 达到整批的特定MSE?
网络通常经过培训,直到它们“收敛”,这意味着剧集之间 Q -table一再没有有意义的变化