一、策略函数
策略函数 $\pi(a|s)$ 的本质是一个概率密度函数(Probability Density Function, PDF)。它将从环境观察到的状态 $s$ 作为输入,输出所有动作中每个动作的概率。在需要执行动作时,就从这些动作概率中随机抽取一个动作来执行。
二、策略网络
因为从环境观察到的状态 $s$ 常常有无数多种,所以可以使用神经网络 $\pi(a|s; \theta)$ 来近似策略函数 $\pi({a|s})$,其中 $\theta$ 是神经网络的参数。神经网络 $\pi(a|s; \theta)$ 就是策略网络。
因为策略网络输出的是各个动作的概率,而各个动作概率的总和应该是1,所以策略网络最后的激活函数通常是 softmax 以保证策略网络输出值的总和为1。
三、如何训练策略网络
根据状态价值函数的定义有(为便于推导,假定动作是离散的):
使用神经网络 $\pi(a|s; \theta)$ 来近似策略函数 $\pi({a|s})$ 得到:
我们知道,当找到最优价值函数时,就解决了马尔科夫决策问题。即当我们找到一个策略网络的参数值 $\hat{\theta}$ 使得 $V(s; \hat{\theta})$ 的值最大,我们就找到了一个最优的策略网络。
所以,令:
可以使用 梯度上升 方法来更新策略网络的参数值 $\theta$ :
- 从环境观察到的状态 $s$ 。
- 更新策略网络( $\beta$ 是学习率)
四、策略梯度
策略梯度就是使用神经网络 $\pi(a|s; \theta)$ 来近似策略函数 $\pi({a|s})$ 后得到的状态价值函数对神经网络参数 $\theta$ 的导数,即 $\frac{\partial V(s; \theta)}{\partial \theta}$ 。
- 上面的计算过程中,假设了 $Q_{\pi}(s, a)$ 不依赖于 $\theta$ ,这是为了简化推导,便于理解。实际上即使将 $Q_{\pi}(s, a)$ 对于 $\theta$ 的导数也考虑进去,得到的结果也是一样的。
- 链式求导法则
即:
五、计算策略梯度
5.1 离散动作
如果动作是离散的,比如动作空间是 $\mathcal{A} \in \{ \text{“left”}, \text{“right”}, \text{“fire”} \}$。可以使用 公式4.1 :
对每个动作 $a \in \mathcal{A}$ ,计算
计算策略梯度
5.2 连续动作
如果动作是连续的,比如动作空间是 $\mathcal{A} = [0,1]$。可以使用 公式4.2 :
因为直接求期望很难,所以可以对期望做蒙特卡洛(Monte Carlo)近似,步骤如下:
- 从概率密度函数 $\pi(\cdot | s; \theta)$ 中随机抽样得到一个动作 $\hat{a}$ 。
计算
- 显然有 $\mathbb{E}_A \left[ \mathbf{g}(A, \theta) \right]= \frac{\partial V(s; \theta)}{\partial \theta}$ 。
- 因为 $\hat{a}$ 是从 $\pi(\cdot | s; \theta)$ 中随机抽样得到的,所以 $\mathbf{g}(\hat{a}, \theta)$ 是 $\frac{\partial V(s; \theta)}{\partial \theta}$ 的一个无偏估计。
使用 $\mathbf{g}(\hat{a}, \theta)$ 来近似 $\frac{\partial V(s; \theta)}{\partial \theta}$ (蒙特卡洛近似)。
上面的这种方法对离散的动作也是有效的。
六、使用策略梯度来更新策略网络
完整的步骤如下:
- 从环境观察到的状态 $s_t$ 。
- 从概率密度函数 $\pi(\cdot | s_t; \theta_t)$ 中随机抽样得到一个动作 $a_t$ 。
- 计算动作价值 $q_t \approx Q_{\pi}(s_t, a_t)$ 。
- 计算策略梯度 $\mathbf{d}_{\theta, t} = \frac{\partial \log \pi(a_t | s_t; \theta)}{\partial \theta} \mid_{\theta = {\theta}_t}$ 。
- 计算策略梯度的近似值 $\mathbf{g}(a_t, {\theta}_t) = q_t \cdot \mathbf{d}_{\theta, t}$ 。
- 更新策略网络 $\theta_{t+1} = \theta_t + \beta \cdot \mathbf{g}(a_t, \theta_t)$ 。
在上面的步骤3中,计算 $q_t$ 的方式有两种。
6.1 REINFORCE
使用观测到的 $g_t$ 来代替 $Q_{\pi}(s_t, a_t)$ 。
- 用策略网络 $\pi(\cdot | s_t; \theta_t)$ 控制 agent 从游戏开始到游戏结束玩一局完整的游戏,得到游戏轨迹 $s_1, a_1, r_1, s_2, a_2, r_2, \cdots , s_T, a_T, r_T$ 。
- 计算所有时刻的折扣回报 $g_t = \sum_{k=t}^T \gamma^{k-t} r_k$ 。
- 因为 $Q_\pi (s_t, a_t) = \mathbb{E}[G_t]$ ,所以可以使用折扣回报 $g_t$ 来近似 $Q_\pi (s_t, a_t)$ ,即 $q_t = g_t$ 。
6.2 Actor-Critic Method
使用神经网络来近似 $Q_{\pi}(s_t, a_t)$。
我们已经使用神经网络 $\pi(a|s; \theta)$ 来近似策略函数 $\pi({a|s})$,其中 $\theta$ 是神经网络的参数。同时,我们再使用神经网络 $q(s,a;\mathbf{w})$ 来近似价值函数 $Q_{\pi}(s, a)$,其中 $\mathbf{w}$ 是神经网络的参数。
训练时,策略网络 $\pi(a|s; \theta)$ 相当于运动员(Actor),而价值网络 $q(s,a;\mathbf{w})$ 相当于裁判(Critic):
- 训练 Actor 的目的是让 Critic 的打分尽可能的高,即更新策略网络 $\pi(a|s; \theta)$ 使状态价值 $V(s; \theta, \mathbf{w})$ 的值增加。 Actor 依靠 Critic 的打分来改进自己。
- 而训练 Critic 的目的则是让它对 Actor 的打分更准确,即更新价值网络 $q_{\pi}(s, a; \mathbf{w})$ 以能够更好的估计未来奖励的总和。 Critic 依靠环境给与的奖励来改进自己。
- 当 Critic 的打分比较准确且 Actor 的得分都比较高时,就能得到一个比较好的策略网络了。
在推理时,只需要使用 Actor 来控制 agent 动作就可以了,推理时的不需要 Critic 。
算法完整的训练流程如下:
从环境获得状态 $s_t$ 输入策略网络 $\pi(a|s; \theta)$ ,并从得到的动作概率 $\pi(a|s_t; \theta)$ 中抽样得到动作 $a_t$ 。
在环境中执行动作 $a_t$ 并获取到新的环境状态 $s_{t+1}$ 和奖励 $r_t$ 。
将新的环境状态 $s_{t+1}$ 输入策略网络中 $\pi(a|s; \theta)$ 并随机抽样得到一个临时的动作 $\hat{a}_{t+1}$ (这个动作不会在环境中执行,仅用于更新价值网络)。
随机抽样保证样本的无偏性,这样才能用来做蒙特卡洛近似,详见5.2 连续动作。
计算动作 $a_t$ 和 $\hat{a}_{t+1}$ 的动作价值
计算 TD error
对价值网络 $q(s,a;\mathbf{w})$ 求导
使用时序差分学习来更新价值网络( $\alpha$ 是学习率)
其中 ${\delta}_t \cdot \mathbf{d}_{\mathbf{w}, t}$ 是 TD error $\delta_t$ 的均方差关于参数 $\mathbf{w}$ 的导数
对策略网络 $\pi(a|s; \theta)$ 求导
使用梯度上升方法来更新策略网络( $\beta$ 是学习率)
注意:实现中大多都使用第 5 步计算出来的 ${\delta}_t$ 来替代上面公式中的 $q_t$ 得到
这两种方式都是对的,使用 $q_t$ 是标准算法,而使用 ${\delta}_t$ 则是 Policy Gradient with Baseline 。 使用了 Baseline 的方法不影响期望,但是降低了方差,能让算法收敛更快,所以效果更好。
参考:策略学习 Policy-Based Reinforcement Learning
Policy Gradient 论文:Policy Gradient Methods for Reinforcement Learning with Function Approximation