第一章 动手学深度学习( PyTorch)笔记 ------ 线性神经网络(一)


本文仅作为个人学习笔记用,如有错误请指正,欢迎大家讨论学习。本博客内容来自动手学深度学习


一、什么是线性回归

回归 是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。

线性回归 输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。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 XRd中(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=1nl(i)(w,b)=n1i=1n21(wx(i)+by(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ηiN(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πσ2 1exp(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(yx)=2πσ2 1exp(2σ21(ywxb)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(yX)=i=1np(y(i)x(i)).
根据极大似然估计法选择的估计量称为极大似然估计量。 虽然使许多指数函数的乘积最大化看起来很困难, 但是我们可以在不改变目标的前提下,通过最大化似然对数来简化。 由于历史原因,优化通常是说最小化而不是最大化。 我们可以改为最小化负对数似然 − log ⁡ P ( y ∣ X ) -\log P(\mathbf{y}\mid\mathbf{X}) logP(yX)。 由此可以得到的数学公式是:
− 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(yX)=i=1n21log(2πσ2)+2σ21(y(i)wx(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)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值