【问题标题】:Should I exit my gradient descent loop as soon as the cost increases?一旦成本增加,我应该退出我的梯度下降循环吗?
【发布时间】:2019-05-30 15:50:04
【问题描述】:

我正在尝试学习机器学习,所以我正在学习一门课程,目前正在研究线性回归的梯度下降。我刚刚了解到,如果学习率足够小,成本函数返回的值应该不断减小,直到收敛。当我想象这是在一个代码循环中完成时,似乎我可以跟踪前一次迭代中的成本,如果新成本大于前一个,则退出循环,因为这告诉我们学习率太大。我想听听意见,因为我是新手,但为了不让这个问题主要基于意见,我的主要问题是:这种检测学习率的方法需要减少?如果可能的话,我会很感激这个方法何时失败的例子。

【问题讨论】:

  • 这里有一个实验可以尝试:与其以较大的错误率退出,不如从上一次迭代中恢复参数值,然后以降低的学习率重试。
  • 请阅读次梯度方法(实际使用的方法)和随机梯度下降。事实上,您应该期望成本在整个优化过程中以非常高的概率增加。只有在非常严格的条件下,才能保证成本永远下降。

标签: machine-learning linear-regression gradient-descent


【解决方案1】:

在下面的示例中,我们将改变学习率 eta = 10^kk={-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)))

对于太小的学习率,优化很慢,问题在迭代预算内没有解决。 对于太大的学习率,优化过程变得不稳定并且很快发散。学习率必须“恰到好处”,优化过程才能正常工作。

【讨论】:

  • 啊,谢谢。我想我可能过于简化了这个过程。
猜你喜欢
  • 2017-02-07
  • 2018-10-25
  • 2020-01-10
  • 2019-01-31
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多