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.mzph.cn/web/67330.shtml

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

相关文章

【python】python基于机器学习与数据分析的二手手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的二手手机特性关联与…

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)

手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09; 目录 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion&#xff08;代码&#xff09;Stable Diffusion 原理图Stable Diffusion的原理解释Stable Diffusion 和Di…

前端【8】HTML+CSS+javascript实战项目----实现一个简单的待办事项列表 (To-Do List)

目录 一、功能需求 二、 HTML 三、CSS 四、js 1、绑定事件与初始设置 2.、绑定事项 &#xff08;1&#xff09;添加操作&#xff1a; &#xff08;2&#xff09;完成操作 &#xff08;3&#xff09;删除操作 &#xff08;4&#xff09;修改操作 3、完整js代码 总结…

vue事件总线(原理、优缺点)

目录 一、原理二、使用方法三、优缺点优点缺点 四、使用注意事项具体代码参考&#xff1a; 一、原理 在Vue中&#xff0c;事件总线&#xff08;Event Bus&#xff09;是一种可实现任意组件间通信的通信方式。 要实现这个功能必须满足两点要求&#xff1a; &#xff08;1&#…

图像处理之HSV颜色空间

目录 1 RGB 的局限性 2 HSV 颜色空间 3 RGB与HSV相互转换 4 HSV颜色模型对图像的色相、饱和度和明度进行调节 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 RGB 的局限性 RGB 是我们接触最多的颜色空间&#xff0c;由三个通道表示一幅图像&#xff0c;分…

【C++高并发服务器WebServer】-9:多线程开发

本文目录 一、线程概述1.1 线程和进程的区别1.2 线程之间共享和非共享资源1.3 NPTL 二、线程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、实战demo四、线程同步五、死锁六、读写锁七、生产消费者模型 一、…

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…

21.Word:小赵-毕业论文排版❗【39】

目录 题目​ NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 题目 NO1.2 自己的论文当中接收老师的修改&#xff1a;审阅→比较→源文档&#xff1a;考生文件夹&#xff1a;Word.docx→修订的文档&#xff1a;考生文件夹&#xff1a;教师修改→确定→接收→接收所有修订将合并之…

深度学习 DAY3:NLP发展史及早期的前馈神经网络(ANN)及多任务学习

NLP发展史 NLP发展脉络简要梳理如下&#xff1a; 2001 - Neural language models&#xff08;神经语言模型&#xff09; 2008 - Multi-task learning&#xff08;多任务学习&#xff09; 2013 - Word embeddings&#xff08;词嵌入&#xff09; 2013 - Neural networks for NL…

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…

54.数字翻译成字符串的可能性|Marscode AI刷题

1.题目 问题描述 小M获得了一个任务&#xff0c;需要将数字翻译成字符串。翻译规则是&#xff1a;0对应"a"&#xff0c;1对应"b"&#xff0c;依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的…

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…

10JavaWeb——SpringBootWeb案例01

前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库MySQL&#xff0c;以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来&#xff0c;我们就通过一个案例&#xff0c;来将前端开发、后…

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…

ResNeSt: Split-Attention Networks论文学习笔记

这张图展示了一个名为“Split-Attention”的神经网络结构&#xff0c;该结构在一个基数组&#xff08;cardinal group&#xff09;内进行操作。基数组通常指的是在神经网络中处理的一组特征或通道。图中展示了如何通过一系列操作来实现对输入特征的注意力机制。 以下是图中各部…

设计模式Python版 原型模式

文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对…

神经网络的通俗介绍

人工神经网络&#xff0c;是一种模仿人类大脑工作原理的数学模型。人类的大脑是由无数的小“工作站”组成的&#xff0c;每个工作站叫做“神经元”。这些神经元通过“电线”互相连接&#xff0c;负责接收、处理和传递信息。 一、人类大脑神经网络 人类大脑的神经网络大概长这…

OpenEuler学习笔记(八):安装OpenEuler

在VMware Workstation中安装OpenEuler 准备工作 下载并安装VMware Workstation虚拟机软件。前往OpenEuler官网下载OpenEuler系统镜像文件。 创建虚拟机 打开VMware Workstation&#xff0c;点击“创建新的虚拟机”&#xff0c;选择“自定义”&#xff0c;点击“下一步”。选择…

Leetcode::119. 杨辉三角 II

119. 杨辉三角 II 已解答 简单 相关标签 相关企业 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0…

让Android adb支持互联网调试脱离局域网

某些特殊场景下由于不方便&#xff0c;手机不在身边&#xff0c;但需要进行adb调试。 首先可以先开启adb的无线调试模式&#xff0c;我使用的是第二种方式。 在Android手机上安装一个终端模拟器&#xff0c;并赋予root权限&#xff0c;随后执行&#xff1a; setprop service.…