Русская Википедия:Метод сопряжённых градиентов

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Другие значения Метод сопряжённых градиентов (Метод Флетчера — Ривcа)метод нахождения локального экстремума функции на основе информации о её значениях и её градиенте. В случае квадратичной функции в <math>\mathbb{R}^n</math> минимум находится не более чем за <math>n</math> шагов.

Основные понятия

Определим терминологию:

Пусть <math>\vec{S_1},\ldots,\vec{S_n} \in \mathbb{X} \subset \mathbb{R}^n</math>.

Введём на <math>\mathbb{X}</math> целевую функцию <math>f(\vec{x})\in \mathrm{C^2}(\mathbb{X})</math>.

Векторы <math>\vec{S_1},\ldots,\vec{S_n}</math> называются сопряжёнными, если:

  • <math>\vec{S_i}^T H \vec{S_j}=0, \quad i\neq j, \quad i,j=1,\ldots,n</math>
  • <math>\vec{S_i}^T H \vec{S_i}\geqslant 0, \quad i=1,\ldots,n</math>

где <math>H</math> — матрица Гессе <math>f(\vec{x})</math>.

Шаблон:Message box

Обоснование метода

Нулевая итерация

Файл:Conjugate gradient illustration.svg
Иллюстрация последовательных приближений метода наискорейшего спуска (зелёная ломаная) и метода сопряжённых градиентов (красная ломаная) к точке экстремума.

Пусть <math>\vec{S_0}=-\nabla f(\vec{x_0})\qquad (1)</math>

Тогда <math>\vec{x_1}=\vec{x_0}+\lambda_1 \vec{S_0} \qquad</math>.

Определим направление

<math>\vec{S_1}=-\nabla f(\vec{x_1})+\omega_1 \vec{S_0}\ \qquad (2)</math>

так, чтобы оно было сопряжено с <math>\vec{S_0}</math>:

<math>\vec{S_0}^T H \vec{S_1}=0 \qquad (3)</math>

Разложим <math>\nabla f(\vec{x})</math> в окрестности <math>\vec{x_0}</math> и подставим <math>\vec{x}=\vec{x_1}</math>:

<math>\nabla f(\vec{x_1})-\nabla f(\vec{x_0})=H \, (\vec{x_1}-\vec{x_0})=\lambda_1 H \vec{S_0}</math>

Транспонируем полученное выражение и домножаем на <math>H^{-1}</math> справа:

<math>(\nabla f(\vec{x_1})-\nabla f(\vec{x_0}))^T H^{-1}=\lambda_1 \vec{S_0}^T H^T H^{-1}</math>

В силу непрерывности вторых частных производных <math>H^T=H</math>. Тогда:

<math>\vec{S_0}^T=\frac{(\nabla f(\vec{x_1})-\nabla f(\vec{x_0}))^T H^{-1}}{\lambda_1}</math>

Подставим полученное выражение в (3):

<math>\frac{(\nabla f(\vec{x_1})-\nabla f(\vec{x_0}))^T H^{-1}H\vec{S_1}}{\lambda_1}=0</math>

Тогда, воспользовавшись (1) и (2):

<math>(\nabla f(\vec{x_1})-\nabla f(\vec{x_0}))^T (-\nabla f(\vec{x_1})-\omega_1\nabla f(\vec{x_0})))=0\qquad (4)</math>

Если <math>\lambda=\arg\min_\lambda f(\vec{x_0}+\lambda \vec{S_0})</math>, то градиент в точке <math>\vec{x_1}=\vec{x_0}+\lambda \vec{S_0}</math> перпендикулярен градиенту в точке <math>\vec{x_0}</math>, тогда по правилам скалярного произведения векторов:

<math>(\nabla f(\vec{x_0}),\nabla f(\vec{x_1}))=0</math>

Приняв во внимание последнее, получим из выражения (4) окончательную формулу для вычисления <math>\omega</math>:

<math>\omega_1=\frac{||\nabla f(\vec{x_1})||^2}{||\nabla f(\vec{x_0})||^2}</math>

К-я итерация

На k-й итерации имеем набор <math>\vec{S_0},\ldots,\vec{S_{k-1}}</math>.

Тогда следующее направление вычисляется по формуле:

<math>\vec{S_k}=-\nabla f(\vec{x_k}) - \|\nabla f(\vec{x_k})\|^2 {\cdot} \left( \frac{\nabla f(\vec{x}_{k-1})}{\|\nabla f(\vec{x}_{k-1})\|^2} + \ldots + \frac{\nabla f(\vec{x_0})}{\|\nabla f(\vec{x}_0)\|^2} \right)</math>

Это выражение может быть переписано в более удобном итеративном виде:

<math>\vec{S_k}=-\nabla f(\vec{x_k})+\omega_k \vec{S}_{k-1},\qquad \omega_i=\frac{\|\nabla f(\vec{x_i})\|^2}{\|\nabla f(\vec{x}_{i-1})\|^2},</math>

где <math>\omega_k</math> непосредственно рассчитывается на k-й итерации.

Алгоритм

  • Пусть <math>\vec{x}_0</math> — начальная точка, <math>\vec{r}_0</math> — направление антиградиента и мы пытаемся найти минимум функции <math>f(\vec{x})</math>. Положим <math>\vec{S}_0=\vec{r}_0</math> и найдём минимум вдоль направления <math>\vec{S}_0</math>. Обозначим точку минимума <math>\vec{x}_1</math>.
  • Пусть на некотором шаге мы находимся в точке <math>\vec{x}_k</math>, и <math>\vec{r}_k</math> — направление антиградиента. Положим <math>\vec{S}_k=\vec{r}_{k}+\omega_k \vec{S}_{k-1}</math>, где <math>\omega_k</math> выбирают либо <math>\frac{(\vec{r}_k,\vec{r}_k)}{(\vec{r}_{k-1},\vec{r}_{k-1})}</math> (стандартный алгоритм — Флетчера-Ривса, для квадратичных функций с <math>H>0</math>), либо <math>\max(0,\frac{(\vec{r}_k,\vec{r}_k-\vec{r}_{k-1})}{(\vec{r}_{k-1},\vec{r}_{k-1})})</math> (алгоритм Полака–Рибьера). После чего найдём минимум в направлении <math>\vec{S_k}</math> и обозначим точку минимума <math>\vec{x}_{k+1}</math>. Если в вычисленном направлении функция не уменьшается, то нужно забыть предыдущее направление, положив <math>\omega_k=0</math> и повторив шаг.

Формализация

  1. Задаются начальным приближением и погрешностью: <math>\vec{x}_0,\quad \varepsilon, \quad k=0</math>
  2. Рассчитывают начальное направление: <math>j=0,\quad \vec{S}_k^j=-\nabla f(\vec{x}_k),\quad \vec{x}_k^j=\vec{x}_k</math>
  3. <math>\vec{x}_k^{j+1}=\vec{x}_k^j+\lambda\vec{S}_k^j,\quad \lambda=\arg\min_\lambda f(\vec{x}_k^j+\lambda \vec{S}_k^j),\quad \vec{S}_k^{j+1}=-\nabla f(\vec{x}_k^{j+1})+\omega \vec{S}_k^j,\quad \omega=\frac{||\nabla f(\vec{x}_k^{j+1})||^2}{||\nabla f(\vec{x}_k^{j})||^2}</math>
    • Если <math>||\vec{S}_k^{j+1}||<\varepsilon</math> или <math>||\vec{x}_k^{j+1}-\vec{x}_k^j||<\varepsilon</math>, то <math>\vec{x}=\vec{x}_k^{j+1}</math> и остановка.
    • Иначе
      • если <math>(j+1)<n</math>, то <math>j=j+1</math> и переход к 3;
      • иначе <math>\vec{x}_{k+1}=\vec{x}_k^{j+1},\quad k=k+1</math> и переход к 2.

Случай квадратичной функции

Шаблон:Message box

Литература

  1. Шаблон:Книга
  2. Шаблон:Книга
  3. Шаблон:Книга
  4. Шаблон:Книга
  5. Шаблон:Книга
  6. Шаблон:Книга

Шаблон:Методы оптимизации