Optimization

如何強制 L-BFGS-B 不提前停止?投影梯度為零

  • December 2, 2014

我正在嘗試使用以下代碼使用 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如果您的梯度非常小,那麼一旦您放鬆,其他公差限制(絕對和相對)也可能變得重要。

鏈接到 L-BFGS-B 文檔(後記格式)

鏈接到 L-BFGS-B 的 R 文檔

引用自:https://stats.stackexchange.com/questions/126251

comments powered by Disqus