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


    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))
  • 相关阅读:
    Java垃圾回收机制
    Mybatis 通用 Mapper 和 Spring 集成
    MyBatis:SQL语句中的foreach的详细介绍
    PageHelper补充
    Mybatis分页插件PageHelper
    定时任务
    权限框架Apache Shiro 和 Spring Security
    Navicat操作数据库时一直显示加载中
    BigDecimal使用中的一些注意事项
    WPF应用程序嵌入第三方exe
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/9699157.html
Copyright © 2020-2023  润新知