初识 DeepSeek 大模型
DeepSeek 大模型详细解读
DeepSeek-R1 是一款通过大规模强化学习(Reinforcement Learning, RL)训练的大型语言模型,专注于提升模型的推理能力。与传统的依赖监督微调(Supervised Fine-Tuning, SFT)的模型不同,DeepSeek-R1 在初始阶段未依赖 SFT,而是通过强化学习自然地发展出强大的推理行为。
主要特点
推理能力:DeepSeek-R1 展现出类人的推理能力,尤其在数学问题解决、代码生成和逻辑推理任务方面。
多阶段训练:为了解决可读性差和语言混杂等问题,DeepSeek-R1 引入了多阶段训练流程,包括冷启动数据微调、推理导向的强化学习和监督微调。
推理能力蒸馏:将大模型学到的推理模式蒸馏到小模型中,使小模型在推理任务上表现出色。
技术架构:采用 Transformer 架构,引入稀疏注意力机制和 Mixture-of-Experts(MoE)架构,增强模型容量。
性能表现:在 AIME 2024、MATH-500 等基准测试中取得优异成绩,与 OpenAI-o1-1217 相当。
DeepSeek 的使用方法
1. 注册与登录
网页版:访问 https://chat.deepseek.com/ ,无需下载,打开浏览器即可使用。
App版:在各大应用商店搜索“DeepSeek”,下载安装即可。
2. 功能模块
V3模型(默认模式):反应快、知识丰富,适合日常对话、知识问答。
R1模型(深度思考模式):逻辑强、分析深入,适合复杂问题分析、创意写作。
3. 高级功能
API接口:获取API密钥后,可将DeepSeek功能集成到自己的应用中。
本地部署:从Hugging Face上下载模型权重和相关文件,按照官方文档进行本地部署。
DeepSeek 提问技巧
1. 明确需求
尽量清晰地描述你的问题或任务。例如:“请帮我总结一下人工智能的发展历史。”。
2. 提供上下文
如果问题需要背景信息,可以在提示词中加入上下文。例如:“请将以下英文句子翻译成中文:‘The future of AI is promising.’”。
3. 指定格式
如果你希望回答以特定格式呈现,可以在提示词中说明。例如:“请以 bullet points 的形式列出5条健康饮食的建议。”。
4. 分步骤提问
对于复杂任务,可以分步骤提问。例如:第一步:“请解释什么是机器学习。” 第二步:“机器学习有哪些主要应用场景?”。
5. 使用角色设定
你可以让 DeepSeek 扮演特定角色来回答问题。例如:“你是一位资深程序员,请帮我解释一下Python中的递归函数。”。
6. 尝试开放式问题
开放式问题可以激发更详细的回答。例如:“人工智能在现代社会中有哪些重要应用?它的发展前景如何?”。
7. 调整语气和风格
如果你希望回答的语气或风格符合特定需求,可以在提示词中指定。例如:“请用通俗易懂的语言解释量子计算。”。
8. 多轮对话
如果一次回答不够满意,可以通过多轮对话逐步完善。例如:你:“请推荐几本关于心理学的书。” DeepSeek:“推荐《思考,快与慢》《影响力》《自卑与超越》。” 你:“能详细介绍一下《思考,快与慢》这本书吗?”。
9. 尝试不同的提示词
如果第一次回答不符合预期,可以换一种方式提问。例如:第一次:“如何学习编程?” 第二次:“作为一个编程新手,我应该从哪些资源开始学习?”。
10. 万能提问模板
实例:
示例展示
代码改写
提示词示例:
样例输出:
代码问题分析
1. 效率问题
原因:这段代码使用了递归的方式计算斐波那契数列,但没有使用任何优化手段(如记忆化或动态规划),导致重复计算了大量子问题。
示例:
计算
fib(5)
时,会重复计算fib(3)
和fib(2)
多次。时间复杂度为 O(2^n),指数级增长,效率极低。
2. 边界情况未处理
问题:代码假设输入的
n
是正整数,但没有处理以下情况:n
为负数或零(斐波那契数列通常定义在正整数上)。n
为非整数(如浮点数)。n
非常大时,递归深度过深可能导致栈溢出。
解决方法
1. 优化效率
使用 记忆化(Memoization) 或 动态规划(Dynamic Programming) 来避免重复计算。
或者使用 迭代法,避免递归带来的额外开销。
2. 处理边界情况
检查输入是否为有效正整数。
对于大数问题,可以使用迭代法或矩阵快速幂等高效算法。
优化后的代码
方法 1:动态规划(迭代法)
def fib(n):
# 处理边界情况
if not isinstance(n, int) or n < 0:
raise ValueError("Input must be a non-negative integer.")
if n <= 1:
return n
# 动态规划:迭代计算
a, b = 0, 1
for _ in range(2, n + 1):
a, b = b, a + b
return b
方法 2:记忆化递归
def fib(n, memo={}):
# 处理边界情况
if not isinstance(n, int) or n < 0:
raise ValueError("Input must be a non-negative integer.")
if n <= 1:
return n
# 检查是否已经计算过
if n not in memo:
memo[n] = fib(n - 1, memo) + fib(n - 2, memo)
return memo[n]
方法 3:矩阵快速幂(高效算法,适合大数)
def fib(n):
# 处理边界情况
if not isinstance(n, int) or n < 0:
raise ValueError("Input must be a non-negative integer.")
if n <= 1:
return n
def matrix_mult(a, b):
return [
[a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]],
[a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]],
]
def matrix_pow(mat, power):
result = [[1, 0], [0, 1]] # 单位矩阵
while power > 0:
if power % 2 == 1:
result = matrix_mult(result, mat)
mat = matrix_mult(mat, mat)
power //= 2
return result
# 使用矩阵快速幂计算斐波那契数
mat = [[1, 1], [1, 0]]
result_mat = matrix_pow(mat, n - 1)
return result_mat[0][0]
性能对比
方法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
原始递归 | O(2^n) | O(n)(栈空间) | 小规模数据,不推荐使用 |
动态规划(迭代法) | O(n) | O(1) | 中小规模数据,推荐使用 |
记忆化递归 | O(n) | O(n) | 中小规模数据,代码简洁 |
矩阵快速幂 | O(log n) | O(1) | 大规模数据,高效但代码复杂 |
示例运行
输入:
边界测试:
总结
原始代码问题:效率低(指数级时间复杂度),未处理边界情况。
优化方法:
使用动态规划(迭代法)或记忆化递归优化效率。
处理输入边界情况,确保代码健壮性。
对于大规模数据,可以使用矩阵快速幂进一步优化。```
代码解释
提示词示例:
样例输出:
这段代码实现了一个经典的 0-1 背包问题 的动态规划解法。它的目标是:在给定的背包容量限制下,选择一些物品装入背包,使得背包中物品的总价值最大。
代码逻辑分析
1. 变量定义
weight
:一个数组,weight[i]
表示第i
个物品的重量。value
:一个数组,value[i]
表示第i
个物品的价值。bagweight
:背包的最大容量。dp
:一个二维数组,dp[i][j]
表示前i
个物品在背包容量为j
时的最大价值。
2. 外层循环:遍历物品
遍历每个物品,
i
从 1 开始(因为i = 0
的情况已经在初始化中处理)。weight.size()
是物品的总数。
3. 内层循环:遍历背包容量
遍历每个可能的背包容量,
j
从 0 到bagweight
。
4. 状态转移
情况 1:当前物品重量大于背包容量
如果当前物品的重量
weight[i]
大于当前背包容量j
,则不能选择该物品。此时的最大价值与前
i-1
个物品在容量j
时的最大价值相同,即dp[i][j] = dp[i - 1][j]
。
情况 2:当前物品重量小于等于背包容量
如果当前物品的重量
weight[i]
小于等于当前背包容量j
,则可以选择是否将该物品放入背包。比较两种选择的价值:
不放入:
dp[i - 1][j]
,即前i-1
个物品在容量j
时的最大价值。放入:
dp[i - 1][j - weight[i]] + value[i]
,即前i-1
个物品在容量j - weight[i]
时的最大价值,加上当前物品的价值。
取两者中的较大值作为
dp[i][j]
。
功能总结
这段代码通过动态规划解决了 0-1 背包问题,具体功能如下:
输入:
weight
:每个物品的重量。value
:每个物品的价值。bagweight
:背包的最大容量。
输出:
dp[weight.size() - 1][bagweight]
:在给定背包容量下,能够装入物品的最大总价值。
核心思想:
通过填表法(动态规划)逐步计算每个子问题的最优解,最终得到全局最优解。
示例说明
假设:
weight = [2, 3, 4, 5]
(物品重量)value = [3, 4, 5, 6]
(物品价值)bagweight = 8
(背包容量)
动态规划表(dp
表)的构建过程:
物品 \ 容量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 (2, 3) | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 (3, 4) | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 |
3 (4, 5) | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 |
4 (5, 6) | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 10 |
最终结果:
dp[4][8] = 10
,即在容量为 8 的背包中,最大价值为 10。
优化建议
空间优化:
可以将二维数组
dp
优化为一维数组,因为dp[i][j]
只依赖于dp[i - 1][...]
。优化后的代码:
边界处理:
需要确保
weight
和value
数组的大小一致,且bagweight
为非负整数。
总结
这段代码通过动态规划解决了 0-1 背包问题,核心思想是通过填表法逐步计算每个子问题的最优解,最终得到全局最优解。通过优化空间复杂度,可以进一步提升代码效率。
结论
DeepSeek 是一款功能强大且易于使用的工具,适用于多种场景。通过本教程,可以快速掌握其基本和高级功能,提升工作效率
。掌握 DeepSeek 的提问技巧可以帮助您更精准地获取答案,提高内容产出效率
此外,文件附件是清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后团队推出的《DeepSeek从入门到精通》手册,内容丰富,从基础知识到实用技巧,再到进阶应用,都有详细阐述,是一份非常有价值的学习资料
百度网盘:https://pan.baidu.com/s/1v-WquId3uany5akzd5hAtQ?pwd=5kt3
去下载
评论