线性回归
回归是一个或多个自变量与因变量之间安关系的建模方法,在机器学习领域回归大部分与预测有关的但不绝对
线性回归基本元素
几个名词:假设预测房屋价格,得到的真实的数据集,这个数据集是训练数据集,在数据i集中的每行数据为样本(数据点/数据样本),预测的目标为标签/目标,预测所依据的自变量为特征/协变量
通常用n来表示数据集中的样本数,对索引为i的样本,输入表示为 对应标签为
线性模型
当我们的输入包含𝑑d个特征时,我们将预测结果𝑦̂ (通常使用“尖角”符号表示估计值)表示为:
𝑦̂ =
化简之:
𝑦̂ =
给定一个数据集,我们的目标是寻找模型的权重𝐰和偏置𝑏,使得根据模型做出的预测大体符合数据里的真实价格。输出的预测值由输入特征通过线性模型的仿射变换决定,仿射变换由所选权重和偏置确定。
Notes:在建立模型时,无论多理想,都会出现少量误差,因此即便能够保证特征与标签的潜在关系是线性的,液压泵加入一个噪声项考虑误差带来的影响
在我们开始寻找最好的模型参数 w 和 𝑏 之前,我们还需要两个东西:(1)一种模型质量的度量方式;(2)一种能够更新模型以提高模型预测质量的方法
损失函数
损失函数能够量化目标的实际值与预测值之间的差距。通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。回归问题中最常用的损失函数是平方误差函数,平方误差可以定义为以下公式:
Note:1/2 不会带来影响只是在求导时简便
看下面例子:
一维情况下的回归问题绘制图像:
由于平方误差函数中的二次方项,估计值𝑦̂ (𝑖)y^(i)和观测值𝑦(𝑖)y(i)之间较大的差异将贡献更大的损失。为了度量模型在整个数据集上的质量,我们需计算在训练集𝑛n个样本上的损失均值(也等价于求和)
在训练模型时,我们希望寻找一组参数,这组参数能最小化在所有训练样本上的总损失
线性回归刚好是一个很简单的优化问题。与我们将在本书中所讲到的其他大部分模型不同,线性回归的解可以用一个公式简单地表达出来,这类解叫作解析解。首先,我们将偏置𝑏b合并到参数𝐰中。合并方法是在包含所有参数的矩阵中附加一列。我们的预测问题是最小化‖𝐲−𝐗𝐰‖2‖y−Xw‖2。这在损失平面上只有一个临界点,这个临界点对应于整个区域的损失最小值。将损失关于𝐰的导数设为0,得到解析解
像线性回归这样的简单问题存在解析解,但并不是所有的问题都存在解析解。解析解可以进行很好的数学分析,但解析解的限制很严格,导致它无法应用在深度学习里批量随机梯度下降
小批量随机梯度下降
梯度下降的方法,这种方法几乎可以优化所有深度学习模型。它通过不断地在损失函数递减的方向上更新参数来降低误差
梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(在这里也可以称为梯度)。但实际中的执行可能会非常慢:因为在每一次更新参数之前,我们必须遍历整个数据集。因此,我们通常会在每次需要计算更新的时候随机抽取一小批样本,这种变体叫做小批量随机梯度下降
算法的步骤如下:(1)初始化模型参数的值,如随机初始化;(2)从数据集中随机抽取小批量样本且在负梯度的方向上更新参数,并不断迭代这一步骤。对于平方损失和仿射变换,我们可以明确地写成如下形式:
这里的𝐰和𝐱都是向量。 |B|表示每个小批量中的样本数,这也称为批量大小(batch size)。η表示学习率(learning rate)。批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。这些可以调整但不在训练过程中更新的参数称为超参数。 调参是选择超参数的过程。超参数通常是我们根据训练迭代结果来调整的,而训练迭代结果是在独立的验证数据集上评估得到的。
在训练了预先确定的若干迭代次数后(或者直到满足某些其他停止条件后),我们记录下模型参数的估计值,表示为𝐰̂ ,𝑏̂ w^,b^。但是,即使我们的函数确实是线性的且无噪声,这些估计值也不会使损失函数真正地达到最小值。因为算法会使得损失向最小值缓慢收敛,但却不能在有限的步数内非常精确地达到最小值。
线性回归恰好是一个在整个域中只有一个最小值的学习问题。但是对于像深度神经网络这样复杂的模型来说,损失平面上通常包含多个最小值。幸运的是,出于某种原因,深度学习实践者很少会去花费大力气寻找这样一组参数,使得在训练集上的损失达到最小。事实上,更难做到的是找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失,这一挑战被称为泛化
用学习到的模型进行预测
矢量化加速
在训练我们的模型时,我们经常希望能够同时处理整个小批量的样本。为了实现这一点,需要(我们对计算进行矢量化,从而利用线性代数库,而不是在Python中编写开销高昂的for循环)
正态分布与平方损失
正态分布,也称为高斯分布,正态分布和线性回归之间的关系很密切。 简单的说,若随机变量𝑥具有均值𝜇和方差𝜎2(标准差𝜎),其正态分布概率密度函数如下
定义一个Python函数来计算正态分布:
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)
之后进行可视化正态分布:
# 再次使用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], xlabel='x',
ylabel='p(x)', figsize=(4.5, 2.5),
legend=[f'mean {mu}, std {sigma}' for mu, sigma in params])
就像我们所看到的,改变均值会产生沿𝑥x轴的偏移,增加方差将会分散分布、降低其峰值
均方误差损失函数(简称均方损失)可以用于线性回归的一个原因是:我们假设了观测中包含噪声,其中噪声服从正态分布。噪声正态分布如下式:
现在可以写出通过给定的𝐱x观测到特定𝑦y的可能性
根据最大似然估计法,参数𝐰w和𝑏b的最优值是使整个数据集的可能性最大的值
根据最大似然估计法选择的估计量称为最大似然估计量。 虽然使许多指数函数的乘积最大化看起来很困难,但是我们可以在不改变目标的前提下,通过最大化似然对数来简化。 由于历史原因,优化通常是说最小化而不是最大化。我们可以改为最小化负对数似然−log𝑃(𝐲∣𝐗)−logP(y∣X)。由此可以得到的数学公式是
现在我们只需要假设σ是某个固定常数就可以忽略第一项,因为第一项不依赖于𝐰和𝑏。现在第二项除了常数1/𝜎2外,其余部分和前面介绍的平方误差损失是一样的。 幸运的是,上面式子的解并不依赖于𝜎。因此,在高斯噪声的假设下,最小化均方误差等价于对线性模型的最大似然估计