更新 Deep Q 网络的目标输出是什么

人工智能 神经网络 强化学习 q学习 dqn 深度学习
2021-10-25 03:09:18

我正在尝试为具有连续状态空间和离散化动作空间的宠物问题实施深度 Q 学习。

基于表的 Q-Learning 算法更新 Q 表的单个条目 - 即单个Q(s,a). 然而,神经网络输出表格的一整行——即给定状态下每个可能动作的 Q 值。那么,网络的目标输出向量应该是什么?

我一直在尝试让它与以下内容一起使用:

q_values = model(state)
action = argmax(q_values)
next_state = env.step(state, action)
next_q_values = model(next_state)
max_next_q = max(next_q_values)

target_q_values = q_values
target_q_values[action] = reward(next_state) + gamma * max_next_q

结果是我的模型倾向于针对每个可能的动作收敛于一组固定值——换句话说,无论输入状态是什么,我都会得到相同的 Q 值。(我的猜测是,这是因为,因为只有 1 个 Q 值被更新,所以训练告诉我的模型,它的大部分输出已经很好了。)

我应该将什么用于训练的目标输出向量?我应该计算每个动作的目标 Q 值,而不仅仅是一个吗?

2个回答

正如你所说,a的输出Qnetwork 通常是给定状态的所有动作的值。让我们称之为输出xR|A|. 要使用平方贝尔曼误差训练您的网络,您需要首先计算标量目标y=r(s,a)+maxaQ(s,a). 然后,为了训练网络,我们采用向量x=x并改变a它的第一个元素等于y, 在哪里a是你在状态中采取的行动s; 称这个修改过的向量xa. 我们计算损失L(x,xa)并通过它反向传播以更新我们网络的参数。

请注意,当我们使用Q计算y我们通常使用某种形式的目标网络;这可以是Q其中参数仅更新ith 更新或网络,其权重在每次更新后使用 polyak 平均值与主网络权重进行更新。

从您的代码来看,您的操作选择似乎可能会导致您出现一些问题。据我所知,你总是贪婪地对待你的Q-功能。你应该考虑采取行动ϵ-贪婪地,即概率ϵ采取随机行动,否则贪婪地行动。通常你从ϵ=1并在每次随机动作被降低到某个小值(例如 0.05)时将其衰减。

有几种方法可以定义 DQN 的架构。最常见的方法是接受状态并输出所有可能动作的价值函数——这导致了具有多个输出的 DQN。另一种效率较低的方法包括将状态动作作为输入并输出单个实际值——这种方法通常被避免,因为我们需要多次运行模型以获得不同动作的估计。

重放缓冲区用于存储(S,A,R,S)使用您遇到的转换ϵ- 软政策。我们从重放缓冲区中采样其中一个转换并计算价值函数的估计值(S,A)IEQ^(S,A,θ)然后我们计算一个目标如下。

target=R+maxaQ^(S,a,θ)

假设您使用第一个模型,则可以使用平方误差损失函数,定义如下,并将参数修改为该函数

L(θ)=(targetQ^(S,A,θ))2

假设现在目标是固定的(我会在一分钟内解释这一点),只有Q(S,A,θ)是一个函数θ在损失函数中。Q(S,A,θ)对应于 DQN 的一个输出节点,因此,正如您已经强调的那样,在执行 EBP 时,参数会更新,以便我们使这一节点的值趋向于指定的目标。

这就是 Q-learning 的工作原理,我们使用行为策略生成的样本来创建L(θ)然后调整参数以最小化成本。随着我们对越来越多的样本执行此操作,网络希望能够找到一种方法来适应迄今为止训练过的每个样本(更加强调最近的样本)。

至于你的问题,你确定你正在训练多个不同的样本,而不仅仅是一个特定的样本吗?它可能只是你监督的一个错误。


解释 θ

我使用了一个稍微不同的符号,θ,对于用于生成自举估计的参数,maxaQ^(S,a,θ).θ只匹配到θ每一个nthstep 因为我们希望尽可能保持目标不变。这样做的原因是因为 Q-learning 在使用神经网络时不一定会收敛,部分原因是自举可能会由于状态泛化而导致优化的发散。通过使用这个θ我们帮助防止这样的事情发生。

最终,重放缓冲区和引导的固定参数的想法是尝试将 RL 问题转换为监督学习问题,因为我们在使用 DNN 时更了解如何处理监督学习问题。