第1周:引言与线性回归
课程简介
机器学习定义、监督学习与无监督学习概念、单变量线性回归与代价函数、梯度下降。
🎬 本课程视频:吴恩达机器学习 (2014) — 交互式学习笔记
一、什么是机器学习
机器学习是一门让计算机在没有明确编程的情况下也能学习的科学。Tom Mitchell 给出了一个广为流传的定义:一个计算机程序从经验 E 中学习,完成某类任务 T,并用性能度量 P 来衡量,如果它在 T 上的性能(以 P 衡量)随经验 E 而提高,则称其为学习。通俗地说,机器学习就是让计算机从数据中发现规律,并用这些规律对新数据进行预测或决策。
1.1 监督学习
监督学习(Supervised Learning)是机器学习中最常见的范式。它的核心特征是训练数据包含正确答案——即标签。算法学习从输入到输出的映射关系。
监督学习分为两大类问题:
- 回归问题(Regression):预测连续的数值输出。例如:根据房屋面积预测房价、根据车辆行驶里程预测二手车价格、根据股票历史数据预测未来价格。
- 分类问题(Classification):预测离散的类别输出。例如:判断邮件是否为垃圾邮件(二分类)、识别手写数字0-9(多分类)、诊断肿瘤是良性还是恶性。
Andrew Ng 在课程中用房价预测的例子引入了回归问题:给定房屋面积和价格的训练数据,我们希望学习一个函数,输入房屋面积就能输出预测价格。
1.2 无监督学习
与监督学习不同,无监督学习(Unsupervised Learning)的训练数据没有标签。算法需要自己发现数据中的隐藏结构。
常见应用场景:
- 聚类(Clustering):将相似的样本自动分组。Google News 将新闻按主题聚类、市场部门根据顾客消费行为划分客户群体。
- 降维(Dimensionality Reduction):将高维数据压缩到低维空间,便于可视化和计算。
- 异常检测(Anomaly Detection):识别与大多数样本不同的异常数据点。
课程中 Andrew 用了一个非常直观的例子区分两者——给你一堆带有标签的猫和狗图片,你学习区分它们,这是监督学习;给你一堆不带标签的新闻文章,你让计算机自动把这些文章按主题分组,这就是无监督学习。
二、单变量线性回归
2.1 模型表示
单变量线性回归(Univariate Linear Regression)是最简单的回归模型。它假设输出变量 y 与输入变量 x 之间存在线性关系:
$$h_\theta(x) = \theta_0 + \theta_1 x$$
其中 h_θ(x) 是假设函数,θ₀ 是截距项,θ₁ 是斜率,x 是输入特征。我们使用 θ(theta)来表示模型参数,这是 Andrew Ng 课程中的标准记法。
2.2 代价函数
代价函数(Cost Function)衡量模型的预测值与真实值之间的差距。在线性回归中,我们使用均方误差(MSE)作为代价函数:
$$J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2$$
这里的 m 是训练样本数。乘以 1/2 是为了后续求导时消去平方项的系数,使数学表达式更简洁。
Andrew Ng 用了一个非常直观的方式来解释代价函数——误差平方和的 1/2 倍。代价函数的值越小,说明模型对训练数据的拟合越好。
为了帮助理解,课程通过简化版(固定 θ₀ = 0)展示了 J(θ₁) 是一个开口向上的抛物线——存在一个全局最小值。当 θ₁ 取某个值时,代价函数最小,这就是我们想要的最优参数。
2.3 等高线图与代价函数可视化
当两个参数 θ₀ 和 θ₁ 都存在时,代价函数 J(θ₀, θ₁) 是一个三维曲面。Andrew Ng 用碗状图来描述这个曲面——它是一个凸函数,形状像一只碗,碗底就是全局最小值。等高线图将三维曲面投影到二维平面,每条等高线上的点对应相同的代价函数值。通过观察等高线图,我们可以直观地看到参数组合与代价函数值的关系。
三、梯度下降
3.1 梯度下降的思想
梯度下降(Gradient Descent)是最常用的优化算法之一。它的思想非常直观:想象你站在一座山的某个位置,四周大雾弥漫,你看不到下山的路。你想要快速到达山底。怎么做?你环顾四周,找到最陡的下坡方向,朝那个方向迈一步。然后在新位置重复这个过程——不断找到最陡的下坡方向,不断迈步——直到你到达一个再也无法下降的位置,那就是山底。
在数学上,这就是梯度下降的过程:
1. 计算代价函数 J(θ) 在当前参数 θ 处的梯度
2. 沿着负梯度方向更新参数
3. 重复直到收敛
参数更新公式:
$$\theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_1)$$
其中 α(alpha)是学习率,控制每一步迈出的大小。
3.2 梯度下降应用于线性回归
将线性回归的代价函数代入梯度下降公式,我们需要计算偏导数:
$$\frac{\partial}{\partial \theta_0} J(\theta_0, \theta_1) = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})$$
$$\frac{\partial}{\partial \theta_1} J(\theta_0, \theta_1) = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)}$$
因此参数更新规则为:
$$\theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})$$
$$\theta_1 := \theta_1 - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)}$$
注意这里的更新是同步更新——先计算所有偏导数,再同时更新所有参数。不要先更新 θ₀ 再用更新后的 θ₀ 去计算 θ₁ 的更新,那样会得到错误的结果。
3.3 批量梯度下降
上述算法称为批量梯度下降(Batch Gradient Descent),因为每一步更新都使用了全部训练集样本。批量指的是每次更新都扫描整个训练集。当训练集很大时(例如百万级样本),每次更新都需要计算所有样本的误差和,这非常耗时。但它的优点是每次更新都朝着正确的方向前进,收敛曲线平滑。
四、线性回归的梯度下降实践
4.1 学习率的选择
学习率 α 是梯度下降最重要的超参数:
- α 太小:收敛速度极慢,需要大量迭代次数
- α 太大:可能越过最小值,导致发散
实践中可以通过绘制 J(θ) 随迭代次数的变化曲线来判断:如果曲线持续下降并趋于平稳,说明 α 合适;如果曲线上下振荡甚至上升,说明 α 太大;如果曲线下降太慢,说明 α 太小。
Andrew Ng 的建议:尝试 α 值 0.001、0.003、0.01、0.03、0.1、0.3,每次以约 3 倍的步长递增。
4.2 特征缩放的重要性
在多变量线性回归中,如果不同特征的数值范围差异很大(例如房屋面积 50-500 平方米 vs 卧室数量 1-5 间),梯度下降的收敛会非常缓慢。解决方案是特征缩放:将所有特征缩放到相近的数值范围,通常使用均值归一化或 Z-score 标准化。这个主题在第 2 周会详细讨论。
4.3 线性回归的 Python 实现
import numpy as np
def compute_cost(X, y, theta):
m = len(y)
predictions = X.dot(theta)
cost = (1 / (2 * m)) * np.sum((predictions - y) ** 2)
return cost
def gradient_descent(X, y, theta, alpha, num_iters):
m = len(y)
J_history = np.zeros(num_iters)
for i in range(num_iters):
predictions = X.dot(theta)
errors = predictions - y
theta = theta - (alpha / m) * (X.T.dot(errors))
J_history[i] = compute_cost(X, y, theta)
return theta, J_history
def normal_equation(X, y):
return np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
五、课程核心要点总结
第 1 周的内容为整个机器学习课程奠定了坚实的基础。核心要点:
- 机器学习的定义:程序从经验中学习,提升任务性能
- 监督学习 vs 无监督学习:有无标签数据的区别
- 线性回归模型:最简单的监督学习模型
- 代价函数:衡量模型拟合程度的指标,线性回归中使用 MSE
- 梯度下降:迭代优化算法,沿着负梯度方向更新参数
- 凸优化:线性回归的代价函数是凸函数,梯度下降保证找到全局最优
Andrew Ng 强调的一个核心思想:理解算法的最好方式是用小数据集手动运行一次。拿一个只有 3 个数据点的例子,手动计算一次梯度下降的迭代,你会对算法有更深的理解。下一周我们将扩展线性回归到多变量情况,并学习特征缩放和学习率选择等实用技巧。
补充:梯度下降的数学深入
梯度下降算法的收敛性分析非常重要。对于凸函数,梯度下降保证收敛到全局最优。线性回归的代价函数是凸函数——它的海森矩阵 XᵀX 是半正定的。这意味着不存在局部最优的陷阱,梯度下降算法的初始位置不影响最终结果(只影响收敛速度)。
学习率 α 的选择在实践中有一套系统化的方法。除了绘制 J(θ) 曲线外,还可以使用自动收敛检测:如果 J(θ) 在一次迭代中的下降小于 10⁻³,可以认为已经收敛。但 Andrew Ng 更推荐观察曲线形状——这比单一阈值更可靠。
课程中的编程练习
Andrew Ng 的课程配套了 Octave/Matlab 编程练习。在练习中,学生需要:
1. 实现线性回归的代价函数 computation
2. 实现梯度下降的迭代更新
3. 绘制代价函数的收敛曲线
4. 观察不同学习率对收敛的影响
这些练习帮助学生在实践中巩固理论。学习机器学习的正确方法就是动手实现每个算法——用自己写的代码在小数据集上运行,观察结果,理解每个步骤的实际效果。
梯度下降的变体
除了批量梯度下降,还有几种重要变体:
- 随机梯度下降(SGD):每次只用一个样本更新,适合大数据
- 小批量梯度下降(Mini-Batch GD):每次用一批样本,折中方案
- 带动量的梯度下降:加入历史梯度信息,加速收敛
这些变体将在第 10 周详细讨论。
实践建议总结
- 始终绘制代价函数随迭代次数的变化曲线
- 学习率从 0.001 开始尝试,以 3 倍递增
- 确保特征数值范围相近(特征缩放)
- 代码实现时使用向量化而非 for 循环
- 在小数据集上先验证再扩展到全量数据
机器学习的实际应用案例
Andrew Ng 在课程中分享了一些机器学习的实际应用。自动驾驶汽车使用监督学习来识别行人、交通标志和其他车辆。Google 使用无监督学习来聚类新闻。语音识别系统使用深度学习将音频信号转换为文字。这些应用的共同点是:它们都从数据中学习规律,而无需人为编写复杂的规则系统。
机器学习的另一个重要概念是特征工程(Feature Engineering)——将原始数据转换为适合模型学习的表示形式。在房价预测中,原始数据可能是房屋面积和卧室数量,但你可以创建新特征——比如人均居住面积(面积除以居住人数)或房屋单价(价格除以面积)。好的特征工程往往比选择复杂的算法更重要。
线性回归的局限性在于它只能表示线性关系。但在实际问题中,变量之间的关系往往是非线性的——比如房价随面积的增长可能先快后慢。这正是我们在后续课程中需要更复杂模型的原因——但即使如此,线性回归作为一个强大的基线和诊断工具,在机器学习工作流中始终占有一席之地。
梯度下降的收敛性证明
对于线性回归的代价函数 J(θ) = 1/(2m) Σ(hθ(x)-y)²,它是一个凸函数。凸函数的重要性质是局部最小值就是全局最小值。海森矩阵 XᵀX 是半正定的——这意味着梯度下降无论从何处开始,都会收敛到同一个全局最优。
实践中的注意事项
- 学习率衰减:在训练后期减小学习率有助于更精确地收敛
- 早停法(Early Stopping):当验证集误差不再下降时停止训练,防止过拟合
- 批量大小:对于中小数据集,全批量梯度下降效果稳定;大数据集使用小批量
- 参数初始化:对于线性回归,参数初始化为零是没问题的——因为代价函数是凸的
- 监控训练过程:始终记录每轮迭代的代价函数值,绘制学习曲线
线性回归的局限性
线性回归虽然简单有效,但其局限性也很明显:
- 假设输入和输出之间的关系是线性的——现实世界中的关系往往是非线性的
- 对异常值极其敏感——一个极端数据点就能显著改变回归线的方向和斜率
- 特征之间如果存在多重共线性,参数估计会变得不稳定
- 无法处理高维特征空间中的复杂交互效应
理解这些局限性不是要否定线性回归的价值——而是要让你知道什么时候该使用更复杂的模型。
延伸阅读
- 📺 B 站播放列表:吴恩达机器学习 (2014) — 交互式学习笔记
- 📚 更多学习资源,请访问 deeplearning.ai 官网