当前位置: 首页 > news >正文

强化学习 Reinforcement Learing

Proximal Policy Optimization (PPO)

PPO 是一种策略梯度方法,核心思想是通过限制策略更新的幅度,确保新策略与旧策略的差异不会过大,从而稳定训练过程。PPO 有两种主要变体:PPO-Clip(最常用)和 PPO-Penalty。本文将重点解释 PPO-Clip 的原理,并给出严谨的数学公式。


1. 核心问题:策略更新的稳定性

策略梯度方法(如 REINFORCE、Actor-Critic)直接优化策略网络参数 θ\thetaθ,目标函数为期望回报:
J(θ)=Eτ∼πθ[∑t=0Tγtrt] J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^T \gamma^t r_t \right] J(θ)=Eτπθ[t=0Tγtrt]
但直接最大化 J(θ)J(\theta)J(θ)可能导致策略更新步长过大,破坏训练稳定性。PPO 通过约束新旧策略的差异解决此问题。


2. 重要性采样(Importance Sampling)

PPO 利用重要性采样,用旧策略 (behavior policy)πθold\pi_{\theta_{\text{old}}}πθold收集的数据评估新策略(target policy) πθ\pi_\thetaπθ。定义概率比(Probability Ratio):
rt(θ)=πθ(at∣st)πθold(at∣st) r_t(\theta) = \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)} rt(θ)=πθold(atst)πθ(atst)
策略梯度目标可改写为:
J(θ)=Et[rt(θ)At] J(\theta) = \mathbb{E}_{t} \left[ r_t(\theta) A_t \right] J(θ)=Et[rt(θ)At]
其中 AtA_tAt是优势函数(Advantage Function),衡量动作 ata_tat相对于平均水平的优劣。


3. PPO-Clip 的目标函数

为防止 rt(θ)r_t(\theta)rt(θ)偏离 1 过远(即策略变化过大),PPO-Clip 引入裁剪机制
LCLIP(θ)=Et[min⁡(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)] L^{\text{CLIP}}(\theta) = \mathbb{E}_{t} \left[ \min \left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t \right) \right] LCLIP(θ)=Et[min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)]

  • ϵ\epsilonϵ是超参数(通常取 0.1 或 0.2),定义裁剪范围。
  • clip(x,a,b)\text{clip}(x, a, b)clip(x,a,b)xxx限制在 [a,b][a, b][a,b]区间内。

目标函数行为分析

  • At>0A_t > 0At>0(动作优于平均):
    • 未裁剪项:rt(θ)Atr_t(\theta) A_trt(θ)At鼓励增大动作概率。
    • 裁剪项:限制 rt(θ)≤1+ϵr_t(\theta) \leq 1+\epsilonrt(θ)1+ϵ,防止过度优化。
  • At<0A_t < 0At<0(动作劣于平均):
    • 未裁剪项:rt(θ)Atr_t(\theta) A_trt(θ)At鼓励减小动作概率。
    • 裁剪项:限制 rt(θ)≥1−ϵr_t(\theta) \geq 1-\epsilonrt(θ)1ϵ,防止过度避开。

最终目标取二者最小值,形成保守的悲观估计(避免因策略更新过大导致性能崩溃)。


4. 优势函数估计

优势函数 AtA_tAt使用 Generalized Advantage Estimation (GAE) 计算:
AtGAE(γ,λ)=∑l=0∞(γλ)lδt+l A_t^{\text{GAE}(\gamma, \lambda)} = \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} AtGAE(γ,λ)=l=0(γλ)lδt+l
其中:
δt=rt+γVϕ(st+1)−Vϕ(st) \delta_t = r_t + \gamma V^\phi(s_{t+1}) - V^\phi(s_t) δt=rt+γVϕ(st+1)Vϕ(st)

  • VϕV^\phiVϕ是值函数(Critic 网络),参数为 ϕ\phiϕ
  • γ\gammaγ为折扣因子,λ\lambdaλ为 GAE 超参数(平衡偏差与方差)。

5. 完整目标函数

PPO 的最终目标包含三部分:

  1. 策略损失(Clipped Surrogate Objective)
  2. 值函数损失(Mean Squared Error)
  3. 熵正则项(鼓励探索)

LtPPO(θ,ϕ)=Et[LtCLIP(θ)−c1LtVF(ϕ)+c2H(πθ(⋅∣st))] L_t^{\text{PPO}}(\theta, \phi) = \mathbb{E}_t \left[ L_t^{\text{CLIP}}(\theta) - c_1 L_t^{\text{VF}}(\phi) + c_2 H(\pi_\theta(\cdot|s_t)) \right] LtPPO(θ,ϕ)=Et[LtCLIP(θ)c1LtVF(ϕ)+c2H(πθ(st))]
其中:

  • 值函数损失(LtVF(ϕ)=(Vϕ(st)−Vttarget)2)(L_t^{\text{VF}}(\phi) = \left( V^\phi(s_t) - V_t^{\text{target}} \right)^2)(LtVF(ϕ)=(Vϕ(st)Vttarget)2)
  • 熵正则项H(πθ(⋅∣st))=−∑aπθ(a∣st)log⁡πθ(a∣st)H(\pi_\theta(\cdot|s_t)) = -\sum_a \pi_\theta(a|s_t) \log \pi_\theta(a|s_t)H(πθ(st))=aπθ(ast)logπθ(ast)
  • c1,c2c_1, c_2c1,c2为权重系数(如 c1=0.5,c2=0.01c_1=0.5, c_2=0.01c1=0.5,c2=0.01)。

6. 算法流程

  1. 数据收集:用当前策略 πθold\pi_{\theta_{\text{old}}}πθold与环境交互,收集轨迹 τ\tauτ
  2. 优势计算:用 GAE 计算每个时间步的优势 AtA_tAt
  3. 目标优化:对收集的数据进行 KKK次迭代(通常 K=3∼4K=3\sim4K=34),每轮迭代将数据分为小批量:
    • 更新策略网络:最大化 LCLIP(θ)L^{\text{CLIP}}(\theta)LCLIP(θ)
    • 更新值函数网络:最小化 LVF(ϕ)L^{\text{VF}}(\phi)LVF(ϕ)
  4. 策略同步:将 θ\thetaθ复制到 θold\theta_{\text{old}}θold,开始下一轮数据收集。

7. 数学公式总结

组件公式
概率比(重要性采样)rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)}rt(θ)=πθold(atst)πθ(atst)
Clipped 策略目标函数LtCLIP(θ)=min⁡(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)L^{\text{CLIP}}_t(\theta) = \min\left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t \right)LtCLIP(θ)=min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)
GAE 优势At=∑l=0T−t(γλ)lδt+lA_t = \sum_{l=0}^{T-t} (\gamma \lambda)^l \delta_{t+l}At=l=0Tt(γλ)lδt+l, δt=rt+γVϕ(st+1)−Vϕ(st)\delta_t = r_t + \gamma V^\phi(s_{t+1}) - V^\phi(s_t)δt=rt+γVϕ(st+1)Vϕ(st)
值函数损失LtVF(ϕ)=(Vϕ(st)−Vttarget)2L_t^{\text{VF}}(\phi) = \left( V^\phi(s_t) - V_t^{\text{target}} \right)^2LtVF(ϕ)=(Vϕ(st)Vttarget)2
熵正则项H(πθ)=−∑aπθ(a∣st)log⁡πθ(a∣st)H(\pi_\theta) = -\sum_a \pi_\theta(a \mid s_t) \log \pi_\theta(a \mid s_t)H(πθ)=aπθ(ast)logπθ(ast)
总目标LtPPO=Et[LtCLIP−c1LtVF+c2H(πθ)]L_t^{\text{PPO}} = \mathbb{E}_t \left[ L_t^{\text{CLIP}} - c_1 L_t^{\text{VF}} + c_2 H(\pi_\theta) \right]LtPPO=Et[LtCLIPc1LtVF+c2H(πθ)]

8. PPO 的优势

  • 稳定性:Clip 机制避免破坏性的大幅更新。
  • 样本效率:支持多次 epochs 重用数据(on-policy)。
  • 调参简单:超参数少(ϵ,K,c1,c2\epsilon, K, c_1, c_2ϵ,K,c1,c2),鲁棒性强。

PPO 已成为深度强化学习的标准算法,广泛应用于游戏控制、机器人、自然语言处理等领域。其核心创新在于裁剪机制,平衡了策略更新的性能与稳定性。

熵正则项(Entropy Regularization)是PPO算法目标函数中的关键组件之一,其核心作用是增强策略的探索能力防止策略过早收敛到次优解。下面从数学原理和实际影响两个层面进行严谨解释:


一、熵的数学定义与物理意义

设策略网络输出动作概率分布 πθ(⋅∣st)\pi_\theta(\cdot|s_t)πθ(st),则其熵定义为:
H(πθ(⋅∣st))=−∑a∈Aπθ(a∣st)log⁡πθ(a∣st) H(\pi_\theta(\cdot|s_t)) = -\sum_{a \in \mathcal{A}} \pi_\theta(a|s_t) \log \pi_\theta(a|s_t) H(πθ(st))=aAπθ(ast)logπθ(ast)
其中 A\mathcal{A}A 是动作空间。熵的物理意义:

  1. 不确定性度量:熵值越大,策略选择动作的随机性越强(探索充分)。
  2. 确定性度量:熵值越小,策略对某些动作的偏好越强(利用当前知识)。

二、熵正则项的作用机制

在目标函数中加入熵的正则化项:
LtPPO(θ,ϕ)=Et[LtCLIP(θ)−c1LtVF(ϕ)+c2H(πθ(⋅∣st))] L_t^{\text{PPO}}(\theta, \phi) = \mathbb{E}_t \left[ L_t^{\text{CLIP}}(\theta) - c_1 L_t^{\text{VF}}(\phi) + \color{red}{c_2 H(\pi_\theta(\cdot|s_t))} \right] LtPPO(θ,ϕ)=Et[LtCLIP(θ)c1LtVF(ϕ)+c2H(πθ(st))]
其中 c2>0c_2 > 0c2>0 是正则化系数。最大化总目标函数时,熵项会推动策略向高熵(高随机性)方向更新

具体作用:
  1. 促进探索

    • 当策略倾向于少数动作(熵低)时,H(πθ)H(\pi_\theta)H(πθ) 较小,正则项惩罚较大。
    • 算法通过增大 H(πθ)H(\pi_\theta)H(πθ) 鼓励策略更均匀地尝试不同动作,避免陷入局部最优。
  2. 防止策略过早收敛

    • 未加熵正则时,策略可能过早确定“看似最优”的动作,忽略潜在更好的选择。
    • 熵正则通过保持策略的随机性,延迟策略的“硬化”(Hardening),提高全局收敛性。
  3. 改善训练稳定性

    • 高熵策略对环境扰动更鲁棒,减少因噪声导致的学习震荡。
    • 尤其在稀疏奖励环境中,探索不足会导致训练停滞,熵正则可缓解此问题。

三、熵正则的直观示例

假设某状态下有两个动作 {a1,a2}\{a_1, a_2\}{a1,a2}

  • 低熵策略π(a1∣s)=0.99,π(a2∣s)=0.01→H≈0.06\pi(a_1|s)=0.99, \pi(a_2|s)=0.01 \rightarrow H \approx 0.06π(a1s)=0.99,π(a2s)=0.01H0.06
  • 高熵策略π(a1∣s)=0.6,π(a2∣s)=0.4→H≈0.67\pi(a_1|s)=0.6, \pi(a_2|s)=0.4 \rightarrow H \approx 0.67π(a1s)=0.6,π(a2s)=0.4H0.67

a2a_2a2 的实际价值未被充分探索,低熵策略几乎不尝试 a2a_2a2,可能错过更优解;而高熵策略持续探索 a2a_2a2,最终可能发现更高奖励。


四、熵正则对策略更新的影响

通过梯度分析理解其数学行为:
∇θH(πθ)=−∇θ∑aπθ(a∣st)log⁡πθ(a∣st) \nabla_\theta H(\pi_\theta) = -\nabla_\theta \sum_a \pi_\theta(a|s_t) \log \pi_\theta(a|s_t) θH(πθ)=θaπθ(ast)logπθ(ast)
展开后的梯度形式:
∇θH=−∑a(∇θπθ(a∣st)⋅log⁡πθ(a∣st)+∇θπθ(a∣st)) \nabla_\theta H = -\sum_a \left( \nabla_\theta \pi_\theta(a|s_t) \cdot \log \pi_\theta(a|s_t) + \nabla_\theta \pi_\theta(a|s_t) \right) θH=a(θπθ(ast)logπθ(ast)+θπθ(ast))
梯度更新会:

  1. 降低高概率动作的确定性:对 πθ(a∣st)≈1\pi_\theta(a|s_t) \approx 1πθ(ast)1 的动作,log⁡πθ≈0\log \pi_\theta \approx 0logπθ0,但第二项 ∇θπθ\nabla_\theta \pi_\thetaθπθ 推动其概率减小。
  2. 提升低概率动作的概率:对 πθ(a∣st)≈0\pi_\theta(a|s_t) \approx 0πθ(ast)0 的动作,log⁡πθ→−∞\log \pi_\theta \to -\inftylogπθ,梯度强烈增大其概率。

五、超参数 c2c_2c2 的调节

  • 较大 c2c_2c2:探索性增强,适合复杂/稀疏奖励环境(如蒙特祖玛的复仇)。
  • 较小 c2c_2c2:利用性增强,适合奖励密集的稳定环境(如连续控制任务)。
  • 动态衰减:部分实现随着训练步数衰减 c2c_2c2,后期侧重策略利用。

六、熵正则的算法意义总结

问题类型熵正则的作用数学本质
探索不足强制策略尝试新动作增大 H(πθ)H(\pi_\theta)H(πθ)
早熟收敛维持策略随机性约束 πθ\pi_\thetaπθ 分布熵
高方差训练平滑策略更新方向在梯度中引入均匀化分量

熵正则项是PPO能稳定处理复杂任务的关键设计之一,其通过信息论约束平衡了探索(Exploration)与利用(Exploitation)的矛盾。实验表明,移除熵正则会使PPO在Atari等任务上的性能显著下降(详见OpenAI Spinning Up基准测试)。

Generalized Advantage Estimation (GAE) 详解

GAE 是一种高效估计优势函数的技术,由 Schulman 等人于 2015 年提出。它通过平衡偏差-方差权衡,解决了传统优势估计的局限性。以下是严谨的数学推导和解释:


1. 基础概念回顾
  • 优势函数定义
    A(st,at)=Q(st,at)−V(st) A(s_t, a_t) = Q(s_t, a_t) - V(s_t) A(st,at)=Q(st,at)V(st)
    表示在状态 sts_tst 下选择动作 ata_tat 相对于平均水平的优势。
  • 估计挑战
    • 直接估计 QQQ 函数需要模拟完整轨迹(高方差)
    • TD 方法只使用单步奖励(高偏差)

2. k 步优势估计

定义 k 步优势函数
At(k)=∑l=0k−1γlrt+l+γkV(st+k)−V(st) A_t^{(k)} = \sum_{l=0}^{k-1} \gamma^l r_{t+l} + \gamma^k V(s_{t+k}) - V(s_t) At(k)=l=0k1γlrt+l+γkV(st+k)V(st)

  • 物理意义
    • kkk 步使用实际奖励
    • kkk 步后用值函数估计剩余回报
  • 特殊情形
    • k=1k=1k=1:TD 误差 δt=rt+γV(st+1)−V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)δt=rt+γV(st+1)V(st)
    • k=∞k=\inftyk=:蒙特卡洛估计 At(∞)=∑l=0∞γlrt+l−V(st)A_t^{(\infty)} = \sum_{l=0}^{\infty} \gamma^l r_{t+l} - V(s_t)At()=l=0γlrt+lV(st)

3. GAE 核心思想

GAE 将不同步数的估计通过参数 λ∈[0,1]\lambda \in [0,1]λ[0,1] 进行指数加权平均
AtGAE(γ,λ)=(1−λ)(At(1)+λAt(2)+λ2At(3)+⋯ ) A_t^{\text{GAE}(\gamma,\lambda)} = (1-\lambda) \left( A_t^{(1)} + \lambda A_t^{(2)} + \lambda^2 A_t^{(3)} + \cdots \right) AtGAE(γ,λ)=(1λ)(At(1)+λAt(2)+λ2At(3)+)


4. 数学推导
步骤 1:用 TD 误差表示 k 步优势

可证:
At(k)=∑l=0k−1γlδt+l A_t^{(k)} = \sum_{l=0}^{k-1} \gamma^l \delta_{t+l} At(k)=l=0k1γlδt+l
其中 δt=rt+γV(st+1)−V(st)\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)δt=rt+γV(st+1)V(st) 是 TD 误差。

步骤 2:代入 GAE 定义

AtGAE=(1−λ)(δt+λ(δt+γδt+1)+λ2(δt+γδt+1+γ2δt+2)+⋯ )=(1−λ)∑k=0∞λk∑l=0kγlδt+l \begin{align*} A_t^{\text{GAE}} &= (1-\lambda) \left( \delta_t + \lambda (\delta_t + \gamma \delta_{t+1}) + \lambda^2 (\delta_t + \gamma \delta_{t+1} + \gamma^2 \delta_{t+2}) + \cdots \right) \\ &= (1-\lambda) \sum_{k=0}^{\infty} \lambda^k \sum_{l=0}^{k} \gamma^l \delta_{t+l} \end{align*} AtGAE=(1λ)(δt+λ(δt+γδt+1)+λ2(δt+γδt+1+γ2δt+2)+)=(1λ)k=0λkl=0kγlδt+l

步骤 3:交换求和顺序(关键步骤)

AtGAE=(1−λ)∑l=0∞γlδt+l∑k=l∞λk=(1−λ)∑l=0∞γlδt+l(λl1−λ)=∑l=0∞(γλ)lδt+l \begin{align*} A_t^{\text{GAE}} &= (1-\lambda) \sum_{l=0}^{\infty} \gamma^l \delta_{t+l} \sum_{k=l}^{\infty} \lambda^k \\ &= (1-\lambda) \sum_{l=0}^{\infty} \gamma^l \delta_{t+l} \left( \frac{\lambda^l}{1-\lambda} \right) \\ &= \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l} \end{align*} AtGAE=(1λ)l=0γlδt+lk=lλk=(1λ)l=0γlδt+l(1λλl)=l=0(γλ)lδt+l
最终形式
AtGAE(γ,λ)=∑l=0∞(γλ)lδt+l \boxed{A_t^{\text{GAE}(\gamma,\lambda) }= \sum_{l=0}^{\infty} (\gamma \lambda)^l \delta_{t+l}} AtGAE(γ,λ)=l=0(γλ)lδt+l


5. 参数 λ\lambdaλ 的作用
λ\lambdaλ估计特性偏差-方差特性
λ=0\lambda=0λ=0退化为 TD 误差 At=δtA_t = \delta_tAt=δt高偏差,低方差
λ=1\lambda=1λ=1退化为 MC 估计 At=∑l=0∞γlδt+lA_t = \sum_{l=0}^{\infty} \gamma^l \delta_{t+l}At=l=0γlδt+l低偏差,高方差
0<λ<10<\lambda<10<λ<1平滑过渡平衡偏差与方差
  • 实验建议λ≈0.95\lambda \approx 0.95λ0.95 在多数任务中表现良好

6. 高效计算算法

实际中通过反向递归计算(复杂度 O(T)O(T)O(T)):

def compute_gae(rewards, values, gamma=0.99, lambda_=0.95):deltas = rewards + gamma * values[1:] - values[:-1]A = np.zeros_like(rewards)gae = 0for t in reversed(range(len(rewards))):gae = deltas[t] + gamma * lambda_ * gaeA[t] = gaereturn A

数学形式
At=δt+γλAt+1 A_t = \delta_t + \gamma \lambda A_{t+1} At=δt+γλAt+1
其中 AT=δTA_{T} = \delta_TAT=δT(轨迹终点)


7. GAE 的统计性质
期望值(无偏性)

E[AtGAE]=E[∑l=0∞(γλ)lδt+l]=Attrue \mathbb{E}[A_t^{\text{GAE}}] = \mathbb{E}\left[ \sum_{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l} \right] = A_t^{\text{true}} E[AtGAE]=E[l=0(γλ)lδt+l]=Attrue
V(s)=Vtrue(s)V(s) = V^{\text{true}}(s)V(s)=Vtrue(s) 时成立。

方差分析

方差表达式:
Var(AtGAE)=∑l=0∞(γλ)2lVar(δt+l) \text{Var}(A_t^{\text{GAE}}) = \sum_{l=0}^{\infty} (\gamma\lambda)^{2l} \text{Var}(\delta_{t+l}) Var(AtGAE)=l=0(γλ)2lVar(δt+l)

  • λ\lambdaλ 减小会指数级降低方差
  • γ\gammaγ 减小同时降低偏差和方差

8. 与其他方法的对比
方法估计形式优缺点
TD(0)At=δtA_t = \delta_tAt=δt低方差,高偏差
MCAt=∑γlrt+l−V(st)A_t = \sum \gamma^l r_{t+l} - V(s_t)At=γlrt+lV(st)高方差,无偏
TD(λ\lambdaλ)At=(1−λ)∑(γλ)lδt+lA_t = (1-\lambda)\sum (\gamma\lambda)^l \delta_{t+l}At=(1λ)(γλ)lδt+l通用但需重要性采样
GAE∑(γλ)lδt+l\sum (\gamma\lambda)^l \delta_{t+l}(γλ)lδt+l专为优势函数设计

9. 在 PPO 中的具体应用
  1. 数据收集:采样轨迹 {(st,at,rt)}t=0T−1\{(s_t, a_t, r_t)\}_{t=0}^{T-1}{(st,at,rt)}t=0T1
  2. 计算值函数:用 Critic 网络输出 Vϕ(st)V_\phi(s_t)Vϕ(st)
  3. 计算 TD 误差δt=rt+γVϕ(st+1)−Vϕ(st)\delta_t = r_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)δt=rt+γVϕ(st+1)Vϕ(st)
  4. 计算 GAEAt=∑l=0T−t−1(γλ)lδt+lA_t = \sum_{l=0}^{T-t-1} (\gamma\lambda)^l \delta_{t+l}At=l=0Tt1(γλ)lδt+l
  5. 优化目标
    max⁡θ1T∑t=0T−1min⁡(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At) \max_\theta \frac{1}{T} \sum_{t=0}^{T-1} \min\left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon) A_t \right) θmaxT1t=0T1min(rt(θ)At,clip(rt(θ),1ϵ,1+ϵ)At)

10. 理论优势总结
  1. 方差控制λ\lambdaλ 提供显式的方差调节机制
  2. 偏差可控:当 V(s)→Vtrue(s)V(s) \to V^{\text{true}}(s)V(s)Vtrue(s) 时,估计渐近无偏
  3. 计算高效O(T)O(T)O(T) 时间复杂度的反向计算
  4. 兼容性:适用于任意策略梯度算法(PPO, TRPO, A2C)

实验证明,GAE 可使策略梯度算法的样本效率提升 2-5 倍(来源:PPO 原始论文)。其设计体现了强化学习中偏差-方差权衡的核心思想,已成为现代深度强化学习的标准组件。


文章转载自:

http://3myrDROu.rknhd.cn
http://H8wf1gG4.rknhd.cn
http://8R1xonao.rknhd.cn
http://xfHGholX.rknhd.cn
http://LFXXJA6d.rknhd.cn
http://7cWGxnbU.rknhd.cn
http://1O3NoE1w.rknhd.cn
http://TfpVsCMi.rknhd.cn
http://SsAEIWb3.rknhd.cn
http://aybgHeIz.rknhd.cn
http://LxFVt9U6.rknhd.cn
http://wuO4u5oy.rknhd.cn
http://fJ8R73Ma.rknhd.cn
http://19zm6JnQ.rknhd.cn
http://RVmVEMm2.rknhd.cn
http://0C6xA2cW.rknhd.cn
http://UMDYX85p.rknhd.cn
http://NMs5kWOY.rknhd.cn
http://Vf5RPpM1.rknhd.cn
http://5Rc55hV8.rknhd.cn
http://LKwMcfki.rknhd.cn
http://mqbxey8y.rknhd.cn
http://qC2mgbqa.rknhd.cn
http://E5ecGx4W.rknhd.cn
http://IPm2S7CK.rknhd.cn
http://3hfOkPc3.rknhd.cn
http://gB6dZLdG.rknhd.cn
http://25lneJU3.rknhd.cn
http://wZD17lrs.rknhd.cn
http://BHqcklLX.rknhd.cn
http://www.dtcms.com/a/376463.html

相关文章:

  • 数据库物理外键与逻辑外键全解析
  • 分布式专题——8 京东热点缓存探测系统JDhotkey架构剖析
  • 计算机系统性能、架构设计、调度策略论文分类体系参考
  • Mujoco学习记录
  • [react] react-router-dom是啥?
  • uniapp,vue2 置顶功能实现,默认右边半隐藏,点击一次移出来,点击二次置顶,一段时间不操隐藏
  • 佩京VR重走长征路模拟系统
  • HTML详解
  • ai生成文章,流式传输(uniapp,微信小程序)
  • JVM 内存参数设置详解!
  • 医院高值耗材智能化管理路径分析(下)
  • 上市公司人工智能水平指数 1993-2024
  • AI/AR智能眼镜步入全球破圈增长期,五大科技大厂入局加剧生态市场角逐
  • FastGPT源码解析 Agent 智能体插件实现代码分析
  • 【Fastjson】Fastjson2 在不同 Modules 模块包下,@JSONField name映射无法反序列化的 BUG 及解决
  • [特殊字符] 从助手到引擎:基于 GPT 的战略协作系统演示
  • SSE 模仿 GPT 响应
  • ThingsKit物联网平台 v2.0.0 发布|前端UI重构、底层架构升级
  • 面向对象数据分析实战编程题:销售数据统计与可视化(Python)
  • Transformer vs. Diffusion:谁将主宰通用视频生成与世界模型的未来?
  • 存储卷配额管理针对海外VPS容器环境的实施流程
  • 前端开发中常见英文缩写及其全称
  • Linux第十五讲:Socket编程UDP
  • Electron 高级 UI:集成 React 或 Vue.js
  • CKAD-CN考试之路----10
  • Linux嵌入式自学笔记(基于野火EBF6ULL):1.配置环境
  • 2025【1460天】网络工程师经验之道
  • 图解设计模式【3】
  • java 将pdf转图片
  • ES(springcloud笔记第五期)