改善深层神经网络(一)深度学习的实用层面

1、L 层神经网络正则化:

(1)L2 正则化:

 

(2)为什么正则化可以避免过拟合?

 当 lambda 足够大时,最小化 J 时,就会使得权重矩阵 w 趋近于0,神经网络简化为高偏差状态:

 lambda 较大,w 较小,由 z = w * a + b,z 也较小,以 tanh 函数为例:

当 z 在较小的阶段,函数 g(z) 趋近于线性. 如果每一层都趋近线性,该网络为线性网络,不会产生过拟合的情况.

 

(3)dropout正则化(随机失活):

 神经网络的每一个节点都含有 p 的概率失活,如下图:

 

简化连线,得到一个节点更少,规模更小的网络:

实现代码如下:

对于第3层进行随机失活,keep_prob = 0.8(保留某个隐藏单元的概率,即消除一个隐藏单元的概率为0.2),不同层的keep_prob可以不同.

d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob

a3 = np.multiply(a3, d3)  #过滤掉失活的节点

a3 = a3 / keep_prob  #弥补过滤掉的20%,使得 a3 的期望值不变

 

(4)其它正则化方法:

① 扩大数据集;

② 提早结束迭代:

 

 

(5)正则化输入:

① 零均值化:

μ = 1 / m * ∑x(i)

x = x - μ

 

② 方差归一化:

σ² = 1 / m * ∑(x(i)

x = x / σ²

③ 为什么要正则化输入?

非正则化的输入可能导致代价函数的图像偏于细长,如 x1 的取值1-1000,而 x2 的取值仅有0-1. 正则化输入后,代价函数看起来更对称.

下图可以看到非正则化的梯度下降较为曲折,而正则化的梯度下降较快. 

 

2、Vanishing / Exploding gradients(梯度消散与梯度爆炸):

(1)举例描述:

 

假设:g(z) = z; b[l] = 0.

y = w[L]w[L-1]w[L-2] ... w[2]w[1]x

 

(2)解决方案:权重初始化

由 z = w1x1 + w2x2 + ... + wnxn

随着 n 的增大,期望的 w[l] 越小,由此设置 Var(w[l]) = 1/n 或者 2/n(效果更好),即:

w[l] = np.random.randn(shape) * np.sqrt(2/n[l-1])

 

3、梯度检验:

(1)梯度的数值逼近:

双边误差公式更准确,可以用来判断 g(θ) 是否实现了函数 f 的偏导.

 

(2)神经网络的梯度检验:

① 将 W[1],b[1],...,W[L],b[L] 从矩阵转为一个向量 θ;

② 将 dW[1],db[1],...,dW[L],db[L] 从矩阵转为一个向量 dθ;

③ J = J(θ1, θ2, ..., θi, ...)

for each i :

  dθapprox[i] = (J(θ1, θ2, ..., θ+ ε, ...) - J(θ1, θ2, ..., θ- ε, ...)) / (2 * ε)

  check dθapprox[i] ≈ dθ[i] by calculate || dθapprox[i] - dθ[i] ||2  / (|| dθapprox[i] ||2 + || dθ[i] ||2)  < 10^-7(或其他误差阈值)

 

(3)梯度检验注意点:

① 检测完关闭梯度检验;

② 检查是否完成了正则化;

③ 不适用于dropout;

④ 检查是否进行了随机初始化.

posted @ 2019-11-08 22:30  橙同学的学习笔记  阅读(529)  评论(0编辑  收藏  举报