我試圖在rosenbrock函數上測試我的梯度下降程序。但無論我如何調整自己的學習率(step
參數),精度(precision
參數)和迭代次數(iteration
參數),我都無法獲得非常接近的結果。多元標量函數的梯度下降優化
import numpy as np
def minimize(f, f_grad, x, step=1e-3, iterations=1e3, precision=1e-3):
count = 0
while True:
last_x = x
x = x - step * f_grad(x)
count += 1
if count > iterations or np.linalg.norm(x - last_x) < precision:
break
return x
def rosenbrock(x):
"""The Rosenbrock function"""
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)
def rosenbrock_grad(x):
"""Gradient of Rosenbrock function"""
xm = x[1:-1]
xm_m1 = x[:-2]
xm_p1 = x[2:]
der = np.zeros_like(x)
der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
der[-1] = 200*(x[-1]-x[-2]**2)
return der
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
minimize(rosenbrock, rosenbrock_grad, x0, step=1e-6, iterations=1e4, precision=1e-6)
例如,像上面的代碼給我array([ 1.01723267, 1.03694999, 1.07870143, 1.16693184, 1.36404334])
。但如果我使用scipy.optimize
中的任何內置優化方法,我可以得到非常接近的答案或完全相等array([ 1., 1., 1., 1., 1.])
(這是真實的答案)。
但是,如果我在我的程序中使用非常小的step
,precision
和非常大的iterations
,計算只需要在我的計算機上永久存在。
我不知道這是由於
在我的程序中的任何錯誤
或者僅僅因爲
梯度下降是低效這裏的要求很低
step
,precision
和非常大的iterations
產生非常接近的 解決方案
,或者因爲
我需要做一些特殊的功能擴展。
(聚苯乙烯。我還試圖繪製二維圖,其中的函數值是在y軸上和迭代次數是在X軸上爲「調試」梯度下降,但即使我得到一個nice-解決方案仍然不是非常接近。)
讚賞。我想知道如果我選擇了固定的學習速率,但它很小,我會在迭代之後仍然超出問題的範圍嗎? – Nicholas