【大模型系列篇】DeepSeek-R1如何通过强化学习有效提升大型语言模型的推理能力?
如何通过强化学习(RL)有效提升大型语言模型(LLM)的推理能力?
《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》由DeepSeek-AI团队撰写,主要介绍了他们开发的第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1,以及如何通过强化学习(Reinforcement Learning, RL)提升大型语言模型(LLMs)的推理能力。论文展示了一种前沿的开源推理模型(Reasoning model),以及使用大规模强化学习技术训练此类模型的详细方法。
本文介绍了DS团队的第一代推理模型 DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是通过大规模强化学习(RL)训练的模型,没有经过监督微调(SFT)作为初步步骤,展示了显著的推理能力。通过强化学习,DeepSeek-R1-Zero自然展现出许多强大且有趣的推理行为。然而,它面临着可读性差和语言混合等挑战。为了解决这些问题并进一步提升推理性能,DS团队推出了 DeepSeek-R1,该模型在强化学习之前融入了多阶段训练和冷启动数据。DeepSeek-R1 在推理任务上的表现与 OpenAI-o1-1217 相当。为了支持研究社区,DS团队开源了 DeepSeek-R1-Zero、DeepSeek-R1 以及从 6个从 DeepSeek-R1 蒸馏出的稠密模型(1.5B、7B、8B、14B、32B、70B),这些模型基于 Qwen 和 Llama 构建。
-
DeepSeek-R1-Zero:无需SFT(监督式微调),纯RL,展现了自我进化能力,但存在可读性问题。
-
DeepSeek-R1:冷启动 + 多阶段训练,解决Zero遇到的问题,多个推理benchmark上取得了和OpenAI-o1-1217相近的水平。
-
小模型蒸馏:知识蒸馏后的小模型在推理benchmark上也表现出强大的竞争力,远超原始开源模型,包括Qwen2.5和Llama3。
一、背景
近年来,大型语言模型(LLMs)经历了快速的迭代和演变,逐渐缩小了与人工通用智能(AGI)之间的差距。最近,后训练已成为完整训练流程中的一个重要组成部分。研究表明,它能够提高推理任务的准确性,与社会价值观保持一致,并适应用户偏好,同时在计算资源需求上相较于预训练相对较少。在推理能力的背景下,OpenAI的o1系列模型首次通过增加链式思维推理过程的长度引入了推理时的扩展。这种方法在数学、编程和科学推理等各种推理任务中取得了显著的改善。然而,有效的测试时间扩展的挑战仍然是研究界的一个未解之谜。之前的几项研究探索了各种方法,包括基于过程的奖励模型(PRM)、强化学习(RL)以及搜索算法,如蒙特卡洛树搜索(MCTS)和束搜索(BS)。然而,这些方法都未能实现与OpenAI的o1系列模型相当的通用推理性能。
1. 现有模型在复杂推理任务(如数学证明、代码生成、科学问题解答)上的表现仍存在显著瓶颈。传统的监督微调(SFT)虽能部分提升性能,但依赖大量标注数据,且难以覆盖长链、多步推理场景。
2. 后训练(Post-Training)的重要性。后训练(如强化学习、对齐优化)已成为LLMs能力提升的关键环节。它能够以较低算力成本优化模型的推理能力、价值观对齐和用户适应性。例如,OpenAI的o1系列通过动态扩展推理链长度(Chain-of-Thought, CoT)显著提升了数学和编码任务的性能。然而,如何高效实现“测试时计算扩展”(即在推理过程中灵活调整计算资源)仍是一个开放挑战。
3. 此外,现有方法也存在一定的局限性:
- 基于过程的奖励模型(PRM):依赖对中间步骤的细粒度奖励,但标注成本高且易受奖励劫持(Reward Hacking)影响。
- 搜索算法(如蒙特卡洛树搜索):在复杂任务中面临搜索空间爆炸问题,难以规模化。
- 混合监督与强化学习:需大量标注数据,限制了模型的自主演化潜力。
二、方法
2.1 概述
- DeepSeek-R1-Zero:纯强化学习
- 直接在基础模型上应用强化学习,不使用任何 SFT 数据。
- 探索 LLM 在纯 RL 环境下的自演化过程,使其自主发展推理能力。
- DeepSeek-R1:冷启动 + 多阶段训练
- 使用少量高质量长链思维(CoT)数据进行冷启动,预热模型。
- 进行面向推理的强化学习,提升模型在推理任务上的性能。
- 使用拒绝采样和监督微调,进一步提升模型的综合能力。
- 再次进行强化学习,使模型在所有场景下都表现良好。
- 知识蒸馏:
- 将 DeepSeek-R1 的推理能力蒸馏到更小的模型中,使小模型也具有强大的推理能力。
2.2 DeepSeek-R1-Zero:基础模型上的强化学习
强化学习在推理任务中表现出显著的有效性,正如之前的研究所证明的那样。然而,这些研究都在很大程度上依赖监督数据,而这些数据的收集过程非常耗时。DeepSeek-R1-Zero探讨了在没有任何监督数据的情况下,LLMs 如何通过纯强化学习过程自我演化并发展推理能力。首先简要概述了我们的 RL 算法,然后呈现一些令人兴奋的结果,希望能为社区提供有价值的见解。
2.2.1 强化学习算法
群体相对策略优化:为了节省强化学习的训练成本,DS团队采用了 Group Relative Policy Optimization (GRPO)
,它不依赖于通常与策略模型大小相同的评价模型,而是通过从组得分中估计基线。具体而言,对于每个问题 ,GRPO 从旧的策略中采样一组输出 {1, 2, ···, },然后通过最大化以下目标来优化策略模型:
2.2.2 奖励模型
奖励是训练信号的来源,决定了强化学习(RL)的优化方向。为了训练 DeepSeek-R1-Zero,采用了一种基于规则的奖励系统,主要由两种类型的奖励组成:
准确度奖励(Accuracy rewards):准确度奖励模型用于评估响应是否正确。例如,在具有确定性结果的数学问题中,要求模型以指定的格式(例如,在一个框内)提供最终答案,从而可以通过可靠的规则进行正确性验证。同样,对于 LeetCode 问题,可以使用编译器基于预定义的测试用例生成反馈。
格式奖励(Format rewards):除了准确度奖励模型外,还使用了格式奖励模型,强制模型将其思维过程放置在 <think> 和 </think>标签之间。
在开发 DeepSeek-R1-Zero 时没有应用基于结果或过程的神经奖励模型,因为在大规模强化学习过程中,神经奖励模型可能会遭遇奖励操控问题,并且重新训练奖励模型需要额外的训练资源,这会使整个训练流程变得更加复杂。
2.2.3 训练模板
为了训练 DeepSeek-R1-Zero,首先设计了一个简单的模板,指导基础模型遵循指定的指令。
如表 1 所示,该模板要求 DeepSeek-R1-Zero 首先生成推理过程,然后给出最终答案。模板示例如下:
表1:用户(User)和助手(Assistant)之间的对话。用户提出了一个问题,助手解决了这个问题。助手首先在脑海中思考推理过程,然后向用户提供答案。推理过程和答案分别包含在标签 <think> </think>和 <answer> </answer> 中,即
<think> reasoning process here </think>, <answer> answer here </answer>。
User: prompt.
Assistant:
DS团队有意将约束限制在这种结构格式上,同时避免任何内容特定的偏见,例如强制要求反思性推理或推广特定的解题策略——以确保能够准确观察模型在强化学习过程中的自然进展。
2.2.4 性能、自我进化过程和顿悟时刻
性能
自我进化过程
自我进化过程是一个引人注目的示范,展示了强化学习如何驱动模型自主提升其推理能力。通过直接从基础模型开始强化学习,可以在没有监督微调阶段影响的情况下,密切监控模型的进展。这种方法清晰地展示了模型如何随着时间的推移不断进化,特别是在处理复杂推理任务的能力方面。
如图3 所示,DeepSeek-R1-Zero的思维时间在整个训练过程中持续改进。这种改进不是外部调整的结果,而是模型内部的自我发展。DeepSeek-R1-Zero通过利用扩展的测试时间计算,自然获得了解决越来越复杂推理任务的能力。这些计算从生成数百个到数千个推理标记不等,使得模型能够更深入地探索和完善其思维过程。
这种自我进化的一个最显著的方面是随着测试时间计算的增加,复杂行为的出现。比如反思行为——模型回顾并重新评估之前的步骤——以及探索问题解决替代方法的行为,都是自发产生的。这些行为并非显式编程所致,而是模型与强化学习环境互动的结果。这种自发的发展显著增强了DeepSeek-R1-Zero的推理能力,使其能够以更高的效率和准确性应对更具挑战性的任务。
“
Aha Moment” - 顿悟时刻
在DeepSeek-R1-Zero的训练过程中,观察到一个特别有趣的现象,即发生了“顿悟”时刻。如表3所示,这一时刻出现在模型的一个中间版本中。在此阶段,DeepSeek-R1-Zero通过重新评估其初始方法,学会了为一个问题分配更多的思考时间。这种行为不仅证明了模型推理能力的提升,而且是强化学习如何导致意外且复杂结果的迷人示例。
这个时刻不仅是模型的“顿悟”,也是观察其行为的研究人员的“顿悟”。
它强调了强化学习的力量与美妙:并没有显式地教模型如何解决问题,而是为其提供了正确的激励,模型自主发展出先进的问题解决策略。这个“顿悟”时刻有力地提醒我们,强化学习能够解锁人工系统中智能的新层次,为未来更具自主性和适应性的模型铺平道路。
DeepSeek-R1-Zero的缺点
尽管 DeepSeek-R1-Zero 展现了强大的推理能力,并能自主发展出意想不到且强大的推理行为,但它仍然面临一些问题。例如,DeepSeek-R1-Zero 在可读性差和语言混杂等问题上存在困难。为了使推理过程更加易读并与开放社区分享,DS团队继续探索了DeepSeek-R1,一种结合了强化学习与人性化冷启动数据的方法。
2.3 DeepSeek-R1:结合冷启动的强化学习
受到DeepSeek-R1-Zero取得的良好结果的启发,产生了两个自然而然的问题:
(1)通过引入少量高质量数据作为冷启动,是否能够进一步提高推理性能或加速收敛?
(2)如何训练一个既能生成清晰连贯的推理链(CoT),又能展现出强大通用能力的用户友好型模型?
为了解决这些问题,DS团队设计了一个训练深度寻求-R1的流程。该流程包括四个阶段,概述如下:
2.3.1 冷启动
与 DeepSeek-R1-Zero 不同,为了防止强化学习训练的早期冷启动阶段在基础模型上出现不稳定现象,在 DeepSeek-R1 中,DS团队构建并收集了少量的高质量长推理链(CoT)数据,用以微调模型,作为初始的 RL 行为目标。
为了收集这些数据,DS团队探索了几种方法:使用少量示例提示与长推理链的结合,直接提示模型生成带有反思和验证的详细回答,收集DeepSeek-R1-Zero输出的可读格式,并通过人工注释者后处理以优化结果。
在这项工作中,DS团队收集了数千条冷启动数据,用于微调 DeepSeek-V3-Base作为强化学习的起点。与DeepSeek-R1-Zero相比,冷启动数据的优势包括:
可读性:DeepSeek-R1-Zero的一个主要限制是其内容通常不适合阅读。响应可能会混合多种语言,或者缺乏Markdown格式来突出显示给用户的答案。相比之下,在为DeepSeek-R1创建冷启动数据时,DS团队设计了一个可读的模式,包括每个响应末尾都有一个摘要,并且过滤掉不适合阅读的响应。这里定义输出格式为 |special_token| <reasoning_process>|special_token| <summary>,其中推理过程是针对查询的CoT,而摘要则用于总结推理结果。
潜力:通过精心设计结合人工先验的冷启动数据模式,观察到DeepSeek-R1在性能上优于DeepSeek-R1-Zero。DS团队认为,迭代训练是推理模型的一种更好的方法。
2.3.2 面向推理的强化学习
在对DeepSeek-V3-Base进行冷启动数据微调后,DS团队采用与DeepSeek-R1-Zero相同的大规模强化学习训练过程。
这个阶段重点提升模型的推理能力,特别是在推理密集型任务中,如编码、数学、科学和逻辑推理等,这些任务涉及明确定义的问题和清晰的解决方案。在训练过程中,观察到CoT经常出现语言混合,尤其是在强化学习提示涉及多种语言时。为了缓解语言混合的问题,DS团队在强化学习训练中引入了语言一致性奖励,这一奖励是根据推理链中目标语言词汇的比例计算的。尽管消融实验表明这种对齐会导致模型性能略微下降,但这一奖励与人类偏好一致,使得模型输出更具可读性。最后,通过直接将推理任务的准确性和语言一致性奖励相加,形成最终的奖励。然后,对微调后的模型进行强化学习训练,直到其在推理任务上收敛。
2.3.3 拒绝采用与监督微调
当面向推理的强化学习收敛后,DS团队利用得到的检查点收集监督微调(SFT)数据用于下一轮训练。与最初的冷启动数据主要关注推理不同,这一阶段将涉及其他领域的数据,以增强模型在写作、角色扮演和其他通用任务中的能力。具体而言,生成数据并按如下所述对模型进行微调。
推理数据
整理推理提示,并通过从上述强化学习训练的检查点执行拒绝采样来生成推理轨迹。在前一个阶段,仅包含了可以通过基于规则的奖励进行评估的数据。然而,在这一阶段,DS团队通过加入额外的数据来扩展数据集,其中一些数据使用生成奖励模型,通过将真实标签和模型预测输入DeepSeek-V3进行判断。此外,由于模型输出有时混乱且难以阅读,过滤掉了含有混合语言、长段落和代码块的推理链。对于每个提示,采样多个响应,并只保留正确的响应。最终,收集了约60万个与推理相关的训练样本。
非推理数据
对于非推理数据,如写作、事实问答、自我认知和翻译,采用DeepSeek-V3流程并重复使用部分DeepSeek-V3的SFT数据集。对于某些非推理任务,通过提示调用DeepSeek-V3生成潜在的推理链,以便在回答问题前使用。然而,对于更简单的查询,例如“你好”,不会提供推理链作为回应。最终,收集了大约20万个与推理无关的训练样本。
DS团队使用上述整理好的大约80万个样本数据集对DeepSeek-V3-Base进行两轮微调。
2.3.4 面向所有场景的强化学习
为了进一步使模型与人类偏好对齐,实施了一个二次强化学习阶段,旨在提高模型的有用性和无害性,同时精炼其推理能力。具体而言,使用奖励信号和多样化的提示分布来训练模型。对于推理数据,遵循DeepSeek-R1-Zero中概述的方法,利用基于规则的奖励来引导数学、代码和逻辑推理领域的学习过程。对于一般数据,依赖奖励模型来捕捉人类偏好,以应对复杂和微妙的场景。在DeepSeek-V3流程的基础上,采用类似的偏好对分布和训练提示。在有用性方面,专注于最终的总结,确保评估重点强调响应对用户的实用性和相关性,同时尽量减少对基础推理过程的干扰。在无害性方面,评估模型的整个响应,包括推理过程和总结,以识别并减少生成过程中可能出现的任何潜在风险、偏见或有害内容。最终,奖励信号和多样化数据分布的整合使DS团队能够训练一个既在推理上表现优异,又优先考虑有用性和无害性的模型。
2.4 蒸馏:将推理能力赋予小型模型
为了使更高效的小型模型具备类似于DeepSeek-R1的推理能力,DS团队直接对开源模型如Qwen和Llama进行了微调,使用了与DeepSeek-R1策划的80万样本,研究结果表明,这种简单的蒸馏方法显著增强了小型模型的推理能力。这里使用的基础模型包括Qwen2.5-Math-1.5B、Qwen2.5-Math-7B、Qwen2.5-14B、Qwen2.5-32B、Llama-3.1-8B和Llama-3.3-70B-Instruct。选择Llama-3.3,因为它的推理能力略优于Llama-3.1。
对于蒸馏模型,仅应用SFT,而不包括RL阶段,尽管结合RL可能会显著提升模型性能。但在这里的主要目标是展示蒸馏技术的有效性,将RL阶段的探索留给更广泛的研究社区。
三、实验
数据收集:收集数千条冷启动数据,用于初始微调。这些数据通过少样本提示、直接提示生成详细答案、人工后处理等方式生成。
实验设置:在多个基准测试上进行评估,包括 MMLU、MMLU-Redux、MMLU-Pro、C-Eval、CMMLU、IFEval、FRAMES、GPQA Diamond、SimpleQA、C-SimpleQA、SWE-Bench Verified、Aider 1、LiveCodeBench、Codeforces、Chinese National High School Mathematics Olympiad (CNMO)、American Invitational Mathematics Examination 2024 (AIME)等。
参数配置:所有模型的最大生成长度设置为32,768个token。对于需要采样的基准测试,使用温度0.6,top-p值0.95,每个查询生成64个响应。
3.1 DeepSeek-R1模型评估
3.2 DeepSeek-R1蒸馏模型评估
四、讨论
4.1 蒸馏与强化学习
论文得出两个结果:首先,将更强大的模型蒸馏到较小的模型中可以获得优秀的结果,而依赖于大规模强化学习的小模型则需要巨大的计算能力,甚至可能无法达到蒸馏的性能。其次,尽管知识蒸馏策略既经济又有效,但推进超越智能的边界可能仍需要更强大的基础模型和更大规模的强化学习。
4.2 不成功的尝试
在开发DeepSeek-R1的早期阶段,DS团队也遇到了失败和挫折。以下是他们分享的失败经验,用以提供见解,但这并不意味着这些方法无法开发出有效的推理模型。
过程奖励模型(PRM),PRM是一种合理的方法,可以引导模型朝着更好的解决推理任务的方法前进。然而,在实践中,PRM有三个主要限制,可能会阻碍其最终成功。首先,很难明确地定义一般推理中的细粒度步骤。其次,确定当前中间步骤是否正确是一项具有挑战性的任务。使用用模型进行自动标注可能无法产生令人满意的结果,而手动标注则不利于规模化。第三,一旦引入基于模型的PRM,必然会导致奖励黑客行为,并且重新训练奖励模型需需要额外的训练资源,这使整个训练流程变得复杂。总之,尽管PRM在重新排序模型生成的前N个响应或辅助引导搜索方面表现出良好的能力,但与其在实验中引入的大规模强化学习过程所带来的额外计算开销相比,其优势是有限的。
蒙特卡罗树搜索(MCTS),受到AlphaGo和AlphaZero的启发,DS团队探索了使用蒙特卡罗树搜索(MCTS)来增强测试时的计算可扩展性。这种方
法涉及将答案分解为更小的部分,以便模型能够系统地探索触决方案空间。为此,提示模型生成多个标签,这些标签对应于搜索所需的特定推理步骤。在训练过程中,首先使用收集到的提示通过MCTS找到答案,MCTS由预训练的价值模型指导。随后,使用生成的问题-答案对来训练演员模型和价值模型,迭代地完善这一过过程。
然而,这种方法在扩大训练规模时遇到了几个挑战。首先,与国际象棋相比,后者的搜索空间相对明确,而令牌生成则呈现出指数级更大的搜索空间。为了解决这个问题,我们为每个节点设置了最大扩展限制,但这可能导致模型陷入局部最优解。其次,价值模型直接影响生成的质量,因为它指导搜索过程的每一步。训练一个细粒度的价值模型本质上是困难的,这使得模型难以进行选代改进。虽然AlphaGo的核心成功依赖于训练一个价值模型以逐步提升其性能,但由于令牌生成的复杂性,这一原则在设置中难以复制。
总之,尽管MCTS在与预训练价值模型配对时可以提高推理性能,但通过自我搜索迭代提升模型性能仍然是一个重大挑战。
五、结论、局限性与未来工作
通用能力:目前,DeepSeek-R1在函数调用、多轮对话、复杂角色扮演和json输出等任务上的能力不及深度寻求-V3。继续探索如何利用长链推理来增强这些领域的任务。
语言混合:DeepSeek-R1目前针对中文和英文进行了优化,这可能导致在处理其他语言查询时出现语言混合问题。例如,DeepSeek-R1可能会在推理和回应时使用英语,即使查询是用其他语言而非英语或中文提出的。旨在未来的更新中解决这一限制。
提示工程:在评估DeepSeek-R1时,观察到它对提示非常敏感。少量示例提示会持续降低其性能。因此,建议用户直接描述问题,并在zero-shot设置中指定输出格式,以获得最佳结果。
软件工程任务:由于评估时间较长,影响了强化学习过程的效率,因此大规模强化学习在软件工程任务中尚未得到广泛应用。因此,DeepSeek-R1在软件工程基准测试中并未表现出相较于DeepSeek-V3的显著改进。未来的版本将通过在软件工程数据上实施拒绝采样或在强化学习过程中引入异步评估来解决这一问题,以提高效率。
相关文章:

【大模型系列篇】DeepSeek-R1如何通过强化学习有效提升大型语言模型的推理能力?
如何通过强化学习(RL)有效提升大型语言模型(LLM)的推理能力? 《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》由DeepSeek-AI团队撰写,主要介绍了他们开发的第一代…...

主表增一个子表批量新增
1、在新增接口里,先随机生成编码,生成RedisLock,逻辑校验,Dto转bean,新增主表,获取主表的ID,新增子表,最后释放锁 2、在修改接口里,获取主表ID,先修改主表&am…...

Llama 3.1 本地电脑部署 Linux系统 【轻松简易】
本文分享在自己的本地电脑部署 llama3.1,而且轻松简易,快速上手。 这里借助Ollama工具,在Linux系统中进行大模型部署~ Llama3.1,有三个版本:8B、70B、405B Llama 3.1 405B 是第一个公开可用的模型,在常识…...
langchain系列 - FewShotPromptTemplate 少量示例
导读 环境:OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3 背景:前期忙碌的开发阶段结束,需要沉淀自己的应用知识,过一遍LangChain 时间:20250220 说明:技术梳理,针对FewShotP…...
详细介绍下软件生命周期的各个阶段以及常见的软件生命周期模型
软件生命周期(Software Life Cycle)是指软件从需求分析到最终退役的整个过程。通常,软件生命周期可以划分为以下几个主要阶段: 一、软件生命周期的主要阶段 需求分析(Requirements Analysis) 与客户沟通&am…...

重构谷粒商城07:Git一小时快速起飞指南
重构谷粒商城07:Git一小时快速起飞指南 前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率ÿ…...
设计模式教程:命令模式(Command Pattern)
1. 什么是命令模式? 命令模式(Command Pattern)是一种行为型设计模式。它将请求封装成一个对象,从而使你能够用不同的请求、队列和日志请求以及支持可撤销操作。 简单来说,命令模式通过把请求封装成对象的方式解耦了…...

Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件
一.类的介绍 1.QPdfWriter介绍 Qt中提供了一个直接可以处理PDF的类,这就是QPdfWriter类。 (1)PDF文件生成 支持创建新的PDF文件或覆盖已有文件,通过构造函数直接绑定文件路径或QFile对象; 默认生成矢量图形PDF&#…...

Android开发-深入解析Android中的AIDL及其应用场景
深入解析 Android 中的 AIDL 及其应用场景 1. 前言2. AIDL 的核心概念3. AIDL 的实现步骤3.1. 定义 AIDL 接口文件3.2. 实现服务端(Service)3.3. 客户端绑定与调用 4. AIDL 的典型应用场景4.1. 多进程应用4.2. 与系统服务交互4.3. 高性能 IPC4.4. 跨应用…...

RT-Thread+STM32L475VET6实现红外遥控实验
文章目录 前言一、板载资源介绍二、具体步骤1. 确定红外接收头引脚编号2. 下载infrared软件包3. 配置infrared软件包4. 打开STM32CubeMX进行相关配置4.1 使用外部高速时钟,并修改时钟树4.2 打开定时器16(定时器根据自己需求调整)4.3 打开串口4.4 生成工程 5. 打开HW…...

【机器学习】衡量线性回归算法最好的指标:R Squared
衡量线性回归算法最好的指标:R Squared 一、摘要二、回归算法评价指标与R Squared指标介绍三、R Squared的编程实践 一、摘要 本文主要介绍了线性回归算法中用于衡量模型优劣的重要指标——R Squared(R方)。R方用于比较模型预测结果与实际结…...
设计模式-Java
一、创建型模式 1. 单例模式 定义 确保一个类只有一个实例,并提供一个全局访问点。 实现方式 饿汉式(线程安全,但可能浪费资源) public class Singleton {// 静态变量,类加载时初始化private static final Singlet…...

代码讲解系列-CV(五)——语义分割基础
文章目录 一、图像分割标注1.1 Labelme标注1.2 SAM辅助1.3 json格式 二、数据解析2.1 Dataset2.2 train.py2.2.1 取参2.2.2 分割和数据集的读取 三、Unet网络搭建3.1 Unet3.2 Network 四、损失函数和指标4.1 DICE系数4.2 损失函数4.3 半精度训练 五、SAM六、作业 语义分割是图片…...

在mfc中使用自定义三维向量类和计算多个三维向量的平均值
先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…...
RDMA ibverbs_API功能说明
设备管理 获取当前活动网卡 返回当前rdma设备列表 struct ibv_device **ibv_get_device_list(int *num_devices);//使用 struct ibv_device **dev_list ibv_get_device_list(NULL);获取网卡名 返回网卡名字字符串:如"mlx5_0",一般通过网卡…...

【C++语言】string 类
一、为什么要学习 string 类 C语言中,字符串是以 “\0” 结尾的一些字符的集合,为了操作方便,C标准库中提供了一些 str 系列的库函数,但是这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需…...

快速上手gdb/cgdb
Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g…...
《养生》(二)
一、基础生活调整 1.作息规律 固定每天7-8小时睡眠,尽量22:30前入睡,晨起后拉开窗帘晒太阳5分钟,调节生物钟 2.饮食优化 三餐定时,每餐细嚼慢咽20次以上,优先吃蔬菜和蛋白质(如鸡蛋、豆腐&#x…...

JAVA:集成 Drools 业务规则引擎的技术指南
1、简述 Drools 是一个强大的业务规则引擎,适用于需要动态决策或规则管理的场景。它允许开发人员将业务逻辑与应用代码分离,使得业务人员可以通过规则文件维护和更新规则,而无需修改应用代码。本文将介绍 Drools 的基本概念、配置方式&#…...

GeoHD - 一种用于智慧城市热点探测的Python工具箱
GeoHD - 一种用于智慧城市热点探测的Python工具箱 详细原理请参考:Yan, Y., Quan, W., Wang, H., 2024. A data‐driven adaptive geospatial hotspot detection approach in smart cities. Trans. GIS tgis.13137. 代码下载:下载 1. 简介 在城市数据…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...