zoukankan      html  css  js  c++  java
  • 跟我学算法-吴恩达老师(偏差方差,正则化,正则化输入,梯度消失和爆炸,梯度检测)

    1.训练样本的分布

    交叉验证指的是训练集和验证集,为了防止在训练过程中受到部分训练样本的影响

    一般当样本数目较少时,采用60/20/20的比例,60%的训练集,20%的验证集,20%的测试集
    当样本数目较大时,一般可以采用2.5%的验证集和1%的测试集,其他都是训练样本。

    很多情况下,我们会不适用测试集,这样的训练集叫做训练验证集

    2.偏差和方差

    当在训练集的准确度很高,在验证集或者测试集的准确度很差时,称为过拟合,即高方差

    当在训练集的准确度很差时,称为欠拟合,即高偏差

    一般较好的都是训练集的错误率在0.5%,测试集或者验证集的1% 

    高偏差的解决方法,采用更加大的神经网络进行训练

    高方差的解决方法,使用更多的数据进行训练,提高模型的泛化能力,或者就添加正则化,防止过拟合的情况出现

    3.正则化

    L2 regulation 正则化:

       加上 dw = (from backpop) + λ/m*w 

       w[l] = w[l] - dw * a   a表示学习率

       当λ 很大时, w[l]会变得很小

       Z[l] = w[l]*A[l-1] +b[l]

       当Z趋于很小时,tanh(Z)的值处于一个较小值,这个时候的方程趋于线性,防止了过拟合状况的出现

    dropout 正则化

       在参数进行更新时,随机的关闭一部分的神经元

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

       a3 = np.multiply(a3, d3)

       a3 / = keep-prob  保证期望值不变

       dropout 会压缩权重,导致每个神经元的权重都接近,在我们查看损失函数的时候,一般都会先关闭dropout

    import numpy as np
    
    a=[np.random.random() for x in range(6)]
    
    temp=(np.random.random()>0.5 for x in range(np.shape(a)[0]))
    temps = []
    for i in temp:
        temps.append(i)
    
    a = np.multiply(a, temps)

    其他正则化方法

        数据扩增:水平翻转图片,进行随意的裁剪,

        采用Eealy stop ,当损失函数的值出现多次上升时,停止迭代,取第一次上升时的前一次的参数

    4.正则化输入
         对样本参数采用归一化输入
                    首先去均值,使得数据的均值为0 

                    然后处于样本的方差,使得样本的均值为0,方差为1, 可以使得各个参数的分布都处于一个接近的范围内

    5.梯度消失或梯度爆炸

          当g(Z) = Z 

          y = X * w[1]*w[2]*w[3]*w[4].....

          当W[l]>1时,深度很深时, 激活函数以指数上升就会出现梯度爆炸

          当W[l] < 1时,深度很深时, 激活函数以指数下降就会出现梯度消失
    .梯度消失或梯度下降的初步解决方法

          神经网络权重初始化

          w[l] = np.random.randn(shape) * np.sqrt(2/n[l-1])  n[l-1] 表示当前层神经元的个数

    6. 梯度检验

        使用双边误差做梯度检验, 确保backpop正确

       对参数进行梯度检测

             dθapper[i] = (J(θ1, θ2, ...θi+ξ, ) -  J(θ1, θ2, ...θi-ξ, )) / 2

       check = (dθapper[i] - dθ) / (dθapper[i] + dθ) =10-7 

    可以检测神经网络的错误

    import numpy as np
    
    def sigmoid(z):
        return 1./(1+np.exp(-z))
    
    # 定义dA/dz函数的导数
    def sigmoid_prime(z):
        return sigmoid(z) * (1-sigmoid(z))
    
    
    def check_gradient(f, x0, epsilon):
        return (f(x0+epsilon) - f(x0-epsilon)) / 2.0 / epsilon
    
    
    
    x0 = np.array([1, 2, 3])
    epsilon = 1e-4
    print(sigmoid_prime(x0))
    print(check_gradient(sigmoid, x0, epsilon))
  • 相关阅读:
    Spring基础知识
    Hibernate基础知识
    Struts2基础知识
    在eclipse里头用checkstyle检查项目出现 File contains tab characters (this is the first instance)原因
    java后台获取cookie里面值得方法
    ckplayer 中的style.swf 中的 style.xml 中的修改方法
    java hql case when 的用法
    Windows下Mongodb安装及配置
    Mongodb中经常出现的错误(汇总)child process failed, exited with error number
    Mac 安装mongodb
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/9699157.html
Copyright © 2011-2022 走看看