early
在训练中,我们希望在中间箭头的位置停止训练。而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