안녕하세요. 오태호입니다.

이 글에서는 Optimization 기법중에 하나인 LBFGS Method(Limited Memory Broyden–Fletcher–Goldfarb–Shanno Method)의 수식을 다음과 같이 4개의 Part에 걸쳐서 차근차근 유도하여 LBFGS Method의 구조를 조금 깊게 살펴보도록 하겠습니다.

LBFGS Method

Quasi Newton Method중에 하나인 BFGS Method는 \(\mathbf{H}_k\)의 크기가 너무 커서 저장이 쉽지 않은 문제가 있습니다. 여기서는 \(\mathbf{H}_k\)를 저장하지 않고 BFGS Method를 사용하는 LBFGS Method(Limited Memory Broyden Fletcher Goldfarb Shanno Method)를 살펴보겠습니다.

앞에서 정의했던 각종 수식을 다시 정리하면 다음과 같습니다.

\[\mathbf{x}= \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} \\ \nabla f(\mathbf{x})= \begin{bmatrix} \frac{\partial}{\partial x_1}f(\mathbf{x}) \\ \frac{\partial}{\partial x_2}f(\mathbf{x}) \\ \vdots \\ \frac{\partial}{\partial x_n}f(\mathbf{x}) \\ \end{bmatrix} \\ \nabla^2 f(\mathbf{x})= \begin{bmatrix} \frac{\partial^2}{\partial x_1^2}f(\mathbf{x}) & \frac{\partial^2}{\partial x_1 \partial x_2}f(\mathbf{x}) & \cdots & \frac{\partial^2}{\partial x_1 \partial x_n}f(\mathbf{x}) \\ \frac{\partial^2}{\partial x_2 x_1}f(\mathbf{x}) & \frac{\partial^2}{\partial x_2^2}f(\mathbf{x}) & \cdots & \frac{\partial^2}{\partial x_2 \partial x_n}f(\mathbf{x}) \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2}{\partial x_n x_1}f(\mathbf{x}) & \frac{\partial^2}{\partial x_n x_2}f(\mathbf{x}) & \cdots & \frac{\partial^2}{\partial x_n^2}f(\mathbf{x}) \\ \end{bmatrix} \\ \mathbf{s}_k=\mathbf{x}_{k+1}-\mathbf{x}_k \\ \mathbf{g}_k=\nabla f(\mathbf{x}_{k}) \\ \mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k \\ \mathbf{B}_k \approx \nabla^2 f(\mathbf{x}_k) \\ \mathbf{H}_k=\mathbf{B}_k^{-1}\]

Quasi Newton Method를 다시 살펴보면 다음과 같습니다.

\[\begin{aligned} \mathbf{x}_{k+1}=\mathbf{x}_k-t_k\mathbf{H}_k\mathbf{g}_k \end{aligned}\]

BFGS Method를 다시 살펴보면 다음과 같습니다.

\[\begin{aligned} \mathbf{B}_{k+1} &=\mathbf{B}_k+a\mathbf{u}_k\mathbf{u}_k^T+b\mathbf{v}_k\mathbf{v}_k^T \\ &=\mathbf{B}_k-\frac{\mathbf{B}_k\mathbf{s}_k\mathbf{s}_k^T\mathbf{B}_k}{\mathbf{s}_k^T\mathbf{B}_k\mathbf{s}_k}+\frac{\mathbf{y}_k\mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_k} \end{aligned} \\ \mathbf{H}_{k+1} =\left ( \mathbf{I}- \frac{\mathbf{s}_k\mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_k} \right ) \mathbf{H}_k \left ( \mathbf{I}- \frac{\mathbf{y}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k} \right ) + \frac{\mathbf{s}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k}\]

BFGS Method를 설명할 때 \(\mathbf{H}_k\)를 구하는 방법을 알아보았습니다. 그런데 Quasi Newton Method를 자세히 살펴보면 결국 필요한 것은 \(\mathbf{H}_k\)가 아니라 \(\mathbf{H}_k\mathbf{g}_k\)입니다. \(\mathbf{x}\)가 \(n\)차원 Vector일 때 \(\mathbf{H}_k\)를 저장하기 위해서는 \(n^2\) Element의 Memory가 필요하지만 \(\mathbf{H}_k\mathbf{g}_k\)는 \(n\) Element의 Memory만이 필요합니다. 그리고 \(\mathbf{H}_k\)는 Iteration마다 \(n\)차원 Vector 2개를(\(\mathbf{u}_k\)와 \(\mathbf{v}_k\)를) 사용해서 Update를 하기 때문에 \(\mathbf{H}_k\)의 변화정보를 \(n \times 2\) Element의 저장공간에 저장할 수 있습니다. 이런 특징을 보면 \(\mathbf{H}_k\)의 \(n^2\) Element의 저장공간보다 훨씬 적은 저장공간을 사용하면서 BFGS Method를 사용할 수 있는 방법이 있을 것으로 상상할 수 있습니다. 이런 특징을 활용한 방법이 LBFGS Method입니다.

BFGS Method를 좀 더 간결하게 표현하기 위해 \(\rho_k\)를 다음과 같이 정의합니다.

\[\rho_k=\frac{1}{\mathbf{y}_k^T\mathbf{s}_k}\]

\(\rho_k\)를 이용해서 BFGS Method를 다음과 같이 간결하게 표현합니다.

\[\mathbf{H}_{k+1} =\left ( \mathbf{I}- \rho_k\mathbf{s}_k\mathbf{y}_k^T \right ) \mathbf{H}_k \left ( \mathbf{I}- \rho_k\mathbf{y}_k\mathbf{s}_k^T \right ) + \rho_k\mathbf{s}_k\mathbf{s}_k^T\]

\(\mathbf{H}_k\)는 다음과 같습니다.

\[\mathbf{H}_k =\left ( \mathbf{I}- \rho_{k-1}\mathbf{s}_{k-1}\mathbf{y}_{k-1}^T \right ) \mathbf{H}_{k-1} \left ( \mathbf{I}- \rho_{k-1}\mathbf{y}_{k-1}\mathbf{s}_{k-1}^T \right ) + \rho_{k-1}\mathbf{s}_{k-1}\mathbf{s}_{k-1}^T\]

BFGS는 \(\mathbf{H}_k\)를 구하려고 노력하지만, LBFGS Method는 \(\mathbf{H}_k\)대신에 다음과 같이 \(\mathbf{H}_k\mathbf{g}_k\)를 구하려고 노력합니다.

\[\mathbf{H}_k\mathbf{g}_k =\left ( \mathbf{I}- \rho_{k-1}\mathbf{s}_{k-1}\mathbf{y}_{k-1}^T \right ) \mathbf{H}_{k-1} \left ( \mathbf{I}- \rho_{k-1}\mathbf{y}_{k-1}\mathbf{s}_{k-1}^T \right )\mathbf{g}_k + \rho_{k-1}\mathbf{s}_{k-1}\mathbf{s}_{k-1}^T\mathbf{g}_k\]

이 식을 살펴보면 \(\mathbf{H}_k\mathbf{g}_k\)를 최대한 정확하게 구하기 위해서는 이전 Iteration인 \(\mathbf{H}_{k-1}\)을 최대한 정확하게 구해야 합니다. 그리고 \(\mathbf{H}_{k-1}\)을 최대한 정확하게 구하기 위해서는 \(\mathbf{H}_{k-2}\)을 최대한 정확하게 구해야 합니다. 하지만 그렇다고 해도 \(\mathbf{H}_{k-1000}\) 같이 상당히 이전 Iteration 정보가 중요하지는 않습니다. 그래서 LBFGS Method에서는 적당히 이전 Iteration 정보까지만을 사용해서 \(\mathbf{H}_k\mathbf{g}_k\)를 구하려고 노력합니다. 얼마나 이전 Iteration 정보를 사용하는가를 History Size라고 합니다. History Size가 클수록 Memory를 많이 사용하게 되고 계산결과가 더 정확해집니다.

History Size가 $2$인 경우의 \(\mathbf{H}_k\mathbf{g}_k\)를 계산해서 규칙성을 찾아보겠습니다.

\[\begin{aligned} \mathbf{H}_k\mathbf{g}_k &=(\mathbf{I}-\rho_{k-1}\mathbf{s}_{k-1}\mathbf{y}_{k-1}^T)\mathbf{H}_{k-1}(\mathbf{I}-\rho_{k-1}\mathbf{y}_{k-1}\mathbf{s}_{k-1}^T)\mathbf{g}_k+\rho_{k-1}\mathbf{s}_{k-1}\mathbf{s}_{k-1}^T\mathbf{g}_k \\ &=(\mathbf{I}-\rho_{k-1}\mathbf{s}_{k-1}\mathbf{y}_{k-1}^T)((\mathbf{I}-\rho_{k-2}\mathbf{s}_{k-2}\mathbf{y}_{k-2}^T)\mathbf{H}_{k-2}(\mathbf{I}-\rho_{k-2}\mathbf{y}_{k-2}\mathbf{s}_{k-2}^T)+\rho_{k-2}\mathbf{s}_{k-2}\mathbf{s}_{k-2}^T)(\mathbf{I}-\rho_{k-1}\mathbf{y}_{k-1}\mathbf{s}_{k-1}^T)\mathbf{g}_k+\rho_{k-1}\mathbf{s}_{k-1}\mathbf{s}_{k-1}^T\mathbf{g}_k \\ \end{aligned} \\ \mathbf{q}_k=\mathbf{g}_k \\ \alpha_{k-1}=\rho_{k-1}\mathbf{s}_{k-1}^T\mathbf{q}_k \\ \mathbf{q}_{k-1}=\mathbf{q}_k-\alpha_{k-1}\mathbf{y}_{k-1} \\ \mathbf{H}_k\mathbf{g}_k =(\mathbf{I}-\rho_{k-1}\mathbf{s}_{k-1}\mathbf{y}_{k-1}^T)((\mathbf{I}-\rho_{k-2}\mathbf{s}_{k-2}\mathbf{y}_{k-2}^T)\mathbf{H}_{k-2}(\mathbf{I}-\rho_{k-2}\mathbf{y}_{k-2}\mathbf{s}_{k-2}^T)+\rho_{k-2}\mathbf{s}_{k-2}\mathbf{s}_{k-2}^T)\mathbf{q}_{k-1}+\alpha_{k-1}\mathbf{s}_{k-1} \\ \alpha_{k-2}=\rho_{k-2}\mathbf{s}_{k-2}^T\mathbf{q}_{k-1} \\ \mathbf{q}_{k-2}=\mathbf{q}_{k-1}-\alpha_{k-2}\mathbf{y}_{k-2} \\ \mathbf{H}_k\mathbf{g}_k =(\mathbf{I}-\rho_{k-1}\mathbf{s}_{k-1}\mathbf{y}_{k-1}^T)((\mathbf{I}-\rho_{k-2}\mathbf{s}_{k-2}\mathbf{y}_{k-2}^T)\mathbf{H}_{k-2}\mathbf{q}_{k-2}+\alpha_{k-2}\mathbf{s}_{k-2})+\alpha_{k-1}\mathbf{s}_{k-1} \\ \mathbf{r}_{k-2}=\mathbf{H}_{k-2}\mathbf{q}_{k-2} \\ \beta_{k-2}=\rho_{k-2}\mathbf{y}_{k-2}^T\mathbf{r}_{k-2} \\ \mathbf{H}_k\mathbf{g}_k =(\mathbf{I}-\rho_{k-1}\mathbf{s}_{k-1}\mathbf{y}_{k-1}^T)(\mathbf{r}_{k-2}-\beta_{k-2}\mathbf{s}_{k-2}+\alpha_{k-2}\mathbf{s}_{k-2})+\alpha_{k-1}\mathbf{s}_{k-1} \\ \mathbf{r}_{k-1}=\mathbf{r}_{k-2}+(\alpha_{k-2}-\beta_{k-2})\mathbf{s}_{k-2} \\ \beta_{k-1}=\rho_{k-1}\mathbf{y}_{k-1}^T\mathbf{r}_{k-1} \\ \mathbf{H}_k\mathbf{g}_k =\mathbf{r}_{k-1}-\beta_{k-1}\mathbf{s}_{k-1}+\alpha_{k-1}\mathbf{s}_{k-1} \\ \mathbf{r}_{k}=\mathbf{r}_{k-1}+(\alpha_{k-1}-\beta_{k-1})\mathbf{s}_{k-1} \\ \begin{aligned} \mathbf{H}_k\mathbf{g}_k &=\mathbf{r}_k \\ &=\mathbf{r}_{k-1}+(\alpha_{k-1}-\beta_{k-1})\mathbf{s}_{k-1} \\ &=\mathbf{r}_{k-2}+(\alpha_{k-2}-\beta_{k-2})\mathbf{s}_{k-2}+(\alpha_{k-1}-\beta_{k-1})\mathbf{s}_{k-1} \\ &=\mathbf{H}_{k-2}\mathbf{q}_{k-2}+(\alpha_{k-2}-\beta_{k-2})\mathbf{s}_{k-2}+(\alpha_{k-1}-\beta_{k-1})\mathbf{s}_{k-1} \\ \end{aligned}\]

여기서 \(\mathbf{H}_{k-2}\)에는 적당한 Matrix를 넣어줍니다. History Size가 큰 경우에는 \(\mathbf{I}\)를 넣어도 큰 문제가 없지만 LBFGS Method에서는 보통 Heuristic으로 \(\frac{\mathbf{s}_{k-1}^T\mathbf{y}_{k-1}}{\mathbf{y}_{k-1}^T\mathbf{y}_{k-1}}\mathbf{I}\)를 많이 사용합니다. 보통 이런 Heuristic을 사용하는 이유는 Initial Inverse Hessian를 참조하기 바랍니다.

위에서 알아본 History Size 2의 \(\mathbf{H}_k\mathbf{g}_k\)의 계산과정을 일반화하여 History Size가 \(m\)일 때 계산과정을 정리하면 다음과 같습니다.

  • \[\mathbf{q}_k \leftarrow \mathbf{g}_k\]
  • For \(i=k-1,k-2,\cdots,k-m\)
    • \[\alpha_i \leftarrow \rho_i\mathbf{s}_i^T\mathbf{q}_{i+1}\]
    • \[\mathbf{q}_i \leftarrow \mathbf{q}_{i+1} - \alpha_i\mathbf{y}_i\]
  • \[\gamma_k \leftarrow \frac{\mathbf{s}_{k-1}^T\mathbf{y}_{k-1}}{\mathbf{y}_{k-1}^T\mathbf{y}_{k-1}}\mathbf{I}\]
  • \[\mathbf{H}_{k-m} \leftarrow \gamma_k\mathbf{I}\]
  • \[\mathbf{r}_{k-m} \leftarrow \mathbf{H}_{k-m}\mathbf{q}_{k-m}\]
  • For \(i=k-m,k-m+1,\cdots,k-1\)
    • \[\beta_i \leftarrow \rho_i\mathbf{y}_i^T\mathbf{r}_i\]
    • \[\mathbf{r}_{i+1} \leftarrow \mathbf{r}_i+(\alpha_i-\beta_i)\mathbf{s}_i\]
  • \[\mathbf{H}_k\mathbf{g}_k \leftarrow \mathbf{r}_k\]

그런데 여기서 자세히 살펴보면 \(\mathbf{q}_i\)와 \(\mathbf{r}_i\)는 굳이 Index별로 여러 개를 저장할 필요가 없습니다. 그래서 아래와 같이 더 간단하게 정리할 수 있습니다.

  • \[\mathbf{q} \leftarrow \mathbf{g}_k\]
  • For \(i=k-1,k-2,\cdots,k-m\)
    • \[\alpha_i \leftarrow \rho_i\mathbf{s}_i^T\mathbf{q}\]
    • \[\mathbf{q} \leftarrow \mathbf{q} - \alpha_i\mathbf{y}_i\]
  • \[\gamma_k \leftarrow \frac{\mathbf{s}_{k-1}^T\mathbf{y}_{k-1}}{\mathbf{y}_{k-1}^T\mathbf{y}_{k-1}}\mathbf{I}\]
  • \[\mathbf{H}_{k-m} \leftarrow \gamma_k\mathbf{I}\]
  • \[\mathbf{r} \leftarrow \mathbf{H}_{k-m}\mathbf{q}\]
  • For \(i=k-m,k-m+1,\cdots,k-1\)
    • \[\beta_i \leftarrow \rho_i\mathbf{y}_i^T\mathbf{r}\]
    • \[\mathbf{r} \leftarrow \mathbf{r}+(\alpha_i-\beta_i)\mathbf{s}_i\]
  • \[\mathbf{H}_k\mathbf{g}_k \leftarrow \mathbf{r}\]

LBFGS Method는 이와 같이 \(\mathbf{H}_k\mathbf{g}_k\)를 직접 계산하고 다음의 Iteration을 수행하는 것을 반복하여 \(f(\mathbf{x})\)를 최소화시키는 \(\mathbf{x}\)를 구하는 방법입니다. 이때, \(t_k\)는 Wolfe Conditions를 사용해서 구한 적절한 값을 사용합니다.

\[\mathbf{x}_{k+1}=\mathbf{x}_k-t_k\mathbf{H}_k\mathbf{g}_k\]

BFGS Method는 \(\mathbf{H}_k\)를 계산하고 이것을 이용해 \(\mathbf{H}_k\mathbf{g}_k\)을 계산하기 때문에 Memory 사용량이 매우 높지만 LBFGS Method는 \(\mathbf{H}_k\mathbf{g}_k\)를 직접 계산하여 Memory 사용량을 BFGS Method에 비해 크게 낮출 수 있습니다.

Initial Inverse Hessian

LBFGS Method을 살펴보면 Initial Inverse Hessian \(\mathbf{H}_{k-m}\)가 필요합니다. History Size가 큰 경우에는 \(\mathbf{I}\)를 사용해도 무방하지만 조금 더 개선된 Heuristic으로 다음과 같이 \(\mathbf{H}_{k-m}\)를 구해서 사용하는 경우가 많습니다. \(\mathbf{G}_{k-1}\)을 Hessian의 근사치라고 정의합니다.

\[\mathbf{G}_{k-1}\mathbf{s}_{k-1}=\mathbf{y}_{k-1} \\ \mathbf{z}_{k-1}=\sqrt{\mathbf{G}_{k-1}}\mathbf{s}_{k-1} \\ \mathbf{y}_{k-1}=\mathbf{G}_{k-1}\mathbf{s}_{k-1}=\sqrt{\mathbf{G}_{k-1}}\mathbf{z}_{k-1} \\ \mathbf{s}_{k-1}=\frac{1}{\sqrt{\mathbf{G}_{k-1}}}\mathbf{z}_{k-1} \\ \begin{aligned} \frac{\mathbf{s}_{k-1}^T\mathbf{y}_{k-1}}{\mathbf{y}_{k-1}^T\mathbf{y}_{k-1}}\mathbf{I} &=\frac{(\frac{1}{\sqrt{\mathbf{G}_{k-1}}}\mathbf{z}_{k-1})^T(\sqrt{\mathbf{G}_{k-1}}\mathbf{z}_{k-1})}{(\sqrt{\mathbf{G}_{k-1}}\mathbf{z}_{k-1})^T(\sqrt{\mathbf{G}_{k-1}}\mathbf{z}_{k-1})}\mathbf{I} \\ &=\frac{\mathbf{z}_{k-1}^T\mathbf{z}_{k-1}}{\mathbf{z}_{k-1}^T\mathbf{G}_{k-1}\mathbf{z}_{k-1}}\mathbf{I} \end{aligned}\]

자세히 살펴보면 \(\frac{\mathbf{z}_{k-1}^T\mathbf{G}_{k-1}\mathbf{z}_{k-1}}{\mathbf{z}_{k-1}^T\mathbf{z}_{k-1}}\mathbf{I}\)의 Eigenvalue는 Hessian의 Eigenvalue와 유사하기 때문에 \(\frac{\mathbf{z}_{k-1}^T\mathbf{z}_{k-1}}{\mathbf{z}_{k-1}^T\mathbf{G}_{k-1}\mathbf{z}_{k-1}}\mathbf{I}\)의 Eigenvalue는 Inverse Hessian의 Eigenvalue와 유사하게 됩니다. 즉, \(\frac{\mathbf{s}_{k-1}^T\mathbf{y}_{k-1}}{\mathbf{y}_{k-1}^T\mathbf{y}_{k-1}}\mathbf{I}\)의 Eigenvalue는 Inverse Hessian의 Eigenvalue와 유사하게 되므로 \(\frac{\mathbf{s}_{k-1}^T\mathbf{y}_{k-1}}{\mathbf{y}_{k-1}^T\mathbf{y}_{k-1}}\mathbf{I}\)을 Initial Inverse Hessian으로 사용합니다.

Conclusion

LBFGS Method를 처음부터 차근차근 유도해 보았습니다. 이 글이 LBFGS Method를 이해하는데 유용한 자료로 사용되기를 희망합니다.