策略梯度(Policy Gradient)方法
策略梯度(Policy Gradient)方法是强化学习中的一种重要范式,它直接对策略进行参数化,并通过梯度上升(或下降)来优化策略。与值函数方法不同,策略梯度方法不依赖于估计状态值或动作值,而是直接学习一个从状态到动作的映射(即策略)。以下是策略梯度方法的基本原理和工作流程:
1. 策略表示
在策略梯度方法中,策略通常用一个参数化的概率分布
π
θ
(
a
∣
s
)
\pi_\theta(a|s)
πθ(a∣s) 表示,其中
a
a
a 是动作,
s
s
s 是状态,
θ
\theta
θ 是策略的参数。
例子:在一个简单的神经网络实现中,输入为环境的状态 s s s,输出为每个动作的概率分布。对于离散动作空间,可以使用 softmax 函数将最后一层的输出转换为概率分布;对于连续动作空间,则可能使用高斯分布等其他形式。
2. 目标函数
目标是最大化期望回报(Expected Return),即累积奖励。数学上,目标函数可以写成:
J
(
θ
)
=
E
τ
∼
π
θ
[
R
(
τ
)
]
J(\theta) = E_{\tau \sim \pi_\theta}[R(\tau)]
J(θ)=Eτ∼πθ[R(τ)]
其中
τ
\tau
τ 表示轨迹(trajectory),即一系列状态、动作和奖励的序列,
R
(
τ
)
R(\tau)
R(τ) 是该轨迹的总回报。
为了优化这个目标函数,我们需要计算其关于参数
θ
\theta
θ 的梯度:
∇
θ
J
(
θ
)
=
E
τ
∼
π
θ
[
∑
t
=
0
T
∇
θ
log
π
θ
(
a
t
∣
s
t
)
R
t
]
\nabla_\theta J(\theta) = E_{\tau \sim \pi_\theta}\left[\sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) R_t\right]
∇θJ(θ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)Rt]
这里
T
T
T 是轨迹的长度,
R
t
R_t
Rt 代表从时间步
t
t
t 开始直到结束的累计奖励。
3. 策略梯度算法的工作流程
(1) 初始化
初始化策略网络的参数 θ \theta θ 和其他必要的变量(如经验回放缓冲区)。
(2) 收集经验
在每个回合(episode)中,根据当前策略
π
θ
(
a
∣
s
)
\pi_\theta(a|s)
πθ(a∣s) 选择动作并与环境交互。
记录下每一步的状态
s
t
s_t
st、采取的动作
a
t
a_t
at 以及获得的即时奖励
r
t
r_t
rt。
(3) 计算回报
对于收集到的经验,计算每个时间步的回报
R
t
R_t
Rt。这通常是未来所有奖励的折扣累加:
R
t
=
∑
k
=
t
T
γ
k
−
t
r
k
R_t = \sum_{k=t}^{T} \gamma^{k-t} r_k
Rt=k=t∑Tγk−trk
其中
γ
\gamma
γ 是折扣因子(
0
<
γ
≤
1
0 < \gamma \leq 1
0<γ≤1),用于平衡即时奖励和长期奖励的重要性。
(4) 更新策略
使用上述公式计算策略梯度:
∇
θ
J
(
θ
)
≈
1
N
∑
i
=
1
N
∑
t
=
0
T
i
∇
θ
log
π
θ
(
a
i
,
t
∣
s
i
,
t
)
R
i
,
t
\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=0}^{T_i} \nabla_\theta \log \pi_\theta(a_{i,t}|s_{i,t}) R_{i,t}
∇θJ(θ)≈N1i=1∑Nt=0∑Ti∇θlogπθ(ai,t∣si,t)Ri,t
其中
N
N
N 是采样得到的轨迹数量,
T
i
T_i
Ti 是第
i
i
i 条轨迹的长度。
根据计算出的梯度更新策略参数
θ
\theta
θ,例如使用梯度上升法:
θ
←
θ
+
α
∇
θ
J
(
θ
)
\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)
θ←θ+α∇θJ(θ)
其中
α
\alpha
α 是学习率。
常见问题解答
Q1: 负对数概率是一个正数吗?
A: 是的,负对数概率(-\log(\pi_\theta(a_t|s_t))
)几乎总是正数。因为对数函数在 (0, 1) 区间内的值为负数,取负值后变为正数。这确保了模型能够通过最大化对数概率来优化策略。
Q2: 得分低的动作概率大怎么办?
A: 当某个动作带来了较低的累积回报且其选择概率较高时,损失函数会自动调整以减少这种情况的发生。尽管负对数概率较小,但由于累积回报较低甚至为负值,neg_log_prob * discounted_rewards
的结果仍然较大,导致总的损失增加。这促使模型降低这些低回报动作的选择概率。
Q3: neg_log_prob * discounted_rewards
这一步算出来的是什么?
A: neg_log_prob * discounted_rewards
计算的是每个时间步的动作选择相对于其产生的长期回报的重要性。如果某个动作导致了一个高回报,相应的负对数概率会被赋予更高的权重;反之,如果某个动作带来的回报较低或为负,则相应的负对数概率会被赋予较低的权重。这种机制帮助模型学习到哪些动作序列能带来更高的累积回报。
Q4: 如何利用经验池中的状态、动作和折扣回报来计算损失?
A: 首先将经验池中的状态、动作和折扣回报转换为适合模型输入的格式,然后通过策略网络前向传播得到每个动作的概率分布,接着计算负对数概率并与对应的折扣回报相乘得到加权损失,最后基于计算出的损失使用优化器执行反向传播并更新策略网络的参数。
策略梯度中的损失机制详解
问题引入
那是不是可以这样理解,概率小时 discounted_rewards[t]
大则会 loss 变大,概率大时 discounted_rewards[t]
大则 loss 增加不会太多,这个 loss 可以防止得分高的动作概率小?
是的,你的理解是正确的。以下是对这一机制的详细解析。
1. 负对数概率与折扣回报的乘积
在策略梯度方法中,我们使用负对数概率(neg_log_prob
)与折扣回报(discounted_rewards
)的乘积来构建损失函数。具体来说:
loss = − E τ ∼ π θ [ ∑ t = 0 T log π θ ( a t ∣ s t ) R t ] \text{loss} = -\mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T} \log \pi_\theta(a_t|s_t) R_t \right] loss=−Eτ∼πθ[t=0∑Tlogπθ(at∣st)Rt]
其中:
- log π θ ( a t ∣ s t ) \log \pi_\theta(a_t|s_t) logπθ(at∣st) 是选择动作 a t a_t at 在状态 s t s_t st 下的概率的对数。
- R t R_t Rt 是从时间步 t t t 开始的累积折扣回报。
在代码实现中,我们会计算每个时间步的负对数概率并将其与该时间步的累积回报相乘:
neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=actions)
loss = tf.reduce_mean(neg_log_prob * discounted_rewards)
2.概率小时 discounted_rewards[t] 大则 loss 变大
当某个动作的概率较低时(即 π θ ( a t ∣ s t ) \pi_\theta(a_t|s_t) πθ(at∣st) 较小),其对应的负对数概率 − log ( π θ ( a t ∣ s t ) ) -\log(\pi_\theta(a_t|s_t)) −log(πθ(at∣st)) 会较大。如果该动作带来了较高的累积回报(即 discounted_rewards[t] 较大),那么 neg_log_prob * discounted_rewards[t] 的值也会较大,导致总的损失增加。
这意味着模型会“惩罚”那些带来高回报但被低概率选择的动作。为了减少这种损失,模型会在后续的学习过程中调整参数,以增加这些高回报动作的选择概率。
3.概率大时 discounted_rewards[t] 大则 loss 增加不会太多
相反地,如果某个动作的概率较高(即 π θ ( a t ∣ s t ) \pi_\theta(a_t|s_t) πθ(at∣st) 较大),其对应的负对数概率 − log ( π θ ( a t ∣ s t ) ) -\log(\pi_\theta(a_t|s_t)) −log(πθ(at∣st)) 会较小。即使该动作带来了较高的累积回报(即 discounted_rewards[t] 较大),由于负对数概率已经很小,neg_log_prob * discounted_rewards[t] 的值也不会太大,因此总的损失增加不多。
这表明模型不会过多“惩罚”那些带来高回报且已经被高概率选择的动作。在这种情况下,模型认为当前策略已经较好地选择了高回报动作,因此不需要大幅调整参数。
4. 防止得分高的动作概率小
通过上述机制,策略梯度方法能够有效地防止那些带来高回报的动作被赋予过低的概率。具体来说:
- 如果某个动作带来了高回报但其选择概率较低,模型会通过增加相应的损失来“惩罚”这种情况,促使策略网络调整参数,提高该动作的选择概率。
- 相反,如果某个动作带来了高回报且其选择概率已经较高,模型不会对其施加过多的“惩罚”,从而保持当前的良好策略。
5.他是执行一批连续的动作后,开始计算lose然后根据lose训练吗?
是的,在策略梯度(Policy Gradient)方法中,智能体通常会执行一系列连续的动作,直到回合结束(即环境返回 done=True),然后基于整个回合的经验来计算损失并进行模型训练。这种方式有助于更好地评估策略的效果,因为单个动作的好坏往往难以直接衡量,而通过累积奖励可以更准确地反映策略的整体表现。