回归是指一组用于对一个或多个自变量与因变量之间的关系进行建模的方法。在自然科学和社会科学中,回归的目的通常是描述输入和输出之间的关系。另一方面,机器学习最常与预测有关。

每当我们想要预测一个数值时,就会出现回归问题。常见的例子包括预测价格(房屋、股票等)、预测住院时间(针对住院患者)、需求预测(针对零售)等等。并非每个预测问题都是经典的回归问题。在随后的部分中,我们将介绍分类问题,其目标是预测一组类别的成员资格。

3.1.1 线性回归的基本要素

线性回归可能是回归的标准工具中最简单和最流行的。追溯到 19 世纪初,线性回归源于一些简单的假设。首先,我们假设自变量之间的关系 和因变量是线性的,即可以表示为元素的加权和 , 给定观察结果的一些噪音。其次,我们假设任何噪声都表现良好(遵循高斯分布)。

为了激发这种方法,让我们从一个运行示例开始。假设我们希望根据房屋面积(平方英尺)和年龄(年)来估算房屋价格(美元)。要实际开发一个预测房价的模型,我们需要掌握一个由销售组成的数据集,我们知道每个房屋的销售价格、面积和年龄。在机器学习的术语中,数据集称为训练数据集或训练集,每一行(这里是与一次销售对应的数据)称为一个示例(或数据点、 数据实例、样本)。我们试图预测的东西(价格)称为标签(或目标)。预测所依据的自变量(年龄和面积)称为特征(或 协变量)。

空间自回归模型与潜变量_空间自回归模型与潜变量

3.1.1.1 线性模型

线性假设只是说目标(价格)可以表示为特征(面积和年龄)的加权和:

空间自回归模型与潜变量_pytorch_02


给定一个数据集,我们的目标是选择权重w 和偏见b这样平均而言,根据我们的模型做出的预测最符合数据中观察到的真实价格。输出预测由输入特征的仿射变换确定的模型是线性模型,其中仿射变换由选择的权重和偏差指定。

空间自回归模型与潜变量_数据集_03


在求和期间应用广播(参见第 2.1.3 节)。给定训练数据集的特征X 和相应的(已知)标签y,线性回归的目标是找到权向量w 和偏置b项给定从相同分布中采样的新数据示例的特征X ,新示例的标签将(在预期中)以最低的误差被预测。

空间自回归模型与潜变量_pytorch_04


在我们开始搜索最佳参数(或模型参数)之前w和b,我们还需要两件事:

  • (i)某个给定模型的质量度量;
  • (ii) 更新模型以提高其质量的程序。

3.1.1.2。损失函数

空间自回归模型与潜变量_线性回归_05


常数1/2没有真正的区别,但会证明在符号上很方便,当我们取损失的导数时会抵消。由于训练数据集是给我们的,因此我们无法控制,经验误差只是模型参数的函数。为了使事情更具体,考虑下面的例子,我们为一维情况绘制一个回归问题, 如图 3.1.1 所示。

空间自回归模型与潜变量_线性回归_06


图 3.1.1用线性模型拟合数据。

空间自回归模型与潜变量_数据集_07

3.1.1.3。解析解

空间自回归模型与潜变量_pytorch_08


虽然像线性回归这样的简单问题可能会接受分析解决方案,但您不应该习惯这种好运。尽管解析解决方案允许进行很好的数学分析,但对解析解决方案的要求非常严格,以至于它会排除所有深度学习。

3.1.1.4。小批量随机梯度下降

即使在我们无法解析模型的情况下,事实证明我们仍然可以在实践中有效地训练模型。此外,对于许多任务,那些难以优化的模型结果要好得多,以至于弄清楚如何训练它们最终是值得的。

优化几乎所有深度学习模型的关键技术,我们将在本书中使用,包括通过在逐渐降低损失函数的方向上更新参数来迭代地减少错误。这种算法称为 梯度下降。

梯度下降最简单的应用包括获取损失函数的导数,这是对数据集中每个示例计算的损失的平均值。实际上,这可能非常慢:我们必须在进行单次更新之前遍历整个数据集。因此,我们通常会在每次需要计算更新时对样本的随机小批量进行抽样,这种变体称为小批量随机梯度下降。

空间自回归模型与潜变量_pytorch_09


空间自回归模型与潜变量_空间自回归模型与潜变量_10


线性回归恰好是一个学习问题,在整个域中只有一个最小值。然而,对于更复杂的模型,如深度网络,损失表面包含许多最小值。幸运的是,由于尚未完全理解的原因,深度学习从业者很少努力寻找能够最大限度地减少训练集损失的参数。更艰巨的任务是找到将在我们以前从未见过的数据上实现低损失的参数,这是一项称为泛化的挑战。我们将在整本书中回到这些主题。

3.1.1.5。使用学习模型进行预测

空间自回归模型与潜变量_线性回归_11

3.1.2 矩阵加速计算

在训练我们的模型时,我们通常希望同时处理整个小批量示例。要有效地做到这一点,我们需要对计算进行矢量化并利用快速线性代数库,而不是在 Python 中编写昂贵的 for 循环。

%matplotlib inline
import math
import time
import numpy as np
import torch
from d2l import torch as d2l

为了说明为什么这很重要,我们可以考虑两种添加向量的方法。首先,我们实例化两个包含全为 1 的 10000 维向量。在一种方法中,我们将使用 Python for 循环遍历向量。在另一种方法中,我们将依赖于对 +.

n = 10000
a = torch.ones(n)
b = torch.ones(n)

由于我们将在本书中经常对运行时间进行基准测试,因此让我们定义一个计时器。

class Timer:  #@save
    """Record multiple running times."""
    def __init__(self):
        self.times = []
        self.start()

    def start(self):
        """Start the timer."""
        self.tik = time.time()

    def stop(self):
        """Stop the timer and record the time in a list."""
        self.times.append(time.time() - self.tik)
        return self.times[-1]

    def avg(self):
        """Return the average time."""
        return sum(self.times) / len(self.times)

    def sum(self):
        """Return the sum of time."""
        return sum(self.times)

    def cumsum(self):
        """Return the accumulated time."""
        return np.array(self.times).cumsum().tolist()

现在我们可以对工作负载进行基准测试。首先,我们使用 for 循环一次添加一个坐标。

c = torch.zeros(n)
timer = Timer()
for i in range(n):
    c[i] = a[i] + b[i]
f'{timer.stop():.5f} sec'
'0.09488 sec'

或者,我们依靠重新加载的+运算符来计算元素总和。

timer.start()
d = a + b
f'{timer.stop():.5f} sec'
'0.00021 sec'

您可能注意到第二种方法比第一种方法快得多。矢量化代码通常会产生数量级的加速。此外,我们将更多的数学推到库中,不需要自己编写那么多的计算,从而减少了出错的可能性。

3.1.3. 正态分布和平方损失

虽然您已经可以仅使用上述信息来动手,但在下文中,我们可以通过关于噪声分布的假设更正式地激发平方损失目标。

空间自回归模型与潜变量_神经网络_12


下面我们定义一个 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)

我们现在可以可视化正态分布。

# Use numpy again for visualization
x = np.arange(-7, 7, 0.01)

# Mean and standard deviation pairs
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])

空间自回归模型与潜变量_神经网络_13


如我们所见,改变均值对应于沿x 轴,增加方差会分散分布,降低其峰值。使用均方误差损失函数(或简单的平方损失)激发线性回归的一种方法是正式假设观察来自噪声观察,其中噪声正态分布如下:

空间自回归模型与潜变量_空间自回归模型与潜变量_14


空间自回归模型与潜变量_线性回归_15

3.1.4 从线性回归到深度网络

到目前为止,我们只讨论了线性模型。虽然神经网络涵盖了更丰富的模型家族,但我们可以开始将线性模型视为一种神经网络,方法是用神经网络的语言来表达它。首先,让我们从用“层”符号重写事物开始。

3.1.4.1 神经网络图

深度学习从业者喜欢绘制图表来可视化他们模型中发生的事情。在图 3.1.2中,我们将线性回归模型描述为神经网络。请注意,这些图突出显示了连接模式,例如每个输入如何连接到输出,而不是权重或偏差所取的值。

空间自回归模型与潜变量_pytorch_16


3.1.2线性回归是一个单层神经网络

空间自回归模型与潜变量_线性回归_17

3.1.4.2 生物神经元

由于线性回归(1795 年发明)早于计算神经科学,将线性回归描述为神经网络似乎不合时宜。当控制论者/神经生理学家 Warren McCulloch 和 Walter Pitts 开始开发人工神经元模型时,要了解为什么线性模型是一个自然的起点,请考虑图 3.1.3中生物神经元的卡通图片,由树突(输入终端)、细胞核(CPU)、 轴突(输出线)和轴突终端(输出终端),通过突触连接到其他神经元。

空间自回归模型与潜变量_空间自回归模型与潜变量_18


图 3.1.3真正的神经元。

空间自回归模型与潜变量_线性回归_19


当然,许多这样的单元可以与正确的连通性和正确的学习算法拼凑在一起,产生比任何一个神经元单独表达的更有趣和更复杂的行为的高级想法,这归功于我们对真实生物神经系统的研究。

与此同时,当今深度学习的大多数研究几乎没有直接从神经科学中汲取灵感。我们引用了 Stuart Russell 和 Peter Norvig,他们在其经典的 AI 教科书《人工智能:一种现代方法》 [Russell & Norvig,2016]中指出,尽管飞机可能受到鸟类的启发,但鸟类学并不是航空学的主要驱动力几个世纪以来的创新。同样,如今深度学习的灵感来自数学、统计学和计算机科学。

3.1.5 总结

  • 机器学习模型中的关键成分是训练数据、损失函数、优化算法,很明显,模型本身。
  • 矢量化使一切变得更好(主要是数学)和更快(主要是代码)。
  • 最小化目标函数和执行最大似然估计可能意味着同样的事情。
  • 线性回归模型也是神经网络。

3.1.6 练习

空间自回归模型与潜变量_数据集_20