我很确定你必须:
等待内存中有足够的数据(100 个条目等),然后取出一个小批量(例如,10 个随机元素),运行反向传播 10 次 - 每个选定元素一次。
然后,你取结果梯度的平均值,最后用这个平均梯度校正你的网络。
后,
将元素放回内存中(你从哪里拿走它们)
具有高优先级的样本可能会在训练中多次使用。减少这些常见样本的权重基本上告诉网络,“在这些样本上进行训练,但没有过多强调;它们很快就会再次出现。”
或者扔掉它,取而代之的是新的记忆。
然后继续玩游戏,再添加 30 个示例,然后使用一批 10 个元素进行另一个权重校正会话
我指的是“会话”,意思是一系列反向传播,其中结果是用于最终校正网络的平均梯度。
编辑:我在针对神经网络训练神经网络方面的另一个问题是,您是针对一个完全独立的网络进行自我训练,还是针对其先前版本进行训练。并且在针对其他神经网络进行训练时,是否将 epsilon 贪心调低以使对立的神经网络不使用任何随机移动。
考虑只使用一个网络。假设我们的记忆库包含几个元素:
...
{...}
{stateFrom, takenActionIndex, takenActionQval, immediateReward, stateNext } <-- a single element
{...}
{...}
{...}
...
在校正会话期间使用您记忆中的每个元素时(一个元素接一个元素),您需要:
- 选择一个元素。如图所示,它包含 stateFrom、采取的行动(行动 X)、行动 X 的 qvalue、您收到的奖励、它导致的状态。
- 像处于“下一个状态”(在该元素中提到)一样运行 forward prop。获得最好的 [action Y, qvalue]。事实上,你的动作 Y 不一定是具有最高 q 值的动作。相反,它可能是来自“下一个状态”的“epsilon-greedy 决定行动”——然后你将拥有SARSA 而不是 Q-learning
- 获得“行动 X 的 qvalue”与立即奖励 +“行动 Y 的 qvalue ”不同的增量。
- 获取您从银行中选择的其他几个元素的增量
- 使用每个增量,计算网络权重的梯度张量。将这些梯度平均为单个张量。用这个张量惩罚你的网络的权重。
我故意规避了一件事——你实际上并没有存储takenActionQval,因为当你从MemoryBank 获取它的元素时它们可能已经过时了。您必须在反向传播期间重新计算这些分数。
因此,您正在针对类似但之前的校正会话中的网络版本进行训练。
请注意,您没有存储 ["next state", action Y],因为当您选择它进行训练时(可能您没有为几个小批量选择它),网络可能对该操作具有不同的 q 值Y。
您还可以将您的网络复制到第二个网络(目标网络),但只能复制一次,例如每 200 个 timesteps。同时,在每 30 个时间步之后,您仍将继续惩罚您的网络与目标网络的任何差异。
请注意,为什么这样做的直觉是因为:Q 值从终点到起点有点“流动”,每次新的旅程都有一点。而且您总是将当前状态更新为后继状态。并针对其自己的(甚至更远的)继任者训练继任者状态。