简介这份线性回归算法小组报告PPT面向机器学习入门学习者、课程小组汇报与算法基础复习场景围绕连续变量预测问题梳理线性回归的核心脉络。内容以工资、年龄预测贷款额度的小案例切入讲解拟合平面、误差高斯分布假设、似然函数与对数似然推导、最小二乘目标函数及R²评估并延伸到梯度下降的批量、随机与小批量做法讨论学习率与批处理数量的选择末尾还对比逻辑回归、Sigmoid函数与多分类Softmax等分类基础。压缩包共1个pptx文件约860KB页面结构紧凑适合直接用于课堂展示或小组分工讲解。已有320人学习下载可帮助读者建立从模型假设、损失函数到参数优化的整体框架并补齐线性回归与逻辑回归之间的衔接认知对于需要完成课程报告、课堂演示或期末复习的读者也可作为较为完整的提纲与公式速查材料。1. 一条拟合线其实换了三次身份多数人第一次接触线性回归算法脑子里留下的画面就是“在散点图上画一条尽量贴合的直线”然后翻到下一页 PPT。真把这套东西从头推一遍才会发现那条线一路上换了三次身份在统计学眼里它是“让样本出现概率最大的参数估计”在代数眼里它是“残差平方和最小化的闭式解”在优化眼里它只是“一个能被一步步走下山的目标函数”。这三个身份用的是三套完全不同的话术却指向同一个结果。小组报告里那句“工资和年龄各自有多大影响”就是它们交汇的坐标。把这一次转换想透后面再看逻辑回归、看任何带损失函数的模型都能一眼量出它站在哪一层、为什么这么写。2. 误差为什么被假设成高斯最大似然是怎么推到最小二乘的2.1 独立、同分布、高斯三个假设各管一段先摆场景。一张放贷记录表两个特征x1 是年龄x2 是月收入标签 y 是最终批下来的授信额度。样本大概长这样25 岁收入 4000 批 2000030 岁收入 8000 批 7000028 岁收入 5000 批 3500033 岁收入 7500 批 5000040 岁收入 12000 批 85000。一眼看过去年龄和收入都往上走的时候额度也在涨但没有任何一条直线能穿过所有点总会差那么一点。差的这一点就是误差项 εy w1·x1 w2·x2 b ε模型能解释的是w1·x1 w2·x2 b这一块解释不了的全塞进 ε。问题在于ε 是个随机量不加约束的话“最小化误差”这句话根本没法算——你得先知道它长什么样。三个假设就是用来给 ε 定形状的。最简单的理解方式张三和李四同一天来申请批多批少互不影响这是独立两个人都走同一套风控口径、同一批样本来源这是同分布批下来的金额大多数时候离“真实合理额度”不算远偶尔会离谱一次这是高斯正态分布。三条里最容易被质疑的是高斯。现实世界里误差真的一定正态吗不一定。但有两层理由让它站得住脚一是中心极限定理一个误差往往是很多小因素叠加的结果收入稳定性、负债、职业、流水月份数多个独立小扰动相加趋近正态二是数学上极其好处理——高斯密度的指数里带平方取对数之后平方项正好留下来其它全变常数。所以这里的“高斯”不是对世界的断言更像是一次工程上的近似用一点真实性换一大截可解性。注意把“高斯假设成立”当成线性回归的前提是本末倒置。它决定的是“最小二乘是不是最优估计”不是“最小二乘能不能跑”。假设不成立时参数照样能算出来只是它不再等价于最大似然鲁棒性会变差。2.2 取对数这一步把连乘拆成了连加有了分布假设就可以写似然函数了。似然函数的含义很朴素给定某一组参数观察到手上这批样本的可能性有多大。每个样本独立联合概率就是各自概率连乘L(w, b) ∏ p(y_i | x_i; w, b)把高斯密度代进去p(y_i|x_i) 1/(√(2π)σ) · exp(-(y_i - wᵀx_i - b)² / (2σ²))于是L ∏ 1/(√(2π)σ) · exp(-(y_i - wᵀx_i - b)² / (2σ²))这时候出现第一个卡点连乘在数值上极难处理。几百个样本每个概率都小于 1乘起来直接下溢成 0浮点数根本存不住而且对连乘求导乘积法则会展开成一堆项没法化简。对数在这里不是技巧是刚需。log 是单调递增函数argmax L和argmax log L完全等价但连乘变成了连加log L -n/2·log(2πσ²) - 1/(2σ²) · Σ(y_i - wᵀx_i - b)²到这一步结论已经掉出来了。式子右边第一项与参数无关是常数1/(2σ²)是正系数也不影响极值点的位置。剩下能动的只有Σ(y_i - wᵀx_i - b)²。要让 log L 最大就得让这个平方和最小。这就是最小二乘的全部来历。它不是什么“看起来平方比较好算所以用平方”而是“假设误差高斯 独立同分布 求最大似然”三步推下来的必然产物。顺便还解释了一个常被忽略的细节σ² 的取值完全不影响参数解它只影响似然值的绝对大小。所以做参数估计时不需要知道噪声方差事后估计它才需要。这里还可以补一句理解最小二乘对离群点敏感根子就在高斯假设上。高斯分布的尾部按指数衰减认为“大偏差极罕见”所以模型看到一个大离群点会拼命挪动直线去迁就它因为在高斯的世界观里那不该发生。换成拉普拉斯分布对应绝对值损失就会鲁棒很多因为它的尾部更厚容许大偏差存在。2.3 偏置项为什么要单独拎出来推导里 b 一直跟着 w 走实现时它却经常被单独拎出来讨论原因是它决定拟合平面能不能自由平移。如果把 b 去掉模型被迫满足“所有特征为 0 时输出为 0”。放到放贷场景里就是年龄 0、收入 0 的人额度必须是 0。这个约束在物理上勉强说得通但在数据上会带来系统性偏差——样本里的年龄最小 22、收入最低 3000模型只能在“人均额度都很高”的这个局部区域里硬拟合斜率会被压偏。加回 b 之后平面可以整体上移或下移斜率就能专注于刻画“变化率”而不是连水平位置一起背。实现上的常规做法是把 b 吸收进权重向量给每个样本在最左边补一列常数 1X_aug [1, x1, x2]w_aug [b, w1, w2]这样wᵀx b就统一写成w_augᵀ · X_aug代码里少一个分支、少一个特判矩阵运算也更整齐。代价是特征矩阵多一列如果这一列没处理好比如标准化时把常数 1 也做了标准化偏置就废了——这是后面避坑章节要展开的一个坑。还有一个容易被忽略的点偏置项不吃正则化。做岭回归时如果对 b 也加 L2 惩罚等于强行把平面往原点拽模型会为了迁就这个约束把斜率调歪。绝大多数库的做法都是只惩罚权重、不惩罚偏置自己手写的时候要记得把这一列排除掉。3. 求解路径正规方程、R² 与梯度下降的分工3.1 偏导置零闭式解长什么样目标函数定下来之后第一反应都是“能不能直接解出来”。对J(w) (1/n) · Σ(y_i - wᵀx_i)²求 w 的偏导得到∇J (2/n) · Xᵀ(Xw - y)。令梯度为零整理一下就得到正规方程w (XᵀX)⁻¹ Xᵀ y这个式子成立的前提是XᵀX可逆而它可逆等价于特征矩阵列满秩——也就是特征之间没有完全线性相关。样本数少于特征数、或者两列特征能互相线性表出时它直接奇异。所以工程上几乎没人用inv都是用伪逆或带正则的版本import numpy as np def fit_normal_equation(X, y): # 左侧补一列 1把偏置项吸收进权重向量省掉特判 X_aug np.hstack([np.ones((X.shape[0], 1)), X]) # 用 pinv 而不是 inv特征共线时 inv 会抛 LinAlgError # pinv 会退化成最小范数解参数不唯一但预测值稳定 w np.linalg.pinv(X_aug.T X_aug) X_aug.T y return w # 参数说明 # X: (n, d) 特征矩阵n 是样本数d 是特征数这里 d2年龄和收入 # y: (n,) 标签即授信额度 # 返回 w: (d1,)第 0 位是偏置 b后面依次是各特征权重这段代码的复杂度卡在XᵀX上构造它是O(nd²)求逆是O(d³)。特征只有两维时几乎瞬间出结果但一旦特征上千比如文本的 one-hot 展开d³会直接爆炸而且n×d的显存占用也未必扛得住。这就是闭式解的第一个硬边界。第二个边界是数值精度。XᵀX的条件数是 X 条件数的平方特征尺度差异大时年龄 20~50收入 4000~40000条件数会被放大到离谱的程度求逆结果的低位有效数字基本不可信。表现是明明公式没错算出来的权重却和梯度下降跑出来的差一个量级。第三个边界是它只能解平方损失。换成逻辑回归的交叉熵偏导置零后得到的是Σx_i(y_i - σ(wᵀx_i)) 0σ 是非线性的这个方程没有解析解——这就是必须请出梯度下降的原因。线性回归在这里是个特例不是通例。3.2 R² 到底在衡量什么参数解出来了怎么判断好坏均方误差 MSE 是个绝对量单位是“额度的平方”很难有直观感受MSE 等于 5000 万到底算好算坏取决于额度本身是几万还是几百万。R² 做的事情是把它变成一个相对量。def r2_score(y_true, y_pred): ss_res ((y_true - y_pred) ** 2).sum() # 模型没解释掉的残差平方和 ss_tot ((y_true - y_true.mean()) ** 2).sum() # 全猜均值时的残差平方和 return 1 - ss_res / ss_tot分母ss_tot是一条基准线什么特征都不用所有样本一律预测成均值。分子是模型自己的残差。两者相除得到“还剩下多少没解释”用 1 减掉就是“解释掉了多少”。所以 R²0.8 的正确读法是“相比全猜均值模型把残差压掉了 80%”而不是“准确率 80%”。这个解释顺带说明了 R² 的三种取值区间在训练集上它落在 [0,1]因为加偏置的最小二乘解不可能比“全猜均值”更差在测试集上它可以为负意味着模型还不如直接猜均值非线性数据上它也可能偏低因为直线族本身表达力有限。更关键的一点R² 高不等于模型能用。它只统计了训练分布内的拟合程度对“特征和标签之间是不是因果关系”“预测区间外会发生什么”一无所知。这两个盲区正是后面避坑章节的核心。3.3 批量、随机、小批量三种走法的真实差别梯度下降的思路是不奢求一步到位每次朝着当前位置梯度反方向挪一小步累积起来逼近谷底。更新式统一是w ← w - lr · ∇J(w)差别全在∇J用多少样本估计。**批量梯度下降BGD**每次把所有 n 个样本都过一遍梯度是无偏的、方向最准。代价是每一轮的计算量和内存都正比于 n样本上百万时一轮就要几十秒迭代几百轮直接不可接受。它另一个特性是收敛路径平滑因为梯度噪声为零学习率可以设得比较激进。**随机梯度下降SGD**每次只取一个样本估梯度。这个估计方差极大——单样本的方向和真实梯度可能差很远所以路径会剧烈抖动甚至出现目标函数短暂上升的情况。但它的优势是更新频率极高跑完一个 epoch 就更新了 n 次探索效率远超 BGD。抖动本身也不全是坏事它有逃离局部极小和鞍点的副作用。**小批量梯度下降MBGD**取中间值每次用 32/64/128 个样本。梯度估计的方差被平均压下去同时又保留了高频更新批内做矩阵运算还能吃满向量化带来的吞吐。今天的深度学习框架默认走的就是这条路batch_size就是它留下的参数。import numpy as np def mbgd(X, y, lr0.01, epochs50, batch_size32, seed0): rng np.random.default_rng(seed) n, d X.shape X_aug np.hstack([np.ones((n, 1)), X]) w np.zeros(d 1) for epoch in range(epochs): idx rng.permutation(n) # 每个 epoch 重新打乱避免固定顺序引入周期性抖动 for start in range(0, n, batch_size): b_idx idx[start:start batch_size] xb, yb X_aug[b_idx], y[b_idx] err xb w - yb # 当前批的残差 grad (2.0 / len(b_idx)) * xb.T err # 用批内均值代替全量均值 w - lr * grad return w # lr步长决定每次挪多远最敏感的超参 # epochs完整遍历数据集的轮数不是迭代次数 # batch_size每步用多少样本估梯度32/64/128 是常用档位 # 注意这里用了 1/|B| 归一化所以 lr 的量级和 batch_size 基本解耦代码里有三个细节值得单独拎出来。第一每个 epoch 重新 shuffle。如果不打乱样本顺序里隐含的规律比如按时间排好序会让梯度估计在相邻批次间高度相关收敛路径呈锯齿状。第二归一化系数取的是批内样本数不是全局 n如果误写成2.0/n梯度会随 batch_size 变小而等比例变小等效于偷偷调低了学习率调参时会一头雾水。第三种子固定。复现失败是排查问题时最难受的事固定 seed 是排查问题的基本前提。3.4 学习率与批大小两个互相纠缠的参数学习率是这套机制里最像玄学的一个参数。步长太大更新点会在谷底两侧来回横跳目标函数不降反升最后数值溢出成 NaN步长太小每轮挪动的距离被浮点精度吃掉几十轮下来 loss 几乎不动看起来像“模型没在学”。实操上的经验是从 1e-3 附近起手按 3 倍网格往两边试1e-2、3e-3、1e-3、3e-4观察前 100 轮 loss 曲线的形状持续下降且斜率逐渐变缓说明量级合适曲线剧烈震荡或突然跳高往小调曲线几乎水平往大调。批大小和学习率不是独立的。批越大梯度估计的噪声越小能承受的学习率上限越高反过来批越小梯度越抖学习率就得相应压低否则很容易被单个异常样本带飞。有一条被广泛验证的经验对应关系批大小翻倍时学习率大致也翻倍能保持相近的训练动态。这条规律在纯 SGD 上比较准加动量或自适应优化器之后会漂移但作为起手参考很有用。批大小还有内存这层现实约束。批大小 128 的两维特征矩阵和 128 层的网络激活量显存需求差着几个数量级。所以真正决定批大小的往往不是收敛速度而是显存和吞吐的平衡点——这也是为什么 32/64/128 会变成事实标准它们恰好落在“向量化算得动”和“显存装得下”的交叉区间里。4. 逻辑回归Sigmoid 和对数似然求导后剩下的那一项4.1 线性输出为什么要压进 [0,1]分类任务和回归任务的根本差别在于输出空间。线性回归的输出是整条实数轴wᵀx b可以是 -5000也可以是 90000。二分类要的是“是否”这个判断以及这个判断有多确信。直接用阈值切线性输出在数学上能跑问题在于输出值本身没有概率语义一个样本算出 0.3另一个算出 3.0都判为正类但没人能说清前者是不是比后者更危险因为尺度的零点在哪完全取决于数据。Sigmoid 做的事情就是把整条实轴压进开区间 (0,1)σ(z) 1 / (1 e^(-z))它单调、连续、处处可导z0 时输出 0.5z 趋向正无穷逼近 1负无穷逼近 0。压过去之后输出才有“概率”的解释0.5 自然成为决策边界。而且边界是软的z 从 0 变到 3概率从 0.5 涨到 0.95模型能表达“很确信”和“勉强越线”的差别。决策边界本身仍然是线性的——σ(wᵀxb) 0.5等价于wᵀxb 0是一条直线或平面。这让逻辑回归只能处理线性可分的数据遇到环形、月牙形分布必须靠特征工程加多项式项、交互项把数据抬到更高维才能分开。这也是“决策边界可以是非线性的”那句话的真实含义非线性来自特征变换不来自模型本身。Sigmoid 还有一个常被拿来考人的性质σ(z) σ(z)·(1 - σ(z))。导数能用自己的输出表示意味着前向算一遍的结果可以直接复用到反向省一次指数运算。这个性质在下一节的求导里会直接体现出来。4.2 对数似然求导最后只剩“预测减标签”二分类的标签是 0 或 1两个情况可以合并成一个式子写p(y|x) σ(z)^y · (1 - σ(z))^(1-y)y1 时右边第二项指数为 0、整项为 1只剩σ(z)y0 时第一项为 1只剩1-σ(z)。一个式子覆盖两种情况这是后面能顺利求导的关键。似然函数还是连乘取对数变连加得到对数似然ℓ(w) Σ [ y_i·log σ(z_i) (1-y_i)·log(1-σ(z_i)) ]目标是让它最大。对 w 求偏导把σ(z) σ(1-σ)代进去中间那些σ(1-σ)正好在分子分母上约掉最后干净得出奇∇ℓ(w) Σ x_i · (y_i - σ(z_i))这个结果值得停一下。残差(y - 预测概率)乘上特征形式和线性回归的最小二乘梯度一模一样。差别在于线性回归的残差来自平方损失求导逻辑回归的残差来自交叉熵求导两条完全不同的路走到了同一个表达式上——这是广义线性模型框架下的必然也是它好用的原因之一。工程上把梯度上升取负号就变成梯度下降损失函数写成负对数似然也就是交叉熵import numpy as np def sigmoid(z): # 分段实现z 很负时 exp(-z) 会溢出成 inf直接算会得到 nan out np.empty_like(z, dtypefloat) pos z 0 out[pos] 1.0 / (1.0 np.exp(-z[pos])) ez np.exp(z[~pos]) out[~pos] ez / (1.0 ez) # 等价变形避免上溢 return out def logistic_gd(X, y, lr0.1, epochs500): n, d X.shape X_aug np.hstack([np.ones((n, 1)), X]) w np.zeros(d 1) for _ in range(epochs): p sigmoid(X_aug w) # 交叉熵对 w 的梯度和最二乘的残差形式同构X^T (p - y) / n grad X_aug.T (p - y) / n w - lr * grad return w # p当前参数下每个样本被判为正类的概率 # grad 里没有 σ 这一项是因为它已经在求导过程中被约掉了这里有个必须说清的对比。如果逻辑回归偷懒沿用平方损失(y - σ(z))²梯度里会多带一个σ(z) σ(1-σ)。当预测严重错误时y1 而 σ(z)≈0σ 接近 0梯度被乘没了参数几乎不动——这就是典型的梯度消失训练前期 loss 曲线纹丝不动的元凶。交叉熵恰好把这个因子约掉错误越大梯度越大纠正得越快。损失函数的选择不是审美问题直接决定优化能不能跑起来。4.3 softmax从二分类推广到多分类多分类的做法是把标量得分推广成向量得分每个类别一个分数z_k w_kᵀx再用 softmax 归一化成概率分布softmax(z)_k e^(z_k) / Σ_j e^(z_j)和 sigmoid 的关系很直接类别数为 2 时softmax 的两个输出相加为 1其中一个就等于 sigmoid 的形式。所以 sigmoid 是 softmax 在 K2 时的特例不是另一套东西。多分类的损失是交叉熵的推广形式-log softmax(z)_y梯度形式依然是x·(预测概率 - one-hot 标签)和二分完全同构。实现上有个数值细节必须处理e^(z_k)在 z 稍大时就会溢出。标准做法是先减去max(z)再取指数数学上等价分子分母同乘一个常数数值上安全。这一点和 sigmoid 的分段写法是同一个动机——不是数学问题是浮点表示范围的问题。另外要区分两种多分类设定类别互斥时用 softmax 交叉熵每个样本只属于一类类别可以共存时一张图里既有猫又有狗应该拆成多个独立的二分类各用各的 sigmoid。选错了不报错只是概率之和不再为 1训练出来的置信度会系统性偏高事后很难查。5. 避坑与排查这几处翻车最典型5.1 特征尺度没对齐梯度下降直接跑偏现象loss 前几轮剧烈震荡参数很快变成 NaN或者相反loss 一直停在初值附近不动调小学习率也只是变慢没有本质改善。原因年龄落在 20~50月收入落在 4000~40000量纲差三个数量级。目标函数的等高线被拉成极扁的椭圆梯度方向几乎垂直于谷底方向于是更新点在山谷两侧反复横跳。学习率是按“最大的那个方向”定的对小的方向来说步长又远远不够只能在谷里磨。解决训练前统一做标准化减均值除标准差或 min-max 归一化让每个特征量级接近。注意补的那一列常数 1 不能参与标准化否则偏置项被压成 0模型等于失去了平移能力。用闭式解时尺度问题不像梯度下降那么致命但XᵀX的条件数会被平方放大精度照样受损所以该标准化还是要标准化。5.2 学习率选错症状长得像“模型不收敛”现象loss 降到某个值之后突然跳高来回几次后彻底发散或者跑满几百轮loss 曲线几乎是一条水平线而且换随机种子也没变化。原因前者是步长跨过了谷底每次更新都落到对面更高的位置误差被逐轮放大后者是步长小到更新量被浮点精度吞掉参数在初值附近原地打转。两种极端表现很多人会误判成“数据有问题”或“模型能力不够”。解决固定其它超参只对学习率做 3 倍网格扫描1e-1、3e-2、1e-2、3e-3、1e-3把每个设置下前 100 轮 loss 画出来对比。同时把 loss 的初值打印出来——如果初值本身就是 NaN那问题出在数据里除零、log(0)、无穷值和超参无关调学习率是白费功夫。5.3 R² 很漂亮上线后差一截现象训练集 R² 到 0.95验证集也还行但线上跑一段时间发现预测明显偏高或偏低尤其是新用户、极端收入段。原因典型的外推失效。线性模型在训练区间内拟合得好出了区间仍然按同一个斜率无限延伸——收入翻倍就预测额度翻倍而真实业务里额度是有上限的、增长是饱和的。另一种可能是特征泄漏某个特征在训练时隐含了标签信息比如“审批通过日期”这类事后字段训练时表现极好线上拿不到或拿到的是空值。解决按时间或用户切分验证集不要随机切画残差对特征的散点图看残差是否随特征值单调漂移漂移就说明模型在该区间系统性偏了再逐个检查特征在预测时刻是否真的可得。R² 只是分布内的相对指标它管不了外推也管不了泄漏。5.4 逻辑回归套了平方损失训练前期纹丝不动现象换成分类任务后loss 在前几十轮几乎不变参数更新量极小加大学习率也只是变成震荡loss 依然降不下去。原因平方损失对 sigmoid 输出求导时带出σ(z) σ(1-σ)这个因子。预测严重错误时 σ(z) 饱和在 0 或 1 附近σ 接近 0梯度被乘没了参数几乎不更新——越错越学不动正好和期望相反。解决分类任务一律用交叉熵求导时 σ 会被约掉梯度只和残差成正比。如果框架里只能传损失函数务必确认用的是binary_cross_entropy而不是mse_loss。这类问题不会报错只会让模型“看起来在训练”属于最难查的一类。5.5 特征共线闭式解报奇异或参数爆炸现象np.linalg.inv抛LinAlgError: Singular matrix换成pinv后不报错了但权重出现极大值正负相消稍微扰动一下数据参数就面目全非。原因XᵀX的条件数随特征相关性急剧恶化。完全共线时它直接奇异近似共线时它接近奇异求逆过程把微小噪声放大成巨大参数。表现是预测值稳定但参数不可解释——你想回答“年龄和收入各自影响多大”结果两个权重一个 800 一个 -790等于什么都说明不了。解决先算特征间的相关系数矩阵超过 0.9 的组合考虑去掉一个或做差分确实要保留就用岭回归往XᵀX对角线上加一个 λ条件数立刻改善代价是引入少量偏差换取方差大幅下降。判断标准很实际如果换个随机种子参数就翻天覆地说明解不唯一得先处理共线再谈解释。6. 设计取舍什么时候该信公式什么时候该信迭代把这套推导走完最值得琢磨的其实不是哪个公式而是每一步为什么这么选。误差假设成高斯是用“世界大致正态”这个近似换来了平方损失的可解性损失选平方而不是绝对值是拿对离群点的敏感度换了处处可导的平滑性求解从闭式解切到梯度下降是拿精确性换了可扩展性逻辑回归从平方损失切到交叉熵是拿损失函数的直观性换了梯度的可用性。每一个选择都在放弃一部分东西。这些取舍在实操里可以落成几条判断依据。特征维度 d 小、样本量中等、需要反复解释参数含义的场景闭式解是最优解——一次算完没有超参结果确定还能直接看XᵀX的条件数判断共线程度。特征维度上千、样本上百万、或者损失函数没有解析解逻辑回归就是梯度下降是唯一出路代价是要调学习率、要洗数据、要盯着 loss 曲线。验证方式上有个我一直在用的习惯能对拍的地方一定对拍。闭式解和梯度下降跑同一份数据参数应该在容差范围内一致如果不一致先查标准化有没有漏、偏置列有没有被误处理、归一化系数的分母写没写错。这个交叉验证比任何单点调试都快因为它把“代码写错了”和“模型本身就这样”两类问题直接分开了。我见过太多次 loss 不降最后发现是标签和特征错位了一行——这种错误任何损失曲线都看不出来只有对拍能暴露。评估指标也要分层看。训练集上的 R² 只说明优化跑通了验证集上的 R² 说明泛化还在残差随特征分布的漂移说明外推风险参数随随机种子的波动说明解是否唯一。四个一起看才不至于被单一数字误导。那份小组报告的 PPT 价值就在这里它把高斯假设、似然推导、闭式解、三种梯度下降、sigmoid 求导这几层都配了图和完整推导正好可以对着上面每一节逐条核。想自己推一遍的拿它当底稿比从头翻教材省事得多。从那以后我每次接手一个回归或分类任务都强制先跑一遍闭式解、再跑一轮小批量梯度下降做对拍两边对不上就停下来查数据绝不硬调参。这个习惯帮我省掉了大量“模型不收敛”的黑匣子时间。希望帮到你。本文还有配套的精品资源点击获取