深度学习笔记(七):正则化

正则化

在上次笔记中,提到了过拟合,如何解决过拟合呢,其中正则化就是常见的减少过拟合的方法。其中常见的两种正则化方法分别是L2和L1正则化。

L2正则化

定义及公式介绍

L2正则化又叫做weight decay(权重下降),顾名思义,让神经网络尽可能学习比较小的权重。

拿之前的损失函数:交叉熵(cross-entropy)来举例子,原始的交叉熵损失函数公式和经过L2正则化后的cross-entropy公式如下(1)(2):

(1) C = − 1 n ∑ x j [ y j ln ⁡ a j L + ( 1 − y j ) ln ⁡ ( 1 − a j L ) ] . C = -\frac{1}{n} \sum_{xj} [ y_j \ln a^L_j+(1-y_j) \ln(1-a^L_j)].\tag{1} C=n1xj[yjlnajL+(1yj)ln(1ajL)].(1)
(2) C = − 1 n ∑ x j [ y j ln ⁡ a j L + ( 1 − y j ) ln ⁡ ( 1 − a j L ) ] + λ 2 n ∑ w w 2 . C = -\frac{1}{n} \sum_{xj} [ y_j \ln a^L_j+(1-y_j) \ln (1-a^L_j)] + \frac{\lambda}{2n} \sum_w w^2. \tag{2} C=n1xj[yjlnajL+(1yj)ln(1ajL)]+2nλww2.(2)

可以发现,我们在原来的损失函数添加了一项 λ 2 n ∑ w w 2 \frac{\lambda}{2n}\sum_w w^2 2nλww2 ,也就是加上了神经网络所有权重的平方和乘上 λ 2 n \frac{\lambda}{2n} 2nλ
其中λ是一个大于0的数,n表示训练集包含实例个数

对于二次损失函数,我们也可以使用类似的方法进行L2正则化,原始函数和正则化后的函数分别如公式(3)(4):
(3) C = 1 2 n ∑ x ∥ y − a L ∥ 2 C = \frac{1}{2n} \sum_x \|y-a^L\|^2 \tag{3} C=2n1xyaL2(3)
(4) C = 1 2 n ∑ x ∥ y − a L ∥ 2 + λ 2 n ∑ w w 2 . C = \frac{1}{2n} \sum_x \|y-a^L\|^2 + \frac{\lambda}{2n} \sum_w w^2. \tag{4} C=2n1xyaL2+2nλww2.(4)

所以L2正则化就是对损失函数添加一项:
(5) C = C 0 + λ 2 n ∑ w w 2 C = C_0 + \frac{\lambda}{2n}\sum_w w^2 \tag{5} C=C0+2nλww2(5)
其中 C 0 C_0 C0为原始的损失函数, λ 2 n ∑ w w 2 \frac{\lambda}{2n}\sum_w w^2 2nλww2为L2正则化项。

因为我们神经网络的学习是为了降低损失函数Cost(最小化Cost),所有从公式可以看出,添加正则化项偏向让神经网络学习更小的权重(因为我们已经把权重的平方和当做Cost函数的一部分了)。
可以看出公式中的 λ \lambda λ是调整公式中的 C 0 C_0 C0 λ 2 n ∑ w w 2 \frac{\lambda}{2n}\sum_w w^2 2nλww2这两项的比重,当 λ \lambda λ比较小的时候,倾向于让 C 0 C_0 C0最小化, λ \lambda λ比较大的时候倾向于使权重之和最小化。

对于公式(5),对权重和偏向分别求偏导:
(6) ∂ C ∂ w = ∂ C 0 ∂ w + λ n w \frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} + \frac{\lambda}{n} w \tag{6} wC=wC0+nλw(6)
(7) ∂ C ∂ b = ∂ C 0 ∂ b . \frac{\partial C}{\partial b} = \frac{\partial C_0}{\partial b}. \tag{7} bC=bC0.(7)
对于单个输入实例,可以发现对偏向求偏导与之前更新法则没有区别。而权重的更新法则发生了改变:
(8) w → w − η ∂ C 0 ∂ w − η λ n w = ( 1 − η λ n ) w − η ∂ C 0 ∂ w . w \rightarrow w-\eta \frac{\partial C_0}{\partial w}-\frac{\eta \lambda}{n} w = \left(1-\frac{\eta \lambda}{n}\right) w -\eta \frac{\partial C_0}{\partial w}. \tag{8} wwηwC0nηλw=(1nηλ)wηwC0.(8)

权重更新公式的第一项多乘了 ( 1 − η λ n ) (1-\frac{\eta \lambda}{n}) (1nηλ),这是一个小于1大于0的数,相当于把 w w w缩小了。

注意我们选择 λ \lambda λ的值跟训练集实例的个数有关,当我们增加训练集实例个数,我们也需要相应的增加 λ \lambda λ的值

实验

隐藏层: 30个神经元, mini-batch size: 10, 学习率: 0.5,损失函数使用 cross-entropy

>>> import mnist_loader 
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper() 
>>> import network2 
>>> net = network2.Network([784, 30, 10], cost=network2.CrossEntropyCost)
>>> net.large_weight_initializer()
>>> net.SGD(training_data[:1000], 400, 10, 0.5,
... evaluation_data=test_data, lmbda = 0.1,
... monitor_evaluation_cost=True, monitor_evaluation_accuracy=True,
... monitor_training_cost=True, monitor_training_accuracy=True)

Cost函数变化情况
这里写图片描述
准确性的变化情况
这里写图片描述
可以发现准确性一直在提高。在之前的实验中,在迭代次数变大的情况下,准确性出现不变甚至减少的情况,而添加了L2正则化项,准确性总体趋势一直在提高。

L1正则化

正则化Cost函数:
(9) C = C 0 + λ n ∑ w ∣ w ∣ C = C_0 + \frac{\lambda}{n} \sum_w |w| \tag{9} C=C0+nλww(9)
求偏导:
(10)   ∂ C ∂ w = ∂ C 0 ∂ w + λ n   s g n ( w ) , \ \frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} + \frac{\lambda}{n} \, {\rm sgn}(w), \tag{10}  wC=wC0+nλsgn(w),(10)

公式中的 s g n ( w ) \rm{sgn}(w) sgn(w)表示 w w w的符号,如果是正的相当于+1,是负的相当于-1

权重的更新公式变为:
(11) w → w ′ = w − η λ n s g n ( w ) − η ∂ C 0 ∂ w , w \rightarrow w' = w-\frac{\eta \lambda}{n} \rm{sgn}(w) - \eta \frac{\partial C_0}{\partial w}, \tag{11} ww=wnηλsgn(w)ηwC0,(11)

对比L2正则化权重更新公式:
(12) w → w ′ = w ( 1 − η λ n ) − η ∂ C 0 ∂ w . w \rightarrow w' = w\left(1 - \frac{\eta \lambda}{n} \right) - \eta \frac{\partial C_0}{\partial w}. \tag{12} ww=w(1nηλ)ηwC0.(12)

L1倾向于集中在少部分重要的连接上

解释:当 w = 0 w=0 w=0, 偏导数 ∂ C ∂ w \frac{∂C}{∂w} wC无意义, 因为 ∣ w ∣ |w| w的形状在 w = 0 w=0 w=0时是一个V字形尖锐的拐点. 所以, 当w=0时,sgn(0) = 0,相当于使用了un-regulazied表达式. 本来regularization的目的就是减小权重, 当 w = 0 w=0 w=0,无需减少。

L1和L2正则化的区别

都是减小权重, 方法不同:

  1. L1减少一个常量, L2减少权重的一个固定比例
  2. 如果权重本身很大, L1减少的比L2少很多
  3. 如果权重本身很小, L1减少的更多

总结

正则化倾向于让神经网络学习更小的权重,输入实例X的随机变化不会对神经网络模型造成太大的影响,一些局部的噪声对神经网络的影响就比较小了,减少overfitting发生的概率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值