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

  • 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ˉ]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渐开线花键测量学习笔记分享

大家好&#xff0c;继续渐开线花键的相关内容&#xff0c;本期是渐开线花键测量相关的学习笔记分享&#xff1a; 花键检测项目有花键大径和小径检验&#xff1b;内花键齿槽宽和外花键齿厚&#xff0c;以及渐开线终止圆 和起始圆直径检测&#xff1b;齿距累计误差 、齿形误差 、…

Python网络爬虫:Scrapy框架的全面解析

Python网络爬虫&#xff1a;Scrapy框架的全面解析 一、引言 在当今互联网的时代&#xff0c;数据是最重要的资源之一。为了获取这些数据&#xff0c;我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言&#xff0c;拥有许多用于网络爬虫的工具和库…

护网在即,知攻善防助力每一位安服仔~

前言 是不是已经有师傅进场了呢~ 是不是有安服&#x1f412;在值守呢~ 您是不是被网上眼花缭乱的常用应急响应工具而烦恼呢&#xff1f; 何以解忧&#xff1f;唯有知攻善防&#xff01; 创作起源&#xff1a; 驻场、护网等&#xff0c;有的客户现场只允许用客户机器&…

一.7.(2)基本运算电路,包括比例运算电路、加减运算电路、积分运算电路、微分电路等常见电路的分析、计算及应用;(未完待续)

what id the 虚短虚断虚地? 虚短&#xff1a;运放的正相输入端和反相输入端貌似连在一起了&#xff0c;所以两端的电压相等&#xff0c;即UU- 虚断&#xff1a;输入端输入阻抗无穷大 虚地&#xff1a;运放正相输入端接地&#xff0c;导致U&#xff1d;U-&#xff1d;0。 虚…

采用Java语言+开发工具 Idea+ scode数字化产科管理平台源码,产科管理新模式

采用Java语言开发工具 Idea scode数字化产科管理平台源码&#xff0c;产科管理新模式 数字化产科管理系统是现代医疗信息化建设的重要组成部分&#xff0c;它利用现代信息技术手段&#xff0c;对孕产妇的孕期管理、分娩过程及产后康复等各个环节进行数字化、智能化管理&#xf…

lua中判断2个表是否相等

当我们获取 table 长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数&#xff0c;而导致无法正确取得 table 的长度&#xff0c;而且还会出现奇怪的现象。例如&#xff1a;t里面有3个元素&#xff0c;但是因为最后一个下表是5和4&#xff0c;却表现出不一…

SpringBoot3+Vue3开发园区管理系统

介绍 在当今快速发展的城市化进程中&#xff0c;高效、智能的园区管理成为了提升居民生活品质、优化企业运营环境的关键。为此&#xff0c;我们精心打造了全方位、一体化的园区综合管理系统&#xff0c;该系统深度融合了园区管理、楼栋管理、楼层管理、房间管理以及车位管理等…

微信小程序消息通知(一次订阅)

在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…

【SpringBoot】SpringBoot内置Servlet容器源码分析-Tomcat

自动装配加载 ServletWebServerFactoryAutoConfiguration 在自动装配的时候&#xff0c;会加载spring.factories&#xff0c;并且添加到IOC容器中。这里包含web自动配置类ServletWebServerFactoryAutoConfiguration &#xff0c;其中本类中注入三个bean&#xff0c;分别是Embed…

【数据结构与算法】插入排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

Ollama报错:Error: llama runner process has terminated: exit status 0xc0000409

0&#xff0c;背景 今天听说谷歌家的Gemma2性能很好&#xff0c;于是在Ollama上下载到本地测试一下 ollama run gemma2 结果终端里报错 Error: llama runner process has terminated: exit status 0xc0000409 1&#xff0c;原因 原因很简单&#xff0c;新的模型&#xff…

vue项目实现堆叠卡片拖动切换效果

实际效果 实现流程 1. 实现卡片位置堆叠 将父元素的 position 设置成relative &#xff0c;卡片的position 设置成 absolute 即可。 2. 消除图片的移动 如果卡片上有图片&#xff0c;默认拖动的时候就会导致像上图一样变成了选中图片移动&#xff0c;从而没法触发拖动事件。消…

Canal架构以及使用规范

Canal架构以及使用规范 一、Canal的作用 相关文档&#xff1a;GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events&#xff0c;可…

上网监控软件有哪些?3款实力出众的上网监控软件

为什么需要上网监控软件&#xff1f; 据说&#xff0c;99%的员工上班都会摸鱼&#xff0c;1%的员工上班会窃取公司信息。 所以&#xff0c;因此&#xff0c;监控员工的上网行为是很有必要滴。 总结下来&#xff0c;上网监控软件的作用是&#xff1a; 1.提高生产力&#xff1…

Vben:表格的表头和表格的内容对不齐,以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 基于Vue-Vbne-admin框架进行前端开发的时候&#xff0c;调用表格useTable函数实现表格之后&#xff0c;发现表格的表头和表格的内容对不齐。如下图所示。针对这种情况&#xff0c;本文记录了解决方法。 调用的模块如下&#x…

1958.力扣每日一题7/7 Java(100%解)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先将指定位…

浏览器插件利器-allWebPluginV2.0.0.14-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

并查集(还有反集也在)

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

2-27 基于matlab的一种混凝土骨料三维随机投放模型

基于matlab的一种混凝土骨料三维随机投放模型&#xff0c;为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量&#xff0c;边界距离、骨料大小等参数。程序已调通&#xff0c;可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…

Redis 7.x 系列【16】持久化机制之 AOF

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 执行原理2.1 Redis 6.x2.1.1 直接写2.1.2 重写 2.2 Redis 7.x2.2.1 直接写2…