随机梯度下降的收敛准则

机器算法验证 机器学习 神经网络 梯度下降
2022-03-19 16:14:34

我熟悉 SGD 中的更新规则,其中权重 (θ) 用成本函数的梯度更新 (Q) 每个样本乘以学习率 (η)。

w:=wηQi(w)

现在我的问题是何时评估停止标准。在我正在研究的神经网络算法中,步骤/时期一直持续到梯度低于预定义的阈值(或最大时期数)。是在样本循环内(即在 SGD 内)还是在每次完整通过后(即时期)评估梯度。

在前者中,我可以想象数据集中的第一个随机样本都是同一类的情况,因此 SGD 快速收敛以最小化该错误。这将导致模型泛化非常差,因为它已经“学会”将所有内容分类为同一类。所以我怀疑情况并非如此。

如果是后者,如何针对停止条件评估梯度?误差会在样本上平均吗?除了更新功能的工作原理之外,我无法在网上找到任何进一步的信息,也没有在神经网络算法中实现它。我认为这种方法对于“小批量”梯度下降是相同的。

一些伪代码可以帮助解释我的困惑:

while(epoch < max_epochs && reached.threshold < threshold){

    # SGD
    for(i in N){
        weights -= n*dQ(weights)

        # calculate new gradients threshold
        reached.threshold = ...

        # stop check here???
        if(reached.threshold < threshold) break
    }

    # stop check here???
    # if so, how to evaluate???
    ...

    epoch += 1
}
1个回答

我建议保留一些构成验证数据集的数据。您可以定期在验证数据集上计算损失函数(每次迭代后可能会太昂贵,因此在每个 epoch 之后似乎是有意义的)并在验证损失稳定后停止训练。

如果您处于一个没有任何数据的纯在线环境中,我想您可以计算每个时期示例的平均损失,并等待该平均损失收敛,但这当然可能导致过度拟合...

看起来 Vowpal Wabbit(一种在其他优化器中实现 SGD 的在线学习系统)使用了一种称为渐进式交叉验证的技术,该技术类似于使用保持集,但允许您在训练模型时使用更多数据,请参阅:

http://hunch.net/~jl/projects/prediction_bounds/progressive_validation/coltfinal.pdf

Vowpal Wabbit 有一个有趣的方法,它在每个示例之后计算错误度量,但打印带有指数退避的诊断信息,因此首先您会得到频繁的更新(以帮助诊断早期问题),然后随着时间的推移,更新频率会降低。

Vowpal Wabbit 显示两个错误指标,即总体平均渐进损失和自上次打印诊断以来的平均渐进损失。您可以在下面阅读有关大众诊断的一些详细信息:

https://github.com/JohnLangford/vowpal_wabbit/wiki/Tutorial#vws-diagnostic-information