深度学习入门(一):线性回归模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深度学习⼊门(⼀):线性回归模型
⽂章⽬录
单层神经⽹络⼀
因为⼯作需求需要接触到深度学习知识,导师推荐了⼀本书⽤来⼊门:《动⼿学深度学习(PyTorch版)》
在此处记录⼀下学习内容以及学习总结,⽂章以原作者书籍为基础,插⼊⼀些⾃⼰的总结与⼼得做参考(⾼亮部分),喜欢阅读原⽂的可以访问原⽂链接:
⼊门深度学习先认识⼀个单层神经⽹络-线性回归模型
线性回归模型
线性回归输出是⼀个连续值,因此适⽤于回归问题。

回归问题在实际中很常见,如预测房屋价格、⽓温、销售额等连续值的问题。

与回归问题不同,分类问题中模型的最终输出是⼀个离散值。

我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。

softmax回归则适⽤于分类问题。

由于线性回归和softmax回归都是单层神经⽹络,它们涉及的概念和技术同样适⽤于⼤多数的深度学习模型。

我们⾸先以线性回归为例,介绍⼤多数深度学习模型的基本要素和表⽰⽅法。

线性回归是经典的单层神经⽹络,以此为例⼦进⾏讲解
1. 线性回归的基本要素
我们以⼀个简单的房屋价格预测作为例⼦来解释线性回归的基本要素。

这个应⽤的⽬标是预测⼀栋房⼦的售出价格(元)。

我们知道这个价格取决于很多因素,如房屋状况、地段、市场⾏情等。

为了简单起见,这⾥我们假设价格只取决于房屋状况的两个因素,即⾯积(平⽅⽶)和房龄(年)。

接下来我们希望探索价格与这两个因素的具体关系。

1.1 模型定义
设房屋的⾯积为 x 1 x_1 x1,房龄为 x 2 x_2 x2,售出价格为 y y y。

我们需要建⽴基于输⼊ x 1 x_1 x1和 x 2 x_2 x2来计算输出 y y y 的表达式,也就是模型(model)。

顾名思义,线性回归假设输出与各个输⼊之间是线性关系:
y ^ = x 1 w 1 + x 2 w 2 + b \hat{y} = x_1 w_1 + x_2 w_2 + b y^=x1w1+x2w2+b
其中 w 1 w_1 w1和 w 2 w_2 w2是权重(weight), b b b 是偏差(bias),且均为标量。

它们是线性回归模型的参数(parameter)。

模型输出 y ^ \hat{y} y^是线性回归对真实价格 y y y 的预测或估计。

我们通常允许它们之间有⼀定误差。

模型就是输⼊与输出的估测函数关系,线性回归的模型由他名字可知:线性的函数关系,标红处权重和偏差是很重要的概念,先Mark⼀下!
1.2 模型训练
接下来我们需要通过数据来寻找特定的模型参数值,使模型在数据上的误差尽可能⼩。

这个过程叫作模型训练(model training)。

下⾯我们介绍模型训练所涉及的3个要素。

模型训练就是输⼊数据集以⼀定的⽅式进⾏训练,训练过程中对模型的参数数据进⾏迭代
(1) 训练数据
我们通常收集⼀系列的真实数据,例如多栋房屋的真实售出价格和它们对应的⾯积和房龄。

我们希望在这个数据上⾯寻找模型参数来使模型的预测价格与真实价格的误差最⼩。

在机器学习术语⾥,该数据集被称为训练数据集(training data set)或训练集(training set),⼀栋房屋被称为⼀个样本(sample),其真实售出价格叫作标签(label),⽤来预测标签的两个因素叫作特征(feature)。

特征⽤来表征样本的特点。

假设我们采集的样本数为 n n n,索引为 i i i 的样本的特征为 x 1 ( i ) x_1^{(i)} x1(i)和 x 2 ( i ) x_2^{(i)} x2(i),标签为 y ( i ) y^{(i)} y(i)。

对于索引为 i i i 的房屋,线性回归模型的房屋价格预测表达式为
y ^ ( i ) = x 1 ( i ) w 1 + x 2 ( i ) w 2 + 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) 损失函数
在模型训练中,我们需要衡量价格预测值与真实值之间的误差。

通常我们会选取⼀个⾮负数作为误差,且数值越⼩表⽰误差越⼩。

⼀个常⽤的选择是平⽅函数。

它在评估索引为 i i i 的样本误差的表达式为
ℓ ( i ) ( w 1 , w 2 , b ) = 1 2 ( 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
其中常数 1 2 \frac 1 2 21使对平⽅项求导后的常数系数为1,这样在形式上稍微简单⼀些。

显然,误差越⼩表⽰预测价格与真实价格越相近,且当⼆者相等时误差为0。

给定训练数据集,这个误差只与模型参数相关,因此我们将它记为以模型参数为参数的函数。

在机器学习⾥,将衡量误差的函数称为损失函数(loss function)。

这⾥使⽤的平⽅误差函数也称为平⽅损失(square loss)。

通常,我们⽤训练数据集中所有样本误差的平均来衡量模型预测的质量,即
ℓ ( w 1 , w 2 , b ) = 1 n ∑ i = 1 n ℓ ( i ) ( w 1 , w 2 , b ) = 1 n ∑ i = 1 n 1 2 ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + 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)=n1i=1∑nℓ(i)(w1,w2,b)=n1i=1∑n21(x1(i)w1+x2(i)w2+b−y(i))2
在模型训练中,我们希望找出⼀组模型参数,记为 w 1 ∗ , w 2 ∗ , b ∗ w_1^*, w_2^*, b^* w1∗​,w2∗​,b∗,来使训练样本平均损失最⼩:
w 1 ∗ , w 2 ∗ , b ∗ = arg min w 1 , w 2 , b ℓ ( w 1 , w 2 , 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,barg minℓ(w1,w2,b)
损失函数就是⼀个衡量误差程度的函数,其函数⾃变量就是模型训练过程中得到的输出与训练集正确的输出值,函数因变量则是当前模型的损失
(3) 优化算法
当模型和损失函数形式较为简单时,上⾯的误差最⼩化问题的解可以直接⽤公式表达出来。

这类解叫作解析解(analytical solution)。

本节使⽤的线性回归和平⽅误差刚好属于这个范畴。

然⽽,⼤多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。

这类解叫作数值解(numerical solution)
解析解就是训练误差与模型参数间的关系可以⽤函数表⽰,可以找到误差最⼩化的参数
数值解则⽆法⽤函数表⽰,需要借助优化算法来不断迭代
在求数值解的优化算法中,⼩批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被⼴泛使⽤。

它的算法很简单:先选取⼀组模型参数的初始值,如随机选取;接下来对参数进⾏多次迭代,使每次迭代都可能降低损失函数的值。

在每次迭代中,先随机均匀采样⼀个由固定数⽬训练数据样本所组成的⼩批量(mini-batch) B \mathcal{B} B,然后求⼩批量中数据样本的平均损失有关模型参数的导数(梯度),最后⽤此结果与预先设定的⼀个正数的乘积作为模型参数在本次迭代的减⼩量。

在训练本节讨论的线性回归模型的过程中,模型的每个参数将作如下迭代:
w 1 ← w 1 − η∣ B ∣ ∑ i ∈ B ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ w 1 = w 1 − η∣ B ∣ ∑ i ∈ B x 1 ( i ) ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) , w 2 ← w 2 − η∣ B ∣ ∑ i ∈ B ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ w 2 = w 2 − η∣ B ∣ ∑ i ∈ B x 2 ( i ) ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) , b ← b − η∣ B ∣ ∑ i ∈ B ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ b = b − η∣ B ∣ ∑ i ∈ B ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + 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}
w1w2b←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)=w −∣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 模型预测
模型训练完成后,我们将模型参数 w 1 , w 2 , b w_1, w_2, b w1,w2,b 在优化算法停⽌时的值分别记作 w ^ 1 , w ^ 2 , b ^ \hat{w}_1,
\hat{w}_2, \hat{b} w^1,w^2,b^。

注意,这⾥我们得到的并不⼀定是最⼩化损失函数的最优解 w 1 ∗ , w 2 ∗ , b ∗ w_1^*, w_2^*, b^*
w1∗​,w2∗​,b∗,⽽是对最优解的⼀个近似。

然后,我们就可以使⽤学出的线性回归模型 x 1 w ^ 1 + x 2 w ^ 2 + b ^ x_1 \hat{w}_1 + x_2
\hat{w}_2 + \hat{b} x1w^1+x2w^2+b^ 来估算训练数据集以外任意⼀栋⾯积(平⽅⽶)为 x 1 x_1 x1、房龄(年)为 x 2 x_2 x2的房屋的价格了。

这⾥的估算也叫作模型预测、模型推断或模型测试。

训练完之后得到了当前模型参数的较优解,不是最优解,只是对最优解的⼀个近似
2. 线性回归的表⽰⽅法
我们已经阐述了线性回归的模型表达式、训练和预测。

下⾯我们解释线性回归与神经⽹络的联系,以及线性回归的⽮量计算表达式。

2.1 神经⽹络图
在深度学习中,我们可以使⽤神经⽹络图直观地表现模型结构。

为了更清晰地展⽰线性回归作为神经⽹络的结构,图3.1使⽤神经⽹络图表⽰本节中介绍的线性回归模型。

神经⽹络图隐去了模型参数权重和偏差。

图3.1
在图3.1所⽰的神经⽹络中,输⼊分别为 x 1 x_1 x1和 x 2 x_2 x2,因此输⼊层的输⼊个数为2。

输⼊个数也叫特征数或特征向量维度。

图3.1中⽹络的输出为 o o o,输出层的输出个数为1。

需要注意的是,我们直接将图3.1中神经⽹络的输出 o o o 作为线性回归的输出,即 y ^ = o \hat{y} = o y^=o。

由于输⼊层并不涉及计算,按照惯例,图3.1所⽰的神经⽹络的层数为1。

所以,线性回归是⼀个单层神经⽹络。

输出层中负责计算 o o o 的单元⼜叫神经元。

在线性回归中, o o o 的计算依赖于 x 1 x_1 x1和 x 2 x_2 x2。

也就是说,输出层中的神经元和输⼊层中各个输⼊完全连接。

因此,这⾥的输出层⼜叫全连接层(fully-connected layer)或稠密层(dense layer)。

之前我们看到的只是⼀个公式,抽象化很难与神经⽹络联想起来,作者写这⼀段是为了把抽象化的公式通过⽹络图具象化出来,其中公式与该单层神经⽹络的关系为: x 1 x_1 x1 和 x 2 x_2 x2是⽹络的输⼊, w ^ 1 , w ^ 2 \hat{w}_1, \hat{w}_2 w^1,w^2就是权重值,在图中就是⼩箭头,输出层中负责计算 o o o 的单元⼜叫神经元
同时⼜补充了全连接层的概念:输出层中的神经元和输⼊层中各个输⼊完全连接
2.2 ⽮量计算表达式
在模型训练或预测时,我们常常会同时处理多个数据样本并⽤到⽮量计算。

在介绍线性回归的⽮量计算表达式之前,让我们先考虑对两个向量相加的两种⽅法。

下⾯先定义两个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)逐⼀预测价格,将得到
y ^ ( 1 ) = x 1 ( 1 ) w 1 + x 2 ( 1 ) w 2 + b , y ^ ( 2 ) = x 1 ( 2 ) w 1 + x 2 ( 2 ) w 2 + b , y ^ ( 3 ) = x 1 ( 3 ) w 1 + x 2 ( 3 ) w 2 + 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 = [ x 1 ( 1 ) x 2 ( 1 ) x 1 ( 2 ) x 2 ( 2 ) x 1 ( 3 ) x 2 ( 3 ) ] , w = [ w 1 w 2 ] \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=[w1w2]
对3个房屋样本预测价格的⽮量计算表达式为 y ^ = X w + b , \boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b, y^=Xw+b, 其中的加法运算使⽤了⼴播机制。

例如:
a = torch.ones(3)
b = 10
print(a + b)
输出:
tensor([11., 11., 11.])
⼴播机制旨在提供⼀种当被处理数组维度⼤⼩不⼀样时仍然能计算的机制
详细链接:
⼴义上讲,当数据样本数为 n n n,特征数为 d d d 时,线性回归的⽮量计算表达式为:
y ^ = X w + b \boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b y^=Xw+b
其中模型输出 y ^ ∈ R n × 1 \boldsymbol{\hat{y}} \in \mathbb{R}^{n \times 1} y^∈Rn×1 批量数据样本特征 X ∈ R n × d \boldsymbol{X} \in \mathbb{R}^{n \times d} X∈Rn×d,权重 w ∈ R d × 1 \boldsymbol{w} \in \mathbb{R}^{d \times 1} w∈Rd×1,偏差 b ∈ R b \in \mathbb{R} b∈R。

相应地,批量数据样本标签 y ∈ R n × 1 \boldsymbol{y} \in \mathbb{R}^{n \times 1} y∈Rn×1。

设模型参数θ = [ w 1 , w 2 , b ] ⊤
\boldsymbol{\theta} = [w_1, w_2, b]^\top θ=[w1,w2,b]⊤,我们可以重写损失函数为
ℓ ( θ ) = 1 2 n ( 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 ) ( w 1 , w 2 , b ) ∂ w 1 ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ w 2 ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ b ] = [ 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 ) ] = [ x 1 ( i ) x 2 ( 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))
这⾥就是⽤向量来表⽰模型中的各个参数以及中间量
3. ⼩结
和⼤多数深度学习模型⼀样,对于线性回归这样⼀种单层神经⽹络,它的基本要素包括模型、训练数据、损失函数和优化算法。

既可以⽤神经⽹络图表⽰线性回归,⼜可以⽤⽮量计算表⽰该模型。

应该尽可能采⽤⽮量计算,以提升计算效率。

相关文档
最新文档