我正在尝试学习机器学习,所以我正在学习一门课程,目前正在研究线性下降的梯度下降。我刚刚了解到,如果学习率足够小,则成本函数返回的值应不断减小直到收敛。当我想象这是在代码循环中完成时,似乎我可以跟踪上一次迭代的成本,如果新成本大于前一次成本,则退出循环,因为这可以告诉我们学习率太大。由于我是新手,所以我想听听大家的意见,但是为了不让这个问题主要基于意见,我的主要问题是:这种检测学习率的方法是否有任何问题需要解决?减少?如果可能的话,我希望知道一个示例,该方法何时会失败。
答案 0 :(得分:1)
在下面的示例中,我们将使用eta = 10^k
来改变学习率k={-6,-5,-4,...0}
def f(x):
return 100 * (x[ 0] *x[0] - x[ 1]) **2 + (x[ 0] -1) **2
def df(x):
a = x[ 0] *x[0] - x[ 1]
ret = np.zeros(2)
ret[ 0] = 400 * a * x[0] + 2 * (x[0] - 1)
ret[ 1] = -200 * a
return ret
for k in range(-6, 0):
eta = math.pow(10.0, k)
print("eta: " + str(eta))
x = -np.ones(2)
for iter in range(1000000):
fx = f(x)
if fx < 1e-10:
print(" solved after " + str(iter) + " iterations; f(x) = " + str(f(x)))
break
if fx > 1e10:
print(" divergence detected after " + str(iter) + " iterations; f(x) = " +
str(f(x)))
break
g = df(x)
x -= eta * g
if iter == 999999:
print(" not solved; f(x) = " + str(f(x)))
对于太小的学习率,优化速度非常慢,并且无法在迭代预算内解决问题。 对于太大的学习率,优化过程会变得不稳定并且会迅速分散。为了使优化过程正常工作,学习率必须“恰到好处”。