我在使用TensorFlow有一段时间了,有一个理论上的问题想问一下。通常情况下,当我们训练一个网络时,我们通常使用GradientDescentOptimizer(可能是它的变种,如adagrad或adam)来最小化损失函数。一般来说,看起来我们是在调整权重和偏置,以便获得这个损失函数的全局最小值。但问题是,我假设这个函数的图像非常复杂,充满了许多局部最优解。我想知道的是,我们如何能确定梯度下降法能够找到全局最优解,而不仅仅是很快就陷入某个远离全局最优解的局部最优解?
我记得,例如,当你在sklearn中进行聚类时,通常会多次运行聚类算法,并随机初始化聚类中心,通过这种方式确保不会陷入非最优结果。但我们在TensorFlow中训练ANN时并没有这样做——我们从一些随机权重开始,然后只是沿着函数的斜率移动。
所以,对这个问题有什么见解吗?为什么我们可以或多或少地确信,一旦损失显著停止减少,梯度下降训练的结果就接近全局最小值?
为了澄清,我之所以对这个问题感到疑惑,是因为如果我们不能确定至少接近全局最小值,我们就很难判断两个不同的模型哪个实际上更好。因为我们可以进行实验,得到一些模型评估结果,显示模型表现不好……但实际上,它可能只是在训练开始后不久就陷入了局部最小值。而另一个看似表现更好的模型,可能只是幸运地从一个更好的起点开始训练,并且没有很快陷入局部最小值。此外,这个问题意味着我们甚至不能确定我们从当前正在测试的网络架构中获得了最大值。例如,它可能有一个非常好的全局最小值,但很难找到,我们大多陷入局部最小值的较差解决方案,这些解决方案远离全局最优解,永远无法看到手头网络的全部潜力。
回答:
梯度下降法本质上是局部查看函数(局部梯度)。因此,绝对没有保证它会找到全局最小值。事实上,除非函数是凸的,否则它很可能不会找到全局最小值。这也是为什么GD类方法对你开始的位置很敏感。话虽如此,最近有一篇论文提到,在高维解空间中,最大值/最小值的数量并没有之前认为的那么多。
以合理的方式在高维空间中找到全局最小值似乎仍然是一个未解决的问题。然而,你可能更应该关注鞍点而不是最小值。例如,请看这篇文章:
更详细的论文在这里(https://arxiv.org/pdf/1406.2572.pdf)