用 DeepSeek 学机器学习数学时,把问题缩成一个能手算、能跑代码核对的例子,比直接让它讲完整门课更容易发现错误。下面围绕二分类模型推导:先计算线性打分 z,再用 sigmoid 得到预测概率,最后核对导数和数值结果。你将得到一段可复制的学习提示词、一份独立标准答案和一段验证代码。
从官方入口发起一段具体的数学练习
在DeepSeek 官方首页进入 DeepSeek Web;需要登录时按页面提示完成。本文不涉及 API 调用,也不承诺账号额度或某个界面按钮长期不变。我们没有在 DeepSeek 对话中实测回答,下面的推导和结果由公式与 Python 核对,不冒充模型实际返回内容。

建议已有加减乘除和指数函数基础的读者使用。先把 e 看作约 2.71828 的常数;exp(t) 表示 e 的 t 次方,ln 是自然对数。模型中的权重 w 和偏置 b 是参数,本例为了算得清楚直接给定,不通过训练拟合。
复制提示词,要求过程和边界都说清
我正在学习二分类逻辑回归,请只讲下面这个例子。
输入 x=[2,1],权重 w=[0.8,-0.4],偏置 b=-0.3。
1. 逐项计算 z=w·x+b,解释为什么 z 不是概率。
2. 从 p=1/(1+exp(-z)) 算出 p,保留 6 位小数。
3. 逐步推导 dp/dz=p(1-p),说明链式法则在哪里用到。
4. 反解 z=ln(p/(1-p)),解释 log-odds。
5. 说明“p 介于 0 和 1”与“概率在真实数据上可信”有哪些区别。
6. 给出能在 Python 标准库运行的数值核对,不引用不存在的论文。
如果某步不确定,请标出来。最后出一道换偏置的练习,先不公布答案。
拿到回答后,先自己核对 z,再核对 p;不要让“讲得流畅”代替计算正确。出现 z=1.3 之类结果,先要求它逐项列出 0.8×2、-0.4×1 和 -0.3,定位漏掉偏置或负号的位置。
标准答案:线性打分怎样进入 sigmoid
z = 0.8 × 2 + (-0.4) × 1 – 0.3 = 0.9。线性组合的结果可以为任意实数,不能直接当概率。按照Google 机器学习课程的 sigmoid 推导,逻辑回归使用 p = 1 / (1 + exp(-z)),所以本例 p = 1 / (1 + exp(-0.9)) ≈ 0.710950。
当 z=0 时 p=0.5;z 越大,p 越接近 1;z 越小,p 越接近 0。数学上有限实数的 sigmoid 位于 0 与 1 之间;浮点计算在很大的正负输入上可能舍入到 1 或 0,不应把舍入结果说成公式在有限输入时精确达到边界。
把导数与 log-odds 一步步核对
写 p=(1+exp(-z))-1。外层求导得到 -(1+exp(-z))-2;内层 exp(-z) 求导得到 -exp(-z)。两者相乘,负号抵消:
dp/dz = exp(-z) / (1 + exp(-z))²
p = 1 / (1 + exp(-z))
1-p = exp(-z) / (1 + exp(-z))
因此 dp/dz = p(1-p)
本例导数约为 0.205500。这是概率对打分 z 的变化率,不是对任意权重的完整导数;例如对 w1 还要乘 x1:dp/dw1 = p(1-p)x1。不能把这个局部导数直接叫成完整训练损失的梯度。
反解时,先由 p/(1-p)=exp(z),再取自然对数,得到 z=ln(p/(1-p))。p/(1-p) 叫 odds,即两种结果概率的比;这里取对数后就是 log-odds。只在 0<p<1 时直接计算该式,p=0 或 1 会遇到对数或除法边界。
用标准库核对答案和数值稳定性
保存为 sigmoid_check.py,执行 python sigmoid_check.py,不需要第三方包。本机在 Windows 11、Python 3.13.14 运行,输出 z=0.900000, p=0.710950, derivative=0.205500, finite_difference=0.205500,所有断言通过。
import math
def sigmoid(z):
if z >= 0:
return 1 / (1 + math.exp(-z))
t = math.exp(z)
return t / (1 + t)
w = [0.8, -0.4]
x = [2.0, 1.0]
b = -0.3
z = sum(wi * xi for wi, xi in zip(w, x)) + b
p = sigmoid(z)
derivative = p * (1 - p)
h = 1e-5
finite_difference = (sigmoid(z + h) - sigmoid(z - h)) / (2 * h)
assert math.isclose(z, 0.9, abs_tol=1e-12)
assert math.isclose(sigmoid(0), 0.5, abs_tol=1e-12)
assert math.isclose(sigmoid(-z), 1 - p, abs_tol=1e-12)
assert math.isclose(finite_difference, derivative, rel_tol=1e-8)
assert math.isclose(math.log(p / (1 - p)), z, abs_tol=1e-12)
print(f'z={z:.6f}, p={p:.6f}, derivative={derivative:.6f}, finite_difference={finite_difference:.6f}')
print('extreme outputs:', sigmoid(-1000), sigmoid(1000))
有限差分用 (sigmoid(z+h)-sigmoid(z-h))/(2h) 近似导数,用来独立核对解析式;h 太大有近似误差,太小会受浮点减法误差影响,本例选 1e-5 并设定比较容差。代码对正负 z 分支计算,避免在 z=-1000 时直接计算 exp(1000) 导致溢出;极端输入实际输出为 0.0 和 1.0,属于浮点边界演示。
再做一道练习,确认自己会用
保持 x、w 不变,把偏置从 -0.3 改成 -1.2。先在纸上计算,应该得到 z=0,进而 p=0.5、dp/dz=0.25。用代码替换 b 后核对时,也要同步修改针对旧 z=0.9 的断言,不要把预期答案固定在旧输入上。
如果 DeepSeek 的回答把 sigmoid 输出 0.71 说成“该样本真实有 71% 的概率”,追问它参数是否经过训练、标签是否可靠、概率是否经过校准。本例参数人为指定,只说明概率映射如何计算;0 到 1 的数值范围不能证明模型在真实数据上的预测可信。是否把 p>=0.5 转成正类也是另一个决策选择,应按误报与漏报代价验证。
问答:学习卡在导数,怎样继续追问?
让模型只展开“外层幂函数求导”和“内层指数求导”,分别写出两项,再用上述有限差分比对。先解决一个符号或一步运算,确认一致后再学损失函数;不要同时引入多分类 Softmax、优化器与深度网络,让基础错误藏在更长的回答里。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30324.html