《卷积神经网络与计算机视觉》 —3.2.2参数学习
3.2.2参数学习
正如在3.2.1节中所描述的,神经网络的权重定义了神经元之间的连接。需要适当地设置这些权重,以便可以从神经网络获得所需的输出。权重对从训练数据中生成的“模型”进行编码,该模型允许网络执行指定的任务(例如,对象检测、识别或分类)。在实际设置中,权重的数量很大,这需要一个自动程序依据给定任务来适当地更新它们的值。自动调整网络参数的过程称为“学习”,这是在训练阶段完成的(相对于测试阶段,测试阶段对“看不见的数据”进行推断/预测,即训练时网络尚未“看到”数据)。该过程涉及向网络显示所需任务的示例,以便它可以学习识别输入和所需输出之间的正确关系集。例如,在有监督学习的范例中,输入可以是媒体(语音、图像),并且输出是所期望的“标签”组(例如,人的身份),它用于调节神经网络参数。
我们现在描述一种学习算法的基本形式,称为delta规则。
1. delta规则
delta规则背后的基本思想是在训练阶段从神经网络的错误中学习。delta规则由[Widrow et al.,1960]提出,其基于目标输出和预测输出之间的差异来更新网络参数(即,由θ表示权重,考虑0偏置)。该差异是根据最小均方(LMS)误差计算的,这就是delta学习规则也被称为LMS规则的原因。输出单元是由x表示的输入的“线性函数”,即:
如果pn和yn分别表示预测输出和目标输出,则可以将误差计算为:
其中n是数据集中的类别数(或输出层中的神经元个数)。delta规则计算此误差函数(式(3.1))相对于网络参数的梯度Eθij。给定梯度,根据以下学习规则迭代地更新权重:
其中,t表示学习过程的前次迭代。超参数η表示计算出的梯度方向上的参数更新的步长。可以想象当梯度或步长为零时不会发生学习。在其他情况下,更新参数使得预测的输出更接近目标输出。在多次迭代之后,更新过程不会导致参数改变时,称网络训练过程收敛。
如果步长太小,网络将花费更长时间才能收敛,并且学习过程将非常慢。另一方面,采取非常大的步长,可能导致在训练过程中不稳定的反复无常的行为,结果网络可能根本不会收敛。因此,将步长设置为正确的值,对于网络训练非常重要。我们将在5.3节中讨论为CNN训练设定步长的不同方法,这些方法同样适用于MLP。
2.广义delta规则
广义delta规则是delta规则的扩展。它由[Rumelhart et al.,1985]提出。delta规则仅计算输入和输出对之间的线性组合。这就限制了我们只能使用单层网络,因为许多线性层的堆栈并不比单个线性变换更好。为了克服这种限制,广义delta规则利用每个处理单元的非线性激活函数,模拟输入域和输出域之间的非线性关系。它还允许我们在神经网络架构中使用多个隐藏层,这个概念构成了深度学习的核心。用与delta规则相同的方式更新多层神经网络的参数,即:
但是与delta规则不同,误差是通过多层网络递归地向后发送的。因此,广义delta规则也称为“反向传播”算法。因为对于广义delta规则的情况,神经网络不仅具有输出层而且还具有中间隐藏层,我们可以分别计算输出层和隐藏层的误差项(相对于期望输出的微分)。由于输出层的情况很简单,我们首先讨论该层的误差计算。
给定式(3.1)中的误差函数,对于每个节点i,其相对于输出层L中的参数的梯度可以如下计算:
其中,ai=∑jθi,jxj+bi是激励值,是神经元的输入(在激活函数之前)。xj 是前一层的输出,pi=f(ai)是神经元的输出(对于输出层,则是预测值)。f(·)是非线性激活函数,f′(·)表示它的导数。为响应给定的输入激励,激活函数决定神经元是否会激活。注意,非线性激活函数是可微分的,因此可以使用误差反向传播来调整网络的参数。一种流行的激活函数是sigmoid函数,表示如下:
我们将在4.2.4节详细讨论其他激活函数。sigmoid激活函数的导数是在理想情况下合适的,因为它可以根据sigmoid函数本身(即pi)写出,由下式给出:
因此,我们可以为输出层神经元写出其梯度等式
类似地,我们可以在多层神经网络中,通过误差反向传播来计算中间隐藏层的误差信号,如下所示:
其中,l∈{1…L-1} ,L表示网络中的总层数。上述等式应用链式规则,使用所有后续层的梯度逐步计算内部参数的梯度。MLP参数θij的整体更新等式可写为:
其中,xl-1j是前一层的输出,t表示前次训练迭代的编号。完整的学习过程通常涉及多次迭代,并且参数不断更新,直到网络优化(即,经过了若干次迭代之后,或者θt+1ij不再改变)。
梯度不稳定性问题:广义delta规则成功地应用于浅层网络(具有一个或两个隐藏层的网络)的情况。然而,当网络很深(即,L很大)时,学习过程可能遭受梯度消失或梯度爆炸问题,这取决于激活函数的选择(例如,在上面的例子中的sigmoid函数)。这种不稳定性与深度网络中的初始层尤其相关。结果,初始层的权重不能正常地调整。我们用下面的例子解释一下。
考虑具有多个层的深度网络。使用激活函数将每个权重层的输出限制在小范围内(例如,对于sigmoid函数,取值范围为[0,1])。sigmoid函数的梯度导致更小的值(见图3.2)。为了更新初始层参数,根据链式规则连续地乘以导数(如式(3.10)所示)。这些乘法以指数方式衰减反向传播信号。 如果我们考虑一个深度为5的网络,并且sigmoid的最大可能梯度值为0.25,则衰减因子将为(0.25)5=0.0009。
这称为“梯度消失”问题。类似地,很容易理解,在激活函数的梯度很大的情况下,连续乘法可能导致“梯度爆炸”问题。
图3.2sigmoid激活函数及其导数。注意,导数的值域范围相对较小,这导致梯度消失问题
我们将在第4章介绍修正线性单元(ReLU)激活函数,当单元激活时,其梯度等于1。由于1L=1,这避免了梯度消失和梯度爆炸问题。
- 点赞
- 收藏
- 关注作者
评论(0)