提要
Regularization
Regularization的目标是防止过拟合(overfitting)。在logic regression中,最常见的方法是L2 Normalization。在神经网络中,L2方法不是那么常见,我们经常采用的是dropout。
L1 / L2 Norm
所谓L1,是指用所有weights(不包含bias)的绝对值之和最为惩罚函数。所谓L2,是指用所有weights的平方和作为惩罚函数。下面以L2 Normalization为例。
JL2=Jorigin+λ∑l,i,jw2l,i,j∂JL2∂wl,i,j=∂Jorigin∂wl,i,j+2λwl,i,j
通过合理的选择λ,可以有效的限制模型的复杂度(避免出现过大的权重),从而达到避免过拟合的效果。
dropout
Dropout是一种更新更常用的Regularization方法。Dropout的意思是在选定层中,每个mini-batch随机的把一部分节点屏蔽掉,使其不参与运算。一般我们会给定一个Keep probability(pk),从而控制有多少的节点被屏蔽掉。
Dropout layer的正向运算如下
S=X×W+bY=f(X)∘Mpk
其中,M是一个跟
dS=dY∘M∘f′(X)dX=dS×wT
由于dropout的目的在于降低训练阶段的过拟合,所以在inference的过程中我们只需要将pk设为1就可以关闭dropout。
代码
class dropout_layer(object):
def __init__(self, cfg=dict()):
self.cfg = cfg
def forward(self, x):
return self.dropout_vector(x, ff=True)
def backward(self, x, gy):
return self.dropout_vector(gy, ff=False)
def dropout_vector(self, x_, ff=True):
if self.cfg['keep_prob'] == 1:
return x_
x = np.copy(x_)
if ff:
self.dropmask = np.random.rand(*x.shape) < self.cfg['keep_prob']
x *= self.dropmask.astype('int') / self.cfg['keep_prob']
return x