大模型学习笔记 - InstructGPT中的微调与对齐

news2024/10/1 1:32:07

LLM 微调 之 InstructGPT中的微调与对齐

  • LLM 微调 之 InstructGPT中的微调与对齐
    • 技术概览
      • InstructGPT中的微调与对齐
        • 大体步骤
        • 标注数据量
        • 模型训练
          • 1. SFT 是如何训练的
          • 2. Reward Model是如何训练的
          • 3. RLHF 是如何训练的
          • 具体讲解RLHF 的loss 函数
    • 模型效果
    • 参考链接:

LLM 我们不一定要预训练模型,但是一定要会微调。InstructGPT更是微调的最经典的文章。这里详细介绍InstructGPT的微调技术。

技术概览

InstructGPT中的微调与对齐

InstructGPT 里面提到LLM的微调技术, 分为2个阶段:

  1. 指令微调:使得模型有指令遵循的能力
  2. 对齐微调:对齐人类价值观

在这里插入图片描述

大体步骤

在GPT3/3.5的基础上,要解决的问题是 跟人类期待匹配。 最直接的方法就是人工构造一批数据(人类自己写prompt 和 期望的输出) 然后交给模型去学习,使得模型学到人类期望输出。但是这个代价太大,人类自己写prompt和答案 构造者个数据集 代价太大。

所以才有了微调和对齐模型,大体步骤如下:

  1. 有监督微调SFT: 我们称原始模型为V0,也就是GPT-3。人工先构造一批数据,数据量不用很大,先让模型学一学,得到模型V1(SFT) 让模型有基本指令遵循能力。
  2. 人类偏好对齐:(Reward model + PPO) 持续重复进行。
    1. 人类偏好对齐用强化学习的方式来微调模型,输入prompt 输出几个答案,人类对答案进行评价反馈(相当于环境反馈),模型根据评价的结果来继续优化,反复迭代使得最后模型输出符合人类偏好。
    2. 那么问题是人类如何反馈,这套机制如何建立? Reward Model 奖励模型。
      1. 最直接的方法肯定是 输入prompt 模型有几个输出,然后人类给每个输出打出高低分数,模型收到评价 再反向传播迭代更新。人类在根据更新后的模型,输入prompt 等新模型输出 再打分,模型再迭代。
      2. 但是人类不可能在模型前面等他输出一个个打分的。所以这里需要一个自动评分的模型 替代人类做 反馈。 于是就有了 reward model 这个模型输入就是prompt和模型的answer,是输出是得分。
        1. 为了得到这个RM模型,制作训练集,让模型对一个prompt输出多个答案,然后人类对这个答案进行打分排序。打分排序比自己写训练数据要方便多了,从而得到更多的标注数据(prompt,answer,score).
        2. 用这个训练集 来训练RM model,作用是对 prompt和answer pair 进行打分,评价这个pair是否搭配。
    3. 有了打分模型,接下来就要微调第一步得到的SFT(V1)模型。采用PPO方法
      1. 这里给定一些prompt,得到输出,把prompt和输出 一起给RM 模型,得到打分(外界环境的反馈),然后借助强化学习的方法,训练SFT,反复迭代最终得到V2模型也就是InstructGPT.

步骤 1 只进行一次,而步骤Reward model 和PPO算法可以持续重复进行:在当前最佳策略模型上收集更多的比较数据,用于训练新的 RM 模型,然后训练新的策略。

标注数据量

上述三个步骤分别制造和标注了多少样本呢?

  1. SFT 数据,第一步分类根据prompt自己写理想输出,SFT supervised fine tuning 有13k的prompt.(人工标注的占比高一些,11.3k,API 1.5k)
  2. RewardModel数据,第二步用来训练打分模型的数据,包含33k的prompts
  3. PPO数据,第三步用来训练强化学习PPO模型的数据,包含31k的prompts。

其中前2步的prompts 来自OpenAI的 API上用户使用数据和人工标注写的数据,最后一步全是从API上采样的数据。(第一步人工占比高,第二步人工占比低)。

初始种子数据集:需要标注者来编写prompts。

  • plain:自己随便想一些prompts,同时尽可能保证任务多样性。(各种问题和要求)
  • Few-shot: 不仅仅需要写prompts,还需要写对应的outputs(这部分是最耗人力的,也就是SFT的主要组成)
  • User-based: 标注者根据openAI的waitlist里面的task 来编写一些prompts(相当于告诉标注人员,用户期待的功能,你们来写prompt 答案)

API中的数据
在这里插入图片描述

模型训练

这里面3个步骤 分别是如何训练的呢?

1. SFT 是如何训练的

在这里插入图片描述

  • 训练数据: SFT是有监督的微调,训练数据是通过给定一个提示列表,人工写对应的输出得到的。大概13k左右。这里面的提示列表有来自人工自己写的也有API收集的。(这一步主要为了让模型有指令遵循的能力,人工写的比例高一些,因为API很多数据都是扩写 不使用这个任务。)
  • 模型初始化:InstructGPT 是从GPT3初始化的,chatGPT是从GPT3.5初始化的。
  • 训练:在Fine-tuning的过程中同样采用自回归的方式,将Prompt和对应的label answer串联在一起进行训练(下一个词预测训练目标)。

这一步finetuning时,1个epoch就已经overfit了 但是由于这个不是最终的模型,并且train epoch越多对后面两步越有帮助,所以train了16个epoch。

由于该步骤的数据量也有限,该过程获得的 SFT 模型可能会输出仍然并非用户关注的文本,并且通常会出现不一致问题。这里的问题是监督学习步骤的 可扩展性成本高 不可能让标注人员把所有的问题都写一遍。

所以需要让模型学到人类的喜爱偏好(训练出一个RM模型作为机器裁判从而代替人类当裁判) 也就是使用的策略是让人工标注者对 SFT 模型的不同输出进行排序以创建 RM 模型,而不是让人工标注者创建一个更大的精选数据集

2. Reward Model是如何训练的

在这里插入图片描述

  • 初始化: OpenAI使用了指令微调16个epoch的6B模型作为奖励模型的初始模型。通过『移除了最后一层unembedding layer的上一阶段的SFT模型』初始化出我们的RM模型,且考虑到175B计算量大且不稳定不适合作为奖励函数,故最后用的6B版本的SFT初始化RM模型。
  • 模型训练:训练方式是两两对比计crossentropy(其实就是logist 二分类损失,这里是两两组合),其中rθ 是奖励函数对指令x和回复y的打分,如下 (a>b>c) 两两组合 计算loss

l o s s ( θ ) = − 1 ( 2 k ) E ( x , y w , y l )   D [ l o g ( σ ( r θ ( x , y w ) − r θ ( x , y l ) ) ) ] loss(\theta) = -\frac{1}{(^k_2)} E_{(x,y_w,y_l)~D}[log(\sigma(r_{\theta}(x,y_w) - r_{\theta}(x,y_l)))] loss(θ)=(2k)1E(x,yw,yl) D[log(σ(rθ(x,yw)rθ(x,yl)))]

  • 数据收集:让阶段1的SFT模型回答来自OpenAI API和labeler-written且规模大小为33k的数据集的一些问题比如 x n + 1 x_{n+1} xn+1,接着针对每个问题收集4-9个不同的模型输出从而获取4-9个回答。

    为什么模型会有多个回答呢?在于模型每次预测一个词都有对应的概率,根据不同的概率大小可以采样出很多答案,比如通过beam search保留k个当前最优的答案(beam search相当于贪心算法的加强版,除了最好的答案外,还会保留多个比较好的答案供选择)。  
    

    人工对这4-9个回答的好坏进行标注且排序,排序的结果用来训练一个奖励模型RM,具体做法就是学习排序结果从而理解人类的偏好。 对于标注者来说,对输出进行排序比从头开始打标要容易得多,这一过程可以更有效地扩展。在实践中,所选择的 prompt 的数量大约为 30-40k,并且包括排序输出的不同组合。

  • 训练技巧:OpenAI发现如果对数据进行Shuffle,则训练一轮就会过拟合,但如果把针对1个指令模型的K个回复,K在4~9之间,得到 C K 2 C^2_K CK2 个pairwise对,放在一个batch里进行训练,会得到显著更高的准确率。这里一个batch包括64个指令生成的所有回复对,其中排名相同的样本对被剔除。这里感觉和对比学习要用大batch_size进行拟合的思路有些相似,是为了保证对比的全面性和充分性,使用全面对比后计算的梯度对模型进行更新。另一个原因可能是不同标注人员之间的偏好差异,shuffle之后这种偏好差异带来的样本之间的冲突性更高。

3. RLHF 是如何训练的

大体步骤:

  • 首先 初始化PPO模型,
  • 然后 让PPO模型去回答问题(这些问题没有人类标注,都是新问题)此时不用人工评估,而是让阶段二的RM来对结果进行打分,进而进行排序。
  • 之后,通过不断更大化奖励而优化PPO模型的生成策略(因为生成策略更好,模型的回答便会更好),策略优化的过程中使用PPO算法限制策略更新范围
  • 最后,根据优化后的策略再次生成 -> RM再评估 -> 模型再优化后再生成,如此循环进行,直到策略最优为止.

在这里插入图片描述

o b j e c t i v e ( ∅ ) = E ( x , y )   D π ∅ R L [ r θ ( x , y ) − β l o g ( π ∅ R L ( y ∣ x ) / π S F T ( y ∣ x ) ) ] + γ E x   D p r e t r a i n [ l o g ( π ∅ R L ( x ) ) ] objective(\varnothing) = E_{(x,y)~D_{\pi_{\varnothing}RL}}[r_\theta(x,y) - \beta log(\pi_{\varnothing}^{RL}(y|x)/\pi^{SFT}(y|x))] + \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL}(x))] objective()=E(x,y) DπRL[rθ(x,y)βlog(πRL(yx)/πSFT(yx))]+γEx Dpretrain[log(πRL(x))]

在RL微调的部分,OpenAI使用了PPO算法,基于Reward模型的打分进行微调,微调了2个epoch。在此基础上加入了两个目标:

  • 微调模型和原始模型在token预测上的KL散度,避免模型过度拟合奖励函数偏离原始模型。后面也论证了KL的加入,可以加速RL收敛,核心是在相同的KL下最大化模型偏好的提升
  • 10%的预训练目标(PPO-PTX): 降低RL对模型语言能力的影响

且论文提到样本的收集和RL训练是多次迭代的,也就是使用RL微调后的模型上线收集更多的用户请求,重新训练RM,再更新模型。不停在优化后的模型上收集用户反馈,会让RM模型学习到更充分的高偏好样本,强者愈强。

在这里插入图片描述

具体讲解RLHF 的loss 函数

首先目标函数如下:
o b j e c t i v e ( ∅ ) = E ( x , y ) − D π ∅ R L [ r θ ( x , y ) − β l o g ( π ∅ R L ( y ∣ x ) / π S F T ( y ∣ x ) ) ] + γ E x   D p r e t r a i n [ l o g ( π ∅ R L ( x ) ) ] objective(\varnothing) = E_{(x,y)-D_{\pi_{\varnothing}^{RL}}}[r_\theta(x,y) - \beta log(\pi_{\varnothing}^{RL}(y|x)/\pi^{SFT}(y|x))] + \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL}(x))] objective()=E(x,y)DπRL[rθ(x,y)βlog(πRL(yx)/πSFT(yx))]+γEx Dpretrain[log(πRL(x))]

其中

  • ∅ \varnothing 是我们要训练的参数,
  • π S F T \pi^{SFT} πSFT是基线模型(基线策略),
  • π ∅ R L \pi_{\varnothing}^{RL} πRL 是我们要训练得到的RL模型也是RL策略(这个模型是用SFT基线模型初始化的)
  • x 是用于训练的Prompt,y 是将x输入到 π ∅ R L \pi_{\varnothing}^{RL} πRL后得到的输出
  • r θ ( x , y ) r_\theta(x,y) rθ(x,y)是用第二步训练出来的参数为 θ \theta θ的Reward Model对 x和y 进行打分, 我们希望这个分数是最大的,我们优化的PPO目标就是最大化 E ( x , y ) − D π ∅ R L r θ ( x , y ) E_{(x,y)-D_{\pi_{\varnothing}^{RL}}}r_\theta(x,y) E(x,y)DπRLrθ(x,y) 这样训练出来的 D π ∅ R L D_{\pi_{\varnothing}{RL}} DπRL 就是符号人类要求的输出得分最高的那个模型.
    • 这里有一个问题是 每次更新 D π ∅ R L D_{\pi_{\varnothing}^{RL}} DπRL后,x 还是不变prompt不变,y会因为更新 π ∅ R L {\pi_{\varnothing}^{RL}} πRL策略而发生变化,然后采样到的数据就会发生变化,此时x,y输入到 r θ ( x , y ) r_\theta(x,y) rθ(x,y)中得到分数。
    • RL中常见的是 模型输出-人排序-模型反向传播更新-输出-人排序 这是在线学习 on-policy.

真正计算时 实际上是如下展开:
o b j e c t i v e ( ∅ ) = E ( x , y )   D π ∅ R L ′ [ π ∅ R L π R L ′ r θ ′ ( x , y ) − β l o g ( π R L ′ ( y ∣ x ) / π S F T ( y ∣ x ) ) ] + γ E x   D p r e t r a i n [ l o g ( π ∅ R L ( x ) ) ] objective(\varnothing) = E_{(x,y)~D_{\pi_{\varnothing}^{RL'}}}[\frac{\pi_{\varnothing}^{RL}}{\pi^{RL'}}r_{\theta'}(x,y) - \beta log(\pi^{RL'}(y|x)/\pi^{SFT}(y|x))] + \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL}(x))] objective()=E(x,y) DπRL[πRLπRLrθ(x,y)βlog(πRL(yx)/πSFT(yx))]+γEx Dpretrain[log(πRL(x))]

这里面: ∅ \varnothing 是我们要训练的参数, π S F T \pi^{SFT} πSFT是基线策略, π R L ′ \pi^{RL'} πRL是旧策略, π ∅ R L \pi_{\varnothing}^{RL} πRL 是新策略

  • 第一部分 E ( x , y )   D π ∅ R L ′ [ π ∅ R L π R L ′ r θ ′ ( x , y ) ] E_{(x,y)~D_{\pi_{\varnothing}RL'}}[\frac{\pi_{\varnothing}^{RL}}{\pi^{RL'}}r_{\theta'}(x,y)] E(x,y) DπRL[πRLπRLrθ(x,y)]: 由于 第二阶段已经得到了奖励模型,便可基于最大化奖励这个目标,通过PPO算法不断优化RL模型的策略 π R L \pi^{RL} πRL
  • 第二部分 是带 β \beta β的惩罚项 β l o g ( π R L ′ ( y ∣ x ) / π S F T ( y ∣ x ) ) \beta log(\pi^{RL'}(y|x)/\pi^{SFT}(y|x)) βlog(πRL(yx)/πSFT(yx)) 作用是通过KL散度对比RL 在最大化RM的目标下学到的策略 π R L ′ \pi^{RL'} πRL 和基线 π S F T \pi^{SFT} πSFT的差距,开始时 π R L ′ \pi^{RL'} πRL的初始值就是 π S F T \pi^{SFT} πSFT,最终希望 π R L ′ \pi^{RL'} πRL最终迭代结束后 他们两个之间的差距不至于太大。
    • 如何避免差距太大呢?可以通过KL散度衡量两个策略的概率分布之间的差距,从而使得在优化策略时限制参数更新的范围。RL和RL’与PPO算法中的 θ / θ ′ \theta/\theta' θ/θ相对应,比如与环境交互的 θ ′ \theta' θ等同于旧策略 π R L ′ \pi ^{RL'} πRL,但具体而言,则有以下4点:
      1. 已经掌握人类偏好的RM模型一旦判定现有回答不好,则会更新 π ∅ R L \pi_{\varnothing}^{RL} πRL 但是如果 π ∅ R L \pi_{\varnothing}^{RL} πRL发生变化,会导致后续的$R_\theta = E_{t~p_{\theta}(\tau)}[R(\tau)\nabla log p_\theta(\tau)] $ 计算一系列问答评分时中的 p θ ( τ ) p_{\theta}(\tau) pθ(τ)发生变化(策略轨迹必变化),进而已经采样的问答数据 < x n + 2 , y n + 2 1 , . . y n + 2 4 > < x n + 3 . . > <x_{n+2},{y^1_{n+2},..y^4_{n+2}}> <x_{n+3}..> <xn+2,yn+21,..yn+24><xn+3..> 便无法使用,而只能不断采样一批新的问答数据(更新一次 π ∅ R L \pi_{\varnothing}^{RL} πRL 后,得采样新一批数据,再更新一次 π ∅ R L \pi_{\varnothing}^{RL} πRL 后 再采样新一批数据…)
      1. 为了避免 π ∅ R L \pi_{\varnothing}^{RL} πRL 只要一更新便只能一次次去采样一批批新问题数据。(为了提高数据利用率),我们改成让 π ∅ R L ′ \pi_{\varnothing}^{RL'} πRL去和环境交互,
        • a. 首先,在使用旧策略 π R L ′ \pi^{RL'} πRL生成一批数据,包括状态、动作和奖励等信息,这些数据可以类似DQN那样,存储在一个经验回放缓冲区中,
        • b. 其次,在训练新策略 π ∅ R L \pi_{\varnothing}^{RL} πRL时,从经验回放缓冲区中随机抽取一批数据
        • c.对于旧策略采样到的每个数据样本(x,y) 计算重要性采样权重w(x,y) w ( x , y ) = π ∅ R L ( y ∣ x ) π R L ′ ( y ∣ x ) w(x,y) = \frac{\pi_{\varnothing}^{RL}(y|x)}{\pi^{RL'}(y|x)} w(x,y)=πRL(yx)πRL(yx)
          • 比如 前几轮通过旧策略 π ( R L ′ ) \pi_{(RL')} π(RL)采样的数据放在经验缓冲区中,把新策略多次迭代更新出 π ( R L 2 ) \pi_{(RL2)} π(RL2) π ( R L 3 ) \pi_{(RL3)} π(RL3),这个过程中重要性采样的比值为 π ( R L ) π ( R L ′ ) \frac{\pi_{(RL)}}{\pi_{(RL')}} π(RL)π(RL) π ( R L 2 ) π ( R L ′ ) \frac{\pi_{(RL2)}}{\pi_{(RL')}} π(RL)π(RL2)
          • 再之后,通过 π ( R L 3 ) \pi_{(RL3)} π(RL3)采样一批新数据再次放在经验缓冲区里,从而积雪迭代更新出 4 5 6 这个过程中重要性采样的比值变为 π ( R L 4 ) π ( R L 3 ) / \frac{\pi(RL4)}{\pi(RL3)}/ π(RL3)π(RL4)/. π ( R L 5 ) π ( R L 3 ) / \frac{\pi(RL5)}{\pi(RL3)}/ π(RL3)π(RL5)/… 以此类推。
          • 且使用一些方法限制策略更新的幅度,例如PPO中截断重要性采样比率.
        • d. 然后通过最大化奖励而不断迭代 π R L ′ \pi^{RL'} πRL 迭代过程中可一定程度的重复使用旧策略生成的已有数据反复验证。
        • e. 按照更新后的目标函数进行梯度计算和参数更新
        • f. 在训练过程中,可以多次重复使用经验回复缓冲区中的数据进行训练,但是需要注意的是 随着梯度更新,新旧策略之间的差异可能会变化大,这时重要性采样权重可能变得不稳定,从而影响训练的稳定性。
  • 第三部分是加在最后边的偏置项 γ E x   D p r e t r a i n [ l o g ( π ∅ R L ) ] \gamma E_{x~D_{pretrain}}[log(\pi_{\varnothing}^{RL})] γEx Dpretrain[log(πRL)] 其中 D p r e t r a i n D_{pretrain} Dpretrain是GPT3的预训练分布,预训练损失系数 γ \gamma γ控制预训练梯度的强度,且为0 则是PPO模型,否则称为PPO-ptx模型。 之所以加最后这个偏置项是防止ChatGPT在训练过程中过度优化,从而避免过于放飞自我,通过某种刁钻的方式愉悦人类,而不是老实地根据问题给出正确答案。GPT3->SFT->RM->RLHF.

模型效果

在这里插入图片描述

PPO-Ptx/PPO > SFT > GPT(with prompted) > GPT
人类对齐的效果 好于 SFT 好于GPT with prompted 调整过的 好于GPT only。

参考链接:

李沐视频讲解

ChatGPT技术原理解析:从RL之PPO算法、RLHF到GPT4、instructGPT

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

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

相关文章

数据结构实验报告-图

桂 林 理 工 大 学 实 验 报 告 一、实验名称&#xff1a; 实验7 图 二、实验内容&#xff1a; 1.已知一个有向图的顶点集V和边集E分别为:V (0,1,2,3,4,5,6,7,8};E{<0,2>&#xff0c;<1,3>,<1,4>,<2,4>,<2,5>,<3,6>,<3,7>.&l…

计算机的错误计算(五十二)

摘要 用错数解释计算机的错误计算&#xff08;五十一&#xff09;中案例 的错误计算原因。 首先&#xff0c;由计算机的错误计算&#xff08;二十七&#xff09;知&#xff0c;错数公式是 上式表示&#xff0c;函数值的错误数字个数 比自变量的错误数字个数 多约 位。其中…

为智能改造赋能,提升运营效率的智慧地产开源了。

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 AI是新形势下数…

稳稳的年化10%,多任务时序动量策略——基于pytorch的深度学习策略(附python代码)

原创文章第608篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 做因子挖掘这段时间&#xff0c;有一个观感。 传统的因子挖掘&#xff0c;尤其是手工构造因子&#xff0c;到遗传算法因子挖掘。——本身也是一种”拟合“&#xff0c;或者说试图”…

6 定时器

6 定时器 1、基本概念2、使用库函数实现 1、基本概念 定时器的基本工作框架 STM32F103共支持8个定时器 假如分频器PSC的值0,则PSC分频系数1,表示输入1个时钟信号,CNT计数器加1,1S加1&#xff0c;当CNT计数器的值3&#xff0c;跟ARR自动重载寄存器的值21相等时&#xff0c;就…

Linux基于设备树的字符设备驱动框架

掌握设备树是 Linux 驱动开发人员必备的技能&#xff01;因为在新版本的 Linux 中&#xff0c;ARM 相关的驱动全部采用了设备树(也有支持老式驱动的&#xff0c;比较少)&#xff0c;最新出的 CPU 其驱动开发也基本都是基于设备树的&#xff0c;比如 ST 新出的 STM32MP157、NXP的…

【React】详解 index.js 文件

文章目录 一、index.js文件的基本结构1. 引入必要的模块2. 渲染根组件3. 注册服务工作者&#xff08;可选&#xff09; 二、index.js文件的详细解析1. ReactDOM.render的作用2. 为什么使用React.StrictMode3. 服务工作者的注册 三、index.js文件的最佳实践1. 使用模块化引入2. …

缓存常见问题总结

目录 一&#xff1a;缓存穿透 解决方案 1.对请求增加校验机制 2.缓存空值或者特殊值 3.使用布隆过滤器 布隆过滤器原理图​编辑 哈希函数的基本特性 布隆过滤器为什么会存在误判 如何降低误判率 如何使用布隆过滤器 布隆过滤器的应用场景 如何使用布隆过滤器 第一…

QT 建立tcp服务端 TcpServer TcpSocket

基于正点原子教程&#xff0c;个人改编一点点(先写着&#xff0c;还没学客户端来验证) QTcpServer 服务端&#xff0c;下控制多个socket QTcpSocket 可以理解为一个TCP连接 使用客户端的流程为 1.包含network和include 2.声明QTcpServer信号 整个流程都要使用QTcpServer对象&a…

搭建pxe网络安装环境实现服务器自动部署

1.首先配置自动化脚本工具 根据自己的主机设置自己的IP 这张图选择红框下面的选则剩余空间 红帽7的初始网卡为ens33&#xff0c;所以部署后新机器的网卡为ens33 根据自己所要部署的版本编写合适的脚本 使用vim.ks.cfg进入脚本编写 2.配置DHCP 使用vim编写/etc/dhcp/dhcpd.conf …

深入研究Java的String常量池

文章目录 一、StringTable分析一段代码示例一示例二示例三 二、 intern1、StringTable位置2、StringTable 性能调优3、intern深入分析3.1 思考3.2 JDK6中的解释3.3 JDK7中的解释3.4 详细分析3.5 intern正确使用的例子3.6 intern使用不当的例子 一、StringTable 常量池中的字符…

清华计算几何-ElementUniqueness, MinMap, MaxGap

ElementUniqueness问题(EU) 给出一组数给出一组数据,, 判断每个数都是唯一性的或者说判断是否存在重复的. 算法思路很简单, 快速排序 遍历判断: Max(O(nlogn) O(n)) O(nlogn)算法复杂度 代码实现 bool IsEelementUniqueness(const vector<float>& Elemnts) {vect…

【数学建模】 机器学习与统计模型

文章目录 机器学习与统计模型1. 统计分布与假设检验1.1 统计量与常见统计分布常见统计分布Python代码示例 1.2 正态性检验Shapiro-Wilk检验Python代码示例 1.3 独立性检验卡方检验Python代码示例 1.4 两组样本的差异性检验独立样本t检验Python代码示例 1.5 方差分析与事后多重比…

基于Django+MySQL球馆场地预约系统的设计与实现(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

学习STM32(1)--Keil软件安装与基本操作和Keil 软件高级应用

目录 1 引 言 2 实验目的 3 实验内容 3.1 认识单片机和STM32 3.2 安装、认识软件Keil和硬件STM32F103开发板 3.3 学习调试工程 3.4 Keil工程软件的配置 4 深入解析 思考一 1.以项目“12-GPIO输出—使用固件库点亮LED”为例子&#xff0c;认识本地工程文件夹&#xf…

2024下《信息安全工程师》案例简答题,刷这些就够了!

距离2024下半年软考已经越来越近了&#xff0c;不知道今年备考软考信息安全工程师的同学们开始准备了吗&#xff1f; 简答题一直是信安拿分的重点区域&#xff0c;对于许多考生来说&#xff0c;也往往是最具挑战性的部分。今天我就把那些重要的案例简答题类型整理汇总给大家&am…

招聘网站的头像如何上传?

1、某招聘网站 显示的是圆形的&#xff0c;但是上传却需要正方形的300300像素。 2、某某招聘网站 仅支持jpg格式&#xff0c;不支持png 3、某某招聘网站 支持1mb以内图片&#xff0c;格式gif,jpg,png都支持。比较友好 4、某招聘网站 这里仅支持200200像素&#xff0c;图片格…

贪心系列专题篇四

​​​​​​​ 目录 整数替换 解法一 解法二 俄罗斯套娃信封问题 堆箱子 可被三整除的最大和 距离相等的条形码 重构字符串 声明&#xff1a;接下来主要使用贪心法来解决问题&#xff01;&#xff01;&#xff01; 整数替换 题目 思路 下面将使用两种方法来解决这…

【论文阅读】—RTDETR

《DETRs Beat YOLOs on Real-time Object Detection》 最近&#xff0c;基于端到端DETR取得了显著的性能。然而&#xff0c;DETR的高计算成本限制了它们的实际应用&#xff0c;并阻碍了它们充分利用无后处理&#xff08;如非最大抑制&#xff08;NMS&#xff09;&#xff09;的…

Windows下如何像linux一样查看GPU使用情况

在linux下&#xff0c;只要使用 nvidia-smi即可看到服务器中每块卡的使用情况 但是在windows下该如何查看显卡的使用情况呢 通过网上学习发现&#xff0c;windows下有一个叫nvidia-smi.exe的程序 找到它所在的路径&#xff0c;然后在命令行中进入到这个路径&#xff0c;然后…