假设我们有一个固定由m个训练实例组成的训练集{(x(1),y(1)),…,(x(m),y(m))}.我们可以用批量梯度下降方法来训练我们的神经网络.细节上,对于一个训练实例(x,y),我们定义关于该实例的代价函数:
这是平方误差(的一半)代价函数。给定m个实例的训练集,我们定义全局代价函数:
第一项J(W,b)是平方误差和的平均项。第二项是正则化项(也称为权重衰减项),用来降低权重(占的)大小,可以防止过拟合。
(注意:通常权重衰减不会应用在偏置项b(l),这一点在我们J(W,b)的定义中可以看出。然而,对偏置单元应用权重衰减通常只会对最终的网络产生很小的影响。如果你有上斯坦福CS229(机器学习)课程或者在YouTube看过视频课程,你还能意识到权重衰减实质上是贝叶斯正则化那些方法的一种变体,这种情况下我们会在参数上添加高斯先验并作最大后验估计(而不是最大似然估计)。
权重衰减参数λ控制着两项的相对重要性。还要注意到这个稍微复杂的一项J(W,b;x,y)是对一个实例的平方误差代价;J(W,b)是全局的代价函数,还包括了权重衰落项。
上面的代价函数通常用于分类和回归问题。在分类问题中,我们让y=0或1代表两个类标记(回忆sigmoid激活函数输出值在[0,1]区间。如果我们使用tanh激活函数,我们会使用-1和+1来表示标记)。在回归问题中,我们缩放我们的输出保证它们在[0,1]区间(或者如果我们在使用tanh激活函数,则是[-1,+1]区间。
我们的目标是最小化W和b的函数J(W,b)。为了训练我们的神经网络,我们将初始化每个W(l)ij和b(l)到接近0的小随机数(比如符合标准正态分布(0,ϵ2),ϵ可以取些小值比如0.01),然后采取优化算法比如批量梯度下降。既然J(W,b)是非凸函数,梯度下降容易受局部最优解的影响;然而,实际中梯度下降法表现地非常好。最后,注意随机初始化参数是非常重要的,而不是全部设为0。如果所有的参数都从相同的值开始(训练),那么所有隐藏层单元会以学习相同输入函数结束(正式地说,W(1)ij对所有的i值都相等,因此对任意的输入x,a(2)1=a(2)2=a(2)3=…)。随机初始化达到了打破对称性的目的。
梯度下降的一次迭代按如下更新W和b:
其中α是学习率。关键步骤是计算上面的偏导数。我们现在会介绍反向传播算法,它提供了一种高效的计算这些偏导数的方法。
我们首先介绍反向传播怎样能应用在计算∂J(W,b;x,y)/∂W(l)ij和J(W,b;x,y)/∂b(l)i,这些对于单个实例(x,y)定义的代价函数J(W,b;x,y)的偏导数。一旦我们能计算这些偏导数,我们发现全局代价函数J(W,b)的导数就能这么计算:
以上两行稍微有点差别因为权重衰减应用在W而不是b。
反向传播算法背后直观的理解如下。给定一个训练实例(x,y),我们首先进行前向传播计算网络的所有激活值,包括假设hW,b(x)的输出。然后,对于层l的每一个节点i,我们会计算一个误差项δi(l),衡量这个节点对输出的任何误差“负多大责任”。对于一个输出节点,我们可以直接衡量网络的激活值和真正的目标值的差距,并用于定义δi(nl)(nl层是输出层)。那么对隐藏单元而言呢?对于它们,我们将基于那些使用ai(l)作为输入的节点的加权平均的误差项计算δi(l)。具体而言,以下是反向传播算法:
1、 执行前馈传播,计算L2、L3层的激活值,一直到Lnl层。
2、 对于每个在nl层(输出层)的输出单元i,令
3、 对于l=nl−1,nl−2,nl−3,…,2层,对于每个在l层的输出单元i,令
4、 计算所需要的偏导数,如下:
最后,我们还可以使用矩阵向量形式重写算法。我们将使用”∙”表示逐元素的乘积操作(在Matlab和Octave中用”∙*”,也称为阿达玛积。因此如果a=b∙c,即表示ai=bici。类似我们扩展f(⋅)的定义应用在向量逐元素中,我们同样可以应用在f′(⋅)(因此有f′([z1,z2,z3])=[f′(z1),f′(z2),f′(z3)])。
然后,算法就能写为:
1、 执行前馈传播,使用定义前向传播步骤的等式计算L2、L3层的激活值,一直到Lnl层。
2、 对于输出层(nl层),令
3、 对于l=nl−1,nl−2,nl−3,…,2,令
4、 计算所需的偏导数:
实现注意:
在上面第2步和第3步中,我们需要对每个i计算f′(zi(l))。假设f(z)是sigmoid激活函数,我们已经通过网络前向传输存储了ai(l)的值。这样,使用我们为f′(z)早就计算好的表达式,我们可以计算f′(zi(l))=ai(l)(1−ai(l))。
最后,我们准备描述完整的梯度下降算法。在下面的伪代码中,ΔW(l)是一个矩阵(与W(l)维数相同),Δb(l)是一个向量(与b(l)维数相同)。注意到在这些符号中,ΔW(l)是一个矩阵,而尤其它不是指Δ乘以W(l)。按照如下,我们实现批量梯度下降的一次迭代:
1、 对所有l,令ΔW(l):=0 , Δb(l):=0(零矩阵/向量)。
2、 For i=1 to m,
1、 使用反向传播计算∇W(l)J(W,b;x,y)和∇ b(l)J(W,b;x,y)。
2、 令ΔW(l):=ΔW(l)+∇W(l)J(W,b;x,y)。
3、 令Δb(l):=Δb(l)+∇b(l)J(W,b;x,y)。
3、 更新参数:
为了训练我们的神经网络,我们现在可以重复地采用梯度下降的步骤来减小我们的代价函数J(W,b)。
补充:
练习:有监督的神经网络
在这次练习中,你将训练一个神经网络分类器将MNIST数据集的10个数字分类。神经网络的输出单元和你在softmax练习中建立的softmax回归函数一样。只用softmax回归函数不能很好地匹配训练集,是欠拟合的一个例子。相比而言,神经网络有较低的偏差并能较好地匹配训练集。在多层神经网络一节中我们介绍了用平方误差函数,通过反向传播算法来计算网络中所有参数的梯度。在这次练习中,我们需要用到和softmax回归(交叉熵)一样的代价函数,而不是平方误差函数。
代价函数于softmax回归代价函数几乎一样。注意到,不是通过输入数据x来做预测,而是softmax函数将网络的最后一层隐藏层hW,b(x)看作输入。损失函数是这样的:
代价函数的区别导致了输出层误差项的不同δ(nl)。对于交叉熵形式的代价函数,我们有
使用这式子,你就可以推到所有的反相传播算法来计算网络所有参数的梯度。