哪家公司做企业网站稳定优惠,榆次小学网站建设,网站维护的基本概念,电脑装机网站PPO强化学习算法详解
一、什么是PPO#xff1f;
PPO是一种策略梯度方法#xff0c;由OpenAI在2017年提出。它的核心思想是#xff1a;在更新策略时#xff0c;不要让新策略偏离旧策略太远#xff0c;这样训练更稳定。
为什么需要PPO#xff1f;
传统的策略梯度方法PPO是一种策略梯度方法由OpenAI在2017年提出。它的核心思想是在更新策略时不要让新策略偏离旧策略太远这样训练更稳定。为什么需要PPO传统的策略梯度方法如REINFORCE更新步长难以控制容易导致更新太大 → 策略崩溃更新太小 → 训练缓慢二、PPO的核心公式1.重要性采样比率r t ( θ ) π θ ( a t ∣ s t ) π θ o l d ( a t ∣ s t ) r_t(\theta) \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}rt(θ)πθold(at∣st)πθ(at∣st)π θ \pi_\thetaπθ新策略π θ o l d \pi_{\theta_{old}}πθold旧策略表示新旧策略选择同一动作的概率比2.PPO-Clip目标函数最常用L C L I P ( θ ) E t [ min ( r t ( θ ) ⋅ A t , clip ( r t ( θ ) , 1 − ϵ , 1 ϵ ) ⋅ A t ) ] L^{CLIP}(\theta) \mathbb{E}_t[\min(r_t(\theta) \cdot A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1\epsilon) \cdot A_t)]LCLIP(θ)Et[min(rt(θ)⋅At,clip(rt(θ),1−ϵ,1ϵ)⋅At)]其中A t A_tAt优势函数Advantage表示动作好坏ϵ \epsilonϵ裁剪参数通常取0.2clip ( x , a , b ) \text{clip}(x, a, b)clip(x,a,b)将x限制在[a, b]范围内三、数值例子假设一个简单场景智能体在某状态下有3个动作可选。输入数据状态 s_t: [1.0, 0.5] 动作 a_t: 动作1 奖励 r_t: 10 优势值 A_t: 2.5 (计算得出表示这个动作比平均好) 裁剪参数 ε: 0.2策略概率旧策略 π_old(动作1|s_t) 0.3 新策略 π_new(动作1|s_t) 0.5计算过程步骤1计算重要性采样比率r t π n e w ( a t ∣ s t ) π o l d ( a t ∣ s t ) 0.5 0.3 1.667 r_t \frac{\pi_{new}(a_t|s_t)}{\pi_{old}(a_t|s_t)} \frac{0.5}{0.3} 1.667rtπold(at∣st)πnew(at∣st)0.30.51.667步骤2计算未裁剪项未裁剪项 r t ⋅ A t 1.667 × 2.5 4.167 \text{未裁剪项} r_t \cdot A_t 1.667 \times 2.5 4.167未裁剪项rt⋅At1.667×2.54.167步骤3计算裁剪项clip(r_t, 1-ε, 1ε) clip(1.667, 0.8, 1.2) 1.2 (因为1.667 1.2) 裁剪项 1.2 × 2.5 3.0步骤4取最小值L C L I P min ( 4.167 , 3.0 ) 3.0 L^{CLIP} \min(4.167, 3.0) 3.0LCLIPmin(4.167,3.0)3.0输出结果最终损失值3.0这个会用来更新神经网络四、关键理解为什么要裁剪看上面的例子比率 r_t 1.667说明新策略比旧策略更偏爱这个动作但PPO将其限制在1.21ε防止更新过激如果优势A_t是负的坏动作裁剪会限制在0.81-ε直观解释如果 A_t 0好动作 - r_t 太大1.2→ 被限制不让新策略过度自信 如果 A_t 0坏动作 - r_t 太小0.8→ 被限制不让新策略过度惩罚五、完整例子对比情况r_tA_t未裁剪项裁剪后r_t裁剪项最终Loss例11.6672.54.1671.23.03.0 ✓例20.52.51.250.82.01.25 ✓例31.12.52.751.12.752.75 ✓注意例3r_t1.1在[0.8, 1.2]范围内所以不需要裁剪。总结PPO通过裁剪机制让策略更新稳扎稳打既保证学习效率又避免崩溃是目前最流行的强化学习算法之一你理解了吗有任何疑问欢迎继续提问问题:这里的新策略和旧策略是哪来的是通过正在训练的模型生成的吗新旧策略的来源是的它们都是正在训练的模型但处于不同的训练阶段旧策略 π_old (θ_old)就是当前已训练好的神经网络的参数在一轮训练开始前先冻结这个版本用它来收集经验数据与环境交互新策略 π_new (θ)是正在更新中的同一个神经网络参数在训练过程中不断调整目标是变得更好但不能离旧策略太远PPO训练流程完整版第k轮训练 1️⃣ 保存当前模型参数 θ_old ← θ拷贝一份作为旧策略 2️⃣ 用旧策略收集数据 for 每个episode: 用 π_θ_old 与环境交互 收集(状态s, 动作a, 奖励r, π_old(a|s)) 3️⃣ 计算优势函数 A_t 4️⃣ 更新策略多次迭代 for epoch in range(K): # 通常K3~10 for 每个batch: 计算 π_θ(a|s) # 新策略概率 计算 r_t π_θ(a|s) / π_old(a|s) 计算 PPO loss 梯度下降更新 θ 5️⃣ 回到步骤1开始新一轮数值例子训练过程假设我们训练一个智能体玩简化版游戏初始状态模型一个神经网络随机初始化 输入游戏状态[位置,速度]输出3个动作的概率[左,右,跳]第1轮训练阶段1保存旧策略θ_oldcopy(θ)# 拷贝当前参数# 此时的输出例如状态[1.0, 0.5]π_old([左,右,跳])[0.3,0.5,0.2]阶段2收集数据# 用旧策略玩100局游戏forepisodeinrange(100):stateenv.reset()whilenotdone:actionsample_from(π_old(state))# 用旧策略选动作next_state,reward,doneenv.step(action)存储(state,action,reward,π_old(action|state))# 收集到的一条数据示例数据点1:状态:[1.0,0.5]动作:右π_old(右|状态)0.5# 记录下来奖励:10阶段3更新模型# 现在开始更新θ产生新策略forepochinrange(5):# 用同一批数据更新5次forbatchindata:# 用当前模型新策略重新计算概率π_newmodel(state)# 新策略输出# 对于上面的数据点1π_new([左,右,跳])[0.25,0.6,0.15]# 参数更新后π_new(右|状态)0.6# 计算比率r_tπ_new(右)/π_old(右)0.6/0.51.2# 计算PPO losslosscompute_ppo_loss(r_t,A_t)# 梯度下降θθ-lr*∇loss关键点对比时间点旧策略 π_old新策略 π_new说明收集数据时π_old model(θ_old)不存在旧策略固定用于采样第1次更新后π_old model(θ_old)π_new model(θ_1)θ_1 ≠ θ_old第5次更新后π_old model(θ_old)π_new model(θ_5)θ_5 离 θ_old 更远为什么这样设计问题直接用新数据不行吗# ❌ 错误做法普通策略梯度whileTrue:收集数据用当前策略 更新一次 丢弃数据# 浪费PPO的优势# ✅ PPO做法whileTrue:收集数据用θ_old 用同一批数据更新多次3-10次# 数据利用率高但用重要性采样修正偏差直观理解把模型想象成一个学生旧策略θ_old - 上周的你已经考完试了 - 试卷已经答完数据已收集 新策略θ - 现在的你正在复习 - 根据试卷错题学习 - 但不能学得面目全非裁剪限制 下一轮 - 这周的你变成旧的你 - 继续循环完整代码框架classPPO:def__init__(self):self.policy_netNeuralNetwork()# 策略网络deftrain(self):foriterationinrange(1000):# 1. 保存旧策略old_paramscopy(self.policy_net.parameters())# 2. 收集数据trajectories[]forepisodeinrange(100):states,actions,rewards,old_probsself.collect_episode()trajectories.append((states,actions,rewards,old_probs))# 3. 计算优势advantagesself.compute_advantages(trajectories)# 4. 更新策略多个epochforepochinrange(5):forbatchintrajectories:# 新策略概率new_probsself.policy_net(states)# 计算比率rationew_probs/old_probs# 这里# PPO losslossself.ppo_loss(ratio,advantages)# 更新loss.backward()optimizer.step()总结旧策略 本轮开始时的模型快照新策略 正在训练中的模型它们是同一个网络的不同版本PPO通过比较两者控制更新幅度这下清楚了吗用户:我看有的PPO公式还有KL散度约束Claude:常好的观察PPO确实有两个版本让我详细讲解PPO的两个版本1️⃣PPO-Clip我之前讲的L C L I P ( θ ) E t [ min ( r t ( θ ) ⋅ A t , clip ( r t ( θ ) , 1 − ϵ , 1 ϵ ) ⋅ A t ) ] L^{CLIP}(\theta) \mathbb{E}_t[\min(r_t(\theta) \cdot A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1\epsilon) \cdot A_t)]LCLIP(θ)Et[min(rt(θ)⋅At,clip(rt(θ),1−ϵ,1ϵ)⋅At)]2️⃣PPO-Penalty带KL散度约束L K L P E N ( θ ) E t [ r t ( θ ) ⋅ A t − β ⋅ K L [ π θ o l d ∣ ∣ π θ ] ] L^{KLPEN}(\theta) \mathbb{E}_t[r_t(\theta) \cdot A_t - \beta \cdot KL[\pi_{\theta_{old}}||\pi_\theta]]LKLPEN(θ)Et[rt(θ)⋅At−β⋅KL[πθold∣∣πθ]]什么是KL散度KL散度Kullback-Leibler Divergence衡量两个概率分布的差异K L [ π o l d ∣ ∣ π n e w ] ∑ a π o l d ( a ∣ s ) log π o l d ( a ∣ s ) π n e w ( a ∣ s ) KL[\pi_{old}||\pi_{new}] \sum_a \pi_{old}(a|s) \log\frac{\pi_{old}(a|s)}{\pi_{new}(a|s)}KL[πold∣∣πnew]a∑πold(a∣s)logπnew(a∣s)πold(a∣s)直观理解KL散度越大 → 新旧策略差异越大KL散度 0 → 两个策略完全相同KL散度 0 → 策略有差异数值例子KL散度计算场景设置状态 s: [1.0, 0.5] 可选动作: [左, 右, 跳] 旧策略概率分布: π_old [0.2, 0.5, 0.3] 新策略概率分布: π_new [0.3, 0.4, 0.3]计算KL散度K L [ π o l d ∣ ∣ π n e w ] ∑ i 1 3 π o l d i log π o l d i π n e w i KL[\pi_{old}||\pi_{new}] \sum_{i1}^3 \pi_{old}^i \log\frac{\pi_{old}^i}{\pi_{new}^i}KL[πold∣∣πnew]i1∑3πoldilogπnewiπoldi逐项计算动作1左:0.2× log(0.2/0.3)0.2× log(0.667)0.2×(-0.405)-0.081动作2右:0.5× log(0.5/0.4)0.5× log(1.25)0.5×0.2230.112动作3跳:0.3× log(0.3/0.3)0.3× log(1.0)0.3×00总和:KL-0.0810.11200.031结果KL散度 0.031差异较小PPO-Penalty 完整例子输入数据状态: [1.0, 0.5] 选择的动作: 右 优势值 A_t: 2.5 βKL惩罚系数: 0.5 旧策略: π_old(右|s) 0.5, π_old [0.2, 0.5, 0.3] 新策略: π_new(右|s) 0.6, π_new [0.3, 0.4, 0.3]计算过程步骤1计算比率项r t 0.6 0.5 1.2 r_t \frac{0.6}{0.5} 1.2rt0.50.61.2比率项 r t ⋅ A t 1.2 × 2.5 3.0 \text{比率项} r_t \cdot A_t 1.2 \times 2.5 3.0比率项rt⋅At1.2×2.53.0步骤2计算KL散度如上K L 0.031 KL 0.031KL0.031步骤3计算最终损失L K L P E N 3.0 − 0.5 × 0.031 3.0 − 0.0155 2.9845 L^{KLPEN} 3.0 - 0.5 \times 0.031 3.0 - 0.0155 2.9845LKLPEN3.0−0.5×0.0313.0−0.01552.9845输出损失值 2.9845两个版本对比PPO-Clip vs PPO-Penalty特性PPO-ClipPPO-Penalty约束方式硬裁剪 [1-ε, 1ε]软惩罚减去KL项超参数ε 0.2固定β需要自适应调整计算复杂度低只计算比率高需计算完整分布实践效果更稳定更常用 ✓理论优美但调参难实现难度简单复杂图形化理解假设横轴是策略更新幅度纵轴是Loss PPO-Clip (裁剪方式) Loss | 平台期 | _____ | / | / |_/_____________ 更新幅度 ↑ 裁剪点(1ε) PPO-Penalty (惩罚方式) Loss | | /---越来越平缓 | / | / | / |/______________ 更新幅度 ↑ KL惩罚逐渐增大自适应KL改进版实际中PPO-Penalty会动态调整βifKLKL_target/1.5:ββ/2# KL太小减小惩罚elifKLKL_target ×1.5:ββ ×2# KL太大增加惩罚例子β调整过程第1轮: β0.5, KL0.02 → KL太小 → β0.25 第2轮: β0.25, KL0.06 → 合适 → β不变 第3轮: β0.25, KL0.15 → KL太大 → β0.5完整对比例子同样的场景两种方法的结果场景r_t 1.8新策略偏离较大 A_t 2.0 ε 0.2 β 0.5 KL 0.08PPO-Clip未裁剪:1.8×2.03.6裁剪后:clip(1.8,0.8,1.2)1.2裁剪项:1.2×2.02.4Lossmin(3.6,2.4)2.4# 被裁剪了PPO-Penalty比率项:1.8×2.03.6惩罚项:0.5×0.080.04Loss3.6-0.043.56# 只被轻微惩罚结论Clip方法限制更强为什么PPO-Clip更流行优点不需要调参ε0.2通常就够了计算简单不需要完整分布效果稳定硬约束更可靠PPO-Penalty的问题β需要精心调整计算开销大不同环境需要不同的β实际应用# OpenAI Gym中的PPO大多用Clip版本classPPOClip:defloss(self,ratio,advantage):clippedtorch.clamp(ratio,1-0.2,10.2)return-torch.min(ratio*advantage,clipped*advantage).mean()# 研究中有时用Penalty版本classPPOPenalty:defloss(self,ratio,advantage,old_dist,new_dist):klcompute_kl(old_dist,new_dist)return-(ratio*advantage-self.beta*kl).mean()总结表方法公式核心约束强度使用场景PPO-Clipmin(r·A, clip®·A)硬约束实际应用推荐PPO-Penaltyr·A - β·KL软约束研究/理论分析混合版本同时使用两者双重保险极端稳定性要求推荐做法初学者/实践用PPO-Clip简单有效研究/理论可以尝试PPO-Penalty生产环境PPO-Clip 监控KL散度你现在理解KL散度在PPO中的作用了吗