《机器学习》 梯度下降

本文介绍了机器学习中如何使用梯度下降法寻找线性函数的最优参数。通过误差函数衡量拟合效果,梯度下降策略用于找到使得误差最小的权重向量。讨论了梯度下降的计算过程,包括标准梯度下降和随机梯度下降的差异,并提供了一个代码实例链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参照《机器学习》这本书的第4.4.3节。

一.解决目标及情景假设:

当给定一些数据,输入x向量已知,输出y也已知,设计一个线性函数y=h(x)去拟合这些数据。

既然是线性函数,在此不妨设为h(x)=w0*x0+w1*x1。

此时我们遇到的问题就是如何确定w0和w1这两个参数,即w=(w0,w1)这个向量。

既然是拟合,则拟合效果可以用误差函数:E(w)=∑ [ h(x)- y ] ^2 / 2 来衡量。

其中w是权重二维向量,x是输入二维向量,x和y都是训练集的数据,即已知。

至于后面除于2只是为了之后的推导过程中对E求导时候可以消除系数,暂时可以不管。


因为我们解决的目标是找出一个向量w=(w0,w1)使得E(w)值最小,即误差最小。

其实这个问题本质上也是搜索最优解的问题,如果用暴力搜索的话,随机取每个可能的值去让机器每天每夜地跑,显然这是不可能的。
所以此时有一种搜索策略:梯度下降。


二. 梯度下降方法:

梯度其实就是高数求导方法,对E这个公式针对每个维数(w0,w1)求偏导后的向量▽E(w)=(∂E/∂w0,∂E/∂w1

梯度为最陡峭上升的方向,对应的梯度下降的训练法则为:

w=w-η▽E(w)

这里的η代表学习速率,决定梯度下降搜索中的步长 。

### 梯度下降算法的实例与代码示例 梯度下降是一种优化方法,用于最小化目标函数。它通过迭代调整参数来逐步接近最优解[^1]。以下是梯度下降的一个简单实现案例。 #### 单变量线性回归中的梯度下降 假设我们有一个简单的单变量线性回归问题 \( y = wx + b \),其中 \( w \) 是权重,\( b \) 是偏置项。我们的目标是最小化均方误差损失函数: \[ L(w, b) = \frac{1}{n} \sum_{i=1}^{n}(y_i - (wx_i + b))^2 \] 下面是一个基于 Python 的梯度下降实现示例: ```python import numpy as np # 数据准备 X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # 初始化参数 w = 0.0 b = 0.0 learning_rate = 0.1 iterations = 1000 m = len(X) for iteration in range(iterations): # 计算预测值 y_pred = w * X + b # 计算梯度 gradient_w = (-2 / m) * sum(X * (y - y_pred)) gradient_b = (-2 / m) * sum(y - y_pred) # 更新参数 w -= learning_rate * gradient_w b -= learning_rate * gradient_b print(f"w: {w}, b: {b}") ``` 上述代码展示了如何利用梯度下降更新参数 \( w \) 和 \( b \)[^5]。每次迭代都会根据当前参数计算梯度,并按照负梯度方向调整参数。 #### 批量梯度下降 vs 随机梯度下降 批量梯度下降使用整个数据集计算梯度,而随机梯度下降(SGD)则一次只使用一个样本进行更新[^2]。对于大规模数据集,SGD通常更高效,因为它减少了每一步所需的计算资源。 #### 使用 Scikit-Learn 进行 SGD 回归 Scikit-Learn 提供了一个内置的 `SGDRegressor` 类,可以直接用来执行随机梯度下降回归任务[^3]。 ```python from sklearn.linear_model import SGDRegressor from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler sgd_reg = make_pipeline( StandardScaler(), SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1) ) sgd_reg.fit(X, y.ravel()) print(f"Coefficients: {sgd_reg.named_steps['sgdregressor'].coef_}") print(f"Intercept: {sgd_reg.named_steps['sgdregressor'].intercept_}") ``` 此代码片段演示了如何使用 Scikit-Learn 中的 `SGDRegressor` 来拟合线性回归模型[^4]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值