欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > 【强化学习】【笔记】【ch.7】DQN / AC - 把神经网络作为函数逼近

【强化学习】【笔记】【ch.7】DQN / AC - 把神经网络作为函数逼近

2025/6/20 11:07:20 来源:https://blog.csdn.net/m0_72372080/article/details/148675537  浏览:    关键词:【强化学习】【笔记】【ch.7】DQN / AC - 把神经网络作为函数逼近

1. 引述

之前的笔记,在用函数逼近时,通常都是用的线性函数。在 14 年,有一个方法使用神经网络作为函数逼近,将深度学习和强化学习结合了起来。

这个方法,将前面提到过的 Q-Learning 和深度神经网络(Deep Neural Network)相结合,提出了 Deep Q-learning Network,简称DQN

2. DQN

2.1 方法介绍

回顾一下之前笔记(ch.4)提过的 Q-Learning 的概念,这是一种逐渐逼近 Q 值的 TD 算法。当前状态下 Return 的计算公式是:(1-step)

g_t^m=r_t^m+\gamma \max_a Q(s_{t+1}^m, a)

这个方法是的背景,是假定当前状态有限,于是可以去更新一个 Q 值表。

然而,在DQN算法的背景中,状态是无限的或者说不可数的。比如 DQN 就被用在雅达利的游戏中,输入是雅达利2600(一款很老的游戏机)的游戏画面,所以状态是无限的。

在函数逼近那一节的笔记(ch.5)中提到过,对于无限的状态,Q 值表无法存储。于是需要通过拟合一个函数,来逼近真实 Q 值。

DQN 使用神经网络作为函数逼近真实Q值,其 Return 计算公式如下:

g_t^m=r_t^m+\gamma \max \text{DQN}(s_{t+1}^m)

DQN 是一个神经网络,输入是状态,输出是当前所有 Action 的一个 Q 值,如下图所示。

假设我们之后往上、下、左、右四个方向走的动作,那么输出就是 4 个神经元,每个神经元代表其对应动作的 Q 值。

2.2 两个神经网络

既然 DQN 是一个神经网络,那免不了要去训练参数。训练参数就需要有真实值和预测值。对于真实值,就是之前提到的这个公式:

g_t^m=r_t^m+\gamma \max \text{DQN}(s_{t+1}^m)

虽然说是真实值,但是其实是一阶差分的预测值。不过我们把它当真实值来用,毕竟这也是 Q-Learning 等一系列 TD 算法的做法。

而当前状态的预测值就很简单了:

\hat{g}_t^m = \text{DQN}(s_{t}^m)

可以看到,由于真实值和预测值都依赖 DQN 的参数,所以训练效果会非常不稳定。因此,引入了类似 off policy 的技巧,用两个神经网络。一个 Online 网络用来输出真实值,一个 Target 网络用来输出预测值。

在训练一开始,为这两个网络随机初始化相同的参数。随后,Online 网络输出预测值:

\hat{g}_t^m = \text{DQN}_{\text{online}}(s_{t}^m)

Target 网络输出真实值:

g_t^m=r_t^m+\gamma \max \text{DQN}_{\text{target}}(s_{t+1}^m)

每采样一次 Trajectory,更新一次 Online 网络,而不更新 Target 网络。直到过了 K 个 epoch 之后,比如过了 100 个 epoch,就用 Online 网络的参数去覆盖 Target 网络的参数,然后继续训练,以此类推。

在别人介绍 DQN 的时候,有一些专用术语,比如 “经验回放”,这其实就是把 Agent 和环境的交互过程记录了下来,组成一个四元组(比如 s0, a0, r1, s1)

2.3 策略

策略采用 \epsilon-\text{greedy} 算法(ch.3),对于 Online 网络的预测 Q 值:

\hat{g}_t^m = \text{DQN}_{\text{online}}(s_{t}^m)

有一定概率随机走,剩下的概率就采取 Q 值最大的动作

2.4 训练过程

假设现在有一个 3 * 3 的格子,Agent 从左上开始走,走到右下给予 10 点奖励并终止,走到下方给予 -10 点奖励并终止,其他格子基于 -1 点奖励。如下图所示:

第一步是经验回放过程,也叫做数据收集过程。这个过程就是记录 Agent 从开始到结束的一整个 Trajectory。每一次SARS过程,记录成一个四元组:(s_t,a_t,r_t,s_{t+1})

SARS过程:基于当前状态 s_t ,作出决策 a_t ,然后从环境中获得奖励 r_{t} ,并从环境中获取下一状态 s_{t+1} 的这一整个过程。

比如,一次 Agent 的路线可能是这样:S1, S2, S5, S8

此时的经验回放内容如下:

[

        (S1, Right, -1, S2),

        (S2, Down, -1, S5),

        (S5, Down, -1, S8)

]

接着,基于经验回放的内容,计算损失并反向传播,损失函数使用均方误差。经验回放中的每一个 4 元组,都可以计算一次损失并反向转播。由于计算方式相同,所以我只用其中一个 4 元组举例。

对于 4 元组:(S1, Right, -1, S2),这意味着 Agent 将 S1 输入到 Online 网络中,获得了一系列 Q 值。比如说,获得的 Q 值如下:

Online 网络:

        Q(S1, Right) = -0.67

        Q(S1, Left) = 1.36

        Q(S1, Up) = -1.63

        Q(S1, Down) = 0.72

根据 4 元组 (S1, Right, -1, S2) 的内容,我们知道 Agent 基于 \epsilon-\text{greedy} 算法,采取了向右走的策略,并获得奖励:r_1=-1,和下一个状态 S2。

那么此时的预测值就是:(0.67 是当前 Online 网络对于向右走这一策略的 Q 值)

\hat{g}_1= \text{DQN}_{\text{online}}(\text{S1})=-0.67

随后,我们将 S2 输入到 Target 网络中。Target 网络也会返回一系列 Q 值,比如说返回的 Q 值如下:

Target 网络:

        Q(S2, Right) = 1.02

        Q(S2, Left) = -0.66

        Q(S2, Up) = -1.36

        Q(S2, Down) = 1.42

我们将其中最大的值取出来,也就是 \max \text{DQN}_{\text{target}}(\text{S2})=1.42

然后基于这个最大值计算出真值:(衰减因子设置为 1)

g_1=r_1+\gamma \max \text{DQN}_{\text{target}}(\text{S2})=-1+1.42=0.42

最后用真值和预测值计算损失(均方误差):

loss=\frac{1}{2}\left \| g_1-\hat{g}_1 \right \|^2=\frac{1}{2}\times[0.42-(-0.67)]^2=0.59405

随后用这个值进行反向传播

2.5 后续研究

这个 DQN 网络是 14 年的论文提出的方法,存在许多缺陷。后续也有不少在这个网络上做的改进,比如 Double-DQN(2015)、Rainbow-DQN(2017)

3. Actor-Critic 方法(AC)

3.1 方法思想

首先,有一个 Actor 网络,这个网络接收当前的状态作为输入,输出一个动作,如下图所示:

然后,有一个 Critic 网络,这个网络的目的是用来给 Actor 网络输出的动作打分。所以 Critic 网络接收当前的状态和 Actor 网络输出的动作作为输入,输出一个得分:

随后,Actor 网络基于 Critic 网络的打分来改进自己的输出:

但是 Critic 网络在初始化的时候参数随机,也就是说它并不能很好的作为一个裁判打出合适的分数。为此,Critic 网络就需要学习如何打分,学习的方式就是结合环境的 Reward:

在训练阶段,Critic 网络辅助 Actor 网络学习。在测试阶段,只有 Actor 网络输出,Critic 网络不再使用。

3.2 函数逼近

这个方法同样也是用了两个神经网络。不过和 REINFORCE 不同的是,这里使用函数逼近 V 值函数,而不是策略函数。

在之前的笔记(ch.2)我们知道,V 值可以写成这个:

V_{\pi}(s) = \sum_a \pi(a \mid s) \cdot Q_{\pi}(s, a)

于是,就用两个神经网络,分别去逼近公式中的策略函数 \pi(a|s) 和 Q 值函数 Q_\pi(s,a)。分别定义这两个神经网络为:

\pi(a|s;\boldsymbol \theta) \to \pi(a|s) \quad \quad q(s,a;\boldsymbol w) \to Q_\pi(s,a)

于是,V 值就可以写成:

V_\pi(s; \boldsymbol{\theta}, \boldsymbol{w})\approx \sum_a \pi(a \mid s; \boldsymbol{\theta}) \cdot q(s, a; \mathbf{w}).

其中,\pi(a|s;\boldsymbol \theta) 被叫做 Actor 网络;q(s,a;\boldsymbol w) 被叫做 Critic 网络。

 3.3 Critic 网络

如上图所示。Critic 网络接收当前的状态和 Actor 网络输出的行为的概率分布采样得到的一个具体的作为输入(不是把整个概率分布作为输入)。

在分别提取特征+特征拼接之后,输出一个预测的 Q 值,这个 Q 值被试做 Critic 网络打的分数。(如果在某些情况下,动作是离散的,那么就用 One-Hot 编码表示动作)

在更新这个网络的时候,和 DQN 一样,由于是神经网络,就需要预测值和真实值。真实值同样是通过一阶差分(ch.4)获取。

首先输入当前状态 s_t 给 Actor 网络,返回得到一个采样的动作 a_t,随后从环境中获得奖励 r_t 和下一个状态 s_{t+1},接着将 s_{t+1} 输入到 Actor 网络采样得到一个动作 a_{t+1},然后计算下一个状态的预测 Q 值 q(s_{t+1}, a_{t+1}; \mathbf{w}),最后得到真实值:

y_t = r_t + \gamma \cdot q(s_{t+1}, a_{t+1}; \mathbf{w})

而当前状态的预测值就是:

\hat{y}_t = q(s_{t}, a_{t}; \mathbf{w})

最后用均方误差作为损失函数,计算损失并反向传播:

\text{Loss:} \quad L(\mathbf{w}) = \frac{1}{2} \left[ \hat{y}_t - y_t \right]^2

3.4 Actor 网络

如上图所示。Actor 网络用来预测动作的概率分布。输入当前状态,在经过神经网络的卷积层(Conv)+全连接层(Dense)+ Softmax 之后输出每个动作的概率分布。

既然是概率分布,那么做决策采取哪个动作的时候,就不需要如同 DQN 一样用 \epsilon-\text{greedy} 算法来决策了,只需要采样概率即可。

那么这个网络的参数 \theta 要如何更新呢?

依旧是用梯度下降,先把 V 值公式变形,把这个式子对 \theta 求偏导:

V_\pi(s; \boldsymbol{\theta}, \boldsymbol{w})\approx \sum_a \pi(a \mid s; \boldsymbol{\theta}) \cdot q(s, a; \mathbf{w}).

因为 \boldsymbol{w} 这个参数在推导过程中不需要,于是我们就对下面这个式子求导:

V_{\pi}(S;\theta) = \sum_a \pi(a \mid s, \theta) \cdot q_{\pi}(s, a)

我们这里求的是近似梯度,假设 q_{\pi}(s, a) 和 \theta 无关,于是有:

\begin{aligned} \frac{\partial V_{\pi}(S;\theta)}{\partial \theta} &= \frac{\partial}{\partial \theta} \sum_a \pi(a \mid s, \theta) \cdot q_{\pi}(s, a) \\ &= \sum_a q_{\pi}(s, a) \cdot \frac{\partial}{\partial \theta} \pi(a \mid s, \theta) \\ &= \sum_a q_{\pi}(s, a) \cdot \pi(a \mid s, \theta) \cdot \frac{\partial}{\partial \theta} \log \pi(a \mid s, \theta) \\ &= \mathbb{E}_{a \sim \pi(\cdot \mid s, \theta)} \left[ q_{\pi}(s, a) \cdot \frac{\partial}{\partial \theta} \log \pi(a \mid s, \theta) \right]. \end{aligned}

这里,有两个关键的部分。第一个是 “和的偏导 = 偏导的和”,随后是这一步:

\sum_a q_{\pi}(s, a) \cdot \frac{\partial}{\partial \theta} \pi(a \mid s, \theta) = \sum_a q_{\pi}(s, a) \cdot \pi(a \mid s, \theta) \cdot \frac{\partial}{\partial \theta} \log \pi(a \mid s, \theta) \\

这一步是怎么变换的呢,其实就和重要性采样那部分采用的 Trick 是一样的,见:


【强化学习】【笔记】【ch.3】蒙特卡洛策略-CSDN博客


其中的 3.2 节

为了估计这个期望,我们把期望里面的式子单独拎出来:

g(a,s) = q_{\pi}(s, a) \cdot \frac{\partial}{\partial \theta} \log \pi(a \mid s, \theta)

最后,我们这里是省略了 \boldsymbol{w} 这个参数的,我们把这个参数加回去:

g(a,s) = q_{\pi}(s, a, \boldsymbol{w}) \cdot \frac{\partial}{\partial \theta} \log \pi(a \mid s, \theta)

这个公式是一个梯度的公式,转化成损失函数的话就是这样:

\text{Loss} = -q_\pi(s,a) \cdot \log \pi_\theta (a|s)

为什么是这个呢,因为反向传播的时候,就是这个 Loss 求导(梯度)去传。这个 Loss 求导回去就是 g(a,s)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词