在介绍深度神经网络之前,我们需要了解神经网络训练的基础知识。我们将介绍神经网络的整个训练过程,包括:
- 定义简单的神经网络架构
- 数据处理
- 指定损失函数和如何训练模型
经典统计学中的线性回归和softmax回归可以视为线性神经网络。
以上内容将为其他部分中更复杂的技术奠定基础。
线性回归
回归是指一类为一个或多个自变量与因变量之间关系建模的方法。在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。
在机器学习领域中的大多数任务通常都与预测有关。当我们想预测一个数值时,就会涉及到回归问题。
但不是所有的预测都是回归问题。在后面的模块中,我们将介绍分类问题。分类问题的目标是预测数据属于一组类别中的哪一个。
损失函数
在我们开始考虑如何用模型拟合数据之前,我们需要确定一个拟合程度的度量。损失函数能够量化目标的实际值与预测值之间的差距。通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。回归问题中最常用的损失函数是平方误差函数。
上图展示的是用线性模型拟合数据。
由于平方误差函数中的二次方项,估计值 y ^ ( i ) \hat{y}^{(i)} y^(i)和预测值 y ( i ) y^{(i)} y(i)之间较大的差异将贡献更大的损失。为了度量模型在整个数据集上的质量,我们需计算在训练集 n n n个样本上的损失均值(也等价于求和)。
在训练模型时,我们希望寻找一组参数,这组参数能够最小化在所有训练上的总损失。
线性回归刚好是一个简单的优化问题,它的解可以用一个公式简单地表达出来,这类解叫做解析解。
像线性回归这样的简单问题存在解析解,但并不是所有的问题都存在解析解。解析解可以进行很好的数学分析,但解析解的限制很严格,导致它无法应用在深度学习里。
小批量随机梯度下降
即使在我们无法得到解析解的情况下,我们仍然可以有效地训练模型。在许多任务上,那些难以优化的模型效果要更好。因此,弄清楚如何训练这些难以优化的模型是非常重要的。
我们这里用到一种名为梯度下降(gradient descent)的方法,这种方法几乎可以优化所有深度学习模型。它通过不断地在损失函数递减的方向上更新参数来降低误差。
梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(在这里也可以称为梯度)。
但实际中的执行可能会非常慢:因为在每一次更新参数之前,我们必须遍历整个数据集。 因此,我们通常会在每次需要计算更新的时候随机抽取一小批样本,这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)。
在每次迭代中,我们首先随机抽样一个小批量 B \mathcal{B} B,它是由固定数量的训练样本组成的。然后,我们计算小批量的平均损失关于模型参数的导数(也可以称为梯度)。最后,我们将梯度乘以一个预先确定的正数 η \eta η,并从当前参数的值中减掉。
总结一下,算法的步骤如下:
- 初始化模型参数的值,如随机初始化;
- 从数据集中随机抽取小批量样本且在负梯度的方向上更新参数,并不断迭代这一步骤。
这里, ∣ B ∣ |\mathcal{B}| ∣B∣表示每个小批量中的样本数,这也称为批量大小。 η \eta η小时学习率。批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。这些可以调整但不再训练过程中更新的参数称为超参数。调参是选择超参数的过程。超参数通常是我们根据训练迭代的结果来调整的,而训练迭代结果是在独立的验证数据集(validation dataset) 上评估得到的。
在训练了预先确定的若干迭代次数后(或者直到满足某些其他停止条件后),我们记录下模型参数的估计值。但是,即使我们的函数确实是线性的且无噪声,这些估计值也不会使损失函数真正地达到最小值。因为算法会使得损失向最小值缓慢收敛,但却不能在有限的步数内非常精确地达到最小值。
线性回归恰好是一个在整个域中只有一个最小值的学习问题。但是对于像深度神经网络这样复杂的模型来说,损失平面上通常包含多个最小值。幸运的是,出于某种原因,深度学习实践者很少会去花费大力气寻找这样一组参数,使得在训练集上的损失达到最小。事实上,更难做到的是找到一组参数,这组参数能够在我们从未见过的数据集上实现较低的损失,这一挑战被称为泛化(generalization)。
在学习到的模型进行预测
给定特征估计目标的过程通常称为预测(prediction)或推断(inference)。
正态分布与平方损失
接下来,我们通过对噪声分布的假设来解读平方损失目标函数。
正态分布(normal distribution),也称为高斯分布,最早由德国数学家高斯应用于天文学研究。正态分布和线性回归之间的关系很密切。简单的说,若随机变量 x x x具有均值 μ \mu μ和方差 σ 2 \sigma^{2} σ2(标准差 σ \sigma σ),其正态分布概率密度函数如下:
p ( x ) = 1 2 π σ 2 exp ( − 1 2 σ 2 ( x − μ ) 2 ) p(x)=\frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp \left(-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}\right) p(x)=2πσ21exp(−2σ21(x−μ)2)
就像我们所看到的,改变均值会产生沿
x
x
x的偏移,增加方差会分散分布、降低其峰值。
均方误差损失函数(简称均方损失)可以用于线性回归的一个原因是:我们假设了观测中包含噪声,其中噪声服从正态分布。
从线性回归到深度网络
到目前为止,我们只谈论了线性模型。尽管神经网络涵盖了很多更为丰富的模型,我们依然可以用描述神经网络的方式来描述线性模型,从而把线性模型看作一个神经网络。首先,让我们用“层”符号来重写这个模型。
神经网络图
在下图中,我们将线性回归模型描述为一个神经网络。需要注意的是,该图只显示连接模式,即只显示每个输入如何连接到输出,隐去了权重和偏置的值。
在上图所示的神经网络中,需要注意的是,输入值都是已经给定的,并且只有一个计算神经元。由于模型重点在发生计算的地方,所以通常我们在计算层数时不考虑输入层,也就是说,上图中神经网络的层数为1.我们可以将线性回归模型视为仅由单个人工神经元组成的神经网络,或称为单层神经网络。
对于线性回归,每个输入都与每个输出(在本例中只有一个输出)相连,我们将这种变换称为全连接层。接下来将详细讨论由这些层组成的网络。
生物学
线性回归发明的时间为1795年,早于计算神经科学,所以线性回归描述为神经网络似乎不合适。当控制学家、神经生物学家沃伦麦库洛奇和沃尔特皮茨开始开发人工神经元模型时,他们为什么将线性模型作为一个起点呢?如下图所示,这是一张由树突(dendrites,输入终端)、细胞核(nucleu,CPU)组成的生物神经元图片。轴突(axon,输出线)和轴突端子(axon terminal,输出端子)通过突触(synapse)与其他神经元连接。
树突中接收到来自其他神经元(或视网膜等环境传感器)的信息 x i x_{i} xi。该信息通过突触权重 w i w_{i} wi来加权,以确定输入的影响(即,通过 x i w i x_{i} w_{i} xiwi相乘来激活或有抑制)。来自多个源的加权输入以加权和 y = ∑ i x i w i + b y=\sum_{i} x_{i} w_{i}+b y=∑ixiwi+b的形式汇聚在细胞核中,然后将这些信息发送到轴突 y y y中进一步处理,通常会通过 σ ( y ) \sigma(y) σ(y)进行一些非线性处理。之后,它要么到达目的地(例如肌肉),要么通过树突进入另一个神经元。
当然,许多这样的单元可以通过正确连接和正确的学习算法拼凑在一起,从而产生的行为会比单独一个神经元所产生的行为更有趣、更复杂,这种想法归功于我们对真实生物神经系统的研究。
然而当今大多数深度学习的研究几乎没有直接从神经科学中获得灵感。
“虽然飞机可能受到鸟类的启发。但几个世纪依赖,鸟类学并不是航空创新的主要驱动力。同样地,如今在深度学习中的灵感同样或更多地来自数学、统计学和计算机科学。”