EarlyStop

EarlyStop_第1张图片

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

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

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

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

EarlyStop_第2张图片

一般机器学习的步骤分为以上两步,第一步我们确定一个成本函数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

你可能感兴趣的:(tensorflow,深度学习,python)