3.1.2 linear regression

xiaoyao 《动手学深度学习》tensorflow2.1.0实现

3.1 线性回归

线性回归输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。

由于线性回归和softmax回归都是单层神经网络,它们涉及的概念和技术同样适用于大多数的深度学习模型。我们首先以线性回归为例,介绍大多数深度学习模型的基本要素和表示方法。

3.1.1 线性回归的基本要素

我们以一个简单的房屋价格预测作为例子来解释线性回归的基本要素。这个应用的目标是预测一栋房子的售出价格(元)。我们知道这个价格取决于很多因素,如房屋状况、地段、市场行情等。为了简单起见,这里我们假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。接下来我们希望探索价格与这两个因素的具体关系。

3.1.1.1 模型定义

设房屋的面积为 unet网络做回归预测的原理_python,房龄为 unet网络做回归预测的原理_神经网络_02,售出价格为 unet网络做回归预测的原理_算法_03。我们需要建立基于输入 unet网络做回归预测的原理_pythonunet网络做回归预测的原理_神经网络_02 来计算输出 unet网络做回归预测的原理_算法_03 的表达式,也就是模型(model)。顾名思义,线性回归假设输出与各个输入之间是线性关系:
unet网络做回归预测的原理_深度学习_07
其中 unet网络做回归预测的原理_unet网络做回归预测的原理_08unet网络做回归预测的原理_深度学习_09 是权重(weight),unet网络做回归预测的原理_unet网络做回归预测的原理_10 是偏差(bias),且均为标量。它们是线性回归模型的参数(parameter)。模型输出 unet网络做回归预测的原理_深度学习_11 是线性回归对真实价格 unet网络做回归预测的原理_算法_03

3.1.1.2 模型训练

接下来我们需要通过数据来寻找特定的模型参数值,使模型在数据上的误差尽可能小。这个过程叫作模型训练(model training)。下面我们介绍模型训练所涉及的3个要素。

(1) 训练数据

我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。

假设我们采集的样本数为 unet网络做回归预测的原理_unet网络做回归预测的原理_13,索引为 unet网络做回归预测的原理_算法_14 的样本的特征为 unet网络做回归预测的原理_算法_15unet网络做回归预测的原理_神经网络_16,标签为 unet网络做回归预测的原理_python_17。对于索引为 unet网络做回归预测的原理_算法_14 的房屋,线性回归模型的房屋价格预测表达式为
unet网络做回归预测的原理_算法_19

(2) 损失函数

在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。它在评估索引为 unet网络做回归预测的原理_算法_14 的样本误差的表达式为
unet网络做回归预测的原理_unet网络做回归预测的原理_21

其中常数 unet网络做回归预测的原理_深度学习_22

通常,我们用训练数据集中所有样本误差的平均来衡量模型预测的质量,即

unet网络做回归预测的原理_python_23

在模型训练中,我们希望找出一组模型参数,记为 unet网络做回归预测的原理_算法_24,来使训练样本平均损失最小:

unet网络做回归预测的原理_unet网络做回归预测的原理_25

(3) 优化算法

当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)unet网络做回归预测的原理_深度学习_26,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。

在训练本节讨论的线性回归模型的过程中,模型的每个参数将作如下迭代:

unet网络做回归预测的原理_神经网络_27

在上式中,unet网络做回归预测的原理_深度学习_28 代表每个小批量中的样本个数(批量大小,batch size),unet网络做回归预测的原理_算法_29

3.1.1.3 模型预测

模型训练完成后,我们将模型参数 unet网络做回归预测的原理_unet网络做回归预测的原理_30 在优化算法停止时的值分别记作 unet网络做回归预测的原理_深度学习_31。注意,这里我们得到的并不一定是最小化损失函数的最优解 unet网络做回归预测的原理_算法_24,而是对最优解的一个近似。然后,我们就可以使用学出的线性回归模型 unet网络做回归预测的原理_算法_33 来估算训练数据集以外任意一栋面积(平方米)为unet网络做回归预测的原理_python、房龄(年)为unet网络做回归预测的原理_神经网络_02的房屋的价格了。这里的估算也叫作模型预测、模型推断或模型测试。

3.1.2 线性回归的表示方法

我们已经阐述了线性回归的模型表达式、训练和预测。下面我们解释线性回归与神经网络的联系,以及线性回归的矢量计算表达式。

3.1.2.1 神经网络图

在深度学习中,我们可以使用神经网络图直观地表现模型结构。为了更清晰地展示线性回归作为神经网络的结构,图3.1使用神经网络图表示本节中介绍的线性回归模型。神经网络图隐去了模型参数权重和偏差。

unet网络做回归预测的原理_python_36

在图3.1所示的神经网络中,输入分别为 unet网络做回归预测的原理_pythonunet网络做回归预测的原理_神经网络_02,因此输入层的输入个数为2。输入个数也叫特征数或特征向量维度。图3.1中网络的输出为 unet网络做回归预测的原理_算法_39,输出层的输出个数为1。需要注意的是,我们直接将图3.1中神经网络的输出 unet网络做回归预测的原理_算法_39 作为线性回归的输出,即 unet网络做回归预测的原理_算法_41。由于输入层并不涉及计算,按照惯例,图3.1所示的神经网络的层数为1。所以,线性回归是一个单层神经网络。输出层中负责计算 unet网络做回归预测的原理_算法_39 的单元又叫神经元。在线性回归中,unet网络做回归预测的原理_算法_39 的计算依赖于 unet网络做回归预测的原理_pythonunet网络做回归预测的原理_神经网络_02。也就是说,输出层中的神经元和输入层中各个输入完全连接。因此,这里的输出层又叫全连接层(fully-connected layer)或稠密层(dense layer)。

代码部分

import tensorflow as tf
print(tf.__version__)
2.1.0
from time import time
# 定义两个1000维的向量
a = tf.ones((1000,))
b = tf.ones((1000,))
print(type(a), type(b))
<class 'tensorflow.python.framework.ops.EagerTensor'> <class 'tensorflow.python.framework.ops.EagerTensor'>
# 做向量加法,按照元素逐一做标量加法
start = time()
c = tf.Variable(tf.zeros((1000,)))
for i in range(1000):
    c[i].assign(a[i] + b[i])
time() - start
0.2967078685760498
# 另外一种向量的加法,将两个向量直接做矢量加法
start = time()
c.assign(a + b)
time() - start
0.0009565353393554688
start = time()
c.assign_add(a+b)
time() - start
0.012198925018310547

这里显示出,进行矢量计算将更加省时,所以应该尽可能采用矢量计算

如果我们对训练数据集里的3个房屋样本(索引分别为1、2和3)逐一预测价格,将得到
unet网络做回归预测的原理_python_46

现在,我们将上面3个等式转化成矢量计算。设

unet网络做回归预测的原理_unet网络做回归预测的原理_47

对3个房屋样本预测价格的矢量计算表达式为unet网络做回归预测的原理_python_48

广义上讲,当数据样本数为 unet网络做回归预测的原理_unet网络做回归预测的原理_13,特征数为 unet网络做回归预测的原理_神经网络_50 时,线性回归的矢量计算表达式为
unet网络做回归预测的原理_python_51
其中模型输出 unet网络做回归预测的原理_算法_52 批量数据样本特征 unet网络做回归预测的原理_深度学习_53,权重 unet网络做回归预测的原理_深度学习_54, 偏差 unet网络做回归预测的原理_unet网络做回归预测的原理_55。相应地,批量数据样本标签 unet网络做回归预测的原理_算法_56。设模型参数 unet网络做回归预测的原理_unet网络做回归预测的原理_57,我们可以重写损失函数为
unet网络做回归预测的原理_unet网络做回归预测的原理_58

小批量随机梯度下降的迭代步骤将相应地改写为
unet网络做回归预测的原理_python_59

其中梯度是损失有关3个为标量的模型参数的偏导数组成的向量:
unet网络做回归预测的原理_python_60

小结

  • 和大多数深度学习模型一样,对于线性回归这样一种单层神经网络,它的基本要素包括模型、训练数据、损失函数和优化算法。
  • 既可以用神经网络图表示线性回归,又可以用矢量计算表示该模型。
  • 应该尽可能采用矢量计算,以提升计算效率。
# 这里的计算使用到了广播机制
a = tf.ones((3,))
print(a)
b = 10
a+b
tf.Tensor([1. 1. 1.], shape=(3,), dtype=float32)





<tf.Tensor: shape=(3,), dtype=float32, numpy=array([11., 11., 11.], dtype=float32)>