精华内容
下载资源
问答
  • EarlyStop

    千次阅读 2018-09-27 17:17:27
    Early stopping就可以实现该功能,这时获得的模型泛化能力较强,还可以得到一个中等大小的w的弗罗贝尼乌斯范数。其与L2正则化相似,选择参数w范数较小的神经网络。 可以用L2正则化代替early stopping。因为只要...

    这里写图片描述

    在训练中,我们希望在中间箭头的位置停止训练。而Early stopping就可以实现该功能,这时获得的模型泛化能力较强,还可以得到一个中等大小的w的弗罗贝尼乌斯范数。其与L2正则化相似,选择参数w范数较小的神经网络。

    可以用L2正则化代替early stopping。因为只要训练的时间足够长,多试几个lambda。总可以得到比较好的结果。

    Early stopping:
    优点:只运行一次梯度下降,我们就可以找出w的较小值,中间值和较大值。而无需尝试L2正则化超级参数lambda的很多值。

    缺点:不能独立地处理以上两个问题,使得要考虑的东西变得复杂。举例如下:

    这里写图片描述

    一般机器学习的步骤分为以上两步,第一步我们确定一个成本函数J,然后可以用梯度下降等方法去优化它;第二步我们不希望模型发生过拟合,就有正则化等方式去操作,这是一个动态的过程。但是如果采用early stopping,这就相当于用一种方式来控制两个问题的结束,这会使得问题变得复杂。如图一所示,在中间位置时,模型已经停止训练了,而成本函数还没有下降到合适的区域。

    earlyStop例子:

    # coding:utf-8
    
    class EarlyStop:
        def __init__(self,max_not_better_epochs=50):
            self.__max_not_better_epochs=max_not_better_epochs
            self.__current_not_better_epochs=0
            self.__best_valid_rate=0
            pass
    
        def jude_for_each_epoch(self,current_valid_rate):
            if current_valid_rate>self.__best_valid_rate:
                self.__best_valid_rate=current_valid_rate
                self.__current_not_better_epochs=0
            else:
                self.__current_not_better_epochs+=1
            pass
    
        def if_stop(self):
            if self.__current_not_better_epochs>=self.__max_not_better_epochs:
                return True
            else:
                return False
    
    
    展开全文
  • pytorch学习笔记(十五)————Early Stop,Dropout,SGD目录Early StopDropoutSGD随机梯度下降 目录 Early Stop (1)Early Stop的概念 Early Stop的概念非常简单,在我们一般训练中,经常由于过拟合导致在训练...
  • 1.32.Early Stop, Dropout 1.32.1.Early Stopping Early Stop的概念非常简单,在我们一般训练中,经常由于过拟合导致在训练集上的效果好,而在测试集上的效果非常差。因此我们可以让训练提前停止,在测试集上达到...

    关于"深度学习过拟合解决方案":
    https://blog.csdn.net/tototuzuoquan/article/details/113802684?spm=1001.2014.3001.5501

    对于深度学习网络的过拟合,一般的解决方案有:
    Early stop
    在模型训练过程中,提前终止。这里可以根据具体指标设置early stop的条件,比如可以是loss的大小,或者acc/f1等值的epoch之间的大小对比。

    More data
    更多的数据集。增加样本也是一种解决方案,根据不同场景和数据不同的数据增强方法。

    正则化
    常用的有L1,L2正则化

    Droup Out
    以一定的概率使某些神经元停止工作

    BatchNorm
    对神经元作归一化

    1.32.Early Stop, Dropout

    1.32.1.Early Stopping

    在这里插入图片描述
    Early Stop的概念非常简单,在我们一般训练中,经常由于过拟合导致在训练集上的效果好,而在测试集上的效果非常差。因此我们可以让训练提前停止,在测试集上达到最好的效果时候就停止训练,而不是等到在训练集上饱和再停止,这个操作叫做Early Stop

    随着横坐标epoch的进行,train部分的accuracy持续上升,train部分的accuracy增加到临时点后会开始发生over fitting现象,我们一般使用Validation来对临界点进行检测。在取到最大值时便停止调test,将此时取得的参数保存用来做最终的模型参数。

    可注意到train若不停止会进行无限长的时间,Early stop的引入会提前终止训练,即在test accuracy上升到临界值不发生改变后,就停止训练。

    由此我们总结Early stop有以下特点:
    1.通过Validation set来选择合适的参数
    2.通过Validation来进行检测模型优化表现
    3.在最高的Val performance(表现时)停止优化

    Early Stop的过程
    在这里插入图片描述

    1.32.2.Dropout

    Dropout是用来防止Overfitting十分有效的手段,其思路构建假设为:
    1.不全部学习参数,只学习有效的参数
    2.每层链接都有一定的概率”丢失”
    在这里插入图片描述
    通过”丢失”链接后,有效的减少运算量,使优化更为平滑

    在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。

    在2012年,Alex、Hinton在其论文《ImageNet Classification with Deep Convolutional Neural Networks》中用到了Dropout算法,用于防止过拟合。并且,这篇论文提到的AlexNet网络模型引爆了神经网络应用热潮,并赢得了2012年图像识别大赛冠军,使得CNN成为图像分类上的核心算法模型。

    随后,又有一些关于Dropout的文章《Dropout:A Simple Way to Prevent Neural Networks from Overfitting》、《Improving Neural Networks with Dropout》、《Dropout as data augmentation》。

    从上面的论文中,我们能感受到Dropout在深度学习中的重要性。那么,到底什么是Dropout呢?

    Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特殊检测器(隐层节点)间的相互作用,检测器相互作用的是指某些检测器依赖其他检测器才能发挥作用。

    Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的**值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,如上图所示。
    在这里插入图片描述

    # -*- coding: UTF-8 -*-
    
    import torch
    
    net_dropped = torch.nn.Sequential(
        torch.nn.Linear(784, 200),
        torch.nn.Dropout(0.5),       # drop 50% of the neuron
        torch.nn.ReLU(),
        torch.nn.Linear(200, 200),
        torch.nn.Dropout(0.5),       # drop 50% of the neuron
        torch.nn.ReLU(),
        torch.nn.Linear(200, 10),
    )
    

    pytorch与tensorflow中Dropout函数的区别

    torch.nn.Dropout(p=dropout_prob)
    
    tf.nn.dropout(keep_prob)
    

    值得注意的是pytorch中传入的参数丢弃权重参数的概率:
    而在tensorflow中传入的参数是保持权重参数的概率,两者的关系是相加为1.

    Behavior between train and test

    for epoch in range(epochs):
        
        # train
        net_dropped.train()
        for batch_idx, (data, target) in enumerate(train_loader):
            ...
        net_dropped.eval()
        test_loss = 0
        correct = 0
        for data, target in test_loader:
            ...
    

    model.train() :启用 BatchNormalization 和 Dropout
    model.eval(): 不启用BatchNormalization和Dropout

    在训练集中我们在训练模型的过程中需要引入Dropout让模型具备更加强大的泛化能力。而在测试集中,则不需要在测试的时候也进行Dropout。否则会降低模型的表现能力。所以需要添加语句net_dropout.eval(),表示切换到不启用Dropout模式,再利用测试集测试模型性能。

    1.32.3.SGD随机梯度下降

    (1)SGD与确定性模型和随机模型的区别
    Stochastic Gradient Descent
    在这里插入图片描述

    不同于一般的随机,SGD中的随机其实是符合一定函数分布,如正态分布这种,这种随机也不同于一般的Deterministic Model(确定性模型),确定性模型相当于一个f(x),有什么样的输入就会有相应的输出。
    (2)SGD和经典梯度下降算法区别
    在这里插入图片描述
    在这里插入图片描述
    为了解决经典的梯度下降法在每次对模型参数进行更新时,需要遍历所有的训练数据。当M很大的时候,就需要耗费巨大的计算资源和计算时间这个弊端,因此引入了SGD(随机梯度下降算法)

    随机梯度下降法用单个训练数据即可对模型参数进行一次更新,大大加快了训练速度。

    为了降低随机梯度的方差,从而使得迭代算法更加稳定,也为了充分利用高度优化的矩阵运算操作,在实际操作中,我们会同时处理若干训练数据,也就是指定的一个Batchsize,这种SGD叫做BGD。

    展开全文
  • 在XGBoost中通过Early Stop避免过拟合

    千次阅读 2018-12-15 22:10:58
    本文翻译自Avoid Overfitting By Early Stopping With XGBoost In Python,讲述如何在使用XGBoost建模时通过Early Stop手段来避免过拟合。全文系作者原创,仅供学习参考使用,转载授权请私信联系,否则将视为侵权...

    本文翻译自Avoid Overfitting By Early Stopping With XGBoost In Python,讲述如何在使用XGBoost建模时通过Early Stop手段来避免过拟合。全文系作者原创,仅供学习参考使用,转载授权请私信联系,否则将视为侵权行为。码字不易,感谢支持。以下为全文内容:


    过拟合问题是在使用复杂的非线性学习算法时会经常碰到的,比如gradient boosting算法。

    在这篇博客中你将发现如何通过Early Stop方法使得我们在使用Python中的XGBoost模型时可以尽可能地避免过拟合问题:

    读完这篇博客后,你将学到:

    • Early Stop可以减少训练集上的过拟合
    • 在使用XGBoost模型时如何监控训练过程中模型的表现,如何绘制学习曲线
    • 如何使用Early Stop方法在模型表现最好的时候停止训练

    让我们开始吧。

    使用Early Stop避免过拟合

    Early Stop是训练复杂机器学习模型以避免其过拟合的一种方法。

    它通过监控模型在一个额外的测试集上的表现来工作,当模型在测试集上的表现在连续的若干次(提前指定好的)迭代中都不再提升时它将终止训练过程。

    它通过尝试自动选择拐点来避免过拟合,在拐点处,测试数据集的性能开始下降,而训练数据集的性能随着模型开始过拟合而继续改善。

    性能的度量可以是训练模型时正在使用的损失函数(例如对数损失),或通常意义上用户感兴趣的外部度量(例如分类精度)。

    在XGBoost中监控模型的表现

    XGBoost模型在训练时可以计算并输入在某个指定的测试数据集的性能表现。

    在调用model.fit()函数时,可以指定测试数据集和评价指标,同时设置verbose参数为True,这样就可以在训练过程中输出模型在测试集的表现。

    例如,我们可以通过下面的方法在使用XGBoost训练二分类任务时输出分类错误率(通过“error”指定):

    eval_set = [(X_test, y_test)]
    model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True)
    

    XGBoost提供了一系列的模型评价指标,包括但不限于:

    • “rmse” 代表均方根误差
    • “mae” 代表平均绝对误差
    • “logloss” 代表二元对数损失
    • “mlogloss” 代表m-元对数损失
    • “error” 代表分类错误率
    • “auc” 代表ROC曲线下面积

    完整的列表见XGBoost文档中的“Learning Task Parameters””章节。

    例如,我们可以演示如何监控使用UCI机器学习存储库(更新:从这里下载)的关于Pima糖尿病发病数据集的XGBoost模型在训练过程中的性能指标。

    完整代码清单如下:

    # monitor training performance
    from numpy import loadtxt
    from xgboost import XGBClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    # load data
    dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
    # split data into X and y
    X = dataset[:,0:8]
    Y = dataset[:,8]
    # split data into train and test sets
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)
    # fit model no training data
    model = XGBClassifier()
    eval_set = [(X_test, y_test)]
    model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True)
    # make predictions for test data
    y_pred = model.predict(X_test)
    predictions = [round(value) for value in y_pred]
    # evaluate predictions
    accuracy = accuracy_score(y_test, predictions)
    print("Accuracy: %.2f%%" % (accuracy * 100.0))
    

    运行这段代码将会在67%的数据集上训练模型,并且在每一轮迭代中使用剩下的33%数据来评估模型的性能。

    每次迭代都会输出分类错误,最终将会输出最后的分类准确率。

    ...
    [89]	validation_0-error:0.204724
    [90]	validation_0-error:0.208661
    [91]	validation_0-error:0.208661
    [92]	validation_0-error:0.208661
    [93]	validation_0-error:0.208661
    [94]	validation_0-error:0.208661
    [95]	validation_0-error:0.212598
    [96]	validation_0-error:0.204724
    [97]	validation_0-error:0.212598
    [98]	validation_0-error:0.216535
    [99]	validation_0-error:0.220472
    Accuracy: 77.95%
    

    观察所有的输出,我们可以看到,在训练快要结束时测试集上的模型性能的变化是平缓的,甚至变得更差。

    使用学习曲线来评估XGBoost模型

    我们可以提取出模型在测试数据集上的表现并绘制成图案,从而更好地洞察到在整个训练过程中学习曲线是如何变化的。

    在调用XGBoost模型时我们提供了一个数组,数组的每一项是一个X和y的配对。在测试集之外,我们同时将训练集也作为输入,从而观察在训练过程中模型在训练集和测试集上各自的表现。

    例如:

    eval_set = [(X_train, y_train), (X_test, y_test)]
    model.fit(X_train, y_train, eval_metric="error", eval_set=eval_set, verbose=True)
    

    模型在各个数据集上的表现可以在训练结束后通过model.evals_result()函数获取,这个函数返回一个dict包含了评估数据集的代码和对应的分数列表,例如:

    results = model.evals_result()
    print(results)
    

    这将输出如下的结果:

    {
    	'validation_0': {'error': [0.259843, 0.26378, 0.26378, ...]},
    	'validation_1': {'error': [0.22179, 0.202335, 0.196498, ...]}
    }
    

    “validation_0”和“validation_1”代表了在调用fit()函数时传给eval_set参数的数组中数据集的顺序。

    一个特定的结果,比如第一个数据集上的分类错误率,可以通过如下方法获取:

    results['validation_0']['error']
    

    另外我们可以指定更多的评价指标,从而同时获取多种评价指标的变化情况。

    接着我们可以使用收集到的数据绘制曲线,从而更直观地了解在整个训练过程中模型在训练集和测试集上的表现究竟如何。

    下面是一段完整的代码,展示了如何将收集到的数据绘制成学习曲线:

    # plot learning curve
    from numpy import loadtxt
    from xgboost import XGBClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from matplotlib import pyplot
    # load data
    dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
    # split data into X and y
    X = dataset[:,0:8]
    Y = dataset[:,8]
    # split data into train and test sets
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)
    # fit model no training data
    model = XGBClassifier()
    eval_set = [(X_train, y_train), (X_test, y_test)]
    model.fit(X_train, y_train, eval_metric=["error", "logloss"], eval_set=eval_set, verbose=True)
    # make predictions for test data
    y_pred = model.predict(X_test)
    predictions = [round(value) for value in y_pred]
    # evaluate predictions
    accuracy = accuracy_score(y_test, predictions)
    print("Accuracy: %.2f%%" % (accuracy * 100.0))
    # retrieve performance metrics
    results = model.evals_result()
    epochs = len(results['validation_0']['error'])
    x_axis = range(0, epochs)
    # plot log loss
    fig, ax = pyplot.subplots()
    ax.plot(x_axis, results['validation_0']['logloss'], label='Train')
    ax.plot(x_axis, results['validation_1']['logloss'], label='Test')
    ax.legend()
    pyplot.ylabel('Log Loss')
    pyplot.title('XGBoost Log Loss')
    pyplot.show()
    # plot classification error
    fig, ax = pyplot.subplots()
    ax.plot(x_axis, results['validation_0']['error'], label='Train')
    ax.plot(x_axis, results['validation_1']['error'], label='Test')
    ax.legend()
    pyplot.ylabel('Classification Error')
    pyplot.title('XGBoost Classification Error')
    pyplot.show()
    

    运行这段代码将会在每一次训练迭代中输出模型在训练集和测试集上的分类错误率。我们可以通过设置verbose=False来关闭输出。

    我们绘制了两张图,第一张图表示的是模型在每一轮迭代中在两个数据集上的对数损失:

    XGBoost Learning Curve Log Loss

    第二张图表示分类错误率:

    XGBoost Learning Curve Classification Error

    从第一张图来看,似乎有机会可以进行Early Stop,大约在20到40轮迭代时比较合适。

    从第二张图可以得到相似的结果,大概在40轮迭代时效果比较理想。

    在XGBoost中进行Early Stop

    XGBoost提供了在指定轮数完成后提前停止训练的功能。

    除了提供用于评估每轮迭代中的评价指标和数据集之外,还需要指定一个窗口大小,意味着连续这么多轮迭代中模型的效果没有提升。这是通过early_stopping_rounds参数来设置的。

    例如,我们可以像下面这样设置连续10轮中对数损失都没有提升:

    eval_set = [(X_test, y_test)]
    model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True)
    

    如果同时指定了多个评估数据集和多个评价指标,early_stopping_rounds将会使用数组中的最后一个作为依据。

    下面提供了一个使用early_stopping_rounds的详细例子:

    # early stopping
    from numpy import loadtxt
    from xgboost import XGBClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    # load data
    dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
    # split data into X and y
    X = dataset[:,0:8]
    Y = dataset[:,8]
    # split data into train and test sets
    seed = 7
    test_size = 0.33
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
    # fit model no training data
    model = XGBClassifier()
    eval_set = [(X_test, y_test)]
    model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True)
    # make predictions for test data
    y_pred = model.predict(X_test)
    predictions = [round(value) for value in y_pred]
    # evaluate predictions
    accuracy = accuracy_score(y_test, predictions)
    print("Accuracy: %.2f%%" % (accuracy * 100.0))
    

    运行这段代码将得到如下的输出(部分):

    ...
    [35]	validation_0-logloss:0.487962
    [36]	validation_0-logloss:0.488218
    [37]	validation_0-logloss:0.489582
    [38]	validation_0-logloss:0.489334
    [39]	validation_0-logloss:0.490969
    [40]	validation_0-logloss:0.48978
    [41]	validation_0-logloss:0.490704
    [42]	validation_0-logloss:0.492369
    Stopping. Best iteration:
    [32]	validation_0-logloss:0.487297
    

    我们可以看到模型在迭代到42轮时停止了训练,在32轮迭代后观察到了最好的效果。

    通常将early_stopping_rounds设置为一个与总训练轮数相关的函数(本例中是10%),或者通过观察学习曲线来设置使得训练过程包含拐点,这两种方法都是不错的选择。

    总结

    在这篇博客中你发现了如何监控模型的表现以及怎么做Early Stop。

    你学会了:

    • 使用Early Stop手段在模型过拟合之前停止训练
    • 在使用XGBoost模型时如何监控模型的表现并绘制出模型的学习曲线
    • 在训练XGBoost模型时如何设置Early Stop参数

    关于Early Stop或者这篇博客你还有什么想问的问题吗?欢迎在下方的评论区留言,我将尽我最大的努力来解答。


    以上就是本文的全部内容,如果您喜欢这篇文章,欢迎将它分享给朋友们。

    感谢您的阅读,祝您生活愉快!

    作者:小美哥
    2018-12-15

    展开全文
  • 神经网络中的Early Stop

    万次阅读 2015-07-01 21:37:53
    神经网络中的Early Stop神经网络中具体的做法如下: 1. 首先将训练数据划分为训练集和验证集(划分比例为2:1); 2. 在训练集上进行训练,并且在验证集上获取测试结果(比如每隔5个epoch测试一下),随着epoch的...

    神经网络中的Early Stop

    神经网络中具体的做法如下:
    1. 首先将训练数据划分为训练集和验证集(划分比例为2:1);
    2. 在训练集上进行训练,并且在验证集上获取测试结果(比如每隔5个epoch测试一下),随着epoch的增加,如果在验证集上发现测试误差上升,则停止训练;
    3. 将停止之后的权重作为网络的最终参数。
    注:Early Stop能够防止过拟合。

    1. Split the training data into a training set and a validation set, e.g. in a 2-to-1 proportion.
    2. Train only on the training set and evaluate the per-example error on the validation set once in a while, e.g. after every fifth epoch.
    3. Stop training as soon as the error on the validation set is higher than it was the last time it was checked.
    4. Use the weights the network had in that previous step as the result of the training run.

    参考


    展开全文
  • 1、Regularization 2、动量 3、early stop 4、dropout
  • Sklearn_EarlyStop

    2020-08-20 17:22:34
    ax.plot(x_axis, results['validation_0']['error'], label='Test') ax.legend() pyplot.ylabel('Error') pyplot.xlabel('Round') pyplot.title('XGBoost Early Stop') pyplot.show() 测试 模型训练好后,可以用训练...
  • BERT模型中的动态学习率和提前终止(early stop) 上一步我们将语料划分成了训练和测试集,我们的训练方式是,每个epoch,用训练集训练。对模型性能的衡量标准是AUC,AUC的衡量标准对二分类非常易用。 当前epoch训练...
  • Early Stop 如果一直训练,训练集上的性能可以一直上升,但验证集上的性能在经过某个点之后就可能开始下降,这时就是模型出现了over-fitting,提前停止就是用来克服over-fitting的。 但是没训练完怎么知道哪个点是...
  • ML之xgboost:利用xgboost算法(sklearn+3Spli+调参曲线+EarlyStop)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测) 导读 利用xgboost算法(结合sklearn+3CrVa+调参曲线+EarlyStop)训练...
  • 【机器学习】概念复习 early stop

    千次阅读 2019-02-28 21:43:41
    patience: 当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练 verbose: 信息展示模式 mode: 'auto','min','max'之一,在min模式训练,如果检测值停止下降则终止训练...

空空如也

空空如也

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

earlystop