线性回归:从房价建模到单层神经网络的深度学习第一课
发布时间:2026/10/1 2:00:16来源:尧图网络
人工智能深度学习机器学习教程【免费下载链接】d2l-zh《动手学深度学习》面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。项目地址https://gitcode.com/GitHub_Trending/d2/d2l-zh点击查看免费下载导读线性回归是《动手学深度学习》d2l-zh中第一个完整的机器学习模型它以房屋面积与房龄预测房价这一贯穿全书的示例系统讲清了训练数据、模型、损失函数与优化算法这四大要素并最终把线性模型等价地表述为一个单层神经网络为后续全部深度网络知识奠定起点。读完本篇你将掌握线性回归的数学原理仿射变换、平方损失、解析解与小批量随机梯度下降、矢量化加速的实践价值以及从概率视角理解最小化均方误差等价于极大似然估计的关键结论并能够在 d2l-zh 仓库提供的 PyTorch / MXNet / TensorFlow / Paddle 多框架环境中复现全部实验。线性回归的基本元素回归regression是能为一个或多个自变量与因变量之间关系建模的一类方法在自然科学和社会科学领域回归经常用来表示输入和输出之间的关系。在机器学习的大多数任务中我们关心的是预测prediction当想预测一个数值时就涉及回归问题。常见例子包括预测价格房屋、股票等、预测住院时间、预测需求零售销量等。但并非所有预测都是回归问题——后续章节将要介绍的分类问题目标是预测数据属于一组类别中的哪一个二者需要区分。线性回归linear regression可以追溯到 19 世纪初是回归各种标准工具中最简单也最流行的一种。它建立在两个简单假设之上其一假设自变量 $\mathbf{x}$ 和因变量 $y$ 之间的关系是线性的即 $y$ 可以表示为 $\mathbf{x}$ 中元素的加权和通常允许包含观测噪声其二假设噪声比较正常如遵循正态分布。为了解释线性回归原文档举了一个贯穿全书示例希望根据房屋的面积平方英尺和房龄年来估算房屋价格美元。为了开发模型需要收集一个包含销售价格、面积和房龄的真实数据集。在机器学习的术语中该数据集称为训练数据集training data set或训练集training set每行数据如一次房屋交易称为样本sample也称数据点data point或数据样本data instance试图预测的目标如房屋价格称为标签label或目标target预测所依据的自变量面积和房龄称为特征feature或协变量covariate。通常用 $n$ 表示数据集中的样本数。对索引为 $i$ 的样本输入表示为 $\mathbf{x}^{(i)} [x_1^{(i)}, x_2^{(i)}]^\top$其对应标签是 $y^{(i)}$。线性模型线性假设指目标房屋价格可以表示为特征面积和房龄的加权和$$\mathrm{price} w_{\mathrm{area}} \cdot \mathrm{area} w_{\mathrm{age}} \cdot \mathrm{age} b.$$其中的 $w_{\mathrm{area}}$ 和 $w_{\mathrm{age}}$ 称为权重weight决定每个特征对预测值的影响$b$ 称为偏置bias、偏移量offset或截距intercept表示当所有特征都取 0 时预测值应为多少。即使现实中不会有任何房子面积为 0 或房龄恰好为 0 年我们仍然需要偏置项——没有它模型的表达能力将受到限制。严格来说上式是输入特征的一个仿射变换affine transformation通过加权和对特征做线性变换linear transformation再通过偏置项进行平移translation。在机器学习领域我们通常处理高维数据集用线性代数表示法会更方便。当输入包含 $d$ 个特征时将预测结果 $\hat{y}$通常用尖角符号表示 $y$ 的估计值表示为$$\hat{y} w_1 x_1 \dots w_d x_d b.$$把所有特征放入向量 $\mathbf{x} \in \mathbb{R}^d$、所有权重放入向量 $\mathbf{w} \in \mathbb{R}^d$可以用点积形式简洁表达模型$$\hat{y} \mathbf{w}^\top \mathbf{x} b.$$其中向量 $\mathbf{x}$ 对应单个数据样本的特征用符号矩阵 $\mathbf{X} \in \mathbb{R}^{n \times d}$ 可以方便地引用整个数据集的 $n$ 个样本——$\mathbf{X}$ 的每一行是一个样本每一列是一种特征。对于特征集合 $\mathbf{X}$预测值 $\hat{\mathbf{y}} \in \mathbb{R}^n$ 可以通过矩阵-向量乘法表示为$${\hat{\mathbf{y}}} \mathbf{X} \mathbf{w} b$$这个过程会用到广播机制详见 chapter_preliminaries/ndarray.md 中subsec_broadcasting一节的介绍。给定训练数据特征 $\mathbf{X}$ 和已知标签 $\mathbf{y}$线性回归的目标是找到一组权重向量 $\mathbf{w}$ 和偏置 $b$使得从 $\mathbf{X}$ 同分布中取样得到的新样本预测标签误差尽可能小。即使我们相信给定 $\mathbf{x}$ 预测 $y$ 的最佳模型是线性的也很难找到 $n$ 个样本的真实数据集使得对所有 $1 \leq i \leq n$ 都严格满足 $y^{(i)} \mathbf{w}^\top \mathbf{x}^{(i)} b$——无论用什么手段观测特征 $\mathbf{X}$ 和标签 $\mathbf{y}$都可能出现少量观测误差。因此即使确信特征与标签的潜在关系是线性的我们也会加入一个噪声项来考虑观测误差。在寻找最优模型参数model parameters$\mathbf{w}$ 和 $b$ 之前还需要两样东西1一种模型质量的度量方式2一种能够更新模型以提高预测质量的方法。损失函数在考虑如何用模型拟合fit数据之前需要确定拟合程度的度量。损失函数loss function能够量化目标的实际值与预测值之间的差距。通常选择非负数作为损失数值越小表示损失越小完美预测时损失为 0。回归问题中最常用的损失函数是平方误差函数当样本 $i$ 的预测值为 $\hat{y}^{(i)}$、真实标签为 $y^{(i)}$ 时平方误差定义为$$l^{(i)}(\mathbf{w}, b) \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2.$$常数 $\frac{1}{2}$ 不会带来本质差别但求导后常数系数为 1形式上更简单。由于训练数据集不受我们控制经验误差只是关于模型参数的函数。下图展示了一维情况下用线性模型拟合数据的直观效果由于平方误差函数中的二次方项估计值 $\hat{y}^{(i)}$ 和观测值 $y^{(i)}$ 之间较大的差异将导致更大的损失。为度量模型在整个数据集上的质量需要计算训练集 $n$ 个样本上的损失均值等价于求和$$L(\mathbf{w}, b) \frac{1}{n}\sum_{i1}^n l^{(i)}(\mathbf{w}, b) \frac{1}{n} \sum_{i1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} b - y^{(i)}\right)^2.$$训练模型时我们希望寻找一组参数 $(\mathbf{w}^, b^)$使其最小化所有训练样本上的总损失$$\mathbf{w}^, b^ \operatorname*{argmin}_{\mathbf{w}, b}\ L(\mathbf{w}, b).$$解析解线性回归是一个很简单的优化问题与其他大部分模型不同它的解可以用一个公式直接表达这类解叫作解析解analytical solution。首先把偏置 $b$ 合并到参数 $\mathbf{w}$ 中在包含所有参数的矩阵中附加一列预测问题变成最小化 $|\mathbf{y} - \mathbf{X}\mathbf{w}|^2$。这在损失平面上只有一个临界点对应整个区域的损失极小点。将损失关于 $\mathbf{w}$ 的导数设为 0得到解析解$$\mathbf{w}^* (\mathbf X^\top \mathbf X)^{-1}\mathbf X^\top \mathbf{y}.$$像线性回归这样的简单问题存在解析解但并非所有问题都有解析解。解析解便于进行数学分析但对问题的限制很严格因而无法广泛应用在深度学习里——这正是需要引入数值优化方法的原因。随机梯度下降即使在无法得到解析解的情况下我们仍然可以有效地训练模型。在许多任务上那些难以优化的模型效果反而更好因此弄清楚如何训练它们是至关重要的。本书使用一种名为梯度下降gradient descent的方法它几乎可以优化所有深度学习模型通过不断在损失函数递减的方向上更新参数来降低误差。梯度下降最简单的用法是计算损失函数数据集中所有样本的损失均值关于模型参数的导数梯度。但实际执行可能非常慢因为每次更新参数前必须遍历整个数据集。因此通常每次计算更新时随机抽取一小批样本这种变体叫小批量随机梯度下降minibatch stochastic gradient descent初始化模型参数的值如随机初始化从数据集中随机抽取小批量样本在负梯度方向上更新参数并不断迭代。每次迭代中首先随机抽样一个小批量 $\mathcal{B}$由固定数量的训练样本组成然后计算小批量平均损失关于模型参数的导数梯度最后将梯度乘以预先确定的正数 $\eta$并从当前参数值中减掉。数学上可表示为$\partial$ 表示偏导数$$(\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b).$$对于平方损失和仿射变换可以明确写成$$\begin{aligned} \mathbf{w} \leftarrow \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \mathbf{x}^{(i)} \left(\mathbf{w}^\top \mathbf{x}^{(i)} b - y^{(i)}\right),\ b \leftarrow b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \left(\mathbf{w}^\top \mathbf{x}^{(i)} b - y^{(i)}\right). \end{aligned}$$其中 $\mathbf{w}$ 和 $\mathbf{x}$ 都是向量向量表示法比系数表示法如 $w_1, w_2, \ldots, w_d$更具可读性。$|\mathcal{B}|$ 表示每个小批量中的样本数也称批量大小batch size$\eta$ 表示学习率learning rate。批量大小和学习率通常是手动预先指定的而非训练得到这些可调整但不在训练过程中更新的参数称为超参数hyperparameter调参hyperparameter tuning就是选择超参数的过程。超参数通常根据训练迭代结果调整而训练迭代结果在独立的验证数据集validation dataset上评估。在训练了预先确定的若干迭代次数后或满足其他停止条件我们记录下模型参数的估计值 $\hat{\mathbf{w}}, \hat{b}$。但即使函数确实是线性的且无噪声这些估计值也不会让损失函数真正达到最小值——算法只会让损失缓慢收敛无法在有限步数内精确达到最小值。线性回归恰好是一个在整个域中只有一个最小值的学习问题而像深度神经网络这样复杂的模型损失平面上通常包含多个最小值。深度学习实践者很少会费力寻找在训练集上损失最小的参数更难做到的是找到一组参数使它们在我们从未见过的数据上实现较低损失这一挑战被称为泛化generalization。用模型进行预测给定已学习的线性回归模型 $\hat{\mathbf{w}}^\top \mathbf{x} \hat{b}$现在可以通过房屋面积 $x_1$ 和房龄 $x_2$ 估计一个未包含在训练数据中的新房屋价格。给定特征估计目标的过程通常称为预测prediction或推断inference。本书坚持使用预测一词虽然推断已成为深度学习的标准术语但它其实有些用词不当——在统计学中推断更多表示基于数据集估计参数深度学习从业者与统计学家交谈时常因术语误用产生误解。矢量化加速在训练模型时我们经常希望同时处理整个小批量的样本。为此需要对计算进行矢量化vectorization利用线性代数库而非在 Python 中编写开销高昂的 for 循环。原文档的实验代码如下d2l-zh 支持 mxnet、pytorch、tensorflow、paddle 四种后端通过from d2l import torch as d2l等写法切换见 d2l/init.py#tab pytorch %matplotlib inline from d2l import torch as d2l import math import torch import numpy as np import time为了说明矢量化为何重要我们考虑向量相加的两种方法实例化两个全为 1 的 10000 维向量一种方法用 Python for 循环遍历另一种依赖对的调用#tab all n 10000 a d2l.ones([n]) b d2l.ones([n])由于本书会频繁进行运行时间基准测试所以定义了一个计时器。该Timer类在仓库的 d2l/torch.py以及其他框架实现中中完整保存#tab all class Timer: #save 记录多次运行时间 def __init__(self): self.times [] self.start() def start(self): 启动计时器 self.tik time.time() def stop(self): 停止计时器并将时间记录在列表中 self.times.append(time.time() - self.tik) return self.times[-1] def avg(self): 返回平均时间 return sum(self.times) / len(self.times) def sum(self): 返回时间总和 return sum(self.times) def cumsum(self): 返回累计时间 return np.array(self.times).cumsum().tolist()现在可以对工作负载进行基准测试。首先用 for 循环每次执行一位的加法#tab mxnet, pytorch c d2l.zeros(n) timer Timer() for i in range(n): c[i] a[i] b[i] f{timer.stop():.5f} sec在 TensorFlow 后端中需要借助tf.Variable与assign完成逐位写入Paddle 后端则与 MXNet/PyTorch 写法一致。或者使用重载的运算符计算按元素的和#tab all timer.start() d a b f{timer.stop():.5f} sec结果很明显第二种方法比第一种快得多矢量化代码通常会带来数量级的加速。另外把更多数学运算放进库中无须自己编写大量计算也减少了出错的可能性。正态分布与平方损失正态分布和线性回归之间的关系很密切。正态分布normal distribution也称高斯分布Gaussian distribution最早由德国数学家高斯Gauss应用于天文学研究。若随机变量 $x$ 具有均值 $\mu$ 和方差 $\sigma^2$标准差 $\sigma$其正态分布概率密度函数如下$$p(x) \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left(-\frac{1}{2 \sigma^2} (x - \mu)^2\right).$$下面定义一个 Python 函数来计算正态分布并在仓库中随 d2l/torch.py 等模块一起保存本文代码的normal、plot等辅助函数与库中实现一致#tab all def normal(x, mu, sigma): p 1 / math.sqrt(2 * math.pi * sigma**2) return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)可视化正态分布时改变均值会产生沿 $x$ 轴的偏移增加方差会分散分布、降低其峰值#tab pytorch, tensorflow, paddle # 再次使用numpy进行可视化 x np.arange(-7, 7, 0.01) # 均值和标准差对 params [(0, 1), (0, 2), (3, 1)] d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabelx, ylabelp(x), figsize(4.5, 2.5), legend[fmean {mu}, std {sigma} for mu, sigma in params])均方误差损失函数简称均方损失可用于线性回归的一个原因正是我们假设观测中包含噪声且噪声服从正态分布。即$$y \mathbf{w}^\top \mathbf{x} b \epsilon,$$其中 $\epsilon \sim \mathcal{N}(0, \sigma^2)$。因此通过给定的 $\mathbf{x}$ 观测到特定 $y$ 的似然likelihood为$$P(y \mid \mathbf{x}) \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left(-\frac{1}{2 \sigma^2} (y - \mathbf{w}^\top \mathbf{x} - b)^2\right).$$根据极大似然估计法参数 $\mathbf{w}$ 和 $b$ 的最优值是使整个数据集的似然最大的值$$P(\mathbf y \mid \mathbf X) \prod_{i1}^{n} p(y^{(i)}|\mathbf{x}^{(i)}).$$极大似然估计法选择的估计量称为极大似然估计量。虽然使许多指数函数的乘积最大化看起来很困难但可以在不改变目标的前提下通过最大化似然对数来简化。由于历史原因优化通常说最小化而非最大化因此可以改为最小化负对数似然$-\log P(\mathbf y \mid \mathbf X)$$$-\log P(\mathbf y \mid \mathbf X) \sum_{i1}^n \frac{1}{2} \log(2 \pi \sigma^2) \frac{1}{2 \sigma^2} \left(y^{(i)} - \mathbf{w}^\top \mathbf{x}^{(i)} - b\right)^2.$$假设 $\sigma$ 是某个固定常数就可以忽略第一项它不依赖 $\mathbf{w}$ 和 $b$第二项除常数 $\frac{1}{\sigma^2}$ 外其余部分与均方误差完全一致且解并不依赖于 $\sigma$。因此可以得出结论在高斯噪声的假设下最小化均方误差等价于对线性模型的极大似然估计。从线性回归到深度网络到目前为止我们只谈论了线性模型。尽管神经网络涵盖更丰富的模型我们依然可以用描述神经网络的方式来描述线性模型从而把线性模型看作一个神经网络。神经网络图深度学习从业者喜欢绘制图表来可视化模型。下面把线性回归模型描述为一个神经网络——注意该图只显示连接模式每个输入如何连接到输出隐去了权重和偏置的值在该神经网络中输入为 $x_1, \ldots, x_d$因此输入层中的输入数或称特征维度feature dimensionality为 $d$网络的输出为 $o_1$输出层的输出数是 1。输入值都是已经给定的并且只有一个计算神经元由于模型的重点在发生计算的地方通常计算层数时不考虑输入层——因此这个神经网络的层数为 1。我们可以将线性回归模型视为仅由单个人工神经元组成的神经网络即单层神经网络。对于线性回归每个输入都与每个输出本例中只有一个输出相连这种变换称为全连接层fully-connected layer或稠密层dense layer下一章将详细讨论由这些层组成的网络。在 d2l-zh 仓库中这一线性回归即神经网络的视角直接体现在实践章节的实现上零实现版本chapter_linear-networks/linear-regression-scratch.md用d2l.matmul(X, w) b实现linreg模型用(y_hat - d2l.reshape(y, y_hat.shape)) ** 2 / 2实现squared_loss均方损失并用param[:] param - lr * param.grad / batch_size实现小批量随机梯度下降sgd而简洁实现版本chapter_linear-networks/linear-regression-concise.md则直接用net nn.Sequential(nn.Linear(2, 1))构造一个单层全连接网络配合loss nn.MSELoss()与优化器完成训练二者完美呼应线性回归 单层神经网络这一结论。生物学线性回归发明的时间1795 年早于计算神经科学所以将线性回归描述为神经网络似乎不太合适。但当控制学家、神经生物学家沃伦·麦库洛奇和沃尔特·皮茨开始开发人工神经元模型时他们为什么把线性模型作为起点下图是一张由树突dendrites输入终端、细胞核nucleusCPU组成的生物神经元图片轴突axon输出线和轴突端子axon terminal输出端子通过突触synapse与其他神经元连接树突中接收到来自其他神经元或视网膜等环境传感器的信息 $x_i$该信息通过突触权重$w_i$ 加权以确定输入的影响即通过 $x_i w_i$ 相乘来激活或抑制。来自多个源的加权输入以加权和 $y \sum_i x_i w_i b$ 的形式汇聚在细胞核中然后发送到轴突 $y$ 中进一步处理通常会通过 $\sigma(y)$ 进行一些非线性处理之后到达目的地如肌肉或通过树突进入另一个神经元。许多这样的单元可以通过正确连接和正确的学习算法拼凑在一起产生比单独一个神经元更有趣、更复杂的行为——这种想法归功于我们对真实生物神经系统的研究。当然当今大多数深度学习的研究几乎没有直接从神经科学中获得灵感。本书援引斯图尔特·罗素和彼得·诺维格在经典人工智能教科书Artificial Intelligence: A Modern Approach中的比喻虽然飞机可能受到鸟类的启发但几个世纪以来鸟类学并不是航空创新的主要驱动力。同样地如今深度学习中的灵感同样或更多地来自数学、统计学和计算机科学。小结机器学习模型中的关键要素是训练数据、损失函数、优化算法还有模型本身。矢量化使数学表达更简洁同时运行得更快。最小化目标函数和执行极大似然估计等价。线性回归模型也是一个简单的神经网络。练习假设我们有一些数据 $x_1, \ldots, x_n \in \mathbb{R}$目标是找到一个常数 $b$使得最小化 $\sum_i (x_i - b)^2$。找到最优值 $b$ 的解析解。这个问题及其解与正态分布有什么关系推导使用平方误差的线性回归优化问题的解析解。为简化问题可以忽略偏置 $b$可以通过向 $\mathbf X$ 添加所有值为 1 的一列做到这一点。用矩阵和向量表示法写出优化问题将所有数据视为单个矩阵将所有目标值视为单个向量。计算损失对 $w$ 的梯度。通过将梯度设为 0、求解矩阵方程来找到解析解。什么时候可能比使用随机梯度下降更好这种方法何时会失效假定控制附加噪声 $\epsilon$ 的噪声模型是指数分布即 $p(\epsilon) \frac{1}{2} \exp(-|\epsilon|)$。写出模型 $-\log P(\mathbf y \mid \mathbf X)$ 下数据的负对数似然。请试着写出解析解。提出一种随机梯度下降算法来解决这个问题。哪里可能出错提示当我们不断更新参数时在驻点附近会发生什么情况请尝试解决这个问题。赞分享人工智能深度学习机器学习教程【免费下载链接】d2l-zh《动手学深度学习》面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。项目地址https://gitcode.com/GitHub_Trending/d2/d2l-zh点击查看免费下载相关推荐《动手学深度学习》(d2l-zh) 线性回归基础精讲从线性假设到单层神经网络《动手学深度学习》 d2l zh 线性回归基础精讲从线性假设到单层神经网络 导读 本文以开源仓库 d2l zh《动手学深度学习》中文版 https://l人工智能深度学习机器学习教程TensorFlow模型构建从线性回归到神经网络TensorFlow模型构建从线性回归到神经网络 本文深入探讨了TensorFlow模型构建的基础架构、核心组件和最佳实践。首先介绍了TensorFlow作为教程深度学习机器学习终极Gorgonia神经网络构建指南从线性回归到深度学习的完整教程终极Gorgonia神经网络构建指南从线性回归到深度学习的完整教程 Gorgonia是一个强大的Go语言机器学习库专门用于构建和训练神经网络模型。这个完整的机器学习深度学习上一篇libtorrent多协议支持终极指南从IPv4到IPv6的平滑过渡实战教程下一篇GitHub_Trending/aig/ai-guide 开源项目10 个值得学习的 AI 应用案例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网