以下是PPO损失的核心部分:

# Evaluating old actions and values :    # Tensor: (2000,)
 logprobs, state_values, dist_entropy = self.policy.evaluate(old_states, old_actions)
 
 # Finding the ratio (pi_theta / pi_theta__old):  # Tensor: (2000,)
 ratios = torch.exp(logprobs - old_logprobs.detach())
     
 # Finding Surrogate Loss:
 advantages = rewards - state_values.detach()     # Tensor: (2000,) 每一步的奖励减去critic的评价等于优势函数
 surr1 = ratios * advantages                      # Tensor: (2000,)
 surr2 = torch.clamp(ratios, 1-self.eps_clip, 1+self.eps_clip) * advantages     # Tensor: (2000,)
 loss = -torch.min(surr1, surr2) + 0.5*self.MseLoss(state_values, rewards) - 0.01*dist_entropy

loss要最小化,那么让策略在优势正时增加动作概率,优势负时减少概率,熵要尽量大(输出动作的分布要尽量均衡),估算的价值要尽量接近奖励。

1. 优势函数(Advantages)的作用

advantages = rewards - state_values.detach()

优势函数表示“实际奖励”与“Critic预测的期望值”之间的差异。
• 如果 advantages > 0,说明当前动作的收益高于Critic的预期,策略应鼓励该动作
• 如果 advantages < 0,说明动作的收益低于预期,策略应抑制该动作
优化方向
• 策略(Actor)的优化目标是 最大化 surr1surr2(取决于裁剪后的 ratios)。
• 但由于代码中损失函数是 -torch.min(surr1, surr2),因此 loss最小化等价于最大化原始的 surr1/surr2
关键点:不是单纯让优势“尽量大”,而是让策略在优势正时增加动作概率,优势负时减少概率


2. 熵项(dist_entropy)的作用

loss = ... - 0.01 * dist_entropy

熵(Entropy) 衡量策略的随机性:熵越大,策略的探索性越强(动作分布更均衡)。
• 代码中 dist_entropy减去(即 -0.01 * dist_entropy),因此:
最大化熵减少总损失(因为减去一个较大的熵值)。
• 优化器会倾向于增加熵以最小化 loss
理解:熵的项鼓励策略保持探索性,防止过早收敛到次优动作。


3. Critic的价值估计(state_values

0.5 * self.MseLoss(state_values, rewards)

Critic(价值网络) 的目标是让 state_values 尽可能接近真实的 rewards
MSE损失 的优化方向是让 state_values 逼近 rewards,因此:
理解:Critic的价值估计要尽量接近实际奖励。


4. 策略优化(ratios 和裁剪)

ratios = torch.exp(logprobs - old_logprobs.detach())
surr1 = ratios * advantages
surr2 = torch.clamp(ratios, 1-self.eps_clip, 1+self.eps_clip) * advantages
loss = -torch.min(surr1, surr2) + ...

核心思想:通过限制策略更新的幅度(ratios 的裁剪),确保新策略不会偏离旧策略太远。
优化逻辑
• 如果 surr1 < surr2,则优化 surr1(未裁剪的原始比率)。
• 如果 surr2 < surr1,则优化 surr2(裁剪后的比率)。
• 最终目标是让策略在安全范围内(由 eps_clip 控制)最大化优势加权后的目标。


总结:

• 熵项鼓励动作分布均衡(探索性)。
• Critic的价值估计需要接近实际奖励。
优势函数的符号(正/负)决定了策略更新方向,而不是单纯追求“优势尽量大”。
• 策略优化的核心是在裁剪范围内最大化优势加权后的目标,而非直接优化优势的绝对值。


补充:PPO的数学目标

PPO的原始目标是最大化以下函数:

L=E[min⁡(πθ(a∣s)πθold(a∣s)A,clip(πθ(a∣s)πθold(a∣s),1−ϵ,1+ϵ)A)]L = \mathbb{E} \left[ \min\left( \frac{\pi_\theta(a|s)}{\pi_{\theta_{\text{old}}}(a|s)} A, \text{clip}\left(\frac{\pi_\theta(a|s)}{\pi_{\theta_{\text{old}}}(a|s)}, 1-\epsilon, 1+\epsilon\right) A \right) \right]L=E[min(πθold(as)πθ(as)A,clip(πθold(as)πθ(as),1ϵ,1+ϵ)A)]

代码中的 loss 是这一目标的负数形式,因此最小化 loss 等价于最大化原始目标。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐