Deepseek的RL算法GRPO解读

在本文中,我们将深入探讨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.rhkb.cn/news/9173.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cent6.6安装rabbitmq

cent6.6安装rabbitmq 如果对运维课程感兴趣&#xff0c;可以在b站上、A站或csdn上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实战技术视频 1.在服务器192.168.231.128上安装rabbitmq 1)安装编译工具 [rootlocalhost ~]# …

ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”

22LTS to 24LTS 更新过程中手jian把更新程序controlC导致的。 解决 目前企图完成更新来恢复&#xff0c;重启后有软件包冲突&#xff0c;sudo apt upgrade报冲突。无法进行。 将原来source.list重新 sudo dpkg --configure -a sudo apt install -f 这些都不管用。还是显示gno…

Databend x 沉浸式翻译 | 基于 Databend Cloud 构建高效低成本的业务数据分析体系

「沉浸式翻译」是一个非常流行的双语对照网页翻译扩展工具&#xff0c;用户可以用它来即时翻译外文网页、PDF 文档、ePub 电子书、字幕等。它不仅可以实现原文加译文实时双语对照显示&#xff0c;还支持 Google、OpenAI、DeepL、微软、Gemini、Claude 等数十家翻译平台服务的自…

LabVIEW纤维集合体微电流测试仪

LabVIEW开发纤维集合体微电流测试仪。该设备精确测量纤维材料在特定电压下的电流变化&#xff0c;以分析纤维的结构、老化及回潮率等属性&#xff0c;对于纤维材料的科学研究及质量控制具有重要意义。 ​ 项目背景 在纤维材料的研究与应用中&#xff0c;电学性能是评估其性能…

哈工大:LLM高质量嵌入模型KaLM-Embedding

&#x1f4d6;标题&#xff1a;KaLM-Embedding: Superior Training Data Brings A Stronger Embedding Mode &#x1f310;来源&#xff1a;arXiv, 2501.01028 &#x1f31f;摘要 &#x1f538;随着检索增强生成在大型语言模型中的盛行&#xff0c;嵌入模型变得越来越重要。尽…

Baklib打造高效内容管理平台提升协作与创作体验

内容概要 随着信息化时代的迅猛发展&#xff0c;高效的内容管理已成为各类团队日常工作中不可或缺的一部分。Baklib的内容管理平台正是应运而生&#xff0c;旨在为团队提供一个集协作、创作与管理于一体的解决方案。该平台通过其直观的界面和一系列创新功能&#xff0c;帮助用…

通过高效的侦察发现关键漏洞接管整个IT基础设施

视频教程在我主页简介或专栏里 在这篇文章中&#xff0c; 我将深入探讨我是如何通过详细分析和利用暴露的端点、硬编码的凭据以及配置错误的访问控制&#xff0c;成功获取目标组织关键IT基础设施和云服务访问权限的全过程。 我们先提到目标网站的名称 https://*sub.domain*.co…

【Linux笔记】Day4

关机重启 登录注销 注意用户名只能是小写 用户管理 pwd显示当前在哪个目录下&#xff1a; 删除用户 连带着用户文件夹都删掉 高权限用户切换到低权限用户无需输入密码 clear能把当前屏幕显示清掉 如果之前加的用户没有指定组&#xff0c;它会创建一个和用户同名的组&a…

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…

Winform如何取消叉号,减号和放大(两种)

方法一: 找到窗体属性 MaximizeBoxFalse; MinimizeBoxFalse; ControlBoxFALSE; 方法二: 点击Form 在From里面找到Form-Closing 这个事件 写入 if(e.CloseReasonCloseReason.UserClosing) { MessageBox.Show("对不起,你不能关闭") e.Cancel true; }

OpenCV:开运算

目录 1. 简述 2. 用腐蚀和膨胀实现开运算 2.1 代码示例 2.2 运行结果 3. 开运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 开运算应用场景 5. 注意事项 6. 总结 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;闭运算-CSDN博客 …

MIMIC-IV数据部署(博主较忙,缓慢更新)

1. 用到的数据准备 在下面的网站&#xff0c;注册、申请、推荐人从邮箱里帮忙确认。 通过后&#xff0c;拉到页面的最下面。把那个将近10个G的文件给下载下来。 可以在晚上睡觉的时候下载&#xff0c;第二天早上起来“收数据”。 MIMIC-IV v3.1 2. 用到的软件准备 7-zip …

二叉树-堆(补充)

二叉树-堆 1.二叉树的基本特性2.堆2.1.堆的基本概念2.2.堆的实现2.2.1.基本结构2.2.2.堆的初始化2.2.3.堆的销毁2.2.4.堆的插入2.2.5.取出堆顶的数据2.2.6.堆的删除2.2.7.堆的判空2.2.8.堆的数据个数2.2.9.交换2.2.10.打印堆数据2.2.11.堆的创建2.2.12.堆排序2.2.13.完整代码 3…

省市区三级联动

引言 在网页中&#xff0c;经常会遇到需要用户选择地区的场景&#xff0c;如注册表单、地址填写等。为了提供更好的用户体验&#xff0c;我们可以实现一个三级联动的地区选择器&#xff0c;让用户依次选择省份、城市和地区。 效果展示&#xff1a; 只有先选择省份后才可以选择…

【数据结构】动态内存管理函数

动态内存管理 为什么存在动态内存管理动态内存函数的介绍&#x1f38a;malloc补充&#xff1a;perror函数&#x1f38a;free&#x1f38a;calloc&#x1f38a;realloc 常见动态内存错误对空指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一…

【xcode 16.2】升级xcode后mac端flutter版的sentry报错

sentry_flutter 7.11.0 报错 3 errors in SentryCrashMonitor_CPPException with the errors No type named terminate_handler in namespace std (line 60) and No member named set_terminate in namespace std 替换sentry_flutter版本为&#xff1a; 8.3.0 从而保证oc的…

Julius AI 人工智能数据分析工具介绍

Julius AI 是一款由 Casera Labs 开发的人工智能数据分析工具&#xff0c;旨在通过自然语言交互和强大的算法能力&#xff0c;帮助用户快速分析和可视化复杂数据。这款工具特别适合没有数据科学背景的用户&#xff0c;使数据分析变得简单高效。 核心功能 自然语言交互&#x…

智慧园区系统集成解决方案构建智能管理新模式与发展蓝图

内容概要 在当今快速发展的科技环境中&#xff0c;智慧园区系统集成解决方案为园区的管理和运营提供了一种全新的思路。这种解决方案通过集合先进的核心技术&#xff0c;帮助各种园区实现智能化管理&#xff0c;从而提高运营效率。对于工业园、产业园、物流园、写字楼乃至公寓…

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先&#xff0c;要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理&#xff0c;还是其他功能&#xff1f;明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时&#xff0c;你需要选择适合的编程语言、…