高能效类脑智能:算法与体系架构
上QQ阅读APP看书,第一时间看更新

2.1.2 学习

神经网络的学习通常以最小化某种形式的损失(代价)函数(loss(cost)function)L(w)的形式进行,其中w表示神经网络中所有的权重,正是神经网络训练过程中需要学习的参数。值得注意的是,我们从式(2.1)可以看出一个神经网络的偏置项可以看作一个突触,它的输入总是相同的。这样的安排有助于简化符号,因此,除非另有说明,我们将网络中的偏置项视为突触权重。

给定一组输入和输出,损失函数本质上是一个关于网络参数的函数,可以通过调节参数w的值来降低损失函数的值。L(w)的详细定义取决于所涉及的学习类型,这在2.2节中将进行详细说明。损失函数的最小化主要是通过基于梯度下降的优化或其导数实现的,当然也可以用如遗传算法等其他标准优化算法。在梯度下降方法中,最重要的步骤就是求解损失函数对每个可调参数的梯度,即求解:

利用梯度信息,可以改变神经网络中的权重参数和偏置项,从而最小化损失函数,这一过程从概念上如图2.4所示。为了直观理解,图2.4展示了一个一维的例子,将这个例子扩展到高维是很简单的。从图中可以得知损失函数是一个关于突触权重w的函数,而学习的目标就是找到一个正确的权重使得损失函数值最小化,图中的圆圈代表在学习过程中对应的权重和损失函数值,根据损失函数的局部线性化梯度对权重进行调整。在每次学习迭代的过程中,首先对网络参数随机初始化,然后略微调节参数使得损失函数值降低。这一过程在数学上可以描述为:

图2.4 梯度下降过程图解。通过调节参数w使得损失函数值向降低的方向移动

其中代表在第n次迭代学习中的突触权重;α被称为学习率,是用来控制学习速度的超参数。超参数这个词是用来指那些不属于神经网络模型但是为了控制学习过程而需要的参数。

α概念上的含义如图2.5所示。当α太小时,参数的更新过于缓慢,如图2.5a所示需要更多的迭代次数来最小化损失函数。从直观上来讲,当参数更新过于缓慢时,第n次迭代与第n+1次迭代后损失函数的梯度值十分相近,因此可以将这两次迭代合并为一次来减少迭代次数。另一个极端是如图2.5b所示,当学习率α过大时损失函数值可能会发散。在梯度下降学习中,我们使用一个线性化的模型来逼近局部的真实损失函数。当参数变化较小时,线性化模型与真实损失函数拟合较好。然而当参数变化过大时,真正的损失函数与假定的线性化模型有显著差异,从而导致学习的发散。甚至当学习率不足以让训练过程发散时,训练过程仍然可能在最小值附近振荡而不是收敛。显然超参数α的选择对于实现快速有效的训练是十分关键的。一般来说,这个学习率的选择或多或少是一个反复试验的过程,一个常见的做法是从选择一个合理的数字开始,并随着时间的推移逐渐降低学习率以使训练过程能够顺利收敛。最近提出了许多先进的技术以避免手动设置的学习率,这在2.5.3.1.4节中有详细说明。

图2.5 在训练过程中学习率过小和过大的图解。当学习率过小的时候需要很多次迭代才能使得损失函数值最小;当学习率过大的时候训练过程中函数值可能不收敛

从图2.6可以看出,除非损失函数是个凸函数,否则梯度下降法不能保证收敛到全局极小值。这个问题的一个很好的类比是一个球从山顶滚到山谷,即使球可以向重力势能降低的方向移动,它也可能会卡在一些局部的山谷里。在早期,人们常常认为局部最小值是许多神经网络不能得到正确训练的主要原因。为了解决这一问题,研究人员提出了一些精心设计的无局部最小值的神经网络[2-3]。另外,为了获得全局最优解,还将模拟退火算法和遗传算法等全局优化方法应用于神经网络训练中[1-4]。尽管如此,最近深度神经网络的发展表明局部最小值可能并不像人们想象的那样有问题。一个深度神经网络几乎总是能够得到一个接近全局最小的解[5]

图2.6 损失函数局部极小值与全局极小值图解。根据初始点的不同,训练可能会停留在局部极小值,而不是收敛到全局极小值

求解梯度部分的过程通常使用十分著名的反向传播算法,作为神经网络训练的一种权威算法,反向传播算法得到了广泛的应用。尽管类似于反向传播的思想已经存在了一段时间,并被用来解决某些优化问题,但反向传播算法直到20世纪的70年代和80年代才被引入神经网络领域。神经网络中反向传播的概念是由许多研究者独立研究的,如Werbos[6-7]和Rumelhart等人[8]。该算法依赖于神经网络的线性化模型。它利用微积分中的链式法则来获得与每一个没有直接连接到输出神经元的突触权重的梯度。例如,如果已知神经元在的误差,然后我们可以将误差通过式(2.4)传播到神经元

这是微积分中广泛应用的简单链式法则。代表偏置点处激活函数的梯度,数学上表示为。很容易从式(2.1)得知即为。因此式(2.4)可以重写为:

通过式(2.5),输出神经元计算的误差可以逐层传播回每个神经元。同样每个权重的梯度可以被表示为:

sigmoid函数和tanh函数曾经被用于神经网络当中,而现在ReLU函数及其导数在深度神经网络中得到了广泛的应用。ReLU的引入主要有两个原因。第一个原因是抵消在神经网络结构较深时存在的梯度递减。当使用sigmoid函数或者tanh函数时,从图2.2a和b所示的激活函数的斜率可以看出,如果太小或者太大,将会变得非常小。因此,这样一个小的梯度导致一个小的权重更新,这减慢了训练过程。然而,ReLU函数通过在输入较大时不使输出饱和来避免这个问题。

ReLU的另一个优点是计算效率很高,ReLU的使用本质上是一个条件传递操作,而不是执行复杂的数学运算。同样的优点也存在于反向传播阶段,ReLU函数的分段导数比传统的sigmoid函数和tanh函数简单,从而大大加快了训练过程。