什么是ARTS?
- 算法(Algorithm): 每周至少一道LeetCode算法题,加强编程训练和算法学习
- 阅读(Review): 阅读并点评至少一篇英文技术文章,提高英文水平
- 技巧 (Tip):学习至少一个技术技巧,总结、归纳日常工作中遇到的知识点
- 分享(Share):分析一篇有关点和思考的技术文章,建立影响力,输出价值观
算法:
题目描述:
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序
进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题
前置知识:
- 双指针方法:利用两个指针从数组的两端向中间移动,比较元素并决定如何填充结果数组。
- 绝对值比较:由于输入数组已经按非递减顺序排序,但包含负数,我们需要通过比较绝对值来确定平方后的大小关系。
思路:
- 初始化指针和结果数组:
- 使用两个指针
left
和right
分别指向数组的起始和末尾位置。 - 创建一个与原数组长度相同的结果数组
result
,用于存储平方后的有序值。
- 使用两个指针
- 双指针遍历:
- 从结果数组的最后一个位置开始填充(即从右向左)。
- 比较
nums[left]
和nums[right]
的绝对值,将较大的平方值放入结果数组的当前处理位置,并相应地移动指针。
- 结束条件:
- 当
left
超过right
时,说明所有元素都已处理完毕。
- 当
关键点:
- 时间复杂度为 O(n):每个元素只被处理一次,确保算法高效。
- 空间复杂度为 O(n):需要额外的空间来存储结果数组。
- 双指针策略:通过比较绝对值来决定哪个元素的平方值更大,并将其放置在结果数组的正确位置。
代码:
暴力解:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
nums[i] *= nums[i]
nums.sort()
return nums
# 示例测试
print(Solution.sortedSquares([-4, -1, 0, 3, 10])) # 输出: [0, 1, 9, 16, 100]
print(Solution.sortedSquares([-7, -3, 2, 3, 11])) # 输出: [4, 9, 9, 49, 121]
- 时间复杂度:O(nlogn)O(nlogn),主要由排序操作决定。
- 空间复杂度:O(1)O(1),如果忽略输入数组的空间占用,只使用了常数级别的额外空间。
双指针法:
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n = len(nums)
result = [0] * n
left, right = 0, n - 1
position = n - 1
while left <= right:
if abs(nums[left]) > abs(nums[right]):
result[position] = nums[left] ** 2
left += 1
else:
result[position] = nums[right] ** 2
right -= 1
position -= 1
return result
# 示例测试
sol = Solution()
print(sol.sortedSquares([-4, -1, 0, 3, 10])) # 输出: [0, 1, 9, 16, 100]
print(sol.sortedSquares([-7, -3, 2, 3, 11])) # 输出: [4, 9, 9, 49, 121]
- 时间复杂度为 O(n):每个元素只被处理一次,确保算法高效。
- 空间复杂度为 O(n):需要额外的空间来存储结果数组。
- 双指针策略:通过比较绝对值来决定哪个元素的平方值更大,并将其放置在结果数组的正确位置。
阅读:
[2501.12948] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
📰
1. Introduction
背景:近年来,大型语言模型(LLMs)在推理能力方面取得了显著进展,但如何有效提升推理能力仍是一个开放问题。
1.1 Contributions
- Post-Training: 通过大规模强化学习(RL)直接应用于基础模型,而不需要监督微调(SFT),从而显著提升推理能力。这种方法允许模型自主探索解决复杂问题的思维链(CoT),开发出DeepSeek-R1-Zero。
- Pipeline for DeepSeek-R1: 引入了一个包含两个RL阶段和两个SFT阶段的管道,旨在发现改进的推理模式并符合人类偏好。
- Distillation(蒸馏): 展示了较大的模型可以将推理模式提炼到较小的模型中,使得这些小模型的表现优于通过RL在小模型上发现的推理模式。
1.2 Summary of Evaluation Results
- Reasoning Tasks: DeepSeek-R1在多项推理任务上表现出色,如AIME 2024、MATH-500等,性能接近或超过OpenAI-o1系列模型。
- Knowledge: 在知识基准测试(如MMLU、MMLU-Pro、GPQA Diamond)中表现优异,明显优于DeepSeek-V3。
- Others: 在创意写作、问答、编辑、摘要等任务中也表现出色,尤其在长上下文理解方面显著超越DeepSeek-V3。
2. Approach
2.1 Overview
- 讨论了如何通过大规模强化学习来显著提高模型的推理能力,即使没有使用监督微调作为冷启动步骤。进一步介绍了如何通过少量冷启动数据来增强性能。
2.2 DeepSeek-R1-Zero: the Base Model based on Reinforcement Learning
- Reinforcement Learning Algorithm: 使用Group Relative Policy Optimization (GRPO) 算法来优化策略模型。
GRPO的基础
什么是GRPO?
Group Relative Policy Optimization(群体相对策略优化)是一种专门用于增强大型语言模型(LLMs)推理能力的强化学习算法。与传统的强化学习方法不同,传统方法依赖外部评价者(如批评者模型-Critic model/net)来指导学习,而GRPO通过评估一组回答之间的相对表现来优化模型。这种方法使训练更加高效,使GRPO特别适合需要复杂问题解决和长链思维推理的任务。
传统的强化学习算法(如Proximal Policy Optimization,PPO)在应用于LLMs的推理任务时面临着重大挑战:
1.依赖批评者模型:
PPO需要一个独立的批评者模型来评估每个回答的价值,这使内存和计算需求增加了一倍。
训练批评者模型非常复杂且容易出错,尤其是在需要对主观或细微差别进行评价的任务中。
2. 高昂的计算成本:
强化学习流程通常需要大量计算资源来迭代评估和优化回答。
将这些方法扩展到更大的LLMs会进一步加剧成本。
3. 可扩展性问题:
绝对奖励评估难以应对多样化任务,使得跨推理领域的泛化变得困难。
GRPO如何应对这些挑战:
无批评者优化: GRPO通过比较组内回答,消除了对批评者模型的需求,显著降低了计算开销。
相对评估: GRPO不依赖外部评价者,而是利用组内动态来评估每个回答在同一批次中的相对表现。
高效训练: 通过专注于组内优势,GRPO简化了奖励估计流程,使其对大型模型的训练更快且更具可扩展性。
核心思想
GRPO的核心思想是相对评估:
对于每个输入查询,模型生成一组潜在回答。
根据每个回答在组中的相对表现进行评分,而不是孤立地评估单个回答。
一个回答的优势反映了其相对于组内平均表现的优劣程度。
这种方法消除了对独立批评者模型的需求,使GRPO既高效又稳健。通过在组内引入竞争,GRPO推动模型不断提升其推理能力。正是这一创新使DeepSeek在推理任务中取得了卓越的成果。
- Reward Modeling: 包括准确性奖励和格式奖励,确保模型生成的推理过程和最终答案符合要求。
- Training Template: 设计了一种简单的模板,指导基础模型遵循指定的指令,产生推理过程和最终答案。
- Performance, Self-evolution Process and Aha Moment: 描述了DeepSeek-R1-Zero在训练过程中逐步提高性能的过程,包括“aha moment”现象,展示了模型自主发展的强大推理能力。
2.3 DeepSeek-R1: Reinforcement Learning with Cold Start
- Cold Start(冷启动): 通过收集少量高质量的冷启动数据来微调基础模型,以避免RL训练初期的不稳定阶段。
- Reasoning-oriented Reinforcement Learning: 在冷启动数据的基础上应用相同的RL训练过程,重点在于提升推理密集型任务的能力。
- Rejection Sampling and Supervised Fine-Tuning: 在RL检查点上通过拒绝采样创建新的SFT数据,并结合DeepSeek-V3中的监督数据进行微调。
2.4 Distillation: Empower Small Models with Reasoning Capability
- 通过从DeepSeek-R1提炼出推理能力,应用到较小的密集模型中,展示其在多个基准测试中的出色表现。
3. Experiment
3.1 DeepSeek-R1 Evaluation
- 提供了DeepSeek-R1在多种推理任务上的评估结果,展示了其在不同任务中的表现。
3.2 Distilled Model Evaluation
- 对提炼出的小型密集模型进行了评估,证明了它们在推理任务中的优秀表现。
4. Discussion
4.1 Distillation v.s. Reinforcement Learning
- 比较了提炼和强化学习两种方法的效果,探讨了各自的优势和局限性。
4.2 Unsuccessful Attempts
- 讨论了一些未成功的尝试及其原因,为未来的研究提供了参考。
5. Conclusion, Limitations, and Future Work
- 总结了研究的主要成果,讨论了当前模型的局限性,并提出了未来可能的研究方向。
A. Contributions and Acknowledgments
- 列出了论文的主要贡献,并感谢了相关的支持和帮助。
关键内容总结
- 核心贡献:通过纯强化学习(RL)显著提升了大型语言模型(LLMs)的推理能力,特别是在没有监督微调的情况下。
- 主要方法:包括DeepSeek-R1-Zero(直接应用RL于基础模型)和DeepSeek-R1(引入冷启动数据后应用RL)。
- 实验验证:展示了在多个推理任务和基准测试中的卓越表现,特别是与OpenAI-o1系列模型相比。
- 提炼技术:成功地将大模型的推理能力提炼到小型模型中,使其在推理任务中表现出色。
技巧:
https://kdocs.cn/l/ce8cIaLquPei
AI 编程辅助工具是利用人工智能技术来帮助程序员进行软件开发的工具。它们可以在代码编写、代码审查、错误检测、代码优化等多个编程环节发挥作用,提高编程效率和代码质量。
分享:
R1-Zero 等模型正在打破人类数据瓶颈,开启 AI 自我进化新范式?
R1-Zero 展示了一个潜在 scaling 机制的原型,该机制完全没有人类瓶颈 —— 甚至在训练数据获取本身也是如此