理解DQN算法

理解DQN算法

Q-Learning算法

Q-Learning的算法如下:

对于Q-Learning,首先就是要确定如何存储Q值,最简单的想法就是用矩阵,一个s一个a对应一个Q值,所以可以把Q值想象为一个很大的表格,横列代表s,纵列代表a,里面的数字代表Q值.

维度灾难

在上面的分析中,我们使用表格来表示Q(s,a),但是这个在现实的很多问题上是几乎不可行的,因为状态实在是太多。使用表格的方式根本存不下。

怎么办呢?就是用一个函数来表示Q(s,a)。即

Q(s,a) = f(s,a)

f 可以是任意类型的函数,比如线性函数:

Q(s,a) = w_1s + w_2a + b 其中w_1,w_2,b是函数f的参数。

通过函数表示,我们就可以无所谓s到底是多大的维度,反正最后都通过矩阵运算降维输出为单值的Q。

如果我们就用w来统一表示函数f的参数,那么就有

Q(s,a) = f(s,a,w)

高维输入低维输出表示

对应一个高维状态输入,一个低维动作输出。那么怎么来表示这个函数f呢?

其实就是Q(s) \approx f(s,w),只把状态s作为输入,但是输出的时候输出每一个动作的Q值,也就是输出一个向量[Q(s,a_1),Q(s,a_2),Q(s,a_3),...,Q(s,a_n)],记住这里输出是一个值,只不过是包含了所有动作的Q值的向量而已。这样我们就只要输入状态s,而且还同时可以得到所有的动作Q值,也将更方便的进行Q-Learning中动作的选择与Q值更新。

神经网络化Q值

我们用一个深度神经网络来表示这个函数f。

以DQN为例,输入是经过处理的4个连续的84x84图像,然后经过两个卷积层,两个全连接层,最后输出包含每一个动作Q值的向量。

对于这个网络的结构,针对不同的问题可以有不同的设置。

总之,用神经网络来表示Q值非常简单,Q值也就是变成用Q网络(Q-Network)来表示。接下来就到了很多人都会困惑的问题,那就是

Q网络的loss

神经网络的训练是最优化一个损失函数loss function。因此,我们需要有样本,然后通过反向传播使用梯度下降的方法来更新神经网络的参数。

所以,我们利用Q-Learning算法为Q网络提供有标签的样本。

Q-Learning算法中,Q值的更新依靠的是利用Reward和Q计算出来的目标Q值:

R_{t+1}+\lambda \max _aQ(S_{t+1},a)

因此,我们把目标Q值作为标签,Q网络训练的损失函数就是:

上面公式是s^`,a^`  即下一个状态和动作。这里用了David Silver的表示方式,看起来比较清晰。

DQN训练

这里分析NIPS 2013提出的DQN。

具体的算法主要涉及到Experience Replay,也就是经验池的技巧,就是如何存储样本及采样问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是DQN算法的MATLAB代码示例: ``` %% Deep Q-Network (DQN) Algorithm % Initialize replay memory D to capacity N D = replay_memory(N); % Initialize action-value function Q with random weights Q = neural_network(); % Initialize target action-value function Q' with same weights as Q Q_target = Q; % For episode = 1, M do for episode = 1:M % Initialize state s_1 state = initial_state(); % For t = 1, T do for t = 1:T % With probability e select a random action a_t if rand() < e action = random_action(); % Otherwise select a_t = argmax_a Q(s_t, a; theta) else action = max_action(Q, state); end % Execute action a_t in emulator and observe reward r_t and % image x_{t+1} [reward, next_state] = emulator_step(action); % Store transition (s_t, a_t, r_t, s_{t+1}) in D D.store(state, action, reward, next_state); % Sample random minibatch of transitions (s_j, a_j, r_j, s_{j+1}) minibatch = D.sample(); % Set y_j = r_j for terminal s_{j+1} or y_j = r_j + gamma * max_a' Q_target(s_{j+1}, a'; theta') for non-terminal s_{j+1} y = calculate_targets(Q_target, minibatch, gamma); % Perform a gradient descent step on (y_j - Q(s_j, a_j; theta))^2 with respect to the network parameters theta Q = update_weights(Q, minibatch, y, alpha); % Every C steps reset Q_target = Q if mod(t, C) == 0 Q_target = Q; end % Set s_t+1 = s_{t-1} state = next_state; end end ``` 请注意,以上是一个简单的DQN算法示例,并且有很多细节需要考虑,比如网络结构、采样策略、经验回放等。此外,为了使代码更加易于理解,我省略了一些细节。如果您想了解更多关于DQN算法的信息,请查看相关文献或参考开源代码库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值