神经网络可能会存在过拟合,那么建议你首先对模型进行正则化处理。虽然使用更多的训练数据是肯定可以解决过拟合问题的,但问题是我们无法获得更多训练数据,即使能获取也太贵了。所以正则化是首选方案。
正则化方法有很多。L2正则化就是其中一种常见的方法。它的实现主要分为两步。第一步,就是在成本函数后面加点“尾巴”;第二步就是在计算偏导数的时候加点“尾巴”。我们以逻辑回归为例来实现L2正则化,求成本函数J的最小值,
J
=
1
m
∑
i
=
0
m
L
(
y
′
i
,
y
i
)
J=\frac{1}{m}\sum_{i=0}^mL(y'^i,y^i)
J
=
m
1
∑
i
=
0
m
L
(
y
′
i
,
y
i
)
下式是加了L2正则化尾巴的成本函数。
J
=
1
m
∑
i
=
0
m
L
(
y
′
i
,
y
i
)
+
λ
2
m
∣
∣
w
∣
∣
2
J=\frac{1}{m}\sum_{i=0}^mL(y'^i,y^i)+\frac{\lambda}{2m}||w||^2
J
=
m
1
∑
i
=
0
m
L
(
y
′
i
,
y
i
)
+
2
m
λ
∣
∣
w
∣
∣
2
它是我们定义的成本函数,参数包含一些训练数据和不同数据中个体预测的损失,w和b是逻辑回归的两个参数,w是一个多维度参数矢量,b是一个实数,λ是一个超参数,被称为正则化参数,m是样本数量。
上面所说的是单神经元网络的正则化,多神经元网络的正则化也是类似的。
J
=
1
m
∑
i
=
0
m
L
(
y
′
i
,
y
i
)
+
λ
2
m
∑
l
=
0
L
∣
∣
w
∣
∣
2
J=\frac{1}{m}\sum_{i=0}^mL(y'^i,y^i)+\frac{\lambda}{2m}\sum_{l=0}^L||w||^2
J
=
m
1
∑
i
=
0
m
L
(
y
′
i
,
y
i
)
+
2
m
λ
∑
l
=
0
L
∣
∣
w
∣
∣
2
与单神经元网络不同的是多了一个累加操作,就是把每层的结果再累加起来。通俗来说就是把神经元网络每层的每个权重的平方再统统累加起来(单神经元网络只有一层)。这里的W已经从一个向量变成了矩阵,但本质是没有变的,还是简单地将所有元素的平方累加起来,即所有元素的平方和。
在成本函数后面加了“尾巴”后,第二步就是在计算偏导数的时候加“尾巴”了。如下所示。
d
W
l
=
1
m
d
Z
l
∗
d
A
l
−
1
.
T
+
λ
m
W
l
dW^l=\frac{1}{m}dZ^l * dA^{l-1}.T+\frac{\lambda}{m}W^l
d
W
l
=
m
1
d
Z
l
∗
d
A
l
−
1
.
T
+
m
λ
W
l
W
l
=
W
l
−
α
∗
d
W
l
=
(
1
−
α
λ
m
)
W
l
−
1
m
d
Z
l
∗
d
A
l
−
1
.
T
W^l=W^l-\alpha *dW^l=(1-\frac{\alpha\lambda}{m})W^l -\frac{1}{m}dZ^l * dA^{l-1}.T
W
l
=
W
l
−
α
∗
d
W
l
=
(
1
−
m
α
λ
)
W
l
−
m
1
d
Z
l
∗
d
A
l
−
1
.
T
加了尾巴之后,实际上,相当于我们给矩阵W乘以(1-a λ/m)倍的权重,矩阵W减去α λ/m倍的它,也就是用这个系数(1-a λ/m)乘以矩阵W,该系数小于1,因此L2范数正则化也被称为“权重衰减。
那么为什么L2正则化有利于防止过拟合?
直观上理解就是,如果正则化λ设置得足够大,权重矩阵W被设置为接近于0的值,直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,这个神经网络就变成了很简单的网络了,所以就避免了过拟合,当然有时候反而会导致了欠拟合。
上面说权重为0后就变成了简单的神经网络,这只是便于大家理解所说的极端的话。其它的神经元还是起作用的。如果不起作用,那我们为什么要用大型神经网络呢,还不如直接用个小点的神经网络。
另外还有一点需要说明一下。上面我们只对参数w做了衰减。那为什么不对b也作衰减呢。因为神经网络中w的数量很多,而b一个神经元只有一个,数量很少。所以我们一般懒得去衰减它,因为影响力太小。