精华内容
下载资源
问答
  • 深度学习中 --- 解决过拟合问题(dropout, batchnormalization)

    深度学习中 --- 解决过拟合问题(dropout, batchnormalization)

    参考文章:

    (1)深度学习中 --- 解决过拟合问题(dropout, batchnormalization)

    (2)http://www.cnblogs.com/jimmyty/p/5576951.html


    备忘一下。


    展开全文
  • Dropout为什么解决过拟合: (1)取平均的作用:先回到标准的模型即没有 dropout,我们用相同的训练数据去训练 5 个不同的神经网络,一般会得到 5 个不同的结果,此时我们可以采用 “5 个结果取均值” 或者 “多数...

    Dropout为什么解决过拟合:

    (1)取平均的作用: 先回到标准的模型即没有 dropout,我们用相同的训练数据去训练 5 个不同的神经网络,一般会得到 5 个不同的结果,此时我们可以采用 “5 个结果取均值” 或者 “多数取胜的投票策略” 去决定最终结果。例如 3 个网络判断结果为数字 9, 那么很有可能真正的结果就是数字 9,其它两个网络给出了错误结果。这种 “综合起来取平均” 的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些 “相反的” 拟合互相抵消。dropout 掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个 dropout 过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为 “反向” 的拟合相互抵消就可以达到整体上减少过拟合。

    (2)减少神经元之间复杂的共适应关系: 因为 dropout 程序导致两个神经元不一定每次都在一个 dropout 网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看 dropout 就有点像 L1,L2 正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

    (3)Dropout 类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

     

    Dropout的缺点:

    (1)dropout 的一大缺点是成本函数无法被明确定义。因为每次迭代都会随机消除一些神经元结点的影响,因此无法确保成本函数单调递减。

    (2)明显增加训练时间,因为引入 dropout 之后相当于每次只是训练的原先网络的一个子网络,为了达到同样的精度需要的训练次数会增多。dropout 的缺点就在于训练时间是没有 dropout 网络的 2-3 倍

     

    参考:

    https://zhuanlan.zhihu.com/p/38200980

    https://www.cnblogs.com/nxf-rabbit75/p/10546691.html

     

    展开全文
  • 什么是过拟合? 一幅图胜千言万语 欠拟合 正确的拟合 ...过拟合 ...怎么解决过拟合呢? L2正则化 逻辑回归中L2正则化的过程: L2正则化是最常用的正则化。 我们先求出代价方程J(w,b)为: ...

    什么是过拟合?

           一幅图胜千言万语

    欠拟合
    正确的拟合
    过拟合

           过拟合(overfitting):就是对数据的过度严格的拟合。这个经常出现在分类问题上。

    怎么解决过拟合呢?

    L2正则化

    逻辑回归 中L2正则化的过程:

           L2正则化是最常用的正则化。

           我们先求出代价方程J(w,b)为:

                                                            \large J(w,b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y}^{(i)},y^{(i))})

           L2正则化,就是在代价方程后面加个lambda/(2m)参数W范数的平方,下标2表示L2正则化的意思,2是为了接下来的求导好化简而写的,就是个比值而已:

                                                          \large J(w,b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})+\frac{\lambda }{2m}||w||_{2}^{2}

           其中\large ||w||_{2}^{2}是:

                                                          \large ||w||_{2}^{2} = \sum_{j=1}^{n_{x}}w_{j}^{2} = w^{\tau }w

           但是为啥参数W都用上了,为啥不+bias b:

                                                          \large \large J(w,b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})+\frac{\lambda }{2m}||w||_{2}^{2}+\frac{\lambda }{2m}b^{2}

           因为,b也是一个参数,而且是一个数,而W是很多个参数,感觉少了b也没啥所以一般不写上b。

           这里的\large \lambda{\color{Red} }超参数,跟学习率一样,需要我们自己设置

    神经网络 L2回归的过程:

           神经网络其实就是有大于等于1个隐藏层,也就是比逻辑回归多了参数而已:

                                                  \large J(w^{[1]},b^{[1]},...,w^{[l]},b^{[l]}) = \frac{1}{m}\sum_{i=1}^{n}L(\hat{y}^{(i)},y^{(i)})+\frac{\lambda }{2m}\sum_{l=1}^{L}||w^{[l]}||^{2}

           其中\large ||w^{[l]}||^{2}为:

                                                                                 \large ||w^{[l]}||^{2} = \sum_{i=1}^{n^{[l-1]}}\sum_{j=1}^{n^{[l]}}(w_{ij}^{[l]})^{2}

           注:L-1=上一层的大小,L是当前层的大小

           该\large ||w^{[l]}||^{2}矩阵范式被称为Frobenius norm 即弗罗贝尼乌斯范数,表示为\large ||w^{[l]}||_{F}^{2},即:\large ||\cdot ||_{2}^{2} \;\; \; \;\; \; ||\cdot ||_{F}^{2}

           这个矩阵L2范式,也叫弗罗贝尼乌斯范数

    求导:

           没有L2正则化以后,导数是这样的,[from backprop: 从反馈传播求得的]:

                                                                               \large dw^{[l]} = (from\; \; backprop)

                                                                                    \large w^{[l]} := w^{[l]} - \alpha dw^{[l]}

           而现在有了L2正则以后,就变成了:

                                                                  \large w^{[l]}:=w^{[l]}-\alpha [(from\; \; backprop)+\frac{\lambda }{m}w^{[l]}]

                                                                            \large =w^{[l]}-\frac{\alpha \lambda }{m}w^{[l]}-\alpha (from\; \; backprop)

           其中可以看出和上面的原本的W^[L]比,缩小成了下面的倍数(其中alpha>1):\large (1-\frac{\alpha \lambda }{m})

           这个W的缩小的变化使得L2正则化被称为“权重衰退”。

    有L2正则化就有L1正则化,但是为啥不用呢?

           L1正则化的||W||为:

                                                                                       \large \frac{\lambda }{2m}\sum_{i=1}^{n_{x}}|w| = \frac{\lambda }{2m}||w||_{1}

           L1的正则化的||W||会使得W最终变得稀疏,也就是有很多0出现,有助于压缩参数和减小内存,但这也不是我们用L1正则化的目的,不是为了压缩模型。(这个斜体加粗的话我还没弄懂为啥会出现很多0,知道的小伙伴分享下)

    Dropout

           Dropout有很多,其中Inverted Dropout 反向随机失活最常用。根据这个翻译的意思,也能大概猜出来Inverted Dropout的意思,也就是从后面随机使一些当前层的神经单元失效。

           上图说话:

           没Dropout前的网络为:

           开始Dropout操作:

            注释:红叉的单元是被去除的,也就是该单元权重置为0。

            这个dropout操作是从最后一层开始的,首先需要设置一个值,keep_prob,就是保留多少,范围0-1。这个例子很明显是0.5。然后在从后往前经过每一层,都把当前层随机流线keep_prob的比例,其他的单元的权重置为零。

            代码模拟实现为:

            感谢Andrew Ng的视频!


    更多精彩内容,请关注

    深度学习自然语言处理 公众号,就是下方啦!跟随小博主,每天进步一丢丢!哈哈!

    展开全文
  • 过拟合的了解:线性问题中的过拟合,分类问题的中过拟合 防止过拟合: 1.增加数据集,2.正则化方法 3.Dropout 正则化:就是在代价函数后增加正则项 Dropout:神经元的随机失活 tensorflow中屏蔽输出的log...

    过拟合的了解:线性问题中的过拟合,分类问题的中过拟合

    防止过拟合: 1.增加数据集,2.正则化方法 3.Dropout

    正则化:就是在代价函数后增加正则项

    代价函数后增加正则项

    Dropout:神经元的随机失活


    tensorflow中屏蔽输出的log信息方法
    TF_CPP_MIN_LOG_LEVEL 取值 00也是默认值,输出所有信息
    TF_CPP_MIN_LOG_LEVEL 取值 1 : 屏蔽通知信息
    TF_CPP_MIN_LOG_LEVEL 取值 2 : 屏蔽通知信息和警告信息
    TF_CPP_MIN_LOG_LEVEL 取值 3 : 屏蔽通知信息、警告信息和报错信息
    
    import tensorflow as tf
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '0'
    # os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1'
    # os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    # os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    

    import tensorflow as tf
    import numpy as np
    from tensorflow.examples.tutorials.mnist import input_data
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    
    mnist = input_data.read_data_sets("MNIST_data", one_hot=True)
    batch_size = 100 
    n_batch = mnist.train.num_examples // batch_size
    
    x = tf.placeholder(tf.float32, [None, 784])
    y = tf.placeholder(tf.float32, [None, 10]) 
    keep_prob = tf.placeholder(tf.float32)  #设置dropout
    
    #我们一般不初始化为0,一般是以下的初始化,效果会好一点 ====== 并增加新的隐藏层
    W1 = tf.Variable(tf.truncated_normal([784,2000],stddev=0.1)) #截断的正太分布
    b1 = tf.Variable(tf.zeros([2000])+0.1) #b是等于w的列
    L1 = tf.nn.tanh(tf.matmul(x,W1)+b1)
    L1_drop = tf.nn.dropout(L1, keep_prob) #用tenserflow封装好的函数,keep_prob=1表示100%的工作, 在工作的时候通过placeholder传入
    #输出2000个神经元
    W2 = tf.Variable(tf.truncated_normal([2000,2000],stddev=0.1)) #截断的正太分布
    b2 = tf.Variable(tf.zeros([2000])+0.1)
    L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)
    L2_drop = tf.nn.dropout(L2, keep_prob)
    #输出1000个神经元
    W3 = tf.Variable(tf.truncated_normal([2000,1000],stddev=0.1)) #截断的正太分布
    b3 = tf.Variable(tf.zeros([1000])+0.1)
    L3 = tf.nn.tanh(tf.matmul(L2_drop,W3)+b3)
    L3_drop = tf.nn.dropout(L3, keep_prob)
    
    #输出10个神经元
    W4 = tf.Variable(tf.truncated_normal([1000,10],stddev=0.1)) #截断的正太分布
    b4 = tf.Variable(tf.zeros([10])+0.1)
    #softmax将输出转化为概率值
    prediction = tf.nn.softmax(tf.matmul(L3_drop, W4) + b4)
    
    #二次代价函数
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=prediction)) #logits预测值
    train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
    
    corrent_prediction =tf.equal(tf.argmax(y,1), tf.argmax(prediction, 1))
    accuracy = tf.reduce_mean(tf.cast(corrent_prediction, tf.float32))
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for epoch in range(31):
            for batch in range(n_batch):
                batch_xs, batch_ys = mnist.train.next_batch(batch_size)
                sess.run(train_step, feed_dict={x:batch_xs, y:batch_ys, keep_prob:0.7}) #keep_porb=1.0表示所有神经元都是工作的
                
            test_acc = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels, keep_prob:1.0})
            train_acc = sess.run(accuracy, feed_dict={x:mnist.train.images, y:mnist.train.labels, keep_prob:1.0})
            #一般都是用测试的数据来测试训练的数据,这里又用训练是数据来进行测试,看看是否出现过拟合的现状
            print('iter'+ str(epoch)+ ',Testing Accuracy' + str(test_acc),',Training Accuracy'+ str(train_acc))
    

    总结: 使用dropout,会使收敛速度变慢。

    使用dropout主要是防止过拟合的情况。用复杂的网络来训练比非常小的训练集或模型,才能看到dropout的重要性


    展开全文
  • 一、过拟合、欠拟合问题 出现过拟合的原因:在机器学习模型中,若果模型的参数太多,但训练样本又少,训练出来的模型容易产生过拟合现象,具体表现为,模型在训练数据上,损失函数较小,预测准确率较高;在测试数据...
  • Tensorflow 实现dropout解决过拟合
  • Pytorch 实现dropout解决过拟合
  • 什么是过拟合? 简单理解就是:模型在训练集上表现很好,但是放到测试集上效果就变得很差了 一般的解决方法 1.增加训练数据。但是数据一般很难获得 ...这样就有利于解决神经网络过拟合的问题 dropo
  • 进一步理解,如下图三幅图像,左边的拟合曲线不能较好地表示预测情况,右边的拟合曲线过拟合,中间的拟合曲线则是较为理想的状况。 在tensorflow中如何实现避免 overfitting 呢? tensorflow中提供了一个强大的功能...
  • 本文将介绍什么是过拟合,并采用droput解决神经网络中过拟合的问题,以TensorFlow和sklearn的load_digits为案例。本专栏主要结合作者之前的博客、AI经验和相关视频介绍,后面随着深入会讲解更多的Python人工智能案例...
  • 拟合过拟合——解决方法

    万次阅读 2019-01-19 22:11:11
    判断究模型否过拟合方法: 1.4 过拟合原因 (1)建模样本抽取错误,包括(但不限于)样本数量太少,抽样方法错误, 抽样时没有足够正确考虑业务场景或业务特点,不能有效足够代表业务逻辑或业务场景。 ...
  • Dropout解决过拟合代码

    2020-03-01 18:51:15
    权值衰减是一直以来经常被使用的一种抑制过拟合方法,。该方法可以简单地实现,在某种程度上能够抑制过拟合。但是,如果网络的模型变得很复杂,只用权值衰减就难以应对了。在这种情况下,我们经常会使用Dropout ...
  • Pytorch处理过拟合——Dropout

    千次阅读 2020-03-13 09:30:35
    过拟合,简单讲就是对过度符合训练数据,比如二维空间中拟合出的一条曲线保证了所有的训练点都在曲线上,效果就像下图所示 但是这并不一定是好的,这样训练出来的模型,只能说模型很好的符合了训练数据,并不代表...
  • 过拟合解决方法

    2019-06-30 21:20:23
    数据增强-扩展数据集 图像:平移、旋转、缩放 利用生成对抗网络(GAN)生成新数据 NLP:利用机器翻译生成新数据 降低模型复杂度 ... 神经网络:减少网络层、神经元个数 ... 神经网络:Dropout...
  • 这里用dropout来处理过拟合。只要在神经网络中加入dropout层就可以了。 首先来做一些数据 import torch import matplotlib.pyplot as plt torch.manual_seed(1) # reproducible N_SAMPLES = 20 #定义20个数据点 N_...
  • 数据过拟合解决方法

    2017-04-26 15:48:00
    过拟合的三种解决方法: 1. 增加数据集 2. L1,L2正则化。  a) L1正则化是使权值矩阵变成稀疏的。减少网络复杂度。  b) L2正则化是使不断较少权值的大小,从而减少网络复杂度。(权值衰减) 3. Dropout ...
  • Dropout解决过拟合问题

    千次阅读 2017-05-02 15:15:55
    Dropout解决过拟合问题 晓雷 6 个月前 这篇也属于 《神经网络与深度学习总结系列》,最近看论文对Dropout这个知识点有点疑惑,就先总结以下。(没有一些基础可能看不懂,以后还会继续按照正常进度写总结) 是...
  • dropout解决过拟合问题

    千次阅读 2019-08-25 12:13:15
    过度拟合是机器学习中常见的问题,为了解决这个问题,可以使用dropout方法。 当不用dropout处理时的效果:模型对训练数据的适应性优于测试数据,存在overfitting 当使用dropout时,测试效果得以改善了: from __...
  • 避免过拟合方法,正则化,dropout,Batch normalization 目录 避免过拟合方法,正则化,dropout,Batch normalization 一、铺垫 1.奥卡姆剃刀原则 2.简单模型上的过拟合 3.深度学习过拟合 4.数据集的划分...
  • TensorFlow利用dropout解决过拟合问题

    千次阅读 2018-07-10 14:39:24
    在TensorFlow训练样本的数据中,有时会出现过拟合(overfiting)的问题,可以采取dropout方法解决,即随机丢弃部分样本。 下面是示例代码,通过tensorboard对结果进行了可视化: import tensorflow as tf from...
  • 过拟合的问题,可以通过Dropout,添加L1,L2正规项等等很简单的方法解决,网上有许多文章介绍这些方法。但怎么使用keras实现,实现中的细节问题,却缺少描述。我就写写解决过拟合这方面的博客,刚好也是督促自己学习...
  • 1. 正则化 周志华老师的《机器学习》中写道:“正则化可理解为一种‘罚函数法’,即对不希望得到的结果施以惩罚,从而使得...也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险...
  • Overfitting过拟合 所谓过拟合,就是指把学习进行的太彻底,把样本数据的所有特征几乎都习得了,于是机器学到了过多的局部特征,过多的由于噪声带来的假特征,造成模型的“泛化性”和识别正确率几乎达到谷点,于是...
  • Early Stop的概念非常简单,在我们一般训练中,经常由于过拟合导致在训练集上的效果好,而在测试集上的效果非常差。因此我们可以让训练提前停止,在测试集上达到最好的效果时候就停止训练,而不是等到在训练集上饱和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,931
精华内容 7,172
关键字:

过拟合解决方法dropout