Deepseek的RL算法GRPO解读

news2025/4/21 8:39:18

在本文中,我们将深入探讨Deepseek采用的策略优化方法GRPO,并顺带介绍一些强化学习(Reinforcement Learning, RL)的基础知识,包括PPO等关键概念。


策略函数(policy)

在强化学习中, a t ∣ s t a_t \mid s_t atst 表示在状态 s t s_t st 下采取动作 a t a_t at 的条件概率。具体来说,它是由策略函数 π \pi π 决定的。

详细说明

s t s_t st

  • s t s_t st 表示在时间步 t t t 时的状态(state)。
  • 状态是环境对智能体的当前描述,例如在游戏中可能是角色的位置、速度等信息。

a t a_t at

  • a t a_t at 表示在时间步 t t t 时智能体采取的动作(action)。
  • 动作是智能体在给定状态下可以执行的操作,例如在游戏中可能是“向左移动”或“跳跃”。

π ( a t ∣ s t ) \pi(a_t \mid s_t) π(atst)

  • π ( a t ∣ s t ) \pi(a_t \mid s_t) π(atst) 是策略函数(policy),表示在状态 s t s_t st 下选择动作 a t a_t at 的概率。
  • 如果是确定性策略, π ( a t ∣ s t ) \pi(a_t \mid s_t) π(atst) 会直接输出一个确定的动作;如果是随机策略,它会输出一个动作的概率分布。

r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)} rt(θ)=πθold(atst)πθ(atst)

  • 在 PPO 中, r t ( θ ) r_t(\theta) rt(θ) 是新策略 π θ \pi_\theta πθ 和旧策略 π θ old \pi_{\theta_{\text{old}}} πθold 在状态 s t s_t st 下选择动作 a t a_t at 的概率比。
  • 这个比值用于衡量策略更新的幅度,并通过裁剪机制限制其变化范围,确保训练的稳定性。

举例说明

假设我们有一个简单的游戏环境:

  • 状态 s t s_t st:角色的位置。

  • 动作 a t a_t at:可以执行的动作是“向左”或“向右”。

  • 策略 π ( a t ∣ s t ) \pi(a_t \mid s_t) π(atst):在某个位置 s t s_t st 下,策略可能以 70% 的概率选择“向左”,以 30% 的概率选择“向右”。

在 PPO 中,我们会比较新旧策略在相同状态 s t s_t st 下选择相同动作 a t a_t at 的概率,从而计算概率比 r t ( θ ) r_t(\theta) rt(θ),并用于优化目标函数。

总结

a t ∣ s t a_t \mid s_t atst 表示在状态 s t s_t st 下选择动作 a t a_t at 的条件概率,由策略函数 π \pi π 决定。在 PPO 中,这一概率用于计算新旧策略的比值,从而控制策略更新的幅度。

近端策略优化(PPO)

PPO(Proximal Policy Optimization) 是一种用于强化学习的策略优化算法,由 OpenAI 提出。它通过限制策略更新的幅度,确保训练过程的稳定性。

核心思想

PPO 的核心在于限制策略更新的幅度,避免因更新过大导致性能下降。它通过引入“裁剪”机制,控制新旧策略之间的差异。

公式

PPO 的替代目标函数 J P P O ( θ ) \mathcal{J}_{PPO}(\theta) JPPO(θ) 用于优化策略 π θ \pi_\theta πθ,公式如下:

J P P O ( θ ) = E [ q ∼ P ( Q ) , o ∼ π θ o l d ( O ∣ q ) ] 1 ∣ o ∣ ∑ t = 1 ∣ o ∣ min ⁡ [ π θ ( o t ∣ q , o < t ) π θ o l d ( o t ∣ q , o < t ) A t , clip ( π θ ( o t ∣ q , o < t ) π θ o l d ( o t ∣ q , o < t ) , 1 − ε , 1 + ε ) A t ] \mathcal{J}_{PPO}(\theta) = \mathbb{E}_{[q \sim P(Q), o \sim \pi_{\theta_{old}}(O|q)]} \frac{1}{|o|} \sum_{t=1}^{|o|} \min \left[ \frac{\pi_\theta(o_{t} | q, o_{<t})}{\pi_{\theta_{old}}(o_{t} | q, o_{<t})} A_{t}, \text{clip} \left( \frac{\pi_\theta(o_{t} | q, o_{<t})}{\pi_{\theta_{old}}(o_{t} | q, o_{<t})}, 1 - \varepsilon, 1 + \varepsilon\right) A_{t} \right] JPPO(θ)=E[qP(Q),oπθold(Oq)]o1t=1omin[πθold(otq,o<t)πθ(otq,o<t)At,clip(πθold(otq,o<t)πθ(otq,o<t),1ε,1+ε)At]

其中:

期望符号 E \mathbb{E} E 表示对查询 q q q 和输出 o o o 的期望:

  • q ∼ P ( Q ) q \sim P(Q) qP(Q): 查询 q q q 从分布 P ( Q ) P(Q) P(Q) 中采样。

  • o ∼ π θ o l d ( O ∣ q ) o \sim \pi_{\theta_{old}}(O|q) oπθold(Oq): 输出 o o o 由旧策略 π θ o l d \pi_{\theta_{old}} πθold 生成。

1 ∣ o ∣ ∑ t = 1 ∣ o ∣ \frac{1}{|o|} \sum_{t=1}^{|o|} o1t=1o 对输出 o o o 的每个时间步 t t t 求平均:

  • ∣ o ∣ |o| o 是输出序列的长度。

其核心目标函数为:

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 \left[ \min \left( r_t(\theta) \hat{A}_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) \hat{A}_t \right) \right] LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1ϵ,1+ϵ)A^t)]

其中:

  • r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} rt(θ)=πθold(atst)πθ(atst) 是新旧策略的概率比。

  • A ^ t \hat{A}_t A^t 是优势函数,衡量动作的相对好坏。

  • ϵ \epsilon ϵ 是裁剪参数,通常为 0.1 或 0.2。

步骤

  1. 采样:使用当前策略与环境交互,收集数据,在语言模型中,可以类比为生成补全(generating completions)。
  2. 计算优势值:基于收集的数据计算优势值函数 A ^ t \hat{A}_t A^t
  3. 优化目标函数:通过梯度上升优化目标函数 L C L I P ( θ ) L^{CLIP}(\theta) LCLIP(θ)
  4. 更新策略:重复上述步骤,直到策略收敛。

优点

  • 稳定性:通过裁剪机制,避免策略更新过大。
  • 高效性:相比 TRPO,PPO 实现更简单,计算效率更高。

补充

在强化学习中,策略的目标是最大化期望回报,而不是最小化损失。所以,在PPO中使用的是梯度上升,原因在于它的优化目标是最大化目标函数(如强化学习中的期望回报),而不是最小化损失函数(如分类或回归问题)。


Advantage(优势函数)

定义

Advantage函数用于衡量在某个状态(State)下,采取某个动作(Action)相对于平均表现的优劣程度。它的数学定义为:
A ( s , a ) = Q ( s , a ) − V ( s ) A(s, a) = Q(s, a) - V(s) A(s,a)=Q(s,a)V(s), 其中:

  • Q ( s , a ) Q(s, a) Q(s,a)动作值函数,表示在状态 s s s 下采取动作 a a a 后,未来累积回报的期望。

  • V ( s ) V(s) V(s)状态值函数,表示在状态 s s s 下,按照当前策略采取动作后,未来累积回报的期望。

  • A ( s , a ) A(s, a) A(s,a)优势函数,表示在状态 s s s 下采取动作 a a a 比平均表现好多少(或差多少)。

作用

  • Advantage函数用于指导策略更新:

    • 如果 A ( s , a ) > 0 A(s, a) > 0 A(s,a)>0,说明动作 a a a 比平均表现更好,策略应该更倾向于选择这个动作;
    • 如果 A ( s , a ) < 0 A(s, a) < 0 A(s,a)<0,说明动作 a a a 比平均表现更差,策略应该减少选择这个动作的概率。
  • 在PPO等算法中,Advantage函数通常通过**GAE(Generalized Advantage Estimation)**来估计。

直观理解

Advantage函数就像一个“评分”,告诉模型某个动作在当前状态下是好还是坏,以及好(或坏)的程度。


KL Penalty(KL散度惩罚)

定义

KL Penalty是基于**KL散度(Kullback-Leibler Divergence)**的一种正则化手段。KL散度用于衡量两个概率分布之间的差异。在强化学习中,KL Penalty通常用于限制当前策略 π θ \pi_{\theta} πθ 和参考策略 π ref \pi_{\text{ref}} πref 之间的差异。其数学定义为:
KL Penalty = D KL ( π ref ∥ π θ ) \text{KL Penalty} = D_{\text{KL}}(\pi_{\text{ref}} \| \pi_{\theta}) KL Penalty=DKL(πrefπθ)
其中:

  • π θ \pi_{\theta} πθ 是当前策略(由模型参数 θ \theta θ 决定)。

  • π ref \pi_{\text{ref}} πref 是参考策略(通常是更新前的策略或某个基线策略)。

  • D KL D_{\text{KL}} DKL 是KL散度,用于衡量两个策略之间的差异。

作用

  • KL Penalty用于防止策略更新过大,确保当前策略不会偏离参考策略太远。这样可以避免训练过程中的不稳定现象(如策略崩溃)。
  • 在PPO等算法中,KL Penalty通常被添加到目标函数中,作为正则化项。

直观理解

KL Penalty就像一个“约束”,告诉模型在更新策略时不要“步子迈得太大”,以免失去稳定性。


Advantage和KL Penalty的关系

  • Advantage 用于指导策略更新,告诉模型哪些动作更好。

  • KL Penalty 用于约束策略更新,防止策略变化过大。

  • 在PPO等算法中,Advantage和KL Penalty共同作用,既鼓励模型选择更好的动作,又确保更新过程稳定可靠。

举例说明

假设我们训练一个机器人走迷宫:

  • Advantage:机器人发现“向右转”比“向左转”更容易找到出口,于是Advantage函数会给“向右转”一个正的值,鼓励策略更倾向于选择“向右转”。

  • KL Penalty:为了防止策略突然变得只选择“向右转”而忽略其他可能性,KL Penalty会限制策略的变化幅度,确保策略更新是平滑的。

总结

  • Advantage(优势函数):衡量某个动作比平均表现好多少,用于指导策略更新。

  • KL Penalty(KL散度惩罚):限制策略更新的幅度,确保训练过程的稳定性。


群体相对策略优化(GRPO)

GRPO 是一种在线学习算法(online learning algorithm),这意味着它通过使用训练过程中由训练模型自身生成的数据来迭代改进。GRPO 的目标直觉是最大化生成补全(completions)的优势函数(advantage),同时确保模型保持在参考策略(reference policy)附近。

其目标函数为:
J GRPO ( θ ) = E q ∼ P ( Q ) , { o i } i = 1 G ∼ π old ( O ∣ q ) [ 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ ( r i , t ( θ ) A ^ i , t − β D KL ( π θ ∣ ∣ π ref ) ) ] J_{\text{GRPO}}(\theta) = \mathbb{E}_{q \sim P(Q), \{o_i\}_{i=1}^G \sim \pi_{\text{old}}(O|q)} \left[ \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left( r_{i,t}(\theta) \hat{A}_{i,t} - \beta D_{\text{KL}}(\pi_\theta || \pi_{\text{ref}}) \right) \right] JGRPO(θ)=EqP(Q),{oi}i=1Gπold(Oq) G1i=1Goi1t=1oi(ri,t(θ)A^i,tβDKL(πθ∣∣πref))

在这里插入图片描述

为了理解 GRPO 的工作原理,可以将其分解为四个主要步骤:

  1. 生成补全(Generating completions)

  2. 计算优势值(Computing the advantage)

  3. 估计KL散度(Estimating the KL divergence)

  4. 计算损失(Computing the loss)

1. 生成补全(Generating completions)

在每一个训练步骤中,我们从提示(prompts)中采样一个批次(batch),并为每个提示生成一组 G G G 个补全(completions)(记为 o i o_i oi)。

2. 计算优势值(Computing the advantage)

对于每一个 G G G 序列,使用奖励模型(reward model)计算其奖励(reward)。为了与奖励模型的比较性质保持一致——通常奖励模型是基于同一问题的输出之间的比较数据集进行训练的——优势的计算反映了这些相对比较。其归一化公式如下:

A ^ i , t = r i − mean ( r ) std ( r ) \hat{A}_{i,t} = \frac{r_i - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})} A^i,t=std(r)rimean(r)

这种方法赋予了该方法其名称:群体相对策略优化(Group Relative Policy Optimization, GRPO)
在这里插入图片描述

GRPO通过优化PPO算法,解决了计算优势值时需要同时依赖奖励模型(reward model)和价值模型(value model)的问题,成功移除了value model(价值模型),显著降低了推理时的内存占用和时间开销。**Advantage(优势值)**的核心价值在于为模型输出提供更精准的评估,不仅衡量答案的绝对质量,还通过相对比较(与其他回答的对比)来更全面地定位其优劣。

3. 估计KL散度(Estimating the KL divergence)

在实际算法实现中,直接计算KL散度可能会面临一些挑战:

  • 计算复杂度高:KL散度的定义涉及对两个概率分布的对数比值的期望计算。对于复杂的策略分布,直接计算KL散度可能需要大量的计算资源;
  • 数值稳定性:在实际计算中,直接计算KL散度可能会遇到数值不稳定的问题,尤其是当两个策略的概率分布非常接近时,对数比值可能会趋近于零或无穷大。近似器可以通过引入一些数值稳定性的技巧(如截断或平滑)来避免这些问题;
  • 在线学习:在强化学习中,策略通常需要在每一步或每几步更新一次。如果每次更新都需要精确计算KL散度,可能会导致训练过程变得非常缓慢。近似器可以快速估计KL散度,从而支持在线学习和实时更新。

Schulman et al. (2020) 提出的近似器可以根据当前策略和参考策略的差异动态调整估计的精度,从而在保证计算效率的同时,尽可能减少估计误差,其定义如下:

D KL [ π θ ∥ π ref ] = π ref ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) − log ⁡ π ref ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) − 1 \mathbb{D}_{\text{KL}}\left[\pi_\theta \|\pi_{\text{ref}}\right] = \frac{\pi_{\text{ref}}(o_{i,t} \mid q, o_{i,<t})}{\pi_\theta(o_{i,t} \mid q, o_{i,<t})} - \log \frac{\pi_{\text{ref}}(o_{i,t} \mid q, o_{i,<t})}{\pi_\theta(o_{i,t} \mid q, o_{i,<t})} - 1 DKL[πθπref]=πθ(oi,tq,oi,<t)πref(oi,tq,oi,<t)logπθ(oi,tq,oi,<t)πref(oi,tq,oi,<t)1

这个近似器的核心思想是通过对当前策略和参考策略的概率比值的简单变换来估计KL散度。具体来说:

  • 第一项 π ref ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) \frac{\pi_{\text{ref}}(o_{i,t} \mid q, o_{i,<t})}{\pi_\theta(o_{i,t} \mid q, o_{i,<t})} πθ(oi,tq,oi,<t)πref(oi,tq,oi,<t) 是参考策略与当前策略的概率比值。
  • 第二项 log ⁡ π ref ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) \log \frac{\pi_{\text{ref}}(o_{i,t} \mid q, o_{i,<t})}{\pi_\theta(o_{i,t} \mid q, o_{i,<t})} logπθ(oi,tq,oi,<t)πref(oi,tq,oi,<t) 是对数概率比值。
  • 第三项 − 1 -1 1 是一个常数项,用于调整近似器的偏差。

这个近似器的优势在于它只需要计算当前策略和参考策略的概率比值,而不需要直接计算KL散度的积分或期望。因此,它可以在保证一定精度的同时,显著降低计算复杂度。

近似器的直观理解

这个近似器的设计灵感来自于泰勒展开。KL散度可以看作是两个分布之间的某种“距离”,而这个近似器通过一阶或二阶近似来估计这个距离。具体来说:

  • π θ \pi_\theta πθ π ref \pi_{\text{ref}} πref 非常接近时, π ref π θ ≈ 1 \frac{\pi_{\text{ref}}}{\pi_\theta} \approx 1 πθπref1,此时 log ⁡ π ref π θ ≈ 0 \log \frac{\pi_{\text{ref}}}{\pi_\theta} \approx 0 logπθπref0,近似器的值趋近于零,符合KL散度的性质。
  • π θ \pi_\theta πθ π ref \pi_{\text{ref}} πref 差异较大时,近似器会给出一个较大的正值,反映出两个分布之间的差异。

4. 计算损失(Computing the loss)

这一步的目标是最大化优势,同时确保模型保持在参考策略附近。因此,损失定义如下:

L GRPO ( θ ) = − 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ [ π θ ( o i , t ∣ q , o i , < t ) [ π θ ( o i , t ∣ q , o i , < t ) ] no grad A ^ i , t − β D KL [ π θ ∥ π ref ] ] \mathcal{L}_{\text{GRPO}}(\theta) = -\frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \frac{\pi_\theta(o_{i,t} \mid q, o_{i,< t})}{\left[\pi_\theta(o_{i,t} \mid q, o_{i,< t})\right]_{\text{no grad}}} \hat{A}_{i,t} - \beta \mathbb{D}_{\text{KL}}\left[\pi_\theta \| \pi_{\text{ref}}\right] \right] LGRPO(θ)=G1i=1Goi1t=1oi[[πθ(oi,tq,oi,<t)]no gradπθ(oi,tq,oi,<t)A^i,tβDKL[πθπref]]

其中第一项表示缩放后的优势,第二项通过KL散度惩罚与参考策略的偏离。

在原始论文中,该公式被推广为在每次生成后通过利用**裁剪替代目标(clipped surrogate objective)**进行多次更新:

L GRPO ( θ ) = − 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ [ min ⁡ ( π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) A ^ i , t ,   clip ( π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) , 1 − ϵ , 1 + ϵ ) A ^ i , t ) − β D KL [ π θ ∥ π ref ] ] \mathcal{L}_{\text{GRPO}}(\theta) = - \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \min \left( \frac{\pi_\theta(o_{i,t} \mid q, o_{i,< t})}{\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i,< t})} \hat{A}_{i,t}, \, \text{clip}\left( \frac{\pi_\theta(o_{i,t} \mid q, o_{i,< t})}{\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i,< t})}, 1 - \epsilon, 1 + \epsilon \right) \hat{A}_{i,t} \right) - \beta \mathbb{D}_{\text{KL}}\left[\pi_\theta \| \pi_{\text{ref}}\right] \right] LGRPO(θ)=G1i=1Goi1t=1oi[min(πθold(oi,tq,oi,<t)πθ(oi,tq,oi,<t)A^i,t,clip(πθold(oi,tq,oi,<t)πθ(oi,tq,oi,<t),1ϵ,1+ϵ)A^i,t)βDKL[πθπref]]

其中 clip ( ⋅ , 1 − ϵ , 1 + ϵ ) \text{clip}(\cdot, 1 - \epsilon, 1 + \epsilon) clip(,1ϵ,1+ϵ) 通过将策略比率限制在 1 − ϵ 1 - \epsilon 1ϵ 1 + ϵ 1 + \epsilon 1+ϵ 之间,确保更新不会过度偏离参考策略。

在很多代码实现,比如Huggingface的TRL中,与原始论文一样每次生成只进行一次更新,因此可以将损失简化为第一种形式。

总结

GRPO通过优化PPO算法,移除了价值模型,降低了计算开销,同时利用群体相对优势函数和KL散度惩罚,确保策略更新既高效又稳定。

想象一下,你是个销售员,这个月业绩10万块,PPO算法就像个精明的老会计,拿着算盘噼里啪啦一顿算,考虑市场行情、产品类型,最后得出结论:“嗯,这10万还算靠谱,但GAE一算,发现你的优势值还不够高,还得再加把劲啊”

而GRPO呢,就像老板直接搞了个“内卷大赛”,把所有销售员拉到一个群里,每天晒业绩:“你10万,他15万,她20万……”老板还时不时发个红包,刺激大家继续卷。你的10万块在群里瞬间被淹没,老板摇摇头:“你这水平,还得加把劲啊!”

GRPO这招绝了,它把PPO的“算盘”扔了,省了不少计算功夫,直接搞“内卷PK”,用KL散度惩罚来确保大家别躺平。这样一来,策略更新既快又稳,老板再也不用担心有人摸鱼了,毕竟大家都在拼命卷,谁敢松懈?

总结一下:PPO是“单打独斗看实力”,GRPO是“内卷大赛拼到死”,最后GRPO还省了算盘钱,老板笑得合不拢嘴,而我们只能默默加班,继续卷。

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

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

相关文章

神经网络和深度学习

应用 类型 为什么近几年飞速发展 数据增长&#xff0c;算力增长&#xff0c;算法革新 逻辑回归 向量化 浅层神经网络(Shallow neural network) 单条训练数据前向传播计算表达式 batch训练数据前向传播计算表达式 反向传播计算表达式 参数随机初始化 不能全部设为0 原因是同一…

python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算

【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。 按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位取反运算&#xff1a;一个二进制数&#xff0c;0变1,1变0。 按…

关联传播和 Python 和 Scikit-learn 实现

文章目录 一、说明二、什么是 Affinity Propagation。2.1 先说Affinity 传播的工作原理2.2 更多细节2.3 传播两种类型的消息2.4 计算责任和可用性的分数2.4.1 责任2.4.2 可用性分解2.4.3 更新分数&#xff1a;集群是如何形成的2.4.4 估计集群本身的数量。 三、亲和力传播的一些…

【etcd】二进制安装etcd

由于生产服务器不能使用yum 安装 etcd ,或者 安装的etcd 版本比较老&#xff0c;这里介绍一个使用二进制安装的方式。 根据安装文档编写一个下载脚本即可 &#xff1a; 指定 etcd 的版本 提供了两个下载地址 一个 Google 一个 Github&#xff0c; 不过都需要外网 注释掉删除保…

企业知识管理平台助力企业创新与竞争力提升的有效策略探讨

内容概要 在当今快速发展的商业环境中&#xff0c;企业知识管理平台的构建显得至关重要。它不仅为企业的知识资源提供了一个整合与分享的空间&#xff0c;还为企业的创新与竞争力提升提供了策略支持。本文将深入探讨企业知识管理平台的关键要素&#xff0c;包括知识获取、存储…

Java多线程——线程安全性

线程安全性 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的 public class A {public void test(){//....} }无状态对象是线程安全的&#xff0c;其不包含任何域&#xff0c;也不包含任何对其他类中域的引用&#…

Windows安装Miniconda和PySide6以及配置PyCharm

目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda&#xff0c;是因为它是一个更小的Anaconda发行版&#x…

C++传送锚点的内存寻址:内存管理

文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 继C语…

循序渐进kubernetes-RBAC(Role-Based Access Control)

文章目录 概要Kubernetes API了解 Kubernetes 中的 RBACRoles and Role Bindings:ClusterRoles and ClusterRoleBindings检查访问权限&#xff1a;外部用户结论 概要 Kubernetes 是容器化应用的强大引擎&#xff0c;但仅仅关注部署和扩展远远不够&#xff0c;集群的安全同样至…

《从因果关系的角度学习失真不变表示以用于图像恢复》学习笔记

paper&#xff1a;2303.06859 GitHub&#xff1a;lixinustc/Causal-IR-DIL: Distortion invariant feature learning for image restoration from a causality perspective 2023 CVPR 目录 摘要 1、介绍 1.1 图像修复任务 1.2 失真不变表示学习 1.3 因果效应估计的挑战…

亚博microros小车-原生ubuntu支持系列:16 机器人状态估计

本来想测试下gmapping建图&#xff0c;但是底层依赖了yahboomcar_bringup做底层的数据处理&#xff0c;所以先把依赖的工程导入。 程序启动后&#xff0c;会订阅imu和odom数据&#xff0c;过滤掉一部分的imu数据后&#xff0c;然后与odom数据进行融合&#xff0c;最后输出一个…

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…

【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景&#xff1a;DemoScene&#xff08;Unity 2019.4.0f1项目环境&#xff09; Player物体上的CharacterController2D&#xff0c;Mask添加Wall层…

mybatis(134/134)完结

一级缓存&#xff08;默认情况下开启&#xff09;同一个sqlsession中执行相同的查询语句走一级缓存 二级缓存 &#xff1a;同一个sqlsessionfactory&#xff0c;sqlsession关闭了才会将一级缓存提交到二级缓存中 外部编写的缓存 PageHelper插件&#xff1a;方便进行分页&#x…

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹&#xff0c;寻…

BLE透传方案,IoT短距无线通信的“中坚力量”

在物联网&#xff08;IoT&#xff09;短距无线通信生态系统中&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输&#xff0c;最高能满足2Mbps的数据传输速率&…

苍穹外卖—订单模块

该模块分为地址表的增删改查、用户下单、订单支付三个部分。 第一部分地址表的增删改查无非就是对于单表的增删改查&#xff0c;较基础&#xff0c;因此直接导入代码。 地址表 一个用户可以有多个地址&#xff0c;同时有一个地址为默认地址。用户还可为地址添加例如&q…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

MySQL分表自动化创建的实现方案(存储过程、事件调度器)

《MySQL 新年度自动分表创建项目方案》 一、项目目的 在数据库应用场景中&#xff0c;随着数据量的不断增长&#xff0c;单表存储数据可能会面临性能瓶颈&#xff0c;例如查询、插入、更新等操作的效率会逐渐降低。分表是一种有效的优化策略&#xff0c;它将数据分散存储在多…

接口技术-第6次作业

目录 作业内容 解答 1.假设在一个系统中&#xff0c;8255A的端口地址为184H-187H&#xff0c;A口工作于方式1输出&#xff0c;B口工作于方式1输入&#xff0c;禁止中断&#xff0c;C口剩余的两根线PC5&#xff0c;PC4位输入&#xff0c;如下图所示&#xff0c;试编写初始化…