DeepSeek 再探(二)

DeepSeek 再探(二)

  • 知识预备PG

    策略模型参数 θ \theta θ 在给定观测值(input_ids) 的条件下,自回归生成一段轨迹/句子 trajectory τ \tau τ
    τ = { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . , s T , a T , r T } \tau = \{{s_1,a_1,r_1,s_2,a_2,r_2,...,s_T,a_T,r_T}\} τ={s1,a1,r1,s2,a2,r2,...,sT,aT,rT}
    解释下:

    s i s_i si 表示当前观测状态,对应于策略模型(policy model)输入(input_ids or imput_emdings);

    a i a_i ai 是动作,等同于策略模型输入input_idsforward得到的 logitssample 操作,在vocab 里选取 next token; 由于sample 具有随机性,相同的观测值未必采取相同的行动(即: 同一个问题上生成多条回答);

    r i r_i ri冻结的 reward model 在给定状态-动作序列 ( s i < t s_{i<t} si<t, a i < t a_{i<t} ai<t) 后生成的即时奖励分数,表示当前时刻 的 r i r_i ri即时奖励

    当前时刻 i i i整体奖励即时奖励未来奖励两部分组成,其数学表达式为:
    R ( τ ) = ∑ i T r n R(\tau) = \sum_i^{T} r_{n} R(τ)=iTrn

    """
    在选择当前动作  $a_i$ token 时,未来奖励是无法直接获取的。为解决这个问题,还需要引入 `critic` 来估计未来奖励的期望值。
    """
    

    目标:训练模型参数 θ \theta θ , 由 θ \theta θ 采样/生成每条轨迹/句子的奖励分数 R ( τ ) R(\tau) R(τ) 要高,因此,最大化目标函数:
    o b j θ = ∑ τ R ( τ ) P ( τ ∣ θ ) obj_{\theta} = \sum_{\tau} R(\tau)P(\tau|\theta) objθ=τR(τ)P(τθ)
    求解梯度:
    ∇ o b j θ = ∑ τ R ( τ ) ∇ P ( τ ∣ θ ) = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ l o g P ( τ ∣ θ ) = 1 N ∑ 1 N R ( τ ) ∇ l o g P ( τ ∣ θ ) \nabla obj_{\theta} = \sum_{\tau} R(\tau) \nabla P(\tau|\theta) \\ = \sum_{\tau} R(\tau)P(\tau|\theta) \nabla logP(\tau|\theta) \\ = \frac{1}{N} \sum^{N}_{1} R(\tau) \nabla logP(\tau|\theta) objθ=τR(τ)P(τθ)=τR(τ)P(τθ)logP(τθ)=N11NR(τ)logP(τθ)
    P ( τ ∣ θ ) P(\tau|\theta) P(τθ)
    P ( τ ∣ θ ) = p ( s 1 ) p ( a 1 ∣ s 1 , θ ) p ( r 1 , s 2 ∣ s 1 , a 1 ) p ( a 2 ∣ s 2 , θ ) p ( r 2 , s 3 ∣ s 2 , a 2 ) . . . P(\tau|\theta) = p(s_1)p(a_1|s_1,\theta)p(r_1,s_2|s_1,a_1)p(a_2|s_2,\theta)p(r_2,s_3|s_2,a_2) ... P(τθ)=p(s1)p(a1s1,θ)p(r1,s2s1,a1)p(a2s2,θ)p(r2,s3s2,a2)...
    只保留与 θ \theta θ 相关项
    l o g P ( τ ∣ θ ) = ∑ t = 1 T p ( a t ∣ s t , θ ) logP(\tau|\theta) = \sum_{t=1}^{T} p(a_t|s_t,\theta) logP(τθ)=t=1Tp(atst,θ)
    最终梯度计算公式如下:
    ∇ o b j θ = 1 N ∑ n = 1 N R ( τ ) ∇ l o g P ( τ ∣ θ ) = 1 N ∑ n = 1 N ∑ t = 1 T R ( τ n ) ∇ l o g p ( a t ∣ s t , θ ) \nabla obj_{\theta} = \frac{1}{N} \sum^{N}_{n = 1} R(\tau) \nabla logP(\tau|\theta) \\ = \frac{1}{N} \sum^{N}_{n = 1} \sum^{T}_{t = 1} R(\tau^{n}) \nabla logp(a_t|s_t,\theta) objθ=N1n=1NR(τ)logP(τθ)=N1n=1Nt=1TR(τn)logp(atst,θ)
    R ( τ ) R(\tau) R(τ) 始终为正值时,若采样(sample)数量不足,已采样到的动作 a i a_i ai 的概率会随着参数 θ \theta θ 的更新而逐渐提高;而未采样到的动作 a j a_j aj 的概率则会随着 θ \theta θ 的更新而逐渐降低。然而,在初始理想条件下,根据分布 p ( τ ∣ θ ) p(\tau|\theta) p(τθ) a j a_j aj 可能产生的奖励实际上比 a i a_i ai 更高(由于 a j a_j aj 在初始时未被采样到,策略模型参数更新时会降低 a j a_j aj 的概率)。因此,为了避免这种偏差,需要引入一个基线值(baseline),使得 R ( τ ) R(\tau) R(τ) 不完全为正值。这就是引入优势概念的原因。
    ∇ o b j θ = 1 N ∑ n = 1 N ∑ t = 1 T R ( τ n − b ) ∇ l o g p ( a t ∣ s t , θ ) \nabla obj_{\theta} = \frac{1}{N} \sum^{N}_{n = 1} \sum^{T}_{t = 1} R(\tau^{n} -b ) \nabla logp(a_t|s_t,\theta) \\ objθ=N1n=1Nt=1TR(τnb)logp(atst,θ)

  • 知识预备RLHF
    • 价值函数:

      上文讨论奖励值时,仅考虑即时奖励显得有点短视,因为当前状态和动作会影响未来的状态和动作,进而影响整体收益。因此,更合理的设计是:t时刻总收益 = **即时收益 + 未来收益。**表达式如下:
      V t = R t + γ V t + 1 V _ { t } = R _ { t } + \gamma V _ { t + 1 } Vt=Rt+γVt+1

      • V t V_t Vt: t时刻的实际期望总收益,包含即时和未来收益,由参数更新的critic model 预测。指的是对语言模型从“当前生成 token 开始,直到整个 response 生成结束”后的收益预估。由于语言模型尚未生成后续的 token,因此只能对其未来一系列动作的收益进行估计,故称为“期望总收益”。
      • R t R_t Rt: t 时刻的即时收益, 由冻结的 reward model 产生。
      • V t + 1 V_{t+1} Vt+1: t+1时刻的总收益,代表未来收益,由参数更新的critic model 预测,同 V t V_t Vt 定义。
      • γ \gamma γ: 折扣因子,决定未来收益对当前收益的影响程度。
    • 四个角色:

      • Actor Model,需要训练的策略模型,参数可训练。先喂给Actor一条prompt,让它生成对应的response。然后,再将“prompt + response"送入带奖励weight的loss 计算体系中去算loss,用于更新actor 参数更新。
      • Critic Model,作用是预估总收益 V t V_t Vt, 参数可训练。在 t t t 时刻,给不出客观存在的总收益 V t V_t Vt,只能训练一个模型去预测它,主要提升人类偏好量化判断能力。
      • Reward Model,它的作用是计算即时收益 R t R_t Rt, 参数冻结。
      • Reference Model,给Actor增加一些“约束”,防止Actor训歪,一般用SFT模型做初始化, 参数冻结。主要希望这两个模型的输出分布(log_prob)尽量相似。在Actor模型中,给定一个prompt,它会生成response,每个token对应一个log_prob,记为log_probs。将prompt + response输入Reference 模型,得到每个token的ref_log_probs。两个模型输出分布的相似度可用KL散度 计算衡量。即:ref_log_probs - log_probs, 该KL 散度 将用于后续loss的计算。
    • Actor loss

      由上文推导,策略模型的损失函数如下表示。 N N N 表示同一prompt , 生成 N N Nresponse ,T 表示每条 responseT 个生成的token, 现在优化的目标:最大化下述目标函数。
      o b j θ = 1 N ∑ n = 1 N ∑ t = 1 T R ( τ n − b ) ⋅ l o g p ( a t ∣ s t , θ ) obj_{\theta} = \frac{1}{N} \sum^{N}_{n = 1} \sum^{T}_{t = 1} R(\tau^{n} -b )·logp(a_t|s_t,\theta) \\ objθ=N1n=1Nt=1TR(τnb)logp(atst,θ)
      变形1:

      $ R(\tau^{n})$ 是在句子级别上评估,表示response级别的奖励优势,即response里所有token的奖励都一致,请仔细理解角标表示含义。现在用每个token期望预估整体收益 V t V_t Vt 取代它,即response 中生成的每个token分配的奖励不相同,虽然每个token整体收益不能直观获取,但是我可以用critic1 模型去做收益期望估计呀?
      o b j θ = 1 N ∑ n = 1 N ∑ t = 1 T V t ⋅ l o g p ( a t ∣ s t , θ ) obj_{\theta} = \frac{1}{N} \sum^{N}_{n = 1} \sum^{T}_{t = 1} V_{t}·logp(a_t|s_t,\theta) \\ objθ=N1n=1Nt=1TVtlogp(atst,θ)
      V t > 0 V_t > 0 Vt>0 时,意味着CriticActor当前采取的动作给了正向反馈,因此就需要在训练迭代中提高 l o g p ( a t ∣ s t , θ ) logp(a_t|s_t,\theta) logp(atst,θ) .也就是:对 s t s_t st而言,如果采样 a t a_t at产生的收益较高,那就增大它出现的概率,否则降低它出现的概率。

      变形2:
      为让 V t V_t Vt有正有负,上述奖励 ( R ( τ n ) − b R(\tau^{n}) -b R(τn)b) 是减去一个base_line 值。假设Critic对动作 a t a_t at的期望预测总收益为 V t V_t Vt,但实际总收益是 γ ∗ V t + 1 − V t \gamma * V_{t+1} - V_t γVt+1Vt,那么期望预期总收益 V t V_t Vt 不就可以作为baseline了。即我希望当采用这个动作的奖励高于我的预期值。 即:定义优势如下:
      A d v t = R t + γ ∗ V t + 1 − V t Adv_t = R_t + \gamma * V_{t+1} - V_t Advt=Rt+γVt+1Vt
      更新目标函数:
      o b j θ = 1 N ∑ n = 1 N ∑ t = 1 T A d v t ⋅ l o g p ( a t ∣ s t , θ ) obj_{\theta} = \frac{1}{N} \sum^{N}_{n = 1} \sum^{T}_{t = 1}{Adv_t}·logp(a_t|s_t,\theta) \\ objθ=N1n=1Nt=1TAdvtlogp(atst,θ)
      变形3:

      上文讲到需要将Reference ModelActor ModelKL 散度纳入 loss 计算中,不至于模型训歪。怎么实现呢? 一个想法:相同状态 S t S_t St, 如果 Actor Model采取的动作和Reference Model 采取的动作一致,那我就增加一点奖励:(KL散度值),即修改即时收益 R t R_t Rt -> R t ′ R^{'}_{t} Rt
      A d v t = R t ′ + γ ∗ V t + 1 − V t R t ′ = − k l − c t l ∗ ( l o g P ( A t ∣ S t ) P r e f ( A t ∣ S t ) ) + R t Adv_t = R^{'}_t + \gamma * V_{t+1} - V_t \\ R^{'}_t = -k l_- c t l * (log \frac{P(A_t|S_t)}{P_{ref}(A_t|S_t)}) + R_t Advt=Rt+γVt+1VtRt=klctl(logPref(AtSt)P(AtSt))+Rt
      到这里,恭喜您已经基本上学会PPO 方法了,仔细理解下图,确保图的流程和上述公式能准确对上。
      Figure 4 | Demonstration of PPO and our GRPO. GRPO foregoes the value model, instead estimating the baseline from group scores, significantly reducing training resources.

      图中,显示GAE 算法,这么理解:对于收益 V t V_t Vt而言,分为即时 R t ′ R^{'}_{t} Rt和未来 V t + 1 V_{t+1} Vt+1,那么对于优势而言,是不是也能引入对未来优势的考量呢?
      A d v t = ( R t + γ ∗ V t + 1 − V t ) + γ ∗ λ ∗ A t + 1 \begin{align*}Adv_t = (R_t + \gamma * V_{t+1} - V_t) + \gamma * \lambda * A_{t+1}\end{align*} Advt=(Rt+γVt+1Vt)+γλAt+1
      上述介绍了Policy model 整体的损失函数设计,以及怎么变形到ppo算法的损失的。

    • Critic loss

      常规MSE 损失函数:
      C r i t i c _ l o s s = ( R t + γ ∗ V t + 1 − V t ) 2 Critic\_loss = (R_t + \gamma * V_{t+1} - V_t)^2 Critic_loss=(Rt+γVt+1Vt)2

  • 知识预备PPO算法
    • 回顾一下整体流程:
    1. 生成Responses:将prompts批次输入Actor模型,生成相应的responses。在此过程中,可以设置不同的生成策略(如beam search、sampling等)以探索多样的输出。
    2. 计算 Responses 优势:将生成的"prompt + response"对输入Critic/Reward/Reference模型,评估每个response中每个token的奖励分数。
    3. 计算Loss
      • Actor Loss:基于Critic/Reward模型提供的奖励,计算策略梯度,以指导Actor模型的更新。
      • Critic Loss:计算预测值与实际反馈值之间的差异,常用的方法包括均方误差(MSE)等,确保Critic模型能准确评估Actor的输出。
    4. 模型更新:使用计算出的actor和critic loss,通过反向传播算法更新Actor和Critic模型的参数。可以采用Adam、SGD等优化器,并适当调整学习率以稳定训练过程。
    5. 迭代优化:重复上述步骤,持续迭代优化模型。
    • off-policy:

      这部分强烈建议看下李宏毅的重要性采样的强化学习课程,怎么从P(X) 采样 转换为 Q(X) 分布采样的,并保证两者期望值一致。简单点介绍:引入另外一个策略 θ o l d \theta_{old} θold , 用 θ o l d \theta_{old} θold 收集到的数据去训练 θ \theta θ。假设我们可以用 θ o l d \theta_{old} θold收集到的数据去训练 θ \theta θ,意味着说可以把 θ o l d \theta_{old} θold收集到的数据用很多次,也就是可以执行梯度上升好几次,更新参数好几次。
      ∇ o b j θ = E τ ∈ θ o l d [ ( W e i g h t ) ⋅ R ( τ ) ∇ l o g P ( τ ∣ θ ) ] \nabla obj_{\theta} = E_{\tau \in \theta_{{old}}}[(Weight)· R(\tau) \nabla logP(\tau|\theta)] objθ=Eτθold[(Weight)R(τ)logP(τθ)]

      W e i g h t = p θ ( τ ) p θ o l d ( τ ) Weight = \frac{p_{\theta}(\tau)}{p_{\theta_{old}(\tau)}} Weight=pθold(τ)pθ(τ)
      weight 是重要性采样比 (Policy Ratio),衡量新旧策略之间的变化。

    • 裁剪约束:

      裁剪的目标函数:限制策略更新幅度,以避免剧烈变化导致模型崩溃。
      a c t o r l o s s = − m i n ( A d v t ∗ P ( A t ∣ S t ) P o l d ( A t ∣ S t ) , A d v t ∗ c l i p ( P ( A t ∣ S t ) P o l d ( A t ∣ S t ) , 0.8 , 1.2 ) ) actor_{loss} = -min(Adv_t * \frac{P(A_t|S_t)}{P_{old}(A_t|S_t)}, Adv_t * clip(\frac{P(A_t|S_t)}{P_{old}(A_t|S_t)}, 0.8, 1.2)) actorloss=min(AdvtPold(AtSt)P(AtSt),Advtclip(Pold(AtSt)P(AtSt),0.8,1.2))

GRPO算法
  • 核心思想:群体相对策略优化 (GRPO,Group Relative Policy Optimization)。 通过在同一个问题上生成多条回答,评估彼此相关的响应组(彼此之间相互比较)来优化策略模型。

  • 优点:

    • 无Critic模型优化:GRPO 通过比较组内的响应消除了对Critic模型的需求,从而显著减少了计算开销;

    • 相对评估:GRPO 不依赖外部评估者(Critic模型),而是使用群体组来评估某个响应相对于同一批次中其他响应的表现如何。

### 基于 DeepSeek分类任务实现 DeepSeek 是一种强大的大型语言模型,能够处理多种自然语言处理 (NLP) 任务,其中包括文本分类任务。对于分类问题,可以通过调用 DeepSeek 提供的 API 或者直接使用其预训练模型来完成。 以下是基于 Python 和 DeepSeek API 实现分类的具体方法: #### 方法概述 为了实现分类任务,可以向 DeepSeek 发送带有明确指示的任务请求。例如,在输入中指定两个类别标签,并让模型判断给定文本属于哪个类别。这种方式依赖于良好的提示设计,以引导模型生成期望的结果[^1]。 #### 示例代码 以下是一个简单的例子,展示如何通过 DeepSeek API 进行分类任务: ```python import deepseek as ds def binary_classification(text, category_a, category_b): """ 使用 DeepSeek API 执行分类任务。 参数: text (str): 输入文本。 category_a (str): 类别 A 描述。 category_b (str): 类别 B 描述。 返回: str: 预测的类别。 """ prompt = f"Classify the following text into either '{category_a}' or '{category_b}': {text}" response = ds.generate(prompt=prompt) classification_result = response['output'] return classification_result.strip() # 测试函数 if __name__ == "__main__": input_text = "This product is of high quality and very durable." result = binary_classification(input_text, "Positive", "Negative") print(f"The classification result is: {result}") ``` 上述代码定义了一个 `binary_classification` 函数,该函数接受一段文本以及两个类别的描述作为参数。它构建了一条包含清晰指令的提示语句,并将其发送到 DeepSeek 模型进行推理。最终返回预测的类别结果。 #### 注意事项 尽管此方法简单高效,但在实际部署过程中需注意以下几点: - **成本控制**: 调用外部 API 可能会产生一定的经济开销,因此应合理规划请求频率和规模。 - **提示质量**: 分类效果很大程度上取决于提示的设计优劣。精心调整提示有助于提升准确率。 - **延迟考量**: 如果实时性能至关重要,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang S

讨论研讨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值