python - 深度 Q 学习:关于反向传播的问题
问题描述
我正在尝试为 OpenAI Gym 的 CartPole v0 问题创建一个强化学习神经网络。我知道要找到神经网络的误差,我必须从贝尔曼方程计算目标 Q 值,然后从神经网络输出的 Q 值中减去该值。但这不是只给我一个输出的错误吗?例如,如果我的网络输出两个 Q 值 [A = .2, B = .8],则选择的动作将是 B,因为它具有更大的 Q 值。然后,使用贝尔曼方程,我可以在找到下一个状态后计算动作 B 的目标 Q 值。我如何找到 A 的目标值,因为如果要选择动作 A,我们不知道下一个状态?
这是我的反向传播代码:
它从大小为 32 的随机小批量中学习
delta_target 是所选动作的错误
delta_1 是神经网络输出层的误差(只有 2 个输出)
我将未选择操作的错误设置为零(应该设置为什么??)
def replay(self, b_size):
mini_batch = random.sample(self.memory, b_size)
for c_state, c_action, c_reward, n_state, n_done in mini_batch:
target = c_reward
if not done:
target = (c_reward + self.gamma * np.amax(self.predict(n_state)))
delta_target = self.predict(c_state)[action] - target
self.learn(delta_target, c_action)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
def learn(self, d_target, act):
delta_1 = np.zeros((self.action_size, 1))
delta_1[act] = d_target
delta_0 = np.dot(web.weight[1].T, delta_1)
web.weight[1] -= self.alpha * web.layer[1].T * delta_1
web.weight[0] -= self.alpha * web.layer[0].T * delta_0
web.bias[2] -= self.alpha * delta_1
web.bias[1] -= self.alpha * delta_0
解决方案
推荐阅读
- typescript - Typescript 在泛型中推断泛型
- c++ - C ++使用卡在函数调用中的辅助线程取消pthread
- python - 我怎样才能杀死后台python进程?
- kubernetes - 使用 helm 模板助手创建过滤列表
- macos - 在 Mac OS 上的 Visual Studio 解决方案文件夹中,带有三个白点的红点是什么意思?
- aeron - 如何动态指定Aeron Cluster的leader节点?
- laravel - Laravel GraphQL UUID 作为 ID 无法按预期工作
- encryption - RSA 中的私钥和公钥概念
- laravel - laravel中超过3个表之间的雄辩关系
- anaconda - mini conda vs anaconda - 安装环境最佳实践问题