# [0705] Task06 DDPG 算法、PPO 算法、SAC 算法【理论 only】

news2024/7/30 7:58:59
  • easy-rl PDF版本 笔记整理 P5、P10 - P12
  • joyrl 比对 补充 P11 - P13
  • OpenAI 文档整理 ⭐ https://spinningup.openai.com/en/latest/index.html

在这里插入图片描述

在这里插入图片描述

最新版PDF下载
地址:https://github.com/datawhalechina/easy-rl/releases
国内地址(推荐国内读者使用)
链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us6a

easy-rl 在线版本链接 (用于 copy 代码)
参考链接 2:https://datawhalechina.github.io/joyrl-book/

其它:
【勘误记录 链接】
——————
5、深度强化学习基础 ⭐️
开源内容:https://linklearner.com/learn/summary/11
——————————

在这里插入图片描述
图片来源

近端策略优化(proximal policy optimization,PPO)

同策略:要学习的智能体 和 与环境交互的智能体 是相同的。
异策略:要学习的智能体 和 与环境交互的智能体 不相同

策略梯度: 需要很多时间采样数据

同策略     ⟹ 重要性采样     ~~~\overset{重要性采样}{\Longrightarrow}~~~    重要性采样    异策略

PPO: 避免两个分布相差太多。 同策略算法
1、本来的优化项 J ( θ , θ ′ ) J(\theta,\theta^\prime) J(θ,θ)
2、约束项: θ \theta θ θ ′ \theta^\prime θ 输出动作的 KL 散度 ( θ \theta θ θ ′ \theta^\prime θ 越相似越好)

PPO 有一个前身:信任区域策略优化(trust region policy optimization,TRPO)
TRPO 很难处理,因为它把 KL 散度约束当作一个额外的约束,没有放在目标函数里,所以很难计算。因此我们一般就用 PPO,而不使用 TRPO 。PPO 与 TRPO 的性能差不多,但 PPO 在实现上比 TRPO 容易得多。

KL 散度:动作的距离。执行某个动作的概率分布 的距离。

PPO 算法有两个主要的变种:近端策略优化惩罚(PPO-penalty)和近端策略优化裁剪(PPO-clip)。

在这里插入图片描述

性能差不多,更易实现
信任区域策略优化(trust region policy optimization,TRPO)
近端策略优化(proximal policy optimization, PPO
近端策略优化惩罚(PPO-penalty)
近端策略优化裁剪(PPO-clip)

——————————
P10 稀疏奖励 问题
1、设计奖励。 需要领域知识
把 最终奖励 分配到 每个相关动作上, 如何呢?

2、好奇心
内在好奇心模块(intrinsic curiosity module,ICM)
输入: a t , s t a_t,s_t at,st
输出: s ^ t + 1 \hat s_{t+1} s^t+1
网络的预测值 s ^ t + 1 \hat s_{t+1} s^t+1 与真实值 s t + 1 s_{t+1} st+1 越不相似, r t i r_t^i rti 越大

r t i r_t^i rti : 未来的状态越难以被预测,动作的奖励越大。鼓励 冒险 和 探索。

  • 指标过于单一,可能 只学到无用的

特征提取器 (feature extractor)

网络 2:
输入: 向量 ϕ ( s t ) {\bm \phi}(s_{t}) ϕ(st) ϕ ( s t + 1 ) {\bm \phi}(s_{t+1}) ϕ(st+1)

预测动作 a ^ \hat a a^ 与 真正动作 越接近越好。

在这里插入图片描述

3、课程学习

简单 ——> 困难

逆课程学习(reverse curriculum learning):
从最终最理想的状态 [我们称之为黄金状态(gold state)] 开始,依次去寻找距离黄金状态最近的状态作为想让智能体达到的阶段性的“理想”状态。当然,我们会在此过程中有意地去掉一些极端的状态,即太简单、太难的状态。

4、分层强化学习(hierarchical reinforcement learning,HRL)
将智能体的策略分为高层次策略和低层次策略,高层次策略根据当前状态决定如何执行低层次策略。

————————
P11 模仿学习
不清楚 奖励 的场景

模仿学习(imitation learning,IL)
示范学习(learning from demonstration)
学徒学习(apprenticeship learning)
观察学习(learning by watching)

有明确的奖励:棋类游戏、电玩
无法给出明确的奖励: 聊天机器人

收集专家示范:人类开车的记录、人的对话

反推,专家是因为什么样的奖励函数才会采取这些行为。
逆强化学习是先找出奖励函数,找出奖励函数以后,再用强化学习找出最优演员。

第三人称视角模仿学习(third person imitation learning)技术

————————
P12 深度确定性策略梯度(deep deterministic policy gradient,DDPG)

在这里插入图片描述

使用了经验回放 异策略

消融实验 【控制变量法】分析每一个约束条件对于对战结果的影响。


joyrl:

DDPG_连续

在需要确定性策略且连续动作空间的前提下,这类算法将是比较稳定的基线算法

连续动作空间 的 DQN

深度确定性策略梯度算法 (deep deterministic policy gradient, DDPG)

经验回放机制可以减少样本之间的相关性,提高样本的有效利用率,并且增加训练的稳定性。

缺点:
1、无法用于 离散动作空间
2、高度依赖超参数
3、高度敏感的初始条件。 影响算法的收敛性和性能
4、易陷入局部最优。

  • 由于采用了确定性策略,可能会导致算法陷入局部最优,难以找到全局最优策略。为了增加探索性,需要采取一些措施,如加入噪声策略或使用其他的探索方法。

软更新的好处是更加平滑缓慢,可以避免因权重更新过于迅速而导致的震荡,同时降低训练发散的风险。

双延迟 确定性策略梯度算法 (twin delayed DDPG, TD3)

双延迟确定性策略梯度算法

三点改进:双 Q 网络、延迟更新、躁声正则
双 Q 网络:两个 Q 网络, 取 Q 值较小的。 应对 Q 值的过估计问题, 提高算法的稳定性 和 收敛性。

延迟更新:让 actor 的更新频率低于 critic 的更新频率

  • 三思而后行

噪声更像是一种正则化的方式,使得值函数更新更加平滑

OpenAI Gym 库_摆杆直立 Pendulum_TD3

OpenAI 关于 TD3 的文档界面链接

TD3 论文PDF 链接

PPO_连续/离散动作空间 【OpenAI 201708】

强化学习中最为泛用的 PPO 算法
离散 + 连续
快速稳定, 调参简单
基线算法

遇事不决 PPO

在实践中一般用 clip 约束,因为它更简单,计算成本较低,而且效果也更好。

off-policy 算法由于可以利用历史经验,一般使用经验回放来存储和重复利用之前的经验,数据利用效率较高

PPO 是 on-policy 算法

  • 虽然 重要性采样部分 使用了 旧的 actor 采样的样本,但我们并没有直接使用这些样本去更新策略,而是使用重要性采样先将数据分布不同导致的误差进行了修正,即使两者样本分布之间的差异尽可能地缩小。换句话说,就可以理解为重要性采样之后的样本虽然是由旧策略采样得到的,但可以近似为从更新后的策略中得到的,即我们要优化的 actor 和采样的 actor 是同一个。

——————————————————

—— OpenAI 文档_PPO

OpenAI 文档
论文 arXiv 界面链接: Proximal Policy Optimization Algorithms

PPO: on-policy 算法、适用于 离散或 连续动作空间。可能局部最优

PPO 的动机与 TRPO 一样:如何利用现有的数据在策略上采取最大可能的改进 step,而不会改动过大而意外导致性能崩溃?
TRPO 试图用一种复杂的二阶方法来解决这个问题,PPO 则是一种一阶方法,它使用了一些其他技巧来保持新策略与旧策略的接近。
PPO方法的实现要简单得多,而且从经验上看,其执行效果至少与 TRPO 一样好。

PPO 有两种主要的变体:PPO-Penalty 和 PPO-Clip。

  • PPO-Penalty 近似地解决了像 TRPO 这样的 KL 约束更新,但在目标函数中惩罚了 KL-divergence,而不是使其成为硬约束,并在训练过程中自动调整惩罚系数,使其适当缩放。
  • PPO-Clip 在目标函数中没有 KL-divergence,也没有约束。而是依靠对目标函数的特定裁剪来去除 新策略远离旧策略 的激励。
    PPO-Clip (OpenAl 使用的主要变体)。

在这里插入图片描述

PPO-Clip 算法伪码

在这里插入图片描述

算法: PPO-Clip
1:输入:初始策略参数 θ 0 \theta_0 θ0,初始值函数参数 ϕ 0 \phi_0 ϕ0
2: f o r   k = 0 , 1 , 2 , …   d o {\bf for} ~ k=0,1,2,\dots~ {\bf do} for k=0,1,2, do
3:        ~~~~~~       通过在环境中运行策略 π k = π ( θ k ) \pi_k=\pi(\theta_k) πk=π(θk) 收集轨迹集 D k = { τ i } {\cal D}_k=\{\tau_i\} Dk={τi}
4:        ~~~~~~       计算奖励 (rewards-to-go) R ^ t       \hat R_t~~~~~ R^t      R ^ t \hat R_t R^t 的计算规则
5:        ~~~~~~       计算优势估计,基于当前值函数 V ϕ k V_{\phi_k} Vϕk A ^ t \hat A_t A^t (使用任何优势估计方法)       ~~~~~       ▢ 当前有哪些优势估计方法?
6:        ~~~~~~       通过最大化 PPO-Clip 目标函数 更新策略:
            ~~~~~~~~~~~            
            θ k + 1 = arg ⁡ max ⁡ θ 1 ∣ D k ∣ T ∑ τ ∈ D k ∑ t = 0 T min ⁡ ( π θ ( a t ∣ s t ) π θ k ( a t ∣ s t ) A π θ k ( s t , a t ) , g ( ϵ , A π θ k ( s t , a t ) ) ) ~~~~~~~~~~~\theta_{k+1}=\arg\max\limits_\theta\frac{1}{|{\cal D}_k|T}\sum\limits_{\tau\in{\cal D}_k}\sum\limits_{t=0}^T\min\Big(\frac{\pi_{\theta} (a_t|s_t)}{\pi_{\theta_k}(a_t|s_t)}A^{\pi_{\theta_k}}(s_t,a_t),g(\epsilon,A^{\pi_{\theta_k}}(s_t,a_t))\Big)            θk+1=argθmaxDkT1τDkt=0Tmin(πθk(atst)πθ(atst)Aπθk(st,at),g(ϵ,Aπθk(st,at)))       ~~~~~       ▢ 策略更新公式 如何确定?
            ~~~~~~~~~~~            
            ~~~~~~~~~~~             π θ k \pi_{\theta_k} πθk:更新前的策略参数向量。 重要性采样。从旧的策略采样。
            ~~~~~~~~~~~            
            ~~~~~~~~~~~            一般 随机梯度上升 + Adam
7:        ~~~~~~       均方误差回归 拟合 值函数:
            ~~~~~~~~~~~            
            ϕ k + 1 = arg ⁡ min ⁡ ϕ 1 ∣ D k ∣ T ∑ τ ∈ D k ∑ t = 0 T ( V ϕ ( s t ) − R ^ t ) 2 ~~~~~~~~~~~\phi_{k+1}=\arg \min\limits_\phi\frac{1}{|{\cal D}_k|T}\sum\limits_{\tau\in{\cal D}_k}\sum\limits_{t=0}^T\Big(V_\phi(s_t)-\hat R_t\Big)^2            ϕk+1=argϕminDkT1τDkt=0T(Vϕ(st)R^t)2
            ~~~~~~~~~~~            
            ~~~~~~~~~~~            一般 梯度下降
8: e n d   f o r \bf end ~for end for
             ~~~~~~~~~~~~             

$\dots$     … ~~~\dots    

g ( ϵ , A ) = { ( 1 + ϵ ) A      A ≥ 0 ( 1 − ϵ ) A A < 0 g(\epsilon,A)=\left\{\begin{aligned}&(1+\epsilon)A ~~~~&A\geq0\\ &(1-\epsilon)A&A<0\end{aligned}\right. g(ϵ,A)={(1+ϵ)A    (1ϵ)AA0A<0

在这里插入图片描述

论文里的优势估计:

A ^ t = − V ( s t ) + r t + γ r t + 1 + ⋯ + γ T − t + 1 r T − 1 + γ T − t V ( s T ) ⏟ R ^ t ? ? ? \hat A_t=-V(s_t)+\underbrace{r_t+\gamma r_{t+1}+\cdots+\gamma^{T-t+1}r_{T-1}+\gamma^{T-t}V(s_T)}_{\textcolor{blue}{\hat R_t???}} A^t=V(st)+R^t??? rt+γrt+1++γTt+1rT1+γTtV(sT)

在这里插入图片描述

Δ t = r t + γ V ( s t + 1 ) − V ( s t ) \Delta_t =r_t+\gamma V(s_{t+1})-V(s_t) Δt=rt+γV(st+1)V(st)
r t = Δ t − γ V ( s t + 1 ) + V ( s t ) r_t=\Delta_t - \gamma V(s_{t+1})+V(s_t) rt=ΔtγV(st+1)+V(st)

代入 A ^ t \hat A_t A^t 表达式

A ^ t = − V ( s t ) + r t + γ r t + 1 + γ 2 r t + 2 + ⋯ + γ T − t r T − 2 + γ T − t + 1 r T − 1 + γ T − t V ( s T ) = − V ( s t ) + r t + γ r t + 1 + ⋯ + γ T − t + 1 r T − 1 + γ T − t V ( s T ) = − V ( s t ) +         Δ t − γ V ( s t + 1 ) + V ( s t ) +         γ ( Δ t + 1 − γ V ( s t + 2 ) + V ( s t + 1 ) ) +         γ 2 ( Δ t + 2 − γ V ( s t + 3 ) + V ( s t + 1 ) ) +         ⋯ +         γ T − t ( Δ T − t − γ V ( s T − t + 1 ) + V ( s T − t ) ) +         γ T − t + 1 ( Δ T − 1 − γ V ( s T ) + V ( s T − 1 ) ) +         γ T − t V ( s T ) = Δ t + γ Δ t + 1 + γ 2 Δ t + 2 + ⋯ + γ T − t Δ T − t + γ T − t + 1 Δ T − 1 \begin{aligned}\hat A_t&=-V(s_t)+r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\cdots+\gamma^{T-t}r_{T-2}+\gamma^{T-t+1}r_{T-1}+\gamma^{T-t}V(s_T)\\ &=-V(s_t)+r_t+\gamma r_{t+1}+\cdots+\gamma^{T-t+1}r_{T-1}+\gamma^{T-t}V(s_T)\\ &=-V(s_t)+\\ & ~~~~~~~\Delta_t - \gamma V(s_{t+1})+V(s_t)+\\ & ~~~~~~~\gamma (\Delta_{t+1} - \gamma V(s_{t+2})+V(s_{t+1}))+\\ & ~~~~~~~\gamma^2(\Delta_{t+2} - \gamma V(s_{t+3})+V(s_{t+1}))+\\ & ~~~~~~~\cdots+\\ & ~~~~~~~\gamma^{T-t}(\Delta_{T-t} - \gamma V(s_{T-t+1})+V(s_{T-t}))+\\ & ~~~~~~~\gamma^{T-t+1}(\Delta_{T-1} - \gamma V(s_T)+V(s_{T-1}))+\\ & ~~~~~~~\gamma^{T-t}V(s_T)\\ &=\Delta_t+\gamma\Delta_{t+1}+\gamma^2\Delta_{t+2}+\cdots+\gamma^{T-t}\Delta_{T-t}+\gamma^{T-t+1}\Delta_{T-1}\end{aligned} A^t=V(st)+rt+γrt+1+γ2rt+2++γTtrT2+γTt+1rT1+γTtV(sT)=V(st)+rt+γrt+1++γTt+1rT1+γTtV(sT)=V(st)+       ΔtγV(st+1)+V(st)+       γ(Δt+1γV(st+2)+V(st+1))+       γ2(Δt+2γV(st+3)+V(st+1))+       +       γTt(ΔTtγV(sTt+1)+V(sTt))+       γTt+1(ΔT1γV(sT)+V(sT1))+       γTtV(sT)=Δt+γΔt+1+γ2Δt+2++γTtΔTt+γTt+1ΔT1

在这里插入图片描述

通过消除 策略大幅改变的诱因,clipping 起到了正则化的作用。超参数 ϵ \epsilon ϵ 对应于新策略与旧策略之间的距离

这种 clipping 最终仍有可能得到一个与旧策略相去甚远的新策略,在这里的实现中,我们使用了一个特别简单的方法:提前停止。如果新策略与旧策略的平均 KL -散度超过一个阈值,我们就停止执行梯度步骤。

PPO 目标函数简单推导 链接
PPO-Clip 的目标函数为:
  ~  
L θ k C L I P ( θ ) = E s , a ∼ θ k [ min ⁡ ( π θ ( a ∣ s ) π θ k ( a ∣ s ) A θ k ( s , a ) , c l i p ( π θ ( a ∣ s ) π θ k ( a ∣ s ) , 1 − ϵ , 1 + ϵ ) A θ k ( s , a ) ) ] L^{\rm CLIP}_{\theta_k}(\theta)=\underset{s, a\sim\theta_k}{\rm E}\Bigg[\min\Bigg(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}A^{\theta_k}(s, a), {\rm clip}\Big(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)},1-\epsilon, 1+\epsilon\Big)A^{\theta_k}(s, a)\Bigg)\Bigg] LθkCLIP(θ)=s,aθkE[min(πθk(as)πθ(as)Aθk(s,a),clip(πθk(as)πθ(as),1ϵ,1+ϵ)Aθk(s,a))]
  ~  
$\underset{s, a\sim\theta_k}{\rm E}$     E s , a ∼ θ k ~~~\underset{s, a\sim\theta_k}{\rm E}    s,aθkE
  ~  
k k k 次迭代 的策略参数 θ k \theta_k θk ϵ \epsilon ϵ 为 小的超参数。
ϵ ∈ ( 0 , 1 ) \epsilon\in(0,1) ϵ(0,1), 定义
F ( r , A , ϵ ) ≐ min ⁡ ( r A , c l i p ( r , 1 − ϵ , 1 + ϵ ) A ) F(r,A,\epsilon)\doteq\min\Bigg(rA,{\rm clip}(r,1-\epsilon,1+\epsilon)A\Bigg) F(r,A,ϵ)min(rA,clip(r,1ϵ,1+ϵ)A)
A ≥ 0 A\geq0 A0
F ( r , A , ϵ ) = min ⁡ ( r A , c l i p ( r , 1 − ϵ , 1 + ϵ ) A ) = A min ⁡ ( r , c l i p ( r , 1 − ϵ , 1 + ϵ ) ) = A min ⁡ ( r , { 1 + ϵ    r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) 1 − ϵ r ≤ 1 − ϵ } ) = A { min ⁡ ( r , 1 + ϵ )    r ≥ 1 + ϵ min ⁡ ( r , r ) r ∈ ( 1 − ϵ , 1 + ϵ ) min ⁡ ( r , 1 − ϵ ) r ≤ 1 − ϵ } = A { 1 + ϵ    r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) r r ≤ 1 − ϵ }       根据右侧的范围 = A min ⁡ ( r , 1 + ϵ ) = min ⁡ ( r A , ( 1 + ϵ ) A ) \begin{aligned}F(r,A,\epsilon)&=\min\Bigg(rA,{\rm clip}(r,1-\epsilon,1+\epsilon)A\Bigg)\\ &=A\min\Bigg(r,{\rm clip}(r,1-\epsilon,1+\epsilon)\Bigg)\\ &=A\min\Bigg(r,\left\{\begin{aligned}&1+\epsilon~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &1-\epsilon &r\leq1-\epsilon\\ \end{aligned}\right\}\Bigg)\\ &=A\left\{\begin{aligned}&\min(r,1+\epsilon)~~&r\geq1+\epsilon\\ &\min(r,r) &r\in(1-\epsilon,1+\epsilon)\\ &\min(r,1-\epsilon) &r\leq1-\epsilon\\ \end{aligned}\right\}\\ &=A\left\{\begin{aligned}&1+\epsilon~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &r &r\leq1-\epsilon\\ \end{aligned}\right\}~~~~~\textcolor{blue}{根据右侧的范围}\\ &=A\min(r, 1+\epsilon)\\ &=\min\Bigg(rA, (1+\epsilon)A\Bigg) \end{aligned} F(r,A,ϵ)=min(rA,clip(r,1ϵ,1+ϵ)A)=Amin(r,clip(r,1ϵ,1+ϵ))=Amin(r, 1+ϵ  r1ϵr1+ϵr(1ϵ,1+ϵ)r1ϵ )=A min(r,1+ϵ)  min(r,r)min(r,1ϵ)r1+ϵr(1ϵ,1+ϵ)r1ϵ =A 1+ϵ  rrr1+ϵr(1ϵ,1+ϵ)r1ϵ      根据右侧的范围=Amin(r,1+ϵ)=min(rA,(1+ϵ)A)
  ~  
A < 0 A<0 A<0
F ( r , A , ϵ ) = min ⁡ ( r A , c l i p ( r , 1 − ϵ , 1 + ϵ ) A ) = A max ⁡ ( r , c l i p ( r , 1 − ϵ , 1 + ϵ ) ) = A max ⁡ ( r , { 1 + ϵ    r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) 1 − ϵ r ≤ 1 − ϵ } ) = A { max ⁡ ( r , 1 + ϵ )    r ≥ 1 + ϵ max ⁡ ( r , r ) r ∈ ( 1 − ϵ , 1 + ϵ ) max ⁡ ( r , 1 − ϵ ) r ≤ 1 − ϵ } = A { r    r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) 1 − ϵ r ≤ 1 − ϵ }       根据右侧的范围 = A max ⁡ ( r , 1 − ϵ ) = min ⁡ ( r A , ( 1 − ϵ ) A ) \begin{aligned}F(r,A,\epsilon)&=\min\Bigg(rA,{\rm clip}(r,1-\epsilon,1+\epsilon)A\Bigg)\\ &=A\textcolor{blue}{\max}\Bigg(r,{\rm clip}(r,1-\epsilon,1+\epsilon)\Bigg)\\ &=A\max\Bigg(r,\left\{\begin{aligned}&1+\epsilon~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &1-\epsilon &r\leq1-\epsilon\\ \end{aligned}\right\}\Bigg)\\ &=A\left\{\begin{aligned}&\max(r,1+\epsilon)~~&r\geq1+\epsilon\\ &\max(r,r) &r\in(1-\epsilon,1+\epsilon)\\ &\max(r,1-\epsilon) &r\leq1-\epsilon\\ \end{aligned}\right\}\\ &=A\left\{\begin{aligned}&r~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &1-\epsilon &r\leq1-\epsilon\\ \end{aligned}\right\}~~~~~\textcolor{blue}{根据右侧的范围}\\ &=A\max(r, 1-\epsilon)\\ &=\textcolor{blue}{\min}\Bigg(rA,(1-\epsilon)A\Bigg) \end{aligned} F(r,A,ϵ)=min(rA,clip(r,1ϵ,1+ϵ)A)=Amax(r,clip(r,1ϵ,1+ϵ))=Amax(r, 1+ϵ  r1ϵr1+ϵr(1ϵ,1+ϵ)r1ϵ )=A max(r,1+ϵ)  max(r,r)max(r,1ϵ)r1+ϵr(1ϵ,1+ϵ)r1ϵ =A r  r1ϵr1+ϵr(1ϵ,1+ϵ)r1ϵ      根据右侧的范围=Amax(r,1ϵ)=min(rA,(1ϵ)A)
  ~  
综上:可定义 g ( ϵ , A ) g(\epsilon,A) g(ϵ,A)
g ( ϵ , A ) = { ( 1 + ϵ ) A      A ≥ 0 ( 1 − ϵ ) A A < 0 g(\epsilon,A)=\left\{\begin{aligned}&(1+\epsilon)A ~~~~&A\geq0\\ &(1-\epsilon)A&A<0\end{aligned}\right. g(ϵ,A)={(1+ϵ)A    (1ϵ)AA0A<0
在这里插入图片描述

为什么这样定义就可以让 新策略 不至于 离 旧策略 过远?
重要性采样方法有效 要求 新策略 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(as) 和 旧策略 π θ k ( a ∣ s ) \pi_{\theta_k}(a|s) πθk(as) 两个分布不能差距过大

1、当 advantage 优势为正

L ( s , a , θ k , θ ) = min ⁡ ( π θ ( a ∣ s ) π θ k ( a ∣ s ) , 1 + ϵ ) A π θ k ( s , a ) L(s,a,\theta_k, \theta)=\min\Bigg(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}, 1+\epsilon\Bigg)A^{\pi_{\theta_k}}(s, a) L(s,a,θk,θ)=min(πθk(as)πθ(as),1+ϵ)Aπθk(s,a)
优势函数: 发现某个 状态-动作对 奖励多 ——> 增大 该 状态-动作对 的权重。

当 状态-行动对 ( s , a ) (s, a) (s,a) 的优势是正的,则如果行动 a a a 更有可能执行,即如果 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(as) 增加,目标就会增加。
该项中的 min 限制了 目标函数只能增大到某个值
一旦 π θ ( a ∣ s ) > ( 1 + ϵ ) π θ k ( a ∣ s ) \pi_\theta(a|s)>(1+\epsilon)\pi_{\theta_k}(a|s) πθ(as)>(1+ϵ)πθk(as), min 触发,限制该项值为 ( 1 + ϵ ) π θ k ( a ∣ s ) (1+\epsilon)\pi_{\theta_k}(a|s) (1+ϵ)πθk(as)
the new policy does not benefit by going far away from the old policy.
新策略 不会因远离 旧策略而受益。

2、当 advantage 优势为负

L ( s , a , θ k , θ ) = max ⁡ ( π θ ( a ∣ s ) π θ k ( a ∣ s ) , 1 − ϵ ) A π θ k ( s , a ) L(s,a,\theta_k, \theta)=\max\Bigg(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}, 1-\epsilon\Bigg)A^{\pi_{\theta_k}}(s, a) L(s,a,θk,θ)=max(πθk(as)πθ(as),1ϵ)Aπθk(s,a)

当 某个状态-行动对 ( s , a ) (s, a) (s,a) 的优势是负的,则如果执行行动 a a a 的可能性更小 ,即如果 π θ ( a ∣ s ) π_\theta(a|s) πθ(as) 减小,目标函数就会增加。但是该项中的 max 限制了目标函数可以增加到多少。
一旦 π θ ( a ∣ s ) < ( 1 − ϵ ) π θ k ( a ∣ s ) \pi_\theta(a|s)<(1-\epsilon)\pi_{\theta_k}(a|s) πθ(as)<(1ϵ)πθk(as), max 触发,限制该项值为 ( 1 − ϵ ) π θ k ( a ∣ s ) (1-\epsilon)\pi_{\theta_k}(a|s) (1ϵ)πθk(as)

再次说明:the new policy does not benefit by going far away from the old policy.
新策略 不会因远离 旧策略而受益。

TD3_仅连续: Twin Delayed Deep Deterministic Policy Gradient 【ICML 2018 (加拿大)麦吉尔大学】

在这里插入图片描述
图片来源

OpenAI 文档_TD3
论文链接

虽然 DDPG 有时可以实现出色的性能,但在超参数和其他类型的调优方面,它通常是不稳定的。
一个常见的 DDPG 失败模式是,学习到的 Q 函数开始显著高估 Q 值,然后导致策略中断,因为它利用了 Q 函数中的误差。
双延迟 DDPG (Twin Delayed DDPG, TD3) 是一种通过引入三个关键技巧来解决此问题的算法:
1、截断的双 Q 学习

  • TD3 学习两个 Q 函数而不是一个(因此是 “twin”),并使用两个 Q 值中较小的一个来形成 Bellman 误差损失函数中的目标。

2、策略更新延迟

  • TD3 更新策略(和 目标网络) 的频率低于 Q 函数。论文建议 Q 函数每更新两次, 更新一次策略。

3、目标策略平滑。

  • TD3 在目标动作中添加噪声,通过平滑动作变化中的 Q 使策略更难利用 Q 函数的误差。

TD3 是一个 off-policy 算法;只能用于具有连续行动空间的环境。

TD3 算法伪码

在这里插入图片描述

算法: TD3
用随机参数 θ 1 , θ 2 , ϕ \theta_1, \theta_2, \phi θ1,θ2,ϕ 初始化 critic 网络 Q θ 1 , Q θ 2 Q_{\theta_1},Q_{\theta_2} Qθ1,Qθ2, 和 actor 网络 π ϕ \pi_\phi πϕ
初始化 目标网络 θ 1 ′ ← θ 1 , θ 2 ′ ← θ 2 , ϕ ′ ← ϕ \theta_1^\prime\leftarrow\theta_1, \theta_2^\prime\leftarrow\theta_2, \phi^\prime\leftarrow \phi θ1θ1,θ2θ2,ϕϕ
初始化 回放缓冲集 B \cal B B
f o r   t = 1   t o   T {\bf for}~t=1 ~{\bf to} ~T for t=1 to T
       ~~~~~~       选择 带探索噪声的动作 a ∼ π ϕ ( s ) + ϵ ,    ϵ ∼ N ( 0 , σ ) a\sim\pi_\phi(s)+\epsilon,~~\epsilon\sim {\cal N}(0,\sigma) aπϕ(s)+ϵ,  ϵN(0,σ), 观测 奖励 r r r 和新的状态 s ′ s^\prime s
       ~~~~~~       将 transition 元组 ( s , a , r , s ′ ) (s, a,r, s^\prime) (s,a,r,s) 存到 B \cal B B
       ~~~~~~        B \cal B B 中抽样 小批次的 N N N 个 transitions ( s , a , r , s ′ ) (s, a, r, s^\prime) (s,a,r,s)
       a ~ ← π ϕ ′ ( s ′ ) + ϵ ,    ϵ ∼ c l i p ( N ( 0 , σ ~ ) , − c , c ) ~~~~~~\widetilde a\leftarrow \pi_{\phi^\prime}(s^\prime)+\epsilon,~~\epsilon\sim{\rm clip}({\cal N}(0,\widetilde \sigma),-c,c)       a πϕ(s)+ϵ,  ϵclip(N(0,σ ),c,c)
       y ← r + γ min ⁡ i = 1 , 2 Q θ i ′ ( s ′ , a ~ ) ~~~~~~y\leftarrow r+\gamma \min\limits_{i=1,2}Q_{\theta_i^\prime}(s^\prime,\widetilde a)       yr+γi=1,2minQθi(s,a )
       ~~~~~~       更新 critics θ i ← arg ⁡ min ⁡ θ i N − 1 ∑ ( y − Q θ i ( s , a ) ) 2 \theta_i\leftarrow\arg\min\limits_{\theta_i}N^{-1}\sum(y-Q_{\theta_i}(s, a))^2 θiargθiminN1(yQθi(s,a))2
       ~~~~~~        i f   t   %   d {\bf if}~t~ \% ~d if t % d
            ~~~~~~~~~~~            通过 确定性策略梯度 更新 ϕ \phi ϕ
                  ∇ ϕ J ( ϕ ) = N − 1 ∑ ∇ a Q θ 1 ( s , a ) ∣ a = π ϕ ( s ) ∇ ϕ π ϕ ( s ) ~~~~~~~~~~~~~~~~~\nabla _\phi J(\phi)=N^{-1}\sum\nabla_aQ_{\theta_1}(s, a)|_{a=\pi_\phi(s)}\nabla_\phi\pi_\phi(s)                  ϕJ(ϕ)=N1aQθ1(s,a)a=πϕ(s)ϕπϕ(s)
            ~~~~~~~~~~~            更新 目标网络:
                  θ i ′ ← τ θ i + ( 1 − τ ) θ i ′       ~~~~~~~~~~~~~~~~~\theta_i^\prime\leftarrow\tau\theta_i+(1-\tau)\theta_i^\prime~~~~~                  θiτθi+(1τ)θi      τ \tau τ: 目标更新率
                  ϕ ′ ← τ ϕ + ( 1 − τ ) ϕ ′ ~~~~~~~~~~~~~~~~~\phi^\prime\leftarrow\tau\phi+(1-\tau)\phi^\prime                  ϕτϕ+(1τ)ϕ
       e n d   i f ~~~~~~{\bf end ~if}       end if
e n d   f o r {\bf end ~for} end for

Soft Actor-Critic:SAC_连续/离散动作空间 【Google Brain 最新版本 201906】

在这里插入图片描述

图片来源

最大化策略的熵,从而使得策略更加鲁棒。

确定性策略 是指在给定相同状态下,总是选择相同的动作
随机性策略 则是在给定状态下可以选择多种可能的动作

确定性策略随机性策略
定义同样的状态,执行同样的动作同样的状态,可能执行不同的动作
优点稳定、可重复避免陷入局部最优解,提高全局搜索的能力
缺点缺乏探索性、易被对手抓到可能会导致策略的收敛速度较慢,影响效率和性能。

实际应用中,如果有条件的话,我们会尽量使用随机性策略,诸如 A2C、PPO 等等,因为它更加灵活,更加鲁棒,更加稳定。

最大熵强化学习认为,即使我们目前有了成熟的随机性策略,即 AC 一类的算法,但是还是没有达到最优的随机。因此,它引入了一个信息熵的概念,在最大化累积奖励的同时最大化策略的熵,使得策略更加鲁棒,从而达到最优的随机性策略。

——————————————————

—— OpenAI 文档_SAC

OpenAI 文档_SAC 界面链接
  ~  
Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor, Haarnoja et al, 201808 ICML 2018
Soft Actor-Critic Algorithms and Applications, Haarnoja et al, 201901
Learning to Walk via Deep Reinforcement Learning, Haarnoja et al, 201906 RSS2019

Soft Actor Critic (SAC) 以 off-policy 方式优化 随机策略。

DDPG + 随机策略优化

不是 TD3 的直接继承者 (几乎同时发表)。

它包含了 clipped double-Q 技巧,并且由于 SAC 的策略的固有随机性,它也最终受益于目标策略平滑

SAC 的一个核心特征是 entropy regularization 熵正则化
该策略被训练为 最大化 期望回报 和 熵 之间的权衡,熵 是 策略随机性 的度量
这 与探索和利用之间的权衡 有密切的联系:熵的增加导致更多的探索,这可以加速后续的学习。它还可以防止策略过早收敛到一个坏的局部最优

既可用于连续动作空间,也可用于离散动作空间。

熵-正则化 强化学习中,智能体在每个时间步获得与该时间步策略的熵成正比的奖励。
此时 RL 问题描述为:

π ∗ = arg ⁡ max ⁡ π E τ ∼ π [ ∑ t = 0 ∞ γ t ( R ( s t , a t , s t + 1 ) + α H ( π ( ⋅ ∣ s t ) ) ) ] \pi^*=\arg\max\limits_\pi \underset{\tau\sim\pi}{\rm E}\Big[\sum\limits_{t=0}^\infty\gamma^t\Big(R(s_t,a_t,s_{t+1})\textcolor{blue}{+\alpha H(\pi(·|s_t))}\Big)\Big] π=argπmaxτπE[t=0γt(R(st,at,st+1)+αH(π(st)))]

其中 α > 0 \alpha > 0 α>0 为权衡系数。
包括每个时间步的熵奖励的状态值函数 V π V^\pi Vπ 为:

V π ( s ) = E τ ∼ π [ ∑ t = 0 ∞ γ t ( R ( s t , a t , s t + 1 ) + α H ( π ( ⋅ ∣ s t ) ) ) ∣ s 0 = s ] V^\pi(s)=\underset{\tau\sim\pi}{\rm E}\Big[\sum\limits_{t=0}^\infty\gamma^t\Big(R(s_t,a_t,s_{t+1})+\alpha H(\pi(·|s_t))\Big)\Big|s_0=s\Big] Vπ(s)=τπE[t=0γt(R(st,at,st+1)+αH(π(st))) s0=s]

包括除了第一个时间步以外的每个时间步的熵奖励 的 动作值函数 Q π Q^\pi Qπ:

Q π ( s , a ) = E τ ∼ π [ ∑ t = 0 ∞ γ t ( R ( s t , a t , s t + 1 ) + α ∑ t = 1 ∞ H ( π ( ⋅ ∣ s t ) ) ) ∣ s 0 = s , a 0 = a ] Q^\pi(s,a)=\underset{\tau\sim\pi}{\rm E}\Big[\sum\limits_{t=0}^\infty\gamma^t\Big(R(s_t,a_t,s_{t+1})+\alpha \sum\limits_{t=1}^\infty H(\pi(·|s_t))\Big)\Big|s_0=s,a_0=a\Big] Qπ(s,a)=τπE[t=0γt(R(st,at,st+1)+αt=1H(π(st))) s0=s,a0=a]

  • 有些论文 的 Q π Q^\pi Qπ 包含第一个时间步的熵奖励

V π V^\pi Vπ Q π Q^\pi Qπ 间的关系为:

V π ( s ) = E a ∼ π [ Q π ( s , a ) ] + α H ( π ( ⋅ ∣ s ) ) V^\pi(s)=\underset{a\sim\pi}{\rm E}[Q^\pi(s, a)]+\alpha H(\pi(·|s)) Vπ(s)=aπE[Qπ(s,a)]+αH(π(s))

关于 Q π Q^\pi Qπ 的贝尔曼公式为:

Q π ( s , a ) = E s ′ ∼ P a ′ ∼ π [ R ( s , a , s ′ ) + γ ( Q π ( s ′ , a ′ ) + α H ( π ( ⋅ ∣ s ′ ) ) ) ] = E s ′ ∼ P [ R ( s , a , s ′ ) + γ V π ( s ′ ) ] \begin{aligned}Q^\pi(s, a)&=\underset{s^\prime \sim P \atop a^\prime\sim \pi}{\rm E}[R(s,a,s^\prime)+\gamma\big(Q^\pi(s^\prime,a^\prime)+\alpha H(\pi(·|s^\prime))\big)]\\ &=\underset{s^\prime \sim P}{\rm E}[R(s,a,s^\prime)+\gamma V^\pi(s^\prime)]\end{aligned} Qπ(s,a)=aπsPE[R(s,a,s)+γ(Qπ(s,a)+αH(π(s)))]=sPE[R(s,a,s)+γVπ(s)]

SAC 同时学习一个策略 π θ π_\theta πθ 和两个 Q Q Q 函数 Q ϕ 1 , Q ϕ 2 Q_{\phi_1}, Q_{\phi_2} Qϕ1,Qϕ2
目前标准的 SAC 有两种变体:一种使用固定的熵正则化系数 α \alpha α,另一种通过在训练过程中改变 α \alpha α 来强制熵约束。
OpenAI 的文档使用具有固定熵正则化系数的版本,但实践中通常更喜欢熵约束的变体。

如下图,在 α \alpha α 固定版本中, 除了最后一个图有较明显的优势,其它只是略有优势,基本和 α \alpha α 学习版本持平;而在 α \alpha α 学习版本有优势的中间两图,优势较明显。

在这里插入图片描述
图片来源

SAC VS TD3:
  ~  
相同点:
1、两个 Q 函数都是通过回归到单个共享目标的 MSBE (Mean Squared Bellman Error) 最小化来学习的。
2、利用目标 Q-网络计算共享目标,并对训练过程中的 Q-网络参数进行 polyak 平均得到 目标 Q-网络。
3、共享目标使用了被截断的双 Q 技巧。
  ~  
不同点:
1、SAC 包含 熵正则化 项
2、SAC 的目标中使用的下一状态 的动作来自当前策略,而不是目标策略。
3、没有明确的目标策略平滑。TD3 训练一个确定性策略,它通过向下一状态的动作添加随机噪声来实现平滑。SAC 训练的是一个随机策略, 来自随机性的噪声足以获得类似的效果。

SAC 算法伪码

在这里插入图片描述

算法: Soft Actor-Critic SAC
输入: θ 1 , θ 2 , ϕ       \theta_1,\theta_2,\phi~~~~~ θ1,θ2,ϕ      初始化参数
参数初始化:
       ~~~~~~       初始化目标网络权重: θ ˉ 1 ← θ 1 , θ ˉ 2 ← θ 2 \bar \theta_1\leftarrow\theta_1, \bar \theta_2\leftarrow\theta_2 θˉ1θ1,θˉ2θ2
       ~~~~~~       回放池 初始化为空: D ← ∅ {\cal D}\leftarrow\emptyset D
f o r {\bf for} for 每次迭代 d o {\bf do} do
       ~~~~~~        f o r {\bf for} for 每个环境 step d o {\bf do} do
            ~~~~~~~~~~~            从策略中抽样动作: a t ∼ π ϕ ( a t ∣ s t )       a_t\sim\pi_\phi(a_t|s_t)~~~~~ atπϕ(atst)      ▢ 这里的 π ϕ ( a t ∣ s t ) \pi_\phi(a_t|s_t) πϕ(atst) 如何定义?
            ~~~~~~~~~~~            从环境中抽样 transition: s t + 1 ∼ p ( s t + 1 ∣ s t , a t ) s_{t+1}\sim p(s_{t+1}|s_t,a_t) st+1p(st+1st,at)
            ~~~~~~~~~~~            将 transition 存到 回放池: D ← D   ∪   { ( s t , a t , r ( s t , a t ) , s t + 1 ) } {\cal D}\leftarrow{\cal D}~\cup~\{(s_t,a_t,r(s_t,a_t),s_{t+1})\} DD  {(st,at,r(st,at),st+1)}
       ~~~~~~        e n d   f o r {\bf end ~for} end for
       ~~~~~~        f o r {\bf for} for 每个梯度 step d o {\bf do} do
            ~~~~~~~~~~~            更新 Q Q Q 函数参数: 对于 i ∈ { 1 , 2 } i\in\{1,2\} i{1,2} θ i ← θ i − λ Q ∇ ^ θ i J Q ( θ i )       \theta_i\leftarrow\theta_i-\lambda_Q\hat \nabla_{\theta_i}J_Q(\theta_i)~~~~~ θiθiλQ^θiJQ(θi)      ▢ 这里的 J Q ( θ i ) J_Q(\theta_i) JQ(θi) 如何定义?
            ~~~~~~~~~~~            更新 策略权重: ϕ ← ϕ − λ π ∇ ^ ϕ J π ( ϕ )       \phi\leftarrow\phi-\lambda_\pi\hat \nabla_\phi J_\pi (\phi)~~~~~ ϕϕλπ^ϕJπ(ϕ)      ▢ 这里的 J π ( ϕ ) J_\pi (\phi) Jπ(ϕ) 如何定义?
            ~~~~~~~~~~~            调温度: α ← α − λ ∇ ^ α J ( α )       \alpha\leftarrow\alpha-\lambda\hat\nabla_\alpha J(\alpha)~~~~~ ααλ^αJ(α)      ▢ 这里的 J ( α ) J(\alpha) J(α) 如何定义?如何理解 这里的 temperature 温度
            ~~~~~~~~~~~             更新 目标网络 权重:对于 i ∈ { 1 , 2 } i\in\{1,2\} i{1,2} θ ˉ i ← τ θ i − ( 1 − τ ) θ ˉ i       \bar \theta_i\leftarrow \tau \theta_i-(1-\tau)\bar \theta_i~~~~~ θˉiτθi(1τ)θˉi      ▢ 如何理解这里的 τ \tau τ? ——> 目标平滑系数
       ~~~~~~        e n d   f o r {\bf end ~for} end for
e n d   f o r {\bf end ~for} end for
输出: θ 1 , θ 1 , ϕ       \theta_1,\theta_1,\phi~~~~~ θ1,θ1,ϕ     优化好的参数

∇ ^ \hat \nabla ^: 随机梯度

$\emptyset$      ∅ ~~~~\emptyset     

在这里插入图片描述

在这里插入图片描述

Learning to Walk via Deep Reinforcement Learning 中的版本:
  ~  
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

α α α 是温度参数,它决定了熵项与奖励的相对重要性,从而控制了最优策略的随机性。
α \alpha α 大: 探索
α \alpha α 小: 利用

J ( α ) = E a t ∼ π t [ − α log ⁡ π t ( a t ∣ s t ) − α H ˉ ] J(\alpha)=\underset{a_t\sim\pi_t}{\mathbb E}[-\alpha\log \pi_t(a_t|s_t)-\alpha\bar{\cal H}] J(α)=atπtE[αlogπt(atst)αHˉ]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP已下发EWM的交货单修改下发状态

此种情况针对EWM未接收到ERP交货单时&#xff0c;可以使用此程序将ERP交货单调整为未分配状态&#xff0c;在进行调整数据后&#xff0c;然后使用VL06I&#xff08;启用自动下发EWM配置&#xff0c;则在交货单修改保存后会立即下发EWM&#xff09;重新下发EWM系统。 操作步骤如…

去O化神器 Exbase

随着去O化进程推动&#xff0c;很多旧业务依赖的oracle数据库&#xff0c;都需要实现做数据库的替换&#xff0c;当下能很好兼容Oracle&#xff0c;并实现异构数据库之间转换的工具并不多。这里给大家推荐一个商业工具数据库迁移工具exbase&#xff08;北京海量&#xff09;&am…

超高精电容传感器PCAP01调试+LABVIEW数据可视化调试手记

PCAP01超高精电容传感芯片STM32LabView可视化 文章目录 PCAP01超高精电容传感芯片STM32LabView可视化一、PCAP01介绍1.1、PCAP01引脚定义1.2、电容测量1.3、温度测量1.4、PCAP典型测试电路 二、PCAP01的STM32驱动2.1、SPI协议配置2.2、PCAP01浮空电容测量内部温度测量操作流程 …

秋招提前批面试经验分享(上)

⭐️感谢点开文章&#x1f44b;&#xff0c;欢迎来到我的微信公众号&#xff01;我是恒心&#x1f60a; 一位热爱技术分享的博主。如果觉得本文能帮到您&#xff0c;劳烦点个赞、在看支持一下哈&#x1f44d;&#xff01; ⭐️我叫恒心&#xff0c;一名喜欢书写博客的研究生在读…

【LVGL-SquareLine Studio】

LVGL-SquareLine Studio ■ SquareLine Studio-官网下载地址■ SquareLine Studio-参考博客■ SquareLine Studio-安装■ SquareLine Studio-汉化■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio-■ SquareLine Studio- ■ SquareLine S…

云动态摘要 2024-07-07

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起! [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造,可通过对话方式生成可视化…

【vue组件库搭建06】组件库构建及npm发包

一、格式化目录结构 根据以下图片搭建组件库目录 index.js作为入口文件&#xff0c;将所有组件引入&#xff0c;并注册组件名称 import { EButton } from "./Button"; export * from "./Button"; import { ECard } from "./Card"; export * fr…

并查集(还有反集也在)

一.定义 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所谓的并、查&#xff09;。比如说&#xff0c;我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成&#xff1a; 并查集…

如何将Grammarly内嵌到word中(超简单!)

1、下载 安装包下载链接见文章结尾 官网的grammarly好像只能作为单独软件使用&#xff0c;无法内嵌到word中&#x1f9d0;&#x1f9d0;&#x1f9d0; 2、双击安装包&#xff08;安装之前把Office文件都关掉&#xff09; 3、安装完成&#xff0c;在桌面新建个word文件并打开 注…

【Spring AOP 源码解析前篇】什么是 AOP | 通知类型 | 切点表达式| AOP 如何使用

前言&#xff08;关于源码航行&#xff09; 在准备面试和学习的过程中&#xff0c;我阅读了还算多的源码&#xff0c;比如 JUC、Spring、MyBatis&#xff0c;收获了很多代码的设计思想&#xff0c;也对平时调用的 API 有了更深入的理解&#xff1b;但过多散乱的笔记给我的整理…

PXIe-7976【K410T】

起售价 RMB 152,880.00 块RAM(BRAM): 28620 kbit 动态RAM(DRAM): 2 GB FPGA: Kintex-7 410T PXI背板链路: PCI-Express Gen2 x 8 FPGA片: 63550 DSP片: 1540

240707-Sphinx配置Pydata-Sphinx-Theme

Step A. 最终效果 Step B. 为什么选择Pydata-Sphinx-Theme主题 Gallery of sites using this theme — PyData Theme 0.15.4 documentation Step 1. 创建并激活Conda环境 conda create -n rtd_pydata python3.10 conda activate rtd_pydataStep 2. 安装默认的工具包 pip in…

基于Java的水果商品销售网站

1 水果商品销售网站概述 1.1 课题简介 随着电子商务在当今社会的迅猛发展&#xff0c;水果在线销售已逐渐演变为一种极为便捷的购物方式&#xff0c;日益受到人们的青睐。本系统的设计初衷便是构建一个功能完备、用户体验友好的水果销售平台&#xff0c;致力于为用户提供优质、…

入门PHP就来我这(高级)12 ~ 获取数据

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 从结果集中获取一行作为对象 表中数据行如下&#xff1a; 利用mysqli_fetch_array()函数获…

SLF4J的介绍与使用(有logback和log4j2的具体实现案例)

目录 1.日志门面的介绍 常见的日志门面 &#xff1a; 常见的日志实现&#xff1a; 日志门面和日志实现的关系&#xff1a; 2.SLF4J 的介绍 业务场景&#xff08;问题&#xff09;&#xff1a; SLF4J的作用 SLF4J 的基本介绍 日志框架的绑定&#xff08;重点&#xff09…

【CSS in Depth 2精译】2.5 无单位的数值与行高

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高 ✔️2.6 自定义属性2.7 本章小结 2.5 无单位的数值与行高 有些属性允许使用无单位的数值&#xff08;unitless value…

Linux:DHCP服务配置

目录 一、DHCP概述以及DHCP的好处 1.1、概述 1.2、DHCP的好处 二、DHCP的模式与分配方式 2.1、模式 2.2、DHCP的分配方式 三、DHCP工作原理 四、安装DHCP服务 五、DHCP局部配置并且测试 5.1、subnet 网段声明 5.2、客户机预留指定的固定ip地址 一、DHCP概述以及DHCP…

【Java13】包

“包”这个机制&#xff0c;类似于分组。主要作用是区分不同组内的同名类。例如&#xff0c;高三三班有一个“王五”&#xff0c;高二八班也有一个“王五”。高三三班和高三八班就是两个不同的包。 Java中的包&#xff08;package&#xff09;机制主要提供了类的多层命名空间&…

驾校管理系统设计

驾校管理系统设计旨在提高驾校运营效率、学员管理、教练安排、考试预约、财务结算等方面的能力。以下是一个基本的设计框架&#xff0c;包括关键模块和数据表设计&#xff1a; 1. 系统架构设计 前端界面&#xff1a;提供给学员、教练和管理员使用的Web界面或移动应用&#xf…

51单片机STC89C52RC——16.1 五项四线步进电机

目的/效果 让步进电机 正向转90度&#xff0c;逆向转90度 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 步进电机可以理解为&#xff1a;是一个按照固定步幅运动的“小型机器”。它与普通电机不同点在于&#xff0c;普通电机可以持…