携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
提出时间1795年,可以看做单层神经网络。对于线性回归,每个输入都与每个输出,这种变换被称为全连接层( fully-connected layer ) 或稠密层( dense layer )
线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和。权重决定了每个特征对我们预测值的影响。b称为偏置( bias )、偏移量(offset ) 或截距( intercept ) 。偏置是指当所有特征都取值为0时,预测值应该为多少。
严格来说,上式是输入特征的一个仿射变换( affine transformation ) 。 仿射变换的特点是通过加权和对特征进行线性变换( linear transformation ) ,并通过偏置项来进行平移( translation ) 。给定一个数据集,我们的目标是寻找模型的权重 和偏置b, 使得根据模型做出的预测大体符合数据里的真实价格。 输出的预测值由输入特征通过线性模型的仿射变换决定,仿射变换由所选权重和偏置确定。
在机器学习领域,我们通常使用的是高维数据集,建模时采用线性代数表示法会比较方便。 当我们的输入包含d个特征时,我们将预测结果 (通常使用“尖角”符号表示的估计值) 表示为:
将所有特征放到向量x∈Rd中, 并将所有权重放到向量w∈Rd中,可以用点积形式来简洁地表达模型:
上式中,向量x对应于单个数据样本的特征。用符号表示的矩阵 可以很方便地引用我们整个数据集的n个样本。其中,X的每一行是一个样本,每一列是一种特征。 对于特征集合X,预测值y^∈Rn 可以通过矩阵-向量乘法表示为:
这个过程中的求和将使用广播机制。给定训练数据特征X和对应的已知标签y,线性回归的目标是找到一组权重向量w和偏置b: 当给定从X的同分布中取样的新样本特征时, 这组权重向量和偏置能够使得新样本预测标签的误差尽可能小。
虽然我们相信给定x预测y的最佳模型会是线性的, 但我们很难找到一个有n个样本的真实数据集,其中对于所有的 ,y(i)完全等于 。 无论我们使用什么手段来观察特征X和标签y,都可能会出现少量的观测误差。因此,即使确信特征与标签的潜在关系是线性的,我们也会加入一个噪声项来考虑观测误差带来的影响。
在开始寻找最好的模型参数( model parameters ) w和b之前, 我们还需要两个东西: (1)一种模型质量的度量方式;(2)一种能够更新模型以提高模型预测质量的方法。
损失函数
损失函数(loss function ) 能够量化目标的实际值与预测值之间的差距。 通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。 回归问题中最常用的损失函数是平方误差函数。
当样本i的预测值为y^(i),其相应的真实标签为y(i)时,平方误差(平方损失)可以定义为:
常数1/2不会带来本质的差别,但这样在形式上稍微简单一些 (因为当我们对损失函数求导后常数系数为1)。 由于训练数据集并不受我们控制,所以经验误差只是关于模型参数的函数。
为了度量模型在整个数据集上的质量,我们需计算在训练集n个样本上的损失均值(也等价于求和)。
在训练模型时,我们希望寻找一组参数( w ∗,b ∗ ) ,这组参数能最小化在所有训练样本上的总损失。如下式:
线性回归的解可以用一个公式简单地表达出来,这类解叫作解析解( analytical solution ) 。首先,我们将偏置b合并到参数w中,合并方法是在包含所有参数的矩阵中附加一列。我们的预测问题是最小化
。 这在损失平面上只有一个临界点,这个临界点对应于整个区域的损失极小点。将损失关于w的导数设为0,得到解析解:
像线性回归这样的简单问题存在解析解,但并不是所有的问题都存在解析解。解析解可以进行很好的数学分析,但解析解对问题的限制很严格,导致它无法广泛应用在深度学习里。
梯度下降
即使在我们无法得到解析解的情况下,我们仍然可以有效地训练模型。在许多任务上,那些难以优化的模型效果要更好。因此,弄清楚如何训练这些难以优化的模型是非常重要的。
一种名为梯度下降( gradient descent ) 的方法几乎可以优化所有深度学习模型。它通过不断地在损失函数递减的方向上更新参数来降低误差。
梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(在这里也可以称为梯度)。但实际中的执行可能会非常慢:因为在每一次更新参数之前,我们必须遍历整个数据集。因此,我们通常会在每次需要计算更新的时候随机抽取一小批样本, 这种变体叫做小批量随机梯度下降( minibatch stochastic gradient descent ) 。
在每次迭代中,我们首先随机抽样一个小批量 ,它是由固定数量的训练样本组成的。然后,我们计算小批量的平均损失关于模型参数的导数(也可以称为梯度)。 最后,我们将梯度乘以一个预先确定的正数 ,并从当前参数的值中减掉。
算法的步骤如下:(1)初始化模型参数的值,如随机初始化;(2)从数据集中随机抽取小批量样本且在负梯度的方向上更新参数,并不断迭代这一步骤。对于平方损失和仿射变换,可以明确地写成如下形式:
式中的w和x都是向量。在这里,更优雅的向量表示法比系数表示法(如 )更具可读性。 |B|表示每个小批量中的样本数,这也称为批量大小( batch size ) 。η表示学习率(learning rate)。批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。这些可以调整但不在训练过程中更新的参数称为超参数( hyperparameter ) 。调参( hyperparameter tuning ) 是选择超参数的过程。超参数通常是我们根据训练迭代结果来调整的,而训练迭代结果是在独立的验证数据集( validation dataset ) 上评估得到的。 在训练了预先确定的若干迭代次数后(或者直到满足某些其他停止条件后), 我们记录下模型参数的估计值。但是,即使我们的函数确实是线性的且无噪声,这些估计值也不会使损失函数真正地达到最小值。因为算法会使得损失向最小值缓慢收敛,但却不能在有限的步数内非常精确地达到最小值。
线性回归恰好是一个在整个域中只有一个最小值的学习问题。但是对于像深度神经网络这样复杂的模型来说,损失平面上通常包含多个极小值。深度学习实践者很少会去花费大力气寻找这样一组参数,使得在训练集上的损失达到最小。事实上,更难做到的是找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失,这一挑战被称为泛化( generalization ) 。 给定特征估计目标的过程通常称为预测( prediction ) 或推断( inference ) 。在统计学中,推断更多地表示基于数据集估计参数。