线性回归
线性回归输出是一个连续值,因此适用于回归问题。与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。
由于线性回归和softmax回归都是单层神经网络,它们涉及的概念和技术同样适用于大多数的深度学习模型。以线性回归为例。
线性回归基本要素
以一个简单的房屋价格预测作为例子来解释线性回归的基本要素。
这个应用的目标是预测一栋房子的售出价格(元)。这个价格取决于很多因素,如房屋状况、地段、市场行情等。为了简单起见,假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。接下来希望探索价格与这两个因素的具体关系。
模型定义
设房屋的面积为,房龄为,售出价格为。我们需要建立基于输入和来计算输出的表达式,也就是模型。线性回归假设输出与各个输入之间是线性关系:
其中和是权重(weight),是偏差(bias),均为标量。它们是线性回归模型的参数。模型输出是线性回归对真实价格的预测或估计。通常允许它们之间有一定的误差。
模型训练
模型训练:通过数据来寻找特定的模型参数值,使模型在数据上的误差尽可能小。
训练数据
通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。
假设采集的样本数为,索引为的样本的特征为和,标签为。对于索引为的房屋,线性回归模型的房屋价格预测表达式为
损失函数
在模型训练中,需要衡量价格预测值与真实值之间的误差。通常会选取一个非负数为误差,且数值越小表示误差越小。一个常用的选择是平方函数。它在评估索引为的样本误差的表达式为
其中使对平方项求导后的系数为1,这样在形式上稍微简单一些。显然,误差越小表示预测价格与真实价格越接近,且当二者相等时误差为0。给定训练数据集,这个误差只与模型参数相关,因此将它记为以模型参数为参数的函数。在机器学习里,将衡量误差的函数称为损失函数(loss function)。这里使用的平方误差函数也称为平方损失(square loss)。
通常,用训练数据集中所有样本误差来衡量模型预测的质量:
在模型训练中,希望找出一组模型参数,记为,,,来使训练样本平均损失最小:
优化算法
当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
在训练线性回归模型的过程中,模型的每个参数将作如下迭代:
在上式中,代表每个小批量中的样本个数(批量大小,batch size),称作学习率(learning rate)并取正数。需要强调的是,这里的批量大小和学习率的值是人为设定的,并不是通过模型训练学出的,因此叫作超参数(hyperparameter)。通常说的“调参”指的是调节超参数,例如通过反复试错来找到超参数合适的值。
模型预测
模型训练完成后,将模型参数,,在优化算法停止时的值分别记作,,。这里得到的并不一定是最小化损失函数的最优解,,,而是对最优解的一个近似。然后,就可以使用线性回归模型来估算训练数据集意外任意一栋面积(平方米)为、房龄(年)为的房屋的价格了。估算也叫做模型预测、模型推断或模型测试。
线性回归表示方法
神经网络图
神经网络图可以直观地表现模型结构。
输入分别为和,因此输入层的输入个数为2.输入个数也叫做特征数或特征向量维度。图中输出向量为,输出层的输出个数为1。注意将图中神经网络的输出作为线性回归的输出,即。由于输入层并不涉及计算,按照惯例,图中神经网络层数为1。所以,线性回归是一个单层神经网络。输出层中负责计算的单元又叫做神经元。在线性回归中,的计算依赖于和。也就是说,输出层中的神经元和输入层中各个输入完全连接。因此,这里的输出曾又叫全连接层(fully-connected layer)或稠密层(dense layer)。
矢量计算表达式
在模型训练或预测时,我们常常会同时处理多个数据样本并用到矢量计算。在介绍线性回归的矢量计算表达式之前,让我们先考虑对两个向量相加的两种方法。
先定义两个1000维的向量
import torch
from time import time
a = torch.ones(1000)
b = torch.ones(1000)
向量相加的一种方法是,将这两个向量按元素逐一做标量加法。
start = time()
c = torch.zeros(1000)
for i in range(1000):
c[i] = a[i] + b[i]
print(time() - start)
输出:
0.02039504051208496
向量相加的另一种方法是,将这两个向量直接做矢量加法。
start = time()
d = a + b
print(time() - start)
输出:
0.0008330345153808594
结果很明显,后者比前者更省时。因此,我们应该尽可能采用矢量计算,以提升计算效率。
回到本节的房价预测问题。如果对训练数据集里的3个房屋样本(索引分别为1、2和3)逐一预测价格,将得到
现在,将上面3个等式转化成矢量计算。设
对3个房屋样本预测价格的矢量计算表达式为,其中的加法运算使用了广播机制。
广义上讲,当数据样本数为 ,特征数为
其中模型输出,批量数据样本特征,权重,偏差。相应地,批量数据样本标签。设模型参数,我们可以重写损失函数为
小批量随机梯度下降的迭代步骤将相应地改写为
其中梯度是损失有关3个为标量的模型参数的偏导数组成的向量: