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


    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;

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

  • 相关阅读:
    写在博客前面
    JavaAPI学习(一):API && String类 && Stringbuffer && StringBuilder
    Java面向对象(七):Object类 & 内部类 & 单例模式
    Java面向对象(六):抽象方法 & 接口 & 递归
    Java面向对象(五):OOP三大特性之多态 — final 关键字
    Java面向对象(四):OOP三大特性之封装与继承
    Java面向对象(三):Java权限修饰符—static关键字
    Java面向对象(二):成员变量—OOP中的内存管理—构造函数
    Java面向对象(一):方法—初识面向对象
    JavaSE学习(六):随机数—简单的排序算法
  • 原文地址:https://www.cnblogs.com/orangecyh/p/11810840.html
Copyright © 2020-2023  润新知