本文仅作为个人学习笔记用,如有错误请指正,欢迎大家讨论学习。本博客内容来自动手学深度学习
一、什么是线性回归
回归 是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。
线性回归 输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。
二、线性回归基本要素
线性模型
线性假设是指目标(房屋价格)可以表示为特征(面积s和房龄a)的加权和,如下面的式子:
p
r
i
c
e
=
w
s
.
s
+
w
a
.
a
+
b
price = w_s.s+w_a.a+b
price=ws.s+wa.a+b
其中
w
s
w_s
ws和
w
a
w_a
wa称为权重(weight),权重决定了每个特征对我们预测值的影响。
b称为偏置(bias)、偏移量(offset)或截距(intercept)。 偏置是指当所有特征都取值为0时,预测值应该为多少。 即使现实中不会有任何房子的面积是0或房龄正好是0年,我们仍然需要偏置项。 如果没有偏置项,我们模型的表达能力将受到限制。
我们一般将所有特征放到向量
X
∈
R
d
X\in R^d
X∈Rd中(d为特征数量),并用点积来简洁表达该模型:
y
^
=
w
T
x
+
b
\hat y = w^Tx+b
y^=wTx+b
其中我们将例如面积与房龄的数据量看作单个向量
x
x
x或矩阵X,对应于单个或多个数据样本的特征,其中X的每一行是一个样本,每一列是一种特征;将对应的权重作为
w
T
w^T
wT。各数据值以实际情况变化。(理解需要一定线性代数知识)
在开始寻找最好的模型参数(model parameters)w 和 b 之前,我们还需要两个东西:
(1)一种模型质量的度量方式;
(2)一种能够更新模型以提高模型预测质量的方法。
损失函数
在我们开始考虑如何用模型拟合(fit)数据之前,我们需要确定一个拟合程度的度量。损失函数(loss function)能够量化目标的实际值与预测值之间的差距。 通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。 回归问题中最常用的损失函数是平方误差函数。 当样本i的预测值为
y
^
(
i
)
\hat{y}^{(i)}
y^(i),其相应的真实标签为
y
(
i
)
y^{(i)}
y(i)时, 平方误差可以定义为以下公式:
l
(
i
)
(
w
,
b
)
=
1
2
(
y
^
(
i
)
−
y
(
i
)
)
2
.
l^{(i)}(\mathbf{w},b)=\frac12\left(\hat{y}^{(i)}-y^{(i)}\right)^2.
l(i)(w,b)=21(y^(i)−y(i))2.
其中常数
1
2
\frac{1}{2}
21不会带来本质上的区别,但这样在形式上稍微简单一些 (因为当我们对损失函数求导后常数系数为1,二次方求导后乘以2与分数抵消)。
但是仅求平方项,当平方内差值较大时得出的结果会更大,有时这样会极大的影响实验结果,为了度量模型在整个数据集上的质量,我们需计算在训练集n个样本上的损失均值(也等价于求和)。当然当平方项以及到无穷的时候会导致数据上溢,我们在之后会进行进一步优化。
L
(
w
,
b
)
=
1
n
∑
i
=
1
n
l
(
i
)
(
w
,
b
)
=
1
n
∑
i
=
1
n
1
2
(
w
⊤
x
(
i
)
+
b
−
y
(
i
)
)
2
.
L(\mathbf{w},b)=\frac1n\sum_{i=1}^nl^{(i)}(\mathbf{w},b)=\frac1n\sum_{i=1}^n\frac12\left(\mathbf{w}^\top\mathbf{x}^{(i)}+b-y^{(i)}\right)^2.
L(w,b)=n1i=1∑nl(i)(w,b)=n1i=1∑n21(w⊤x(i)+b−y(i))2.
在训练模型时,我们希望寻找一组参数(
w
∗
,
b
∗
{w}^*,b^*
w∗,b∗), 这组参数能最小化在所有训练样本上的总损失。如下式:
w
∗
,
b
∗
=
argmin
w
,
b
L
(
w
,
b
)
.
\mathbf{w}^*,b^*=\underset{\mathbf{w},b}{\operatorname*{argmin}} L(\mathbf{w},b).
w∗,b∗=w,bargminL(w,b).
argmin就是使后面这个式子达到最值时的变量w,b的取值。
随机梯度下降
梯度下降(gradient descent)的方法, 这种方法几乎可以优化所有深度学习模型。 它通过不断地在损失函数递减的方向上更新参数来降低误差。
梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值) 关于模型参数的导数(在这里也可以称为梯度)。 但实际中的执行可能会非常慢:因为在每一次更新参数之前,我们必须遍历整个数据集。 因此,我们通常会在每次需要计算更新的时候随机抽取一小批样本, 这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)。
在每次迭代中,我们首先随机抽样一个小批量 N, 它是由固定数量的训练样本组成的。 然后,我们计算小批量的平均损失关于模型参数的导数(也可以称为梯度)。 最后,我们将梯度乘以一个预先确定的正数,并从当前参数的值中减掉。
(
w
,
b
)
←
(
w
,
b
)
−
η
∣
N
∣
∑
i
∈
N
∂
(
w
,
b
)
l
(
i
)
(
w
,
b
)
.
(\mathbf{w},b)\leftarrow(\mathbf{w},b)-\frac\eta{|\mathcal{N}|}\sum_{i\in\mathcal{N}}\partial_{(\mathbf{w},b)}l^{(i)}(\mathbf{w},b).
(w,b)←(w,b)−∣N∣ηi∈N∑∂(w,b)l(i)(w,b).
N \mathcal{N} N表示每个小批量中的样本数,这也称为批量大小(batch size)。 η \eta η表示学习率(learning rate)。批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。 这些可以调整但不在训练过程中更新的参数称为超参数(hyperparameter)。调参(hyperparameter tuning)是选择超参数的过程。 超参数通常是我们根据训练迭代结果来调整的, 而训练迭代结果是在独立的验证数据集(validation dataset)上评估得到的。
在训练了预先确定的若干迭代次数后(或者直到满足某些其他停止条件后), 我们记录下模型参数的估计值,表示为w,b。 但是,即使我们的函数确实是线性的且无噪声,这些估计值也不会使损失函数真正地达到最小值。 因为算法会使得损失向最小值缓慢收敛,但却不能在有限的步数内非常精确地达到最小值。
线性回归恰好是一个在整个域中只有一个最小值的学习问题。 但是对像深度神经网络这样复杂的模型来说,损失平面上通常包含多个最小值。 深度学习实践者很少会去花费大力气寻找这样一组参数,使得在训练集上的损失达到最小。 事实上,更难做到的是找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失, 这一挑战被称为泛化(generalization)。
三、矢量化加速
在训练我们的模型时,我们经常希望能够同时处理整个小批量的样本。 为了实现这一点,需要我们对计算进行矢量化, 从而利用线性代数库,而不是在Python中编写开销高昂的for循环。矢量化代码通常会带来数量级的加速。 另外,我们将更多的数学运算放到库中,而无须自己编写那么多的计算,从而减少了出错的可能性。
四、正态分布与平方损失
正态分布和线性回归之间的关系很密切。 正态分布(normal distribution),也称为高斯分布(Gaussian distribution), 最早由德国数学家高斯(Gauss)应用于天文学研究。 简单的说,若随机变量x具有均值
μ
\mu
μ和方差
σ
2
\sigma^2
σ2(标准差),其正态分布概率密度函数如下:
p
(
x
)
=
1
2
π
σ
2
e
x
p
(
−
1
2
σ
2
(
x
−
μ
)
2
)
.
p(x)=\frac{1}{\sqrt{2\pi\sigma^2}}\mathrm{exp}\left(-\frac{1}{2\sigma^2}(x-\mu)^2\right).
p(x)=2πσ21exp(−2σ21(x−μ)2).
均方误差损失函数(简称均方损失)可以用于线性回归的一个原因是: 我们假设了观测中包含噪声,其中噪声服从正态分布。 在明白我们所推断的线性回归服从高斯分布后。我们需要知道似然以下两个客观条件
1.对于某个未知参数的分布 (分布的形式必须是事先假设已知的,而分布的参数未知。比如假设正态分布,伯努利分布等),
2 和来自这个分布 ,独立同分布采样的一堆样本 (必须要有数据,深度学习必须有原始数据样本)
基于上述的两个必须,针对待估计的分布参数,使用这一堆已知的样本 去反推 某个参数估计值 作为这个分布参数的可能性(似然)。
内容来自https://zhuanlan.zhihu.com/p/73549270
因此,我们现在可以写出通过给定的x观测到特定y的似然(likelihood):
P
(
y
∣
x
)
=
1
2
π
σ
2
e
x
p
(
−
1
2
σ
2
(
y
−
w
⊤
x
−
b
)
2
)
.
P(y\mid\mathbf{x})=\frac1{\sqrt{2\pi\sigma^2}}\mathrm{exp}\left(-\frac1{2\sigma^2}(y-\mathbf{w}^\top\mathbf{x}-b)^2\right).
P(y∣x)=2πσ21exp(−2σ21(y−w⊤x−b)2).
现在,根据极大似然估计法,参数w和b的最优值是使整个数据集的似然最大的值:
P
(
y
∣
X
)
=
∏
i
=
1
n
p
(
y
(
i
)
∣
x
(
i
)
)
.
P(\mathbf{y}\mid\mathbf{X})=\prod_{i=1}^np(y^{(i)}|\mathbf{x}^{(i)}).
P(y∣X)=i=1∏np(y(i)∣x(i)).
根据极大似然估计法选择的估计量称为极大似然估计量。 虽然使许多指数函数的乘积最大化看起来很困难, 但是我们可以在不改变目标的前提下,通过最大化似然对数来简化。 由于历史原因,优化通常是说最小化而不是最大化。 我们可以改为最小化负对数似然
−
log
P
(
y
∣
X
)
-\log P(\mathbf{y}\mid\mathbf{X})
−logP(y∣X)。 由此可以得到的数学公式是:
−
log
P
(
y
∣
X
)
=
∑
i
=
1
n
1
2
l
o
g
(
2
π
σ
2
)
+
1
2
σ
2
(
y
(
i
)
−
w
⊤
x
(
i
)
−
b
)
2
.
-\log P(\mathbf{y}\mid\mathbf{X})=\sum_{i=1}^n\frac12\mathrm{log}(2\pi\sigma^2)+\frac1{2\sigma^2}\left(y^{(i)}-\mathbf{w}^\top\mathbf{x}^{(i)}-b\right)^2.
−logP(y∣X)=i=1∑n21log(2πσ2)+2σ21(y(i)−w⊤x(i)−b)2.
现在我们只需要假设
σ
\sigma
σ是某个固定常数就可以忽略第一项, 因为第一项不依赖于w和b。现在第二项除了常数
1
2
σ
2
\frac1{2\sigma^2}
2σ21外,其余部分和前面介绍的均方误差是一样的。 幸运的是,上面式子的解并不依赖于
σ
\sigma
σ。 因此,在高斯噪声的假设下,最小化均方误差等价于对线性模型的极大似然估计。
五、从线性回归到深度网络
到目前为止,我们只谈论了线性模型。 尽管神经网络涵盖了更多更为丰富的模型,我们依然可以用描述神经网络的方式来描述线性模型, 从而把线性模型看作一个神经网络。 首先,我们用==“层”==符号来重写这个模型。
下图中我们将线性回归模型描述为一个神经网络。 需要注意的是,该图只显示连接模式,即只显示每个输入如何连接到输出,隐去了权重和偏置的值。
在上图所示的神经网络中,输入为
x
1
,
.
.
.
,
x
d
x_1,...,x_d
x1,...,xd, 因此输入层中的输入数(或称为特征维度,feature dimensionality)为
d
d
d。 网络的输出为
o
1
o_1
o1,因此输出层中的输出数是1。 需要注意的是,输入值都是已经给定的,并且只有一个计算神经元。 由于模型重点在发生计算的地方,所以通常我们在计算层数时不考虑输入层。 也就是说, 图中神经网络的层数为1。 我们可以将线性回归模型视为仅由单个人工神经元组成的神经网络,或称为单层神经网络。
对于线性回归,每个输入都与每个输出(在本例中只有一个输出)相连, 我们将这种变换( 图中的输出层) 称为全连接层(fully-connected layer)或称为稠密层(dense layer)。