10.5 2차 방법과 준뉴턴

실습 · 연습문제 2개

BFGS 역Hessian 갱신 구현하기 bfgs-update

BFGS는 역Hessian의 근사 Hk\mathbf{H}_k를 step마다 갱신한다. 파라미터 변화 s=xk+1−xk\mathbf{s} = \mathbf{x}_{k+1} - \mathbf{x}_k와 gradient 변화 y=∇f(xk+1)−∇f(xk)\mathbf{y} = \nabla f(\mathbf{x}_{k+1}) - \nabla f(\mathbf{x}_k)로

Hk+1=(I−ρ sy⊤) Hk (I−ρ ys⊤)+ρ ss⊤,ρ=1y⊤s\mathbf{H}_{k+1} = (\mathbf{I} - \rho\,\mathbf{s}\mathbf{y}^\top)\,\mathbf{H}_k\,(\mathbf{I} - \rho\,\mathbf{y}\mathbf{s}^\top) + \rho\,\mathbf{s}\mathbf{s}^\top, \qquad \rho = \frac{1}{\mathbf{y}^\top\mathbf{s}}

이다. 함수 bfgs_update(Hinv, s, y)를 완성해 새 근사 (n, n)을 반환한다. 입력 Hinv를 제자리에서 바꾸지 않는다.

테스트는 다음을 확인한다.

  • secant 조건 Hk+1y=s\mathbf{H}_{k+1}\mathbf{y} = \mathbf{s}를 만족한다.
  • y⊤s>0\mathbf{y}^\top\mathbf{s} > 0이면 대칭·양의 정부호가 유지된다.
  • 이차함수 12x⊤Ax−b⊤x\frac{1}{2}\mathbf{x}^\top\mathbf{A}\mathbf{x} - \mathbf{b}^\top\mathbf{x}에서 exact line search와 함께 nn번 갱신하면 최솟점에 도달하고 Hn=A−1\mathbf{H}_n = \mathbf{A}^{-1}이 된다.

힌트: np.outer(s, y)는 sy⊤\mathbf{s}\mathbf{y}^\top이다.

Levenberg–Marquardt step 구현하기 lm-step

비선형 최소제곱 min⁡θ12∥r(θ)∥2\min_\theta \frac{1}{2}\lVert \mathbf{r}(\theta) \rVert^2에서 Levenberg–Marquardt(LM) 방법의 한 step δ\boldsymbol{\delta}는

(J⊤J+λI) δ=−J⊤r(\mathbf{J}^\top\mathbf{J} + \lambda\mathbf{I})\,\boldsymbol{\delta} = -\mathbf{J}^\top\mathbf{r}

의 해다. J\mathbf{J}는 잔차 r\mathbf{r}의 Jacobian(shape (N, p)), λ≥0\lambda \ge 0은 감쇠 계수다. 함수 lm_step(J, r, lam)을 완성해 shape (p,)의 step을 반환한다.

테스트는 다음을 확인한다.

  • λ=0\lambda = 0이면 Gauss–Newton step이다. 잔차가 파라미터에 선형이면(r=Aθ−b\mathbf{r} = \mathbf{A}\theta - \mathbf{b}) 한 step에 최소제곱해에 도달한다.
  • λ\lambda가 아주 크면 step은 −J⊤r/λ-\mathbf{J}^\top\mathbf{r}/\lambda, 즉 짧은 gradient descent step에 가깝다.
  • λ\lambda를 키울수록 step이 짧아지고, 어떤 λ>0\lambda > 0에서도 선형 근사 r+Jδ\mathbf{r} + \mathbf{J}\boldsymbol{\delta}의 크기는 ∥r∥\lVert \mathbf{r} \rVert보다 작다.

힌트: J⊤J\mathbf{J}^\top\mathbf{J}의 역행렬을 직접 만들지 말고 np.linalg.solve로 연립방정식을 푼다.