Optimization
如何強制 L-BFGS-B 不提前停止?投影梯度為零
我正在嘗試使用以下代碼使用 fmin_l_bfgs_b 算法的 SciPy 實現:
imgOpt, cost, info = fmin_l_bfgs_b(func, x0=img, args=(spec_layer, spec_weight, regularization), approx_grad=1,bounds=constraintPairs, iprint=2)
變量 img 只是一個包含 784 個像素的向量,其中所有角都設置為 0,中間部分在 0 到 255 之間隨機初始化。角的邊界是 (0,0),中間部分的邊界是 (0, 255 )。該函數是我的神經網絡中隱藏神經元的加權輸入。這一切都不應該是特別的。但是,當我運行算法時,它會立即停止,因為投影梯度為零。如何幫助算法找到合適的梯度估計,使其不會立即停止?
輸出:
RUNNING THE L-BFGS-B CODE it = iteration number nf = number of function evaluations nseg = number of segments explored during the Cauchy search nact = number of active bounds at the generalized Cauchy point sub = manner in which the subspace minimization terminated: con = converged, bnd = a bound was reached itls = number of iterations performed in the line search stepl = step length used tstep = norm of the displacement (total step) projg = norm of the projected gradient f = function value * * * Machine precision = 2.220D-16 N = 784 M = 10 it nf nseg nact sub itls stepl tstep projg f 0 1 - - - - - - 0.000D+00 1.694D+00 CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL Total User time 0.000E+00 seconds.
我對 SciPy 包裝器了解不多,但底層的 L-BFGS-B 代碼提供了幾個選項。R 接口的幫助文件列出了其中的幾個。
假設您的漸變很小但實際上不為零,您有幾個選項可以增加漸變的大小或減小軟件可以容忍的大小。
- 您可以重新調整參數,以便參數的微小差異會在目標函數中產生更大的變化。R 包裝器有一種自動執行此操作的方法,但我在 SciPy 中沒有看到。您也可以手動進行。
- 您可以重新調整您的目標函數(例如通過將其乘以某個常數),以便差異和導數更大(例如大於).
- 您可以調整方法的容差。您遇到的公差限制是 for
pgtol
,即, 默認。L-BFGS-B 的文檔似乎建議(在第 3 節末尾)您可以安全地將這個值降低到“機器精度的平方根”,大約是在大多數機器上。pgtol
如果您的梯度非常小,那麼一旦您放鬆,其他公差限制(絕對和相對)也可能變得重要。