多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

蒙眼下山:梯度下降的AI智慧

蒙眼下山:梯度下降的AI智慧 假设你站在一座山上四周大雾看不清山谷在哪里。你的目标是尽可能走到更低的位置。虽然看不到整座山但你可以感受脚下的坡度哪边上坡最陡 ↓ 朝它的反方向走一小步 ↓ 重新判断坡度 ↓ 继续往下走这就是梯度下降法Gradient Descent的直观思想。根据当前位置的梯度反复调整参数让损失函数尽可能减小。不过“蒙眼”只是比喻算法并非乱走它能够计算当前位置的局部变化信息。一、AI 训练为什么需要“下山”假设我们想让 AI 学习输入房屋面积 → 预测房价先用一个简单模型hatywxbhat y wxbhatywxb其中(x)房屋面积y^\hat yy^​预测房价(w)面积对价格的影响(b)基础偏移。一开始(w) 和 (b) 可能不合理预测自然不准。我们需要一个指标衡量“预测错得有多离谱”例如均方误差L(w,b)1N∑i1N(wxib−yi)2L(w,b)\frac{1}{N}\sum_{i1}^{N}(wx_ib-y_i)^2L(w,b)N1​∑i1N​(wxi​b−yi​)2这里-yiy_iyi​是真实价格(L) 是损失函数损失越小说明模型在这批数据上的预测越接近真实值。训练的目标就是min⁡w,bL(w,b)\min_{w,b}L(w,b)minw,b​L(w,b)对应到下山下山比喻AI 训练在山上的位置当前参数 (w,b)所处高度当前损失脚下坡度损失对参数的梯度下山步幅学习率配合梯度决定的更新量寻找低处寻找损失较小的参数AI 不是在物理空间下山而是在参数空间中寻找更好的位置。二、梯度到底是什么1. 只有一个参数时导数考虑L(w)(w−3)2L(w)(w-3)^2L(w)(w−3)2它是一条开口向上的抛物线最低点在w3导数是dLdw2(w−3)\frac{dL}{dw}2(w-3)dwdL​2(w−3)它告诉我们当前位置沿着 (w) 增大的方向损失如何变化。例如当 (w0)dLdw−6\frac{dL}{dw}-6dwdL​−6意味着局部来看增大 w → 损失下降所以应该向右走。当 (w5)dLdw4\frac{dL}{dw}4dwdL​4意味着局部来看增大 w → 损失上升所以应该向左走。2. 有多个参数时梯度如果模型有多个参数θ(θ1,θ2,…,θn)\theta(\theta_1,\theta_2,\ldots,\theta_n)θ(θ1​,θ2​,…,θn​)梯度就是所有偏导数组成的向量∇L(θ)[∂L∂θ1∂L∂θ2⋮∂L∂θn]\nabla L(\theta) \begin{bmatrix} \frac{\partial L}{\partial\theta_1}\\ \frac{\partial L}{\partial\theta_2}\\ \vdots\\ \frac{\partial L}{\partial\theta_n} \end{bmatrix}∇L(θ)​∂θ1​∂L​∂θ2​∂L​⋮∂θn​∂L​​​在通常的欧氏距离度量下它指向当前位置损失局部上升最快的方向。因此要下降就沿着负梯度−∇L(θ)-\nabla L(\theta)−∇L(θ)注意关键词当前位置、局部。梯度不是一张指向全局最低点的地图。三、核心公式当前位置减去学习率乘梯度梯度下降的更新公式θt1θt−η∇L(θt)\boxed{\theta_{t1}\theta_t-\eta\nabla L(\theta_t)}θt1​θt​−η∇L(θt​)​拆开理解新参数 旧参数 - 学习率 × 当前梯度其中θt\theta_tθt​第 (t) 次更新时的参数η\etaη学习率∇L(θt)\nabla L(\theta_t)∇L(θt​)当前梯度。为什么这样通常能下降在足够小的邻域内可以近似写成L(θ−η∇L)≈L(θ)−η∥∇L∥2L(\theta-\eta\nabla L) \approx L(\theta)-\eta\|\nabla L\|^2L(θ−η∇L)≈L(θ)−η∥∇L∥2当学习率为正、梯度非零时右边的变化项为负。但这只是局部近似步子过大时实际损失仍然可能上升。四、亲手算一次“下山”继续使用L(w)(w−3)2L(w)(w-3)^2L(w)(w−3)2设定初始参数w 0 学习率η 0.1更新公式wneww−0.1×2(w−3)w_{\text{new}}w-0.1\times2(w-3)wnew​w−0.1×2(w−3)第一步当前w0,L9w0,\quad L9w0,L9梯度2(0−3)−62(0-3)-62(0−3)−6更新w0−0.1(−6)0.6w0-0.1(-6)0.6w0−0.1(−6)0.6新的损失L(0.6−3)25.76L(0.6-3)^25.76L(0.6−3)25.76损失从 (9) 降到了 (5.76)。继续更新更新次数参数 (w)损失 (L(w))00910.65.7621.083.686431.4642.359341.77121.5099参数逐渐接近w3算法不需要事先知道答案只需要反复计算当前位置的梯度。五、学习率步子不是越大越好学习率太小方向正确 但每次只挪一点结果收敛缓慢需要更多次更新。学习率太大一步跨过谷底 下一步又跨回来 甚至越跳越远仍用上面的函数如果η1\eta1η1就会出现w0 → 6 → 0 → 6 → …一直在两侧来回跳无法接近最低点。学习率合适通常能够兼顾下降速度与稳定性。还可以使用学习率调度前期较大快速探索 后期较小细致调整但没有一个适用于所有模型的万能学习率。另外学习率并不等于实际移动距离。普通梯度下降中∥Δθ∥η∥∇L∥\|\Delta\theta\|\eta\|\nabla L\|∥Δθ∥η∥∇L∥相同学习率下梯度越大参数更新幅度也越大。六、三种常见方式一次看多少数据模型训练时梯度通常来自训练样本。1. 批量梯度下降每次使用全部训练数据计算梯度。全部样本 → 计算梯度 → 更新一次特点得到当前完整训练目标的梯度数据量大时单次更新成本高。2. 随机梯度下降严格来说每次使用一个样本估计梯度。一个样本 → 估计梯度 → 更新一次特点更新频繁噪声较大损失可能上下波动。3. 小批量梯度下降每次使用一小批样本例如 32、128 或 256 个。一批样本 → 估计梯度 → 更新一次它兼顾计算效率和梯度质量是深度学习中的常见选择。实际工程里“SGD”也经常泛指小批量随机梯度方法。小批量训练中某一步损失上升不一定代表训练出错因为每一批数据给出的方向可能不同。七、反向传播和梯度下降是什么关系它们不是同一件事。前向传播 用当前参数进行预测。 损失计算 衡量预测与目标的差距。 反向传播 利用链式法则计算梯度。 优化器更新 根据梯度修改参数。可以记成反向传播负责“算坡度”梯度下降负责“迈步子”。神经网络可能有数百万甚至数十亿个参数反向传播让这些梯度能够被高效计算出来。八、用 Python 写一个最小版本w0.0learning_rate0.1forstepinrange(50):gradient2*(w-3)ww-learning_rate*gradient loss(w-3)**2ifstep%100:print(fstep{step1}, fw{w:.6f}, floss{loss:.6f})print(最终参数,w)它只做三件事计算梯度 ↓ 更新参数 ↓ 重复真实神经网络也是这个基本循环只是损失函数更复杂梯度通常由自动微分系统计算。九、“蒙眼下山”并不保证找到最低谷1. 可能遇到局部最低点复杂损失曲面可能有多个低谷。走进一个低谷不代表找到了全局最低点。2. 梯度为零不一定是最低点也可能是局部最高点鞍点。鞍点可以理解为沿一个方向看是谷底 沿另一个方向看却是山顶3. 平坦区域可能让训练变慢梯度很小更新量也可能很小。深层网络中还可能遇到梯度消失或梯度爆炸等问题需要结合网络结构、初始化、归一化和梯度裁剪等方法处理。4. 训练损失低不等于实际表现好模型可能记住了训练数据却不能处理新数据。这叫过拟合。因此还需要关注验证集表现 正则化 数据质量 泛化能力优化器负责降低你定义的目标不负责判断这个目标是否完整代表你的真实需求。十、Momentum 和 Adam更聪明的走法普通梯度下降主要依据当前梯度。常见改进包括方法直观理解Momentum积累过去的方向利用“惯性”减少来回摇摆Adam结合梯度的一阶、二阶矩估计为不同参数调整有效更新尺度它们通常能改善训练效率但不是用了 Adam → 一定收敛 用了 Momentum → 一定找到全局最优学习率、数据和模型设计依然重要。总结梯度下降的核心只有一句话计算损失对参数的梯度然后沿负梯度方向更新参数反复寻找更低的损失。完整循环是做出预测 ↓ 计算损失 ↓ 计算梯度 ↓ 更新参数 ↓ 再次预测“蒙眼下山”的智慧不在于提前看到了终点而在于利用眼前可靠的局部信息小步修正并不断重新判断方向。
返回列表