在 DQN 中,用神经网络来表示函数是很常见的f(s,a)=q^(s,a,θ)直接,它实际上代表f(s)=[q^(s,1,θ),q^(s,2,θ),q^(s,3,θ)...q^(s,Na,θ)]在哪里Na是最大动作,输入是当前状态。这就是这里发生的事情。通常这样做是为了提高性能,因为一次计算所有值比单独计算更快。
但是,在 Q 学习更新中,您无法针对您未采取的操作调整此输出值向量。您可以执行以下两项操作之一:
如果您使用的是 Keras 之类的东西,则第二种方法是可行的方法。一个具体的例子,你有两个网络n_learn并且n_targetQ 值的输出数组可能是这样的:
对于您的小批量中的每个样品(s, a, r, next_s, done)*
- 从您的学习网络计算一系列动作值
qvals = n_learn.predict(s)
- 计算 TD 目标(s,a)例如
td_target = r + max(n_target.predict(next_s))(未显示折扣因子和如何处理终端状态)
- 更改您从此示例中了解的一个数组项
qvals[a] = td_target
- 附加
s到您的train_X数据和qvals您的train_Y数据
适合小批量n_learn.fit(train_X, train_Y)
* 可以将这些计算向量化以提高效率。我将它显示为一个 for 循环,因为这样描述起来更简单