文章目录

  • 前言
  • 1 线性回归的基本要素
    • 1.1 模型定义
    • 1.2 模型训练
      • (1) 训练数据
      • (2) 损失函数
      • (3) 优化算法
    • 1.3 模型预测
  • 2 线性回归的表示方法
    • 2.1 神经网络图
    • 2.2 矢量计算表达式
  • 小结

前言

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

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

1 线性回归的基本要素

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

1.1 模型定义

设房屋的面积为 x1x_1x1​,房龄为 x2x_2x2​,售出价格为 yyy。我们需要建立基于输入 x1x_1x1​ 和 x2x_2x2​ 来计算输出 yyy 的表达式,也就是模型(model)。顾名思义,线性回归假设输出与各个输入之间是线性关系:
y^=x1w1+x2w2+b\hat{y} = x_1 w_1 + x_2 w_2 + b y^​=x1​w1​+x2​w2​+b
其中 w1w_1w1​ 和 w2w_2w2​ 是权重(weight),bbb 是偏差(bias),且均为标量。它们是线性回归模型的参数(parameter)。模型输出 y^\hat{y}y^​ 是线性回归对真实价格 yyy 的预测或估计。我们通常允许它们之间有一定误差。

1.2 模型训练

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

(1) 训练数据

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

假设我们采集的样本数为 nnn,索引为 iii 的样本的特征为 x1(i)x_1^{(i)}x1(i)​ 和 x2(i)x_2^{(i)}x2(i)​,标签为 y(i)y^{(i)}y(i)。对于索引为 iii 的房屋,线性回归模型的房屋价格预测表达式为
y^(i)=x1(i)w1+x2(i)w2+b\hat{y}^{(i)} = x_1^{(i)} w_1 + x_2^{(i)} w_2 + b y^​(i)=x1(i)​w1​+x2(i)​w2​+b

(2) 损失函数

在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。它在评估索引为 iii 的样本误差的表达式为

ℓ(i)(w1,w2,b)=12(y^(i)−y(i))2\ell^{(i)}(w_1, w_2, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2ℓ(i)(w1​,w2​,b)=21​(y^​(i)−y(i))2

其中常数 12\frac 1 221​ 使对平方项求导后的常数系数为1,这样在形式上稍微简单一些。显然,误差越小表示预测价格与真实价格越相近,且当二者相等时误差为0。给定训练数据集,这个误差只与模型参数相关,因此我们将它记为以模型参数为参数的函数。在机器学习里,将衡量误差的函数称为损失函数(loss function)。这里使用的平方误差函数也称为平方损失(square loss)。

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

ℓ(w1,w2,b)=1n∑i=1nℓ(i)(w1,w2,b)=1n∑i=1n12(x1(i)w1+x2(i)w2+b−y(i))2\ell(w_1, w_2, b) =\frac{1}{n} \sum_{i=1}^n \ell^{(i)}(w_1, w_2, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right)^2 ℓ(w1​,w2​,b)=n1​i=1∑n​ℓ(i)(w1​,w2​,b)=n1​i=1∑n​21​(x1(i)​w1​+x2(i)​w2​+b−y(i))2

在模型训练中,我们希望找出一组模型参数,记为 w1∗,w2∗,b∗w_1^*, w_2^*, b^*w1∗​,w2∗​,b∗,来使训练样本平均损失最小:

w1∗,w2∗,b∗=arg⁡min⁡w1,w2,bℓ(w1,w2,b)w_1^*, w_2^*, b^* = \underset{w_1, w_2, b}{\arg\min} \ell(w_1, w_2, b) w1∗​,w2∗​,b∗=w1​,w2​,bargmin​ℓ(w1​,w2​,b)

(3) 优化算法

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

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

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

w1←w1−η∣B∣∑i∈B∂ℓ(i)(w1,w2,b)∂w1=w1−η∣B∣∑i∈Bx1(i)(x1(i)w1+x2(i)w2+b−y(i)),w2←w2−η∣B∣∑i∈B∂ℓ(i)(w1,w2,b)∂w2=w2−η∣B∣∑i∈Bx2(i)(x1(i)w1+x2(i)w2+b−y(i)),b←b−η∣B∣∑i∈B∂ℓ(i)(w1,w2,b)∂b=b−η∣B∣∑i∈B(x1(i)w1+x2(i)w2+b−y(i)).\begin{aligned} w_1 &\leftarrow w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_1} = w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_1^{(i)} \left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right),\\ w_2 &\leftarrow w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_2} = w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_2^{(i)} \left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right),\\ b &\leftarrow b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial b} = b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}\left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right). \end{aligned} w1​w2​b​←w1​−∣B∣η​i∈B∑​∂w1​∂ℓ(i)(w1​,w2​,b)​=w1​−∣B∣η​i∈B∑​x1(i)​(x1(i)​w1​+x2(i)​w2​+b−y(i)),←w2​−∣B∣η​i∈B∑​∂w2​∂ℓ(i)(w1​,w2​,b)​=w2​−∣B∣η​i∈B∑​x2(i)​(x1(i)​w1​+x2(i)​w2​+b−y(i)),←b−∣B∣η​i∈B∑​∂b∂ℓ(i)(w1​,w2​,b)​=b−∣B∣η​i∈B∑​(x1(i)​w1​+x2(i)​w2​+b−y(i)).​

在上式中,∣B∣|\mathcal{B}|∣B∣ 代表每个小批量中的样本个数(批量大小,batch size),η\etaη 称作学习率(learning rate)并取正数。需要强调的是,这里的批量大小和学习率的值是人为设定的,并不是通过模型训练学出的,因此叫作超参数(hyperparameter)。我们通常所说的“调参”指的正是调节超参数,例如通过反复试错来找到超参数合适的值。在少数情况下,超参数也可以通过模型训练学出。本书对此类情况不做讨论。

1.3 模型预测

模型训练完成后,我们将模型参数 w1,w2,bw_1, w_2, bw1​,w2​,b 在优化算法停止时的值分别记作 w^1,w^2,b^\hat{w}_1, \hat{w}_2, \hat{b}w^1​,w^2​,b^。注意,这里我们得到的并不一定是最小化损失函数的最优解 w1∗,w2∗,b∗w_1^*, w_2^*, b^*w1∗​,w2∗​,b∗,而是对最优解的一个近似。然后,我们就可以使用学出的线性回归模型 x1w^1+x2w^2+b^x_1 \hat{w}_1 + x_2 \hat{w}_2 + \hat{b}x1​w^1​+x2​w^2​+b^ 来估算训练数据集以外任意一栋面积(平方米)为x1x_1x1​、房龄(年)为x2x_2x2​的房屋的价格了。这里的估算也叫作模型预测、模型推断或模型测试。

2 线性回归的表示方法

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

2.1 神经网络图

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

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

在图3.1所示的神经网络中,输入分别为 x1x_1x1​ 和 x2x_2x2​,因此输入层的输入个数为2。输入个数也叫特征数或特征向量维度。图3.1中网络的输出为 ooo,输出层的输出个数为1。需要注意的是,我们直接将图3.1中神经网络的输出 ooo 作为线性回归的输出,即 y^=o\hat{y} = oy^​=o。由于输入层并不涉及计算,按照惯例,图3.1所示的神经网络的层数为1。所以,线性回归是一个单层神经网络。输出层中负责计算 ooo 的单元又叫神经元。在线性回归中,ooo 的计算依赖于 x1x_1x1​ 和 x2x_2x2​。也就是说,输出层中的神经元和输入层中各个输入完全连接。因此,这里的输出层又叫全连接层(fully-connected layer)或稠密层(dense layer)。

2.2 矢量计算表达式

在模型训练或预测时,我们常常会同时处理多个数据样本并用到矢量计算。在介绍线性回归的矢量计算表达式之前,让我们先考虑对两个向量相加的两种方法。a

下面先定义两个1000维的向量。

import torch
from time import timea = 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)逐一预测价格,将得到
y^(1)=x1(1)w1+x2(1)w2+b,y^(2)=x1(2)w1+x2(2)w2+b,y^(3)=x1(3)w1+x2(3)w2+b.\begin{aligned} \hat{y}^{(1)} &= x_1^{(1)} w_1 + x_2^{(1)} w_2 + b,\\ \hat{y}^{(2)} &= x_1^{(2)} w_1 + x_2^{(2)} w_2 + b,\\ \hat{y}^{(3)} &= x_1^{(3)} w_1 + x_2^{(3)} w_2 + b. \end{aligned} y^​(1)y^​(2)y^​(3)​=x1(1)​w1​+x2(1)​w2​+b,=x1(2)​w1​+x2(2)​w2​+b,=x1(3)​w1​+x2(3)​w2​+b.​

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

y^=[y^(1)y^(2)y^(3)],X=[x1(1)x2(1)x1(2)x2(2)x1(3)x2(3)],w=[w1w2]\boldsymbol{\hat{y}} = \begin{bmatrix} \hat{y}^{(1)} \\ \hat{y}^{(2)} \\ \hat{y}^{(3)} \end{bmatrix},\quad \boldsymbol{X} = \begin{bmatrix} x_1^{(1)} & x_2^{(1)} \\ x_1^{(2)} & x_2^{(2)} \\ x_1^{(3)} & x_2^{(3)} \end{bmatrix},\quad \boldsymbol{w} = \begin{bmatrix} w_1 \\ w_2 \end{bmatrix} y^​=⎣⎡​y^​(1)y^​(2)y^​(3)​⎦⎤​,X=⎣⎢⎡​x1(1)​x1(2)​x1(3)​​x2(1)​x2(2)​x2(3)​​⎦⎥⎤​,w=[w1​w2​​]

对3个房屋样本预测价格的矢量计算表达式为y^=Xw+b,\boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b,y^​=Xw+b, 其中的加法运算使用了广播机制(参见2.2节)。例如:

a = torch.ones(3)
b = 10
print(a + b)

输出:

tensor([11., 11., 11.])

广义上讲,当数据样本数为 nnn,特征数为 ddd 时,线性回归的矢量计算表达式为
y^=Xw+b\boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b y^​=Xw+b
其中模型输出 y^∈Rn×1\boldsymbol{\hat{y}} \in \mathbb{R}^{n \times 1}y^​∈Rn×1 批量数据样本特征 X∈Rn×d\boldsymbol{X} \in \mathbb{R}^{n \times d}X∈Rn×d,权重 w∈Rd×1\boldsymbol{w} \in \mathbb{R}^{d \times 1}w∈Rd×1, 偏差 b∈Rb \in \mathbb{R}b∈R。相应地,批量数据样本标签 y∈Rn×1\boldsymbol{y} \in \mathbb{R}^{n \times 1}y∈Rn×1。设模型参数 θ=[w1,w2,b]⊤\boldsymbol{\theta} = [w_1, w_2, b]^\topθ=[w1​,w2​,b]⊤,我们可以重写损失函数为
ℓ(θ)=12n(y^−y)⊤(y^−y)\ell(\boldsymbol{\theta})=\frac{1}{2n}(\boldsymbol{\hat{y}}-\boldsymbol{y})^\top(\boldsymbol{\hat{y}}-\boldsymbol{y}) ℓ(θ)=2n1​(y^​−y)⊤(y^​−y)

小批量随机梯度下降的迭代步骤将相应地改写为
θ←θ−η∣B∣∑i∈B∇θℓ(i)(θ),\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta}), θ←θ−∣B∣η​i∈B∑​∇θ​ℓ(i)(θ),

其中梯度是损失有关3个为标量的模型参数的偏导数组成的向量:
∇θℓ(i)(θ)=[∂ℓ(i)(w1,w2,b)∂w1∂ℓ(i)(w1,w2,b)∂w2∂ℓ(i)(w1,w2,b)∂b]=[x1(i)(x1(i)w1+x2(i)w2+b−y(i))x2(i)(x1(i)w1+x2(i)w2+b−y(i))x1(i)w1+x2(i)w2+b−y(i)]=[x1(i)x2(i)1](y^(i)−y(i))\nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta})= \begin{bmatrix} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_1} \\ \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_2} \\ \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial b} \end{bmatrix} = \begin{bmatrix} x_1^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) \\ x_2^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) \\ x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)} \end{bmatrix}= \begin{bmatrix} x_1^{(i)} \\ x_2^{(i)} \\ 1 \end{bmatrix} (\hat{y}^{(i)} - y^{(i)}) ∇θ​ℓ(i)(θ)=⎣⎢⎢⎡​∂w1​∂ℓ(i)(w1​,w2​,b)​∂w2​∂ℓ(i)(w1​,w2​,b)​∂b∂ℓ(i)(w1​,w2​,b)​​⎦⎥⎥⎤​=⎣⎢⎡​x1(i)​(x1(i)​w1​+x2(i)​w2​+b−y(i))x2(i)​(x1(i)​w1​+x2(i)​w2​+b−y(i))x1(i)​w1​+x2(i)​w2​+b−y(i)​⎦⎥⎤​=⎣⎢⎡​x1(i)​x2(i)​1​⎦⎥⎤​(y^​(i)−y(i))

小结

  • 和大多数深度学习模型一样,对于线性回归这样一种单层神经网络,它的基本要素包括模型、训练数据、损失函数和优化算法。
  • 既可以用神经网络图表示线性回归,又可以用矢量计算表示该模型。
  • 应该尽可能采用矢量计算,以提升计算效率。

pytorch学习笔记(三):线性回归相关推荐

  1. 【Pytorch学习笔记三】Pytorch神经网络包nn和优化器optm(一个简单的卷积神经网络模型的搭建)

    文章目录 一, 神经网络包nn 1.1定义一个网络 1.2 损失函数 二.优化器 nn构建于 Autograd之上,可用来定义和运行神经网络, PyTorch Autograd 让我们定义计算图和计算 ...

  2. 学习笔记(三) 线性回归算法(Linear Regression)

    一.算法简介 代码下载:https://download.csdn.net/download/xdg2008/14017829 1.1 什么是回归分析 回归分析是一种预测性的建模技术,它研究的是因变量 ...

  3. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

  4. PyTorch学习笔记(三):PyTorch主要组成模块

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  5. 【从线性回归到 卷积神经网络CNN 循环神经网络RNN Pytorch 学习笔记 目录整合 源码解读 B站刘二大人 绪论(0/10)】

    深度学习 Pytorch 学习笔记 目录整合 数学推导与源码详解 B站刘二大人 目录传送门: 线性模型 Linear-Model 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人( ...

  6. 深度学习入门之PyTorch学习笔记:卷积神经网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 4.1 主要任务及起源 4.2 卷积神经网络的原理和结构 4.2.1 卷积层 1. ...

  7. 深度学习入门之PyTorch学习笔记:深度学习介绍

    深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...

  8. PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard

    文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...

  9. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  10. 深度学习入门之PyTorch学习笔记:多层全连接网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 3.1 PyTorch基础 3.2 线性模型 3.2.1 问题介绍 3.2.2 一维线性回归 3.2 ...

最新文章

  1. html:text中readonly,HTML Input Text readOnly用法及代码示例
  2. VTK:InfoVis之DelimitedTextReader
  3. 360怎么看电脑配置_电脑速度慢怎么办?教你电脑速度慢的原因与解决方法
  4. 图谱实战 | 医学知识图谱的价值与应用场景
  5. 4-4:TCP协议之TCP头部格式详解
  6. CentOS6.8下实现配置配额
  7. 在存储过程中动态创建临时表
  8. 如何自学软件编程?零基础自学编程入门指南
  9. opencv convertTo函数详解
  10. 一阶系统开环传递函数表达式_自动控制总结:第二章、控制系统的数学模型
  11. 如何把字符串复制给数组杭电11页几小题的总结
  12. MVDR最小方差无畸形相应波束形成器 Python 实现
  13. jQuery菜鸟学习实例
  14. 水下SLAM论文!!!
  15. IBM X 3650 M3服务器RAID0设置
  16. 发放盛大网盘Everbox公测邀请码
  17. 巧借“中国制造2025”东风占领“智”高点
  18. 试验设计——计算机试验·超拉丁方抽样
  19. 新股民零基础入市必读
  20. matlab 四叶草,Matlab入门教程 第七章 Simulink 基础

热门文章

  1. 【VS开发】图像颜色
  2. 在Windows Server 2012 R2的Hyper-V中设置虚拟机启用增强会话模式
  3. 博客园jquery专题
  4. python--字符串为空
  5. Sublime+ZenCoding的使用
  6. java查询数据库数据放到Excel下载
  7. windwos开机自启动脚本
  8. J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》
  9. GDKOI2018游记
  10. PYSQLITE用法初探