本文来源于网易云课堂
dropout正则化
除了L2正则化,还有一个非常实用的正则化方法-dropout(随机失活)。
假设你在训练如图这样的神经网络,它存在过拟合。dropout会遍历网络的每一层,并设置消除神经网络中节点的概率。假如以抛硬币的方式设置概率,即概率为0.5,那么就会有一些节点被删除,如图所示。
删除从节点进出的连线,得到一个样本精简后的网络。对于其他样本,我们照旧以抛硬币的方式设置概率,并得到精简的网络。这种方法可能有点怪,什么都是随机的,但是它的确有效。
如何实现dropout?
使用最多的就是invert dropout方法。
以3层的网络,keep_prob = 0.8为例:
#创建一个随机布尔矩阵d3,大于0.8的为false
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)
a3 /= keep_prob
第三行是什么意思呢?假设第3隐层上有50个单元,保留和删除它们的概率分别是80%和20%,也就是平均与10个单元删除。对于
Z[4]=W[4]∗a[3]+b[4]
Z
[
4
]
=
W
[
4
]
∗
a
[
3
]
+
b
[
4
]
,由于a3减少了20%,为了不影响z4的期望值,我们用其除以0.8,他会弥补损失使得期望值不会变。
事实证明,在测试阶段使用dropout方法使得测试阶段变得更容易。
归一化输入
训练神经网络时,一种加速训练的方法是归一化输入(normalize)。
怎么实现归一化?
假如输入
x
x
有2个特征,
,给出散点图(scatter)如下:
归一化过程有2个步骤:
- 零均值化
- 归一化方差
零均值化是指求出平均值
μ=1m∑mi=1x(i)
μ
=
1
m
∑
i
=
1
m
x
(
i
)
后将数据集移动直到
x=x−μ
x
=
x
−
μ
。
归一化方差的过程如下:
- 求方差:
σ2=1m∑mi=1x(i)2
σ
2
=
1
m
∑
i
=
1
m
x
(
i
)
2
- 归一化:
x/=σ2
x
/
=
σ
2
从图中可以看到,x1的方差要比x2的方差大得多,因为方差是衡量数据离散程度的度量。经过归一化以后,x1和x2的方差都会等于1.
Tips:如果你用它来调整训练数据,那么用相同的 μ μ σ2 σ 2 来归一化测试集,尤其是你不希望训练集和测试集的归一化有所不同,因为我们希望不管是训练数据还是测试数据,都是通过相同的 μ μ σ2 σ 2 定义的相同数据转换,其中 μ μ σ2 σ 2 是由训练集计算得来的。
为什么归一化?
对于损失函数
J(w,b)=1m∑m(i=1)L(y^(i),y(i))
J
(
w
,
b
)
=
1
m
∑
(
i
=
1
)
m
L
(
y
^
(
i
)
,
y
(
i
)
)
,如果不使用归一化,代价函数很可能是下图一样的狭窄的函数,因为可能w的范围很大,如(1-1000),而b的范围很小,如(0-1)。如果画出代价函数的部分轮廓,它会是一个狭长的函数。如果使用梯度下降法,那么就必须使用很小的学习率,就像下图蓝色线画的一样,需要经过多次迭代才能找到最小值。
如果归一化后,代价函数看起来更对称,轮廓更圆,不论从哪个地方开始梯度下降,总能更快的找到最小值。
尽管实际上w是高维的,不能用二维表示,但总的理解就是代价函数更圆一些就更容易优化,前提是w和b都在相似范围之内。假如输入x1:(0-1),x2:(1-2);x3:(-1-1),因为他们是相似的范围,那么即使不用归一化他们也可以表现的很好。