归一化
跟特征缩放很像,在之前的机器学习课程中我们也用过很多次了。主要作用就是将特征值的取值范围都变换成一个以原点为圆心的高维球体,求出每个样本的均值向量
μ
\mu
μ与标准差向量
σ
\sigma
σ,即
μ
=
1
m
∑
i
=
1
m
x
(
i
)
σ
2
=
1
m
∑
i
=
1
m
(
x
(
i
)
−
μ
)
2
\mu=\frac{1}{m}\sum_{i=1}^mx^{(i)}\\ \sigma^2=\frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)^2
μ=m1i=1∑mx(i)σ2=m1i=1∑m(x(i)−μ)2
之后,令
x
:
=
x
−
μ
σ
x:=\frac{x-\mu}{\sigma}
x:=σx−μ就完成归一化了。
权值初始化
在深度神经网络中,有时会出现梯度爆炸/消失问题,这是因为在很深的网络中,从一段传播到另一端时会累乘许多个权值,即使权值矩阵都只比单位矩阵大一点或者小一点,在累乘出来以后依旧会指数增长变成一个很大或很小的值,对于梯度来说同理,这就是梯度爆炸/消失问题。
合理的初始化能够较有效地缓解这种问题,我们可以看到传播过程中有正向传播
A
[
l
]
=
σ
(
Z
[
l
]
)
=
σ
(
W
[
l
]
A
[
l
−
1
]
+
b
[
l
]
)
A^{[l]}=\sigma(Z^{[l]}) =\sigma(W^{[l]}A^{[l-1]}+b^{[l]})
A[l]=σ(Z[l])=σ(W[l]A[l−1]+b[l])
可以看到,向该层传递的节点数(即上一层节点数
n
[
l
−
1
]
n^{[l-1]}
n[l−1])越多,得到的
Z
[
l
]
Z^{[l]}
Z[l]值就越可能偏大,反之则越可能偏小,所以我们将权值初始化为均值为0,方差为
C
n
[
l
−
1
]
\frac{C}{n^{[l-1]}}
n[l−1]C的正态分布,以此让计算值的大小尽可能适中,其中常数
C
C
C在使用ReLU函数作为激励函数时一般取2,使用逻辑函数或者
tanh
\tanh
tanh函数时一般取1。
梯度检验
跟机器学习中是一回事,不过新增了一个衡量标准,对于反向传播计算出的梯度向量
d
θ
d\theta
dθ和用导数定义近似计算出的梯度向量
d
θ
approx
d\theta_\text{approx}
dθapprox,我们计算
∣
∣
d
θ
approx
−
d
θ
∣
∣
2
∣
∣
d
θ
approx
∣
∣
2
+
∣
∣
d
θ
∣
∣
2
\frac{||d\theta_\text{approx}-d\theta||_2}{||d\theta_\text{approx}||_2+||d\theta||_2}
∣∣dθapprox∣∣2+∣∣dθ∣∣2∣∣dθapprox−dθ∣∣2其中
∣
∣
x
⃗
∣
∣
2
||\vec{x}||_2
∣∣x∣∣2为欧几里得度量。
当 ε = 1 0 − 7 \varepsilon=10^{-7} ε=10−7时,若上面的值小于 1 0 − 7 10^{-7} 10−7,则认为我们的计算正确。若该值数量级在 1 0 − 5 10^{-5} 10−5,需要仔细检查。若在 1 0 − 3 10^{-3} 10−3,则可以认为算法写挂了。