系列博客是博主学习神经网络中相关的笔记和一些个人理解,仅为作者记录笔记之用,不免有很多细节不对之处。
规范化
本节,我们会讨论一种最为常用的规范化(regularization)手段——有时候被称为权重衰减(weight-decay)或者L2规范化(regularization)。L2规范化的想法是增加一个额外的项到代价函数上,这个项叫做规范化项。下面是\规范化的的交叉熵代价函数:
C=−1n∑xj[yjlnaLj+(1−yj)ln(1−aLj)]+λ2n∑ww2(1) (1) C = − 1 n ∑ x j [ y j ln a j L + ( 1 − y j ) ln ( 1 − a j L ) ] + λ 2 n ∑ w w 2
其中第一项就是常规的交叉熵的表达式。第二项是所有权重的平方和,即规范化项。然后使用一个因子
λ/2n λ / 2 n 进行量化调整,其中
λ>0 λ > 0 可以称为
规范化参数,而
n n 就是训练集合的大小。我们会在后面讨论
λ λ 的选择策略。需要注意的是,规范化项里面并不包含偏置,这点我们后面也会再讲述。
当然,对其他的代价函数也可以进行规范化,例如二次代价函数。类似的规范化形式如下:
C=12n∑x‖y−aL‖2+λ2n∑ww2(2) (2) C = 1 2 n ∑ x ‖ y − a L ‖ 2 + λ 2 n ∑ w w 2
两者都可以写成这样:
C=C0+λ2n∑ww2(3) (3) C = C 0 + λ 2 n ∑ w w 2
其中
C0 C 0 是原始的代价函数。直觉地看,规则化的效果是让网络倾向于学习小一点的权重,其他的东西都一样的。在最小化代价函数时,大的权重只有能够给出原始代价足够的提升时才被允许。换言之,规范化可以当做一种寻找最小化权重和最小化原始代价函数的折中方法。这两部分之间相对的重要性就由
λ λ 的值来控制了:
λ λ 越小,就越偏向于最小化原始代价函数,反之,越向于最小化权重。
更新方程
我们需要知道如何计算网络对权重和偏置的偏导数 ∂C/∂w ∂ C / ∂ w 和 ∂C/∂b ∂ C / ∂ b 。对方程1 进行求偏导数得:
∂C∂w=∂C0∂w+λnw(3) (3) ∂ C ∂ w = ∂ C 0 ∂ w + λ n w
∂C∂b=∂C0∂b(4) (4) ∂ C ∂ b = ∂ C 0 ∂ b
∂C0/∂w ∂ C 0 / ∂ w 和
∂C0/∂b ∂ C 0 / ∂ b 可以通过反向传播进行计算,我们看到其实计算规范化代价函数的梯度是很简单的:仅仅需要反向传播,然后加上
λnw λ n w 得到所有权重的偏导数。而偏置的偏导数没有变化,所以偏置的梯度下降学习规则不会发生变化:
b→b−η∂C0∂b(5) (5) b → b − η ∂ C 0 ∂ b
权重的学习规则就变成:
w→w−η∂C0∂w−ηλnw=(1−ηλn)w−η∂C0∂w(6) (6) w → w − η ∂ C 0 ∂ w − η λ n w = ( 1 − η λ n ) w − η ∂ C 0 ∂ w
除了多添加了一个因子
1−ηλn 1 − η λ n 调整权重
w w ,上式和通常的梯度下降学习规则相同。这种调整权重的方法有时被称为权重衰减}(weight-decay),因为它使得权重变小。粗看,这样会导致权重会不断下降到
0 0 ,但实际不是这样的,
∂C0∂w ∂ C 0 ∂ w 可能会让权重增加。
好了,这就是梯度下降工作的原理。
那么随机梯度呢?正如在没有规则化的随机梯度下降中,我们可以通过平均 m m 个训练样本的小批量数据来估计 ∂C0/∂w ∂ C 0 / ∂ w 。随机梯度下降的规范化学习规则就变成
w→(1−ηλn)w−ηm∑x∂Cx∂w(7) (7) w → ( 1 − η λ n ) w − η m ∑ x ∂ C x ∂ w
其中后一项是在训练样本的小批量数据
x x 上进行的,而
Cx C x 是对每个训练样本的(无规范化的)代价。这其实和之前通常的随机梯度下降的规则是一样的,除了有一权重下降因子
1−ηλn 1 − η λ n 。最后,为了完整,给出偏置的规范化学习规则。这当然是和我们之前的非规范化的情形一致了
b→b−ηm∑x∂Cx∂b(8) (8) b → b − η m ∑ x ∂ C x ∂ b
这⾥求和也是在训练样本的⼩批量数据
x x 上进⾏的。
测试
两种方案:
- ReLU激活函数+均方误差代价函数+L2规则化
- Sigmoid激活函数+交叉熵代价函数+L2规则化
第一种方案的的一个测例:epoch = 100, mini_batch_size = 100, eta = 1(学习速率), lamda = 5(lambda是关键词),网络结构 = [784,30,50,10]
最高识别率97.6%,加入规则化后能提高1%的识别率
第二种方案的的一个测例:epoch = 100, mini_batch_size = 100, eta = 1(学习速率), lamda = 5(lambda是关键词),网络结构 = [784,30,50,10]
提升效果有限,但是未达到97.5%
下面是利用 Michael Nielsen 的程序中network2进行的测试,epoch = 30, mini_batch_size = 10, eta = 0.5(学习速率), lamda = 5(lambda是关键词),网络结构 = [784,30,10]
下面是利用 Michael Nielsen 的程序中network2进行的测试,epoch = 100, mini_batch_size = 100, eta = 1 (学习速率), lamda = 5(lambda是关键词),网络结构 = [784,30,10]
本节代码可以在这里下载到。