我试图在Keras中实现q学习算法。根据文章,我发现了这些代码行。
for state, action, reward, next_state, done in sample_batch:
target = reward
if not done:
#formula
target = reward + self.gamma * np.amax(self.brain.predict(next_state)[0])
target_f = self.brain.predict(state)
#shape (1,2)
target_f[0][action] = target
print(target_f.shape)
self.brain.fit(state, target_f, epochs=1, verbose=0)
if self.exploration_rate > self.exploration_min:
self.exploration_rate *= self.exploration_decay
变量sample_batch
是一个数组,其中包含来自收集到的数据的样本state, action, reward, next_state, done
。
我还发现了以下q学习公式
为什么等式(代码)中没有-
符号?我发现np.amax
返回数组的最大值或沿轴的最大值。当我打电话给self.brain.predict(next_state)
时,我得到[[-0.06427538 -0.34116858]]
。那么它在这个方程中扮演了预测的角色吗?在前进的过程中,target_f
是当前状态的预测输出,然后我们还将在这一步骤中附加奖励。然后,我们在当前的state
(X
)和target_f
(Y
)上训练模型。我有几个问题。 self.brain.predict(next_state)
的作用是什么,为什么没有减号?为什么我们对一个模型进行两次预测?例如self.brain.predict(state) and self.brain.predict(next_state)[0]
答案 0 :(得分:3)
为什么没有-在方程式(代码)中签名?
这是因为损失计算是在fit函数中完成的。
reward + self.gamma * np.amax(self.brain.predict(next_state)[0])
这与损失功能中的 target 组件相同。
在拟合方法中,将按以下给出的方法计算喀拉斯损失。 对于单个训练数据点(神经网络的标准符号),
x = input state
y = predicted value
y_i = target value
loss(x) = y_i - y
在此步骤中,目标-预测在内部进行。
为什么我们要对一个模型进行两次预测?
好问题!!!
target = reward + self.gamma * np.amax(self.brain.predict(next_state)[0])
在此步骤中,我们将预测下一个状态的值,以便在采取特定操作a(表示为Q(s,a))的情况下为状态s计算目标值
> target_f = self.brain.predict(state)
在此步骤中,我们将计算可在状态s下执行的每个操作的所有 Q值。
target = 1.00 // target is a single value for action a
target_f = (0.25,0.25,0.25,0.25) //target_f is a list of values for all actions
然后执行以下步骤。
target_f[0][action] = target
我们仅更改所选操作的值。 (如果我们执行操作3)
target_f = (0.25,0.25,1.00,0.25) // only action 3 value will change
现在target_f将是我们试图以正确形状进行预测的实际目标值。