怎样如何做网站赚钱,抑郁症状有哪些表现免费咨询,企业怎么创建微信公众号,免费的作文网站在上一篇博客中#xff0c;我们学习了线性回归的基本概念、损失函数#xff08;如MSE#xff09;以及最小二乘法。最小二乘法通过求解解析解#xff08;直接计算出最优参数#xff09;的方式得到线性回归模型#xff0c;但它有一个明显的局限#xff1a;当特征数量很多时…在上一篇博客中我们学习了线性回归的基本概念、损失函数如MSE以及最小二乘法。最小二乘法通过求解解析解直接计算出最优参数的方式得到线性回归模型但它有一个明显的局限当特征数量很多时计算过程会非常复杂涉及矩阵求逆等操作。今天我们来学习另一种更通用、更适合大规模数据的参数优化方法——梯度下降。
一、什么是梯度下降
梯度下降Gradient Descent是一种迭代优化算法核心思想是通过不断地沿着损失函数下降最快的方向调整参数最终找到损失函数的最小值或近似最小值。
我们可以用一个生活中的例子理解假设你站在一座山上周围被大雾笼罩你看不见山脚在哪里但你想以最快的速度走到山脚下。此时你能做的最合理的选择就是先感受一下脚下的地面哪个方向坡度最陡且向下然后沿着那个方向走一步走到新的位置后再重复这个过程——感受坡度最陡的向下方向再走一步直到你感觉自己已经走到了最低点脚下各个方向都不再向下倾斜。
这个过程就是梯度下降的直观体现
这座山就是我们的损失函数你的位置代表当前参数值你感受到的坡度最陡的向下方向就是负梯度方向你每次走的一步的长度就是学习率最终到达的山脚下就是损失函数的最小值点
在线性回归中我们的目标是找到最优参数如权重w使得损失函数L(w)达到最小值。梯度下降的作用就是帮助我们一步步调整这些参数最终找到让损失函数最小的参数值。
二、梯度下降的基本步骤
梯度下降的过程可以总结为4个核心步骤我们以单特征且不含偏置项的线性回归模型y  wx为例即b0损失函数使用MSE逐步说明
步骤1初始化参数
首先需要给参数w设定初始值。初始值可以是任意的比如随机值、0或1因为梯度下降会通过迭代不断优化它。
为什么初始值可以任意选择因为梯度下降是一个迭代优化的过程无论从哪个点开始只要迭代次数足够多且学习率合适最终都会收敛到损失函数的最小值附近。
例如我们可以简单地将初始值设为w  0然后开始优化过程。
步骤2计算损失函数的梯度
“梯度在单参数情况下就是损失函数对该参数的导数它表示损失函数在当前参数位置的变化率和变化方向”。
对单特征且b0的模型y  wx我们只需要计算一个导数
损失函数L对w的导数∂L/∂w表示当w变化时损失函数L的变化率
这个导数就是梯度它指向损失函数增长最快的方向。这很重要梯度指向的是损失函数值上升最快的方向所以要让损失函数减小我们需要向相反的方向移动。
步骤3更新参数
为了让损失函数减小我们需要沿着梯度的反方向即负梯度方向调整参数。更新公式为
w  w - α · (∂L/∂w)其中α是学习率后面会详细解释它控制参数更新的步长。
为什么是减去梯度而不是加上因为梯度指向损失函数增大的方向所以减去梯度就意味着向损失函数减小的方向移动这正是我们想要的。
步骤4重复迭代直到收敛
重复步骤2和步骤3每次计算当前参数的梯度然后沿负梯度方向更新参数。当满足以下条件之一时停止迭代即收敛
梯度的绝对值接近0此时损失函数变化很小接近最小值损失函数L(w)的变化量小于某个阈值比如连续两次迭代的损失差小于10⁻⁶达到预设的最大迭代次数防止无限循环。
收敛这个词可以理解为参数值已经稳定下来继续迭代也不会有明显变化此时我们可以认为找到了最优参数。
三、梯度下降的公式推导单特征且b0
要实现梯度下降核心是求出损失函数对参数w的导数。我们以MSE损失函数为例且b0详细推导∂L/∂w的计算过程每一步都会给出详细说明。
已知条件模型y_pred  wx预测值因b0无偏置项真实值y损失函数MSE
L(w)  (1/2n)Σ(yᵢ - y_pred,ᵢ)²  (1/2n)Σ(yᵢ - wxᵢ)²注公式中加入1/2是为了后续求导时抵消平方项的系数2使计算更简洁不影响最终结果
推导∂L/∂w损失函数对w的导数先对单个样本的损失求导
单个样本的损失为lᵢ  (1/2)(yᵢ - wxᵢ)²对w求导
∂lᵢ/∂w  2 · (1/2)(yᵢ - wxᵢ) · (-xᵢ)  -(yᵢ - wxᵢ)xᵢ这里用到了复合函数求导法则链式法则首先对平方项求导得到2·(1/2)(…)然后对括号内的内容求导由于我们是对w求导所以(wxᵢ)对w的导数是xᵢ前面有个负号所以整体是-(yᵢ - wxᵢ)xᵢ。对所有样本的损失求和后求导
总损失L是所有单个样本损失的平均值L  (1/n)Σlᵢ因此
∂L/∂w  (1/n)Σ(∂lᵢ/∂w)  (1/n)Σ[-(yᵢ - wxᵢ)xᵢ]  -(1/n)Σ(yᵢ - y_pred,ᵢ)xᵢ这一步的含义是总损失对w的导数等于所有单个样本损失对w的导数的平均值。最终更新公式
将上面得到的导数代入参数更新公式参数  参数 - 学习率 × 导数得到
w  w  α · (1/n)Σ(yᵢ - y_pred,ᵢ)xᵢ注负负得正公式中的减号变为加号
这个公式的含义是
如果预测值y_pred,ᵢ小于真实值yᵢ即yᵢ - y_pred,ᵢ为正则w会增大反之则减小。增大或减小的幅度取决于三个因素误差大小yᵢ - y_pred,ᵢ、特征值xᵢ的大小和学习率α。特征值xᵢ越大相同误差下w的更新幅度也越大这体现了特征对参数调整的影响。
四、学习率α的作用
学习率Learning Rate是梯度下降中最重要的超参数需要人工设定的参数它控制参数更新的步长。我们继续用下山的例子来理解
如果学习率α太小就像每次只迈一小步下山虽然安全但需要走很多步才能到达山脚迭代次数多效率低。如果学习率α太大就像每次迈一大步下山可能会直接跨过山脚甚至走到对面的山坡上跳过最小值甚至导致损失函数越来越大无法收敛。合适的学习率步长适中能快速逼近最小值既不会太慢也不会跳过。
实际应用中学习率通常需要通过尝试确定常见的初始值有0.1、0.01、0.001等。一种常用的策略是学习率衰减随着迭代次数增加逐渐减小学习率这样在开始时可以快速接近最小值后期可以精细调整。
举个形象的例子假设你在下山开始时你离山脚很远可以大踏步前进较大的学习率当快到山脚时你会放慢脚步小步移动较小的学习率以免走过头。
完整示例手动实现梯度下降单特征b0
import numpy as np
import matplotlib.pyplot as plt  # 可视化# 创建数据  植物的温度、和生长高度 [[20,10],[22,10],[27,12],[25,16]]
data np.array([[20,10],[22,10],[27,12],[25,16]])
# 划分
xdata[:,0]
ydata[:,1]
print(x)
print(y)# 创建一个模型
def model(x,w):return x*w# 定义损失函数
# def loss(y_pred,y):
#      return np.sum((y_pred-y)**2)/len(y)# 手动将损失函数展开  便于下面写梯度函数
def loss(w):return 2238*(w**2) - 1144*w  600# 梯度函数  即,将损失函数求导
def gradient(w):return 2*2238*w - 1144# 梯度下降  给定初始系数w  迭代100次 优化w
w0
learning_rate  1e-5  # 降低学习率避免溢出
for i in range(100):ww-learning_rate*gradient(w)print(e:,loss(w),w:,w)# 绘制损失函数
plt.plot(np.linspace(0,1,100),loss(np.linspace(0,1,100)))# 绘制模型
def draw_line(w):point_x  np.linspace(0, 30, 100)point_y  model(point_x, w)plt.plot(point_x, point_y, labelfFitted line (w{w:.4f}))plt.scatter(x, y, colorred, labelData points)plt.legend()plt.xlabel(Temperature)plt.ylabel(Height)plt.title(Linear Regression via Gradient Descent)plt.grid(True)plt.show()# draw_line(w)五、多特征的梯度下降以2个特征为例
现实中我们遇到的问题往往有多个特征比如用面积和房间数预测房价。下面我们推导2个特征的线性回归模型的梯度下降公式方法与单特征类似但需要考虑更多参数。
模型与损失函数2个特征的模型y_pred  w₁x₁  w₂x₂x₁、x₂是两个特征w₁、w₂是对应的权重因b0无偏置项损失函数MSE
L(w₁,w₂)  (1/2n)Σ(yᵢ - (w₁x₁,ᵢ  w₂x₂,ᵢ))²推导各参数的偏导数
与单特征思路一致我们分别对w₁、w₂求偏导对w₁的偏导
∂L/∂w₁  -(1/n)Σ(yᵢ - y_pred,ᵢ)x₁,ᵢ推导过程与单特征中w的导数完全相同只是这里特征是x₁所以最后乘以x₁,ᵢ。对w₂的偏导
∂L/∂w₂  -(1/n)Σ(yᵢ - y_pred,ᵢ)x₂,ᵢ同理这里特征是x₂所以最后乘以x₂,ᵢ。参数更新公式
将上述偏导数代入更新公式得到
w₁  w₁  α · (1/n)Σ(yᵢ - y_pred,ᵢ)x₁,ᵢ
w₂  w₂  α · (1/n)Σ(yᵢ - y_pred,ᵢ)x₂,ᵢ多特征的扩展规律
从2个特征的推导可以看出梯度下降的公式可以很容易扩展到k个特征的情况模型y_pred  w₁x₁  w₂x₂  …  wₖxₖ对第j个权重wⱼ的更新公式
wⱼ  wⱼ  α · (1/n)Σ(yᵢ - y_pred,ᵢ)xⱼ,ᵢxⱼ,ᵢ表示第i个样本的第j个特征值
这个规律非常重要它告诉我们无论有多少个特征梯度下降的更新规则都是相似的——每个权重wⱼ的更新量都与对应特征xⱼ和误差(yᵢ - y_pred,ᵢ)的乘积有关。
完整示例手动实现梯度下降两个特征b0
import numpy as np
import matplotlib.pyplot as plt
# 如果使用中文显示建议添加以下配置
plt.rcParams[font.sans-serif]  [SimHei]  # 用来正常显示中文标签
plt.rcParams[axes.unicode_minus]  False    # 用来正常显示负号# 创建数据  [[1,1,3],[2,1,4],[1,2,5],[2,2,6]]
data  np.array([[1,1,3],[2,1,4],[1,2,5],[2,2,6]])
# 划分
xdata[:,:-1]
ydata[:,-1]
print(x)
print(y)# 创建模型
def model(x,w):return np.sum(x*w)# 创建损失函数
# def loss(w,x):# return np.sum((np.sum(x*w,axis1)-y)**2)# return np.sum((model(x,w)-y)**2)
def loss(w1,w2):return 5*w1**2  5*w2**2 9*w1*w2 -28*w1-29*w2 43# 创建梯度函数
def gradient_w1(w1,w2):return 10*w19*w2-28def gradient_w2(w1,w2):return 9*w110*w2-29# 初始化w1,w2
w10
w20# 迭代100次 优化w1,w2
for i in range(100):w1,w2w1-0.01*gradient_w1(w1,w2),w2-0.01*gradient_w2(w1,w2)print(e:,loss(w1,w2),w1:,w1,w2:,w2)# # 绘制模型  没写出来所以注释了
# def draw_line(w1,w2):
#     point_xnp.linspace(0,5,100)
#     point_ymodel(point_x,w1,w2)
#     plt.plot(point_x,point_y)# draw_line(w1,w2)
六、梯度下降与最小二乘法的对比特点梯度下降最小二乘法本质迭代优化数值解直接求解方程解析解计算复杂度低适合大规模数据/多特征高涉及矩阵求逆适用性几乎所有损失函数仅适用于凸函数且有解析解超参数依赖需要调整学习率等无需超参数内存需求低可分批处理数据高需要一次性加载所有数据简单来说当特征数量较少时最小二乘法可能更简单直接但当特征数量很多比如超过1000个时梯度下降通常是更好的选择。
总结
梯度下降是机器学习中最基础也最常用的优化算法它通过沿损失函数负梯度方向迭代更新参数的方式找到使损失最小的参数值。与最小二乘法相比梯度下降更适合处理大规模数据和复杂模型。
本文我们从概念、步骤、公式推导单特征且b0和双特征、学习率作用等方面详细讲解了梯度下降希望能帮助你理解其核心逻辑。掌握梯度下降不仅对理解线性回归至关重要也是学习更复杂机器学习算法如神经网络的基础。
下一篇博客中我们将通过实际案例演示如何用梯度下降实现线性回归进一步加深理解。