4  最急降下法

\mathbf{x} \in \mathbb{R}^nの関数f(\mathbf{x})を最小化する問題を考える.ここで,fは微分可能であるとする.

最急降下法は,以下の式で与えられる更新式を繰り返すことで,fの極小値を求めるアルゴリズムである.

\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} - \alpha \nabla f(\mathbf{x}^{(k)})

ここで,\nabla f(\mathbf{x})fの勾配を表し,\alphaはステップサイズを表す.

勾配\nabla f(\mathbf{x})は,以下のように定義される.

\nabla f(\mathbf{x}) = \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right]

\alphaは,ステップサイズを表すハイパーパラメータであり,適切な値を選択することでアルゴリズムの収束性能を向上させることができる.

最急降下法は,勾配の逆方向に進むことで,関数fの極小値を探索するアルゴリズムである.

最急降下法の停止条件として,よく使われるのは以下の式である.

\|\nabla f(\mathbf{x})\| < \text{tol}

\|\cdot\| はベクトルのノルムを表し,\text{tol}はあらかじめ与えられた許容誤差である.

4.1 アルゴリズム

\begin{algorithm} \caption{Gradient Descent} \begin{algorithmic} \Require function $f$, gradient $\nabla f$, initial guess $\mathbf{x}^{(0)}$, step size $\alpha$, tolerance $\text{tol}$ \State $\mathbf{x} \gets \mathbf{x}^{(0)}$ \While{$\|\nabla f(\mathbf{x})\| > \text{tol}$} \State $\mathbf{x} \gets \mathbf{x} - \alpha \nabla f(\mathbf{x})$ \EndWhile \State \textbf{return} $\mathbf{x}$ \end{algorithmic} \end{algorithm}

4.2 Pythonによる実装

import numpy as np

def gradient_descent(f, grad, x0, alpha=1e-3, tol=1e-6):
    """
    Gradient descent (optimization algorithm)

    Parameters
    ----------
    f : function
        The function to minimize
    grad : function
        The gradient of the function
    x0 : np.ndarray
        Initial guess
    alpha : float
        Step size
    tol : float
        Tolerance

    Returns
    -------
    x : np.ndarray
        The estimate of the minimum
    """
    x = x0
    while np.linalg.norm(grad(x)) > tol:
        x = x - alpha * grad(x)
    return x


def f(x):
    return x[0]**2 + x[1]**2

def grad(x):
    return np.array([2*x[0], 2*x[1]])

x0 = np.array([1.0, 1.0])
x = gradient_descent(f, grad, x0)
print(x)