Actor-Critic

Wednesday, March 3, 2021

Policy Gradient的改进

在Policy Gradient的REINFORCE算法实现中,如果某个状态下采样到的复数个动作都取得了正的奖励时,那么相对获得的奖励较多的动作就会得到更高的采样概率提升。但在实际状态下,通常无法采样到一个状态下的所有动作。因此,在这种情况下算法最终会逐渐偏向于一开始取得正向奖励的动作,其他潜在的更优动作则无法被发现。

为了解决上述的问题,最好的方法就是让奖励\(R(\tau)\)有正有负。在REINFORCE算法中,目标函数的梯度为:

\[ \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N}\left(\sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(\mathbf{a}_{i, t} \mid \mathbf{s}_{i, t}\right)\right)\left(\sum_{t=1}^{T} r\left(\mathbf{s}_{i, t}, \mathbf{a}_{i, t}\right)\right) \]

可以简化写为:

\[ \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{n=1}^{N} \nabla_{\theta} \log P(\tau, \theta) R(\tau) \]

让奖励有正有负,最好的方法就是在奖励上减去一个固定的值。即把上述式子改为:

\[ \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{n=1}^{N} \nabla_{\theta} \log p_{\theta}(\tau)\left[R\left(\tau^{n}\right)-b\right] \]

其中\(b\)为一个固定的常数。可以证明减去一个\(b\)常数不影响整个梯度的计算。

\[ E\left[\nabla_{\theta} \log p_{\theta}(\tau) b\right]=\int p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau) b d \tau=\int \nabla_{\theta} p_{\theta}(\tau) b d \tau=b \nabla_{\theta} \int p_{\theta}(\tau) d \tau=b \nabla_{\theta} 1=0 \]

通常来说,常数\(b\)会使用轨迹整体奖励的均值:

\[ b=\frac{1}{N} \sum_{n=1}^{N} R(\tau) \]

Actor-Critic

\(E\left[\nabla_{\theta} \log p_{\theta}(\tau) b\right]\)的计算可知,只要常数\(b\)的取值与策略\(\pi\)无关就能够满足上述等式。当使用状态值函数\(\hat{V}\left(s_{t}\right)\)作为常数时,策略梯度可以写成:

\[ \nabla J(\theta)=\frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{i, t} \mid s_{i, t}\right)\left(\hat{Q}\left(s_{t}, a_{t}\right)-\hat{V}\left(s_{t}\right)\right) \]

其中,\(\hat{Q}\left(s_{t}, a_{t}\right)-\hat{V}\left(s_{t}\right)\)也可以被称为优势函数\(\hat{A}\left(s_{t}, a_{t}\right)\)。优势函数可以用来度量在某个状态下选取某个动作相对于平均性能的差值。通过贝尔曼方程,我们可以得到:

\[ Q\left(s_{t}, a_{t}\right)=r\left(s_{t}, a_{t}\right)+\sum_{s_{t+1}} P\left(s_{t+1} \mid s_{t}, a_{t}\right)\left[V\left(s_{t+1}\right)\right] \]

我们可以通过采样的方式估计状态转移概率,因此有:

\[ Q\left(s_{t}, a_{t}\right) \approx r\left(s_{t}, a_{t}\right)+V\left(s_{t+1}\right) \]

因此策略梯度公式可以进一步写成:

\[ \nabla J(\theta)=\frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} \nabla_{\theta} \log \pi_{\theta}\left(a_{i, t} \mid s_{i, t}\right)\left(r\left(s_{t}, a_{t}\right)+\hat{V}\left(s_{t+1}\right)-\hat{V}\left(s_{t}\right)\right) \]

其中,\(N\)为采样轨迹数。在上式中,我们需要估计状态价值函数\(V(s_{t})\)的值。因此,我们可以使用一个Critic网络来估计状态价值,并使用Actor网络给出具体策略。

Actor-Critic的流程

输入:迭代轮数\(T\),状态特征维度\(n\),动作集\(A\),步长\(\alpha, \beta\),衰减因子\(\gamma\),探索率\(\varepsilon\),Actor网络以及Critic网络

输出:Actor网络参数\(\theta\),Critic网络参数\(\omega\)

  1. 随机初始化所有的状态和动作对应的价值\(Q\)

  2. 进行\(T\)轮迭代

    1. 初始化\(S\)为当前状态序列的第一个状态,将其输入Actor网络并得到动作,获得\(\{S, A, S', R\}\)

    2. \(S,S'\)输入Critic网络,得到状态价值\(V(S), V(S')\)

    3. 计算TD误差\(\delta = R+\gamma V\left(S^{\prime}\right)-V(S)\)

    4. 使用TD误差并结合步长\(\beta\),衰减因子\(\gamma\)更新Critic网络参数\(\omega\)

    5. 更新Actor网络参数\(\theta\)

    \[ \theta = \theta + \alpha \nabla_{\theta} \log \pi_{\theta}(S_t, A) \delta \]

强化学习

DDPG

Noisy Network