Метод сопряжённых градиентов

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(Рекомендации программисту)
м
 
(12 промежуточных версий не показаны.)
Строка 1: Строка 1:
 +
==Введение==
 +
Метод сопряжённых градиентов — итерационный метод для безусловной оптимизации в многомерном пространстве. Основным достоинством метода является то, что он решает квадратичную задачу оптимизации за конечное число шагов. Поэтому, сначала описывается метод сопряжённых градиентов для оптимизации квадратичного функционала, выводятся итерационные формулы, приводятся оценки скорости сходимости. После этого показывается, как метод сопряжённых обобщается для оптимизации произвольного функционала, рассматриваются
 +
различные варианты метода, обсуждается сходимость.
 +
==Постановка задачи оптимизации==
==Постановка задачи оптимизации==
-
Пусть задано множество <tex> X \subset R^n </tex> и на этом множестве определена ''целевая функция'' (''objective function'') <tex>f : R^n \mapsto R</tex>. Задача оптимизации состоит в нахождении на множестве <tex>X</tex> точной верхней или точной нижней грани ''целевой функции''. <br/>
+
Пусть задано множество <tex> X \subset R^n </tex> и на этом множестве определена ''целевая функция'' (''objective function'') <tex>f \: R^n \mapsto R</tex>. Задача оптимизации состоит в нахождении на множестве <tex>X</tex> точной верхней или точной нижней грани ''целевой функции''. <br/>
Множество точек, на которых достигается нижняя грань целевой функции обозначается <tex>X_* </tex>. <br/>
Множество точек, на которых достигается нижняя грань целевой функции обозначается <tex>X_* </tex>. <br/>
::<tex>X_* = \{x \in X| f(x) = inf \limits_{x \in X} f(x) \} </tex> <br/>
::<tex>X_* = \{x \in X| f(x) = inf \limits_{x \in X} f(x) \} </tex> <br/>
Строка 7: Строка 11:
Если <tex> X \neq R^n </tex>, то задача оптимизации называется ''условной'' (''constrained'').
Если <tex> X \neq R^n </tex>, то задача оптимизации называется ''условной'' (''constrained'').
-
==Метод сопряжённых градиентов==
+
==Метод сопряжённых градиентов для квадратичного функционала==
-
 
+
-
''Метод сопряжённых градиентов'' (''conjugate gradient method'') первоначально был разработан для решения систем линейных уравнений с положительно определённой матрицей. Позже этот метод обобщили для решения задач безусловной оптимизации в <tex>R^n</tex>
+
-
 
+
-
==Линейный метод сопряжённых градиентов ==
+
=== Изложение метода ===
=== Изложение метода ===
-
Рассмотрим сначала метод сопряжённых градиентов для решения следующей задачи оптимизации: <br/>
+
Рассмотрим следующую задачу оптимизации: <br/>
::<tex>F(x) = \frac{1}{2} \langle Ax, x \rangle - \langle b, x \rangle \to inf, \quad x \in R^n</tex> <br/>
::<tex>F(x) = \frac{1}{2} \langle Ax, x \rangle - \langle b, x \rangle \to inf, \quad x \in R^n</tex> <br/>
Здесь <tex>A</tex> - симметричная положительно определённая матрица размера <tex>n \times n</tex>.
Здесь <tex>A</tex> - симметричная положительно определённая матрица размера <tex>n \times n</tex>.
Строка 25: Строка 25:
::<tex>x_* = x_0 + \alpha_1 p_1 + \dots \alpha_n p_n </tex>
::<tex>x_* = x_0 + \alpha_1 p_1 + \dots \alpha_n p_n </tex>
Каждое следующее приближение вычисляется по формуле: <br/>
Каждое следующее приближение вычисляется по формуле: <br/>
-
::<tex>x_k = x_0 + \alpha_1 p_1 + \dots \alpha_n p_k </tex> <br/>
+
::<tex>x_k = x_0 + \alpha_1 p_1 + \dots \alpha_k p_k </tex> <br/>
'''Определение.''' Два вектора <tex>p</tex> и <tex>q</tex> называются ''сопряжёнными'' относительно симметричной матрицы B, если <tex> \langle Bp,q \rangle = 0</tex>
'''Определение.''' Два вектора <tex>p</tex> и <tex>q</tex> называются ''сопряжёнными'' относительно симметричной матрицы B, если <tex> \langle Bp,q \rangle = 0</tex>
Строка 38: Строка 38:
::<tex>\beta_k = \frac{ \langle F'(x_{k}), Ap_k \rangle}{ \langle Ap_k, p_k \rangle} </tex>
::<tex>\beta_k = \frac{ \langle F'(x_{k}), Ap_k \rangle}{ \langle Ap_k, p_k \rangle} </tex>
<br/>
<br/>
-
Если обозначить за <tex>r_k = b - Ax_k = -f'(x_{k})</tex> , то после нескольких упрощений получим окончательные формулы, используемые при применении метода сопряжённых градиентов на практике: <br/>
+
Если обозначить за <tex>r_k = b - Ax_k = -F'(x_{k})</tex> , то после нескольких упрощений получим окончательные формулы, используемые при применении метода сопряжённых градиентов на практике: <br/>
<p align = "center">
<p align = "center">
<tex>r_1 = b - Ax_0</tex> <br/>
<tex>r_1 = b - Ax_0</tex> <br/>
Строка 85: Строка 85:
x =\begin{bmatrix} 0.92 \\ \\ -0.44 \\ \\ 1.80 \end{bmatrix},
x =\begin{bmatrix} 0.92 \\ \\ -0.44 \\ \\ 1.80 \end{bmatrix},
</tex>
</tex>
-
получается за две итерации. Собственные числа матрицы <tex>A</tex> - 5, 5, -5 - среди них два различных, поэтому, согласно теоретической оценке, число итераций не могло превышать двух
+
получается за две итерации. Собственные числа матрицы <tex>A</tex> - 5, 5, -5 - среди них два различных, поэтому, согласно теоретической оценке число итераций не могло превышать двух
=== Заключение ===
=== Заключение ===
-
Метод сопряжённых градиентов - один из наиболее эффективных методов решения СЛАУ с положительно определённой матрицей. Метод гарантирует сходимость за конечное число шагов, а нужная точность может быть достигнута значительно раньше. Основная проблема заключается в том, что из-за накопления погрешностей может нарушаться перпендикулярность базисных веторов <tex>p_k</tex>, что ухудшает сходимость
+
Метод сопряжённых градиентов - один из наиболее эффективных методов решения СЛАУ с положительно определённой матрицей. Метод гарантирует сходимость за конечное число шагов, а нужная точность может быть достигнута значительно раньше. Основная проблема заключается в том, что из-за накопления погрешностей может нарушаться ортогональность базисных веторов <tex>p_k</tex>, что ухудшает сходимость
-
==Нелинейный метод сопряжённых градиентов==
+
== Метод сопряжённых градиентов в общем случае ==
-
Расссмотрим теперь модификацию метода сопряжённых градиентов, для случая, когда минимизируемый функционал не является квадратичным:
+
Расссмотрим теперь модификацию метода сопряжённых градиентов для случая, когда минимизируемый функционал не является квадратичным:
Будем решать задачу:
Будем решать задачу:
::<tex>F(x) \to min, \quad x \in R^n </tex>.
::<tex>F(x) \to min, \quad x \in R^n </tex>.
<tex>F(x) </tex> - непрерывно дифференцируемая в <tex>R^n </tex> функция.
<tex>F(x) </tex> - непрерывно дифференцируемая в <tex>R^n </tex> функция.
-
Чтобы модифицировать метод сопряжённых градиентов для решения этой задачи, необходимо получить для <tex>p_k, \alpha_k, \beta_k </tex> формулы, в кторые не входит матрица А:
+
Чтобы модифицировать метод сопряжённых градиентов для решения этой задачи необходимо получить для <tex>p_k, \alpha_k, \beta_k </tex> формулы, в которые не входит матрица А:
::<tex>\alpha_k = argmin \limits_{\alpha_k} F(x_{k-1} + \alpha_k p_k)</tex>
::<tex>\alpha_k = argmin \limits_{\alpha_k} F(x_{k-1} + \alpha_k p_k)</tex>
::<tex> p_{k+1} = - F'(x_{k}) + \beta_{k} p_{k} </tex>
::<tex> p_{k+1} = - F'(x_{k}) + \beta_{k} p_{k} </tex>
<tex> \beta_k </tex> можно вычислять по одной из трёх формул: <br/>
<tex> \beta_k </tex> можно вычислять по одной из трёх формул: <br/>
#<tex> \beta_k = - \frac{\langle F'(x_{k} ), F'(x_{k}) \rangle}{\langle F'(x_{k-1}), F'(x_{k-1}) \rangle} </tex> - ''Метод Флетчера - Ривса'' (''Fletcher–Reeves method'')
#<tex> \beta_k = - \frac{\langle F'(x_{k} ), F'(x_{k}) \rangle}{\langle F'(x_{k-1}), F'(x_{k-1}) \rangle} </tex> - ''Метод Флетчера - Ривса'' (''Fletcher–Reeves method'')
-
#<tex> \beta_k = \frac{\langle F'(x_{k}), F'(x_k) - F'(x_{k-1}} ) \rangle}{\langle F'(x_{k - 1}), F'(x_{k - 1}) \rangle} </tex> - ''Метод Полака - Райбера'' (''Polak–Ribi`ere method'')
+
#<tex> \beta_k = \frac{\langle F'(x_{k}), F'(x_k) - F'(x_{k-1} ) \rangle}{\langle F'(x_{k - 1}), F'(x_{k - 1}) \rangle} </tex> - ''Метод Полака - Райбера'' (''Polak–Ribi`ere method'')
#<tex> \beta_k = \frac{\langle F''(x_k) p_k, F'(x_k) \rangle}{\langle F''(x_{k - 1})p_k, p_k \rangle} </tex>
#<tex> \beta_k = \frac{\langle F''(x_k) p_k, F'(x_k) \rangle}{\langle F''(x_{k - 1})p_k, p_k \rangle} </tex>
Если функция <tex>F(x)</tex> - квадратичная и строго выпуклая, то все три формулы дают одинаковый результат. Если <tex>F(x)</tex> -
Если функция <tex>F(x)</tex> - квадратичная и строго выпуклая, то все три формулы дают одинаковый результат. Если <tex>F(x)</tex> -
Строка 106: Строка 106:
===Анализ метода===
===Анализ метода===
-
Если функция <tex>F(x)</tex> - не квадратичная, метод сопряжённых градиентов может и не сходиться за конечное число шагов. Кроме того, точное вычисление <tex>\alpha_k</tex> на каждом шаге возможно только в редких случаях. Поэтому накопление погрешностей приводит к тому, что вектора <tex> p_k</tex> перестают указывать направление убывания функции <tex>F(x)</tex>. Тогда на какои-то шаге полагают <tex>\beta_k = 0</tex>. Совокупность всех номеров <tex>k</tex>, при которых принимается <tex>\beta_k = 0</tex> обозначим за <tex>I_0</tex>. Номера <tex>k \in I_0</tex> называются ''моментами обновления метода''. На практике часто выбирают
+
Если функция <tex>F(x)</tex> - не квадратичная, метод сопряжённых градиентов может и не сходиться за конечное число шагов. Кроме того, точное вычисление <tex>\alpha_k</tex> на каждом шаге возможно только в редких случаях. Поэтому накопление погрешностей приводит к тому, что вектора <tex> p_k</tex> перестают указывать направление убывания функции <tex>F(x)</tex>. Тогда на каком-то шаге полагают <tex>\beta_k = 0</tex>. Совокупность всех номеров <tex>k</tex>, при которых принимается <tex>\beta_k = 0</tex>, обозначим за <tex>I_0</tex>. Номера <tex>k \in I_0</tex> называются ''моментами обновления метода''. На практике часто выбирают
<tex>I_0 = \{n, 2n, 3n, \dots \}</tex>, где <tex>n</tex> - размерность пространства.
<tex>I_0 = \{n, 2n, 3n, \dots \}</tex>, где <tex>n</tex> - размерность пространства.
Строка 135: Строка 135:
На каждой итерации методов Полака-Райбера или Флетчера-Ривса по одному разу вычисляются функция <tex>F(x)</tex> и её градиент
На каждой итерации методов Полака-Райбера или Флетчера-Ривса по одному разу вычисляются функция <tex>F(x)</tex> и её градиент
<tex>F'(x)</tex>, решается задача одномерной оптимизации
<tex>F'(x)</tex>, решается задача одномерной оптимизации
-
<tex>F(x_{k - 1} + \alpha_k p_k) \to min \limits_{\alpha_k \geq 0} </tex> . Таким образом, сложность одного шага метода споряжённых градиентов имеет тот же порядок что и сложность шага метода скорейшего спуска. На практике, метод сопряжённых градиентов
+
<tex>F(x_{k - 1} + \alpha_k p_k) \to min \limits_{\alpha_k \geq 0} </tex> . Таким образом, сложность одного шага метода сопряжённых градиентов имеет тот же порядок, что и сложность шага метода скорейшего спуска. На практике метод сопряжённых градиентов
показывает лучшую скорость сходимости.
показывает лучшую скорость сходимости.
=== Числовой пример===
=== Числовой пример===
-
Будем искать методом сопряжённых градиентов минимум функции <tex>F(x_1, x2) = (x_1 - 5)^2 (x_2 - 4)^2 + (x_1 - 5)^2 + (x_2 - 4)^2 + 1</tex>. Минимум этой фнкции равен 1 и достигается в точке (5, 4).
+
Будем искать методом сопряжённых градиентов минимум функции <tex>F(x_1, x2) = (x_1 - 5)^2 (x_2 - 4)^2 + (x_1 - 5)^2 + (x_2 - 4)^2 + 1</tex>. Минимум этой функции равен 1 и достигается в точке (5, 4).
Сравним на примере этой функции методы Полака-Райбера и Флетчера-Ривса.
Сравним на примере этой функции методы Полака-Райбера и Флетчера-Ривса.
Итерации в обоих методах прекращаются, когда на текущем шаге квадрат нормы градиента становится меньше <tex>\varepsilon</tex>.
Итерации в обоих методах прекращаются, когда на текущем шаге квадрат нормы градиента становится меньше <tex>\varepsilon</tex>.
Строка 176: Строка 176:
|-
|-
|}
|}
-
 
-
=== Рекомендации программисту ===
 
-
 
-
===Заключение ===
 
-
В методе сопряжённых градиентов используется информация только о линейной части приращения в точке, как и в методах градиентного спуска. При этом, метод сопряжённых градиентов позволяет решать квадратичные задачи за конечное число шагов. На многих других задачах метод сопряжённого градиента также превосходит метод градиентного спуска.
 
-
Сходимость метода градиентов существенно зависит от того, насколько точно решается задача одномерной оптимизации <tex>F(x_{k - 1} + \alpha_k p_k) \to min \limits_{\alpha_k \geq 0} </tex>. Возможные зацикливания метода устраняются с помощью обновлений. Тем не менее, если метод попадёт в локальный минимум функции, скорее всего, ему не удастся из него выбраться.
 
-
==Программная реализация ==
+
== Рекомендации программисту ==
 +
Реализовано два варианта метода сопряжённых градиентов: для минимизации квадратичного функционала, и для минимизации произвольной функции.
 +
В первом случае метод реализуется функцией <br/>
 +
<code>vector<double> FindSolution(matrix<double> A, vector<double> b)</code> <br/>
 +
Здесь '''A''' и '''b''' - матрица и вектор, фигурирющие в определении квадратичной задачи оптимизации. <br/>
 +
Для минимизации произвольного функционала можно использовать одну из двух функций: <br/>
 +
<code>vector<double> FletcherRievesMethod(int spaceSize, Function F, vector<double> (*GradF) (vector<double>)) </code> <br/>
 +
<code>vector<double> PolakRibiereMethod(int spaceSize, Function F, vector<double> (*GradF) (vector<double>)) </code> <br/>
 +
Параметры для обеих функций совпадают и имеют следующий смысл: <br/>
 +
''' spaceSize ''' - размерность пространства( число переменных, от которых зависит минимизируемый функционал) <br/>
 +
''' F ''' - указатель на минимизируемую функцию. Функция должна иметь вид <code> double <имя функции>( vector<double>) </code> <br/>
 +
''' GradF ''' - указатель на функцию, вычисляющую градиент минимизируемого функционала <br/>
 +
Оба метода используют вспомогательную функцию для решения задачи одномерной оптимизации. В программе реализована одномерная оптимизация методом золотого сечения.
 +
 +
Исходный код программ:
[[Media:Slimper_LinearGradient.zip|Линейный метод сопряженных градиентов, исходный код [1кб]]] <br/>
[[Media:Slimper_LinearGradient.zip|Линейный метод сопряженных градиентов, исходный код [1кб]]] <br/>
[[Media:Slimper_NonLinearGradient.zip|Нелинейный метод сопряжённых градиентов, исходный код [1кб] ]]<br/>
[[Media:Slimper_NonLinearGradient.zip|Нелинейный метод сопряжённых градиентов, исходный код [1кб] ]]<br/>
-
[[Media:Slimper_Ublas.zip| Библиотека алгоритмов линейной алгебры [180кб] ]]
+
При написании программ использовалась библиотека Boost, скачать которую можно по адресу [http://www.boost.org http://www.boost.org]
 +
 
 +
== Заключение ==
 +
В методе сопряжённых градиентов используется информация только о линейной части приращения в точке, как и в методах градиентного спуска. При этом метод сопряжённых градиентов позволяет решать квадратичные задачи за конечное число шагов. На многих других задачах метод сопряжённого градиента также превосходит метод градиентного спуска.
 +
Сходимость метода градиентов существенно зависит от того, насколько точно решается задача одномерной оптимизации <tex>F(x_{k - 1} + \alpha_k p_k) \to min \limits_{\alpha_k \geq 0} </tex>. Возможные зацикливания метода устраняются с помощью обновлений. Тем не менее, если метод попадёт в локальный минимум функции, скорее всего, ему не удастся из него выбраться.
 +
 
 +
== См. также ==
 +
* [[Метод Нелдера-Мида]]
 +
* [[Метод Ньютона. Метод Стеффенсена]]
== Список литературы ==
== Список литературы ==
* '' Васильев Ф. П. '' &nbsp; Методы оптимизации - Издательство «Факториал Пресс», 2002 <br/>
* '' Васильев Ф. П. '' &nbsp; Методы оптимизации - Издательство «Факториал Пресс», 2002 <br/>
* '' Nocedal J., Wright S.J. '' &nbsp; Numerical Optimization ,Springer, 1999
* '' Nocedal J., Wright S.J. '' &nbsp; Numerical Optimization ,Springer, 1999
 +
 +
[[Категория:Численные методы безусловной оптимизации|Сопряжённых градиентоа]]

Текущая версия

Содержание

Введение

Метод сопряжённых градиентов — итерационный метод для безусловной оптимизации в многомерном пространстве. Основным достоинством метода является то, что он решает квадратичную задачу оптимизации за конечное число шагов. Поэтому, сначала описывается метод сопряжённых градиентов для оптимизации квадратичного функционала, выводятся итерационные формулы, приводятся оценки скорости сходимости. После этого показывается, как метод сопряжённых обобщается для оптимизации произвольного функционала, рассматриваются различные варианты метода, обсуждается сходимость.

Постановка задачи оптимизации

Пусть задано множество  X \subset R^n и на этом множестве определена целевая функция (objective function) f \: R^n \mapsto R. Задача оптимизации состоит в нахождении на множестве X точной верхней или точной нижней грани целевой функции.
Множество точек, на которых достигается нижняя грань целевой функции обозначается X_* .

X_* = \{x \in X| f(x) = inf \limits_{x \in X} f(x) \}

Если  X = R^n , то задача оптимизации называется безусловной (unconstrained). Если  X \neq R^n , то задача оптимизации называется условной (constrained).

Метод сопряжённых градиентов для квадратичного функционала

Изложение метода

Рассмотрим следующую задачу оптимизации:

F(x) = \frac{1}{2} \langle Ax, x \rangle - \langle b, x \rangle \to inf, \quad x \in R^n

Здесь A - симметричная положительно определённая матрица размера n \times n. Такая задача оптимизации называется квадратичной. Заметим, что F'(x) = Ax - b. Условие экстремума функции F'(x) = 0 эквивалентно системе  Ax - b = 0 Функция F достигает своей нижней грани в единственной точке x_*, определяемой уравнением  Ax_* = b . Таким образом, данная задача оптимизации сводится к решению системы линейных уравнений  Ax = b
Идея метода сопряжённых градиентов состоит в следующем:
Пусть  \{p_k \} _{k = 1}^n - базис в R^n . Тогда для любой точки  x_0 \in R^n вектор x_* - x_0 раскладывается по базису x_* - x_0 = \alpha_1 p_1 + \dots \alpha_n p_n Таким образом, x_* представимо в виде

x_* = x_0 + \alpha_1 p_1 + \dots \alpha_n p_n

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

x_k = x_0 + \alpha_1 p_1 + \dots \alpha_k p_k

Определение. Два вектора p и q называются сопряжёнными относительно симметричной матрицы B, если  \langle Bp,q \rangle = 0

Опишем способ построения базиса  \{p_k \}_{k = 1}^n в методе сопряжённых градиентов В качестве начального приближения  x_0 выбираем произвольный вектор. На каждой итерации \alpha_k выбираются по правилу:

\alpha_k = argmin \limits_{\alpha_k} F(x_{k-1} + \alpha_k  p_k)

Базисные вектора  \{p_k \} вычисляются по формулам:

 p_1 = -F'(x_0)
 p_{k+1} = - F'(x_{k}) + \beta_{k} p_{k}

Коэффициенты \beta_k выбираются так, чтобы векторы p_k и p_{k + 1} были сопряжёнными относительно А.

\beta_k =  \frac{ \langle F'(x_{k}), Ap_k \rangle}{ \langle Ap_k,  p_k \rangle}


Если обозначить за r_k = b - Ax_k = -F'(x_{k}) , то после нескольких упрощений получим окончательные формулы, используемые при применении метода сопряжённых градиентов на практике:

r_1 = b - Ax_0
 p_1 = r_1

\begin{equation*}
\alpha_k  = \frac{ \langle r_k, r_k \rangle }{ \langle Ap_k, p_k \rangle } \\
x_{k + 1} = x_k + \alpha_k p_k \\
r_{k + 1} = r_k - \alpha_k Ap_k \\
\beta_k = \frac{ \langle r_{k + 1}, r_{k + 1} \rangle }{\langle r_k,  r_k \rangle} \\
p_{k + 1} = r_{k + 1} + b_k p_k \\ 
\end{equation*}

Анализ метода

Для метода сопряжённых градиентов справедлива следующая теорема:
Теорема Пусть F(x) = \frac{1}{2}  \langle Ax, x \rangle - \langle b, x \rangle , где A - симметричная положительно определённая матрица размера n. Тогда метод сопряжённых градиентов сходится не более чем за n шагов и справедливы следующие соотношения:

  1. \langle A p_k, p_m \rangle = 0 \quad \forall k, m, \quad k \neq m
  2. \langle F'(x_k), F'(x_m)  \rangle = 0 \quad \forall k, m, \quad k \neq m
  3. \langle F'(x_k),p_m)  \rangle = 0 \quad \forall k, m, \quad m < k

Сходимость метода

Если все вычисления точные, и исходные данные точны то метод сходится к решению системы не более чем за n итераций, гдеn - размерность системы. Более тонкий анализ показывает, что число итераций не превышает m, где m - число различных собственных значений матрицы A. Для оценки скорости сходимости верна следующая (довольно грубая) оценка:

 || x_k - x_* ||_A \leq  ( \frac{ \sqrt  {\kappa(A) } - 1}{ \sqrt { \kappa(A) } + 1} ) || x_0 - x_* ||_A , где

 \kappa(A) = || A || \: || A^{-1} || = \lambda_1 / \lambda_n . Она позволяет оценить скорость сходимости, если известны оценки для максимального \lambda_1 и минимального \lambda_n собственных значений матрицы A На практике чаще всего используют следующий критерий останова:

|| r_k || < \eps.

Вычислительная сложность

На каждой итерации метода выполняется O(n^2) операций. Такое количество операций требуется для вычисления произведения Ap_k - это самая трудоёмкая процедура на каждой итерации. Отальные вычисления требуют O(n) операций. Суммарная вычислительная сложность метода не превышает O(n^3) - так как число итераций не больше n.

Численный пример

Применим метод сопряжённых градиентов для решения системы Ax = b, где
 A = \begin{bmatrix}  3 & 4 & 0 \\ \\ 4 & -3 & 0 \\ \\ 0 & 0 & 5 \end{bmatrix}, \qquad 
b = \begin{bmatrix} 1 \\ \\  \\ \\ 5 \\ \\ 9 \end{bmatrix}
C помощью метода сопряжённых градиентов решение этой системы  
x =\begin{bmatrix} 0.92 \\ \\ -0.44 \\ \\ 1.80 \end{bmatrix}, 
получается за две итерации. Собственные числа матрицы A - 5, 5, -5 - среди них два различных, поэтому, согласно теоретической оценке число итераций не могло превышать двух

Заключение

Метод сопряжённых градиентов - один из наиболее эффективных методов решения СЛАУ с положительно определённой матрицей. Метод гарантирует сходимость за конечное число шагов, а нужная точность может быть достигнута значительно раньше. Основная проблема заключается в том, что из-за накопления погрешностей может нарушаться ортогональность базисных веторов p_k, что ухудшает сходимость

Метод сопряжённых градиентов в общем случае

Расссмотрим теперь модификацию метода сопряжённых градиентов для случая, когда минимизируемый функционал не является квадратичным: Будем решать задачу:

F(x) \to min, \quad x \in R^n .

F(x) - непрерывно дифференцируемая в R^n функция. Чтобы модифицировать метод сопряжённых градиентов для решения этой задачи необходимо получить для p_k, \alpha_k, \beta_k формулы, в которые не входит матрица А:

\alpha_k = argmin \limits_{\alpha_k} F(x_{k-1} + \alpha_k  p_k)
 p_{k+1} = - F'(x_{k}) + \beta_{k} p_{k}

 \beta_k можно вычислять по одной из трёх формул:

  1.  \beta_k = - \frac{\langle F'(x_{k} ), F'(x_{k}) \rangle}{\langle F'(x_{k-1}), F'(x_{k-1}) \rangle} - Метод Флетчера - Ривса (Fletcher–Reeves method)
  2.  \beta_k = \frac{\langle F'(x_{k}), F'(x_k) - F'(x_{k-1} ) \rangle}{\langle F'(x_{k - 1}), F'(x_{k - 1}) \rangle} - Метод Полака - Райбера (Polak–Ribi`ere method)
  3.  \beta_k = \frac{\langle F''(x_k) p_k, F'(x_k) \rangle}{\langle F''(x_{k - 1})p_k, p_k \rangle}

Если функция F(x) - квадратичная и строго выпуклая, то все три формулы дают одинаковый результат. Если F(x) - произвольная функция, то каждой из формул cоответствует своя модификация метода сопряжённых градиентов. Третья формула используется редко, так как она требует, чтобы функция F(x) \in C^2(R^n) и вычисления гессиана функции F(x) на каждом шаге метода.

Анализ метода

Если функция F(x) - не квадратичная, метод сопряжённых градиентов может и не сходиться за конечное число шагов. Кроме того, точное вычисление \alpha_k на каждом шаге возможно только в редких случаях. Поэтому накопление погрешностей приводит к тому, что вектора  p_k перестают указывать направление убывания функции F(x). Тогда на каком-то шаге полагают \beta_k = 0. Совокупность всех номеров k, при которых принимается \beta_k = 0, обозначим за I_0. Номера k \in I_0 называются моментами обновления метода. На практике часто выбирают I_0 = \{n, 2n, 3n, \dots \}, где n - размерность пространства.

Сходимость метода

Для метода Флетчера - Ривса существует теорема о сходимости, накладывающая не слишком жёсткие условия на минимизируемую функцию F(x):
Теорема.
Пусть  F(x) \in C^1(R^n) и выполняются следующие условия:

  1.  \alpha_k удовлетворяет строгим условиям Вольфа:
    1.  F(x_{k -1} + \alpha_k p_k ) \leq F(x_{k - 1}) +  c_1 \alpha_k \langle F'(x_{k - 1}), p_k \rangle
    2.  | \langle F'(x_{k -1} + \alpha_k p_k), p_k \rangle  \leq c_2 |\langle F'(x_{k - 1}), p_k \rangle| где  0 < c_1 < c_2 < 1/2
  2. Множество  M = \{ x | F(x) \leq F(x_0) \} ограничено
  3. Производная F'(x) удовлетворяет условию Липшица с константой L в некоторой окрестности  N

множества M: ||F'(x_1) - F'(x_2)|| \leq L ||x_1 - x_2|| \qquad \forall x_1, x_2 \in N .
Тогда

 \lim \limits_{k \to \infty} inf ||F'(x_k)| = 0

Для метода Полака-Райбера доказана сходимость в предположении, что F(x) - строго выпуклая функция. В общем случае доказать сходимость метода Полака - Райбера невозможно. Напоротив, верна следующая теорема:
Теорема.
Предположим, что в методе Полака-Райбера значения \alpha_k на каждом шаге вычисляются точно. Тогда существует функция F \: R^3 \mapsto R, \quad F(x) \in C^2(R^3), и начальное приближение x_0 , такие что \exists \delta > 0, \forall k = 0, 1, 2, ... \quad ||f(x_k)|| > \delta.

Тем не менее, на практике метод Полака-Райбера работает лучше.
Наиболее распространённые критерии останова на практике: Норма градиента становится меньше некоторого порога
Значение функции в течении m последовательных итераций почти не изменилось

Вычислительная сложность

На каждой итерации методов Полака-Райбера или Флетчера-Ривса по одному разу вычисляются функция F(x) и её градиент F'(x), решается задача одномерной оптимизации F(x_{k - 1} + \alpha_k p_k) \to min \limits_{\alpha_k \geq 0} . Таким образом, сложность одного шага метода сопряжённых градиентов имеет тот же порядок, что и сложность шага метода скорейшего спуска. На практике метод сопряжённых градиентов показывает лучшую скорость сходимости.

Числовой пример

Будем искать методом сопряжённых градиентов минимум функции F(x_1, x2) = (x_1 - 5)^2 (x_2 - 4)^2 + (x_1 - 5)^2 + (x_2 - 4)^2 + 1. Минимум этой функции равен 1 и достигается в точке (5, 4). Сравним на примере этой функции методы Полака-Райбера и Флетчера-Ривса. Итерации в обоих методах прекращаются, когда на текущем шаге квадрат нормы градиента становится меньше \varepsilon. Для выбора  \alpha_k используется метод золотого сечения

 \varepsilon Метод Флетчера - Ривса Метод Полака - Райбера
Число итераций Найденное решение Значение функции Число итераций Найденное решение Значение функции
0.01 18 (5.01382198,3.9697932) 1.00110367 15 (5.03942877,4.00003512) 1.00155463
0.001 20 (5.01056482,3.99018026) 1.00020805 18 (4.9915894,3.99999044) 1.00007074
0.0001 24 (4.9979991,4.00186173) 1.00000747 20 (5.00336181,4.0000018) 1.0000113
0.00001 25 (4.99898277,4.00094645) 1.00000193 22 (4.99846808,3.99999918) 1.00000235
0.00001 29 (4.99974658,4.0002358) 1.00000012 26 (4.99955034,3.99999976) 1.0000002

Рекомендации программисту

Реализовано два варианта метода сопряжённых градиентов: для минимизации квадратичного функционала, и для минимизации произвольной функции. В первом случае метод реализуется функцией
vector<double> FindSolution(matrix<double> A, vector<double> b)
Здесь A и b - матрица и вектор, фигурирющие в определении квадратичной задачи оптимизации.
Для минимизации произвольного функционала можно использовать одну из двух функций:
vector<double> FletcherRievesMethod(int spaceSize, Function F, vector<double> (*GradF) (vector<double>))
vector<double> PolakRibiereMethod(int spaceSize, Function F, vector<double> (*GradF) (vector<double>))
Параметры для обеих функций совпадают и имеют следующий смысл:
spaceSize - размерность пространства( число переменных, от которых зависит минимизируемый функционал)
F - указатель на минимизируемую функцию. Функция должна иметь вид double <имя функции>( vector<double>)
GradF - указатель на функцию, вычисляющую градиент минимизируемого функционала
Оба метода используют вспомогательную функцию для решения задачи одномерной оптимизации. В программе реализована одномерная оптимизация методом золотого сечения.

Исходный код программ: Линейный метод сопряженных градиентов, исходный код [1кб]
Нелинейный метод сопряжённых градиентов, исходный код [1кб]
При написании программ использовалась библиотека Boost, скачать которую можно по адресу http://www.boost.org

Заключение

В методе сопряжённых градиентов используется информация только о линейной части приращения в точке, как и в методах градиентного спуска. При этом метод сопряжённых градиентов позволяет решать квадратичные задачи за конечное число шагов. На многих других задачах метод сопряжённого градиента также превосходит метод градиентного спуска. Сходимость метода градиентов существенно зависит от того, насколько точно решается задача одномерной оптимизации F(x_{k - 1} + \alpha_k p_k) \to min \limits_{\alpha_k \geq 0} . Возможные зацикливания метода устраняются с помощью обновлений. Тем не менее, если метод попадёт в локальный минимум функции, скорее всего, ему не удастся из него выбраться.

См. также

Список литературы

  • Васильев Ф. П.   Методы оптимизации - Издательство «Факториал Пресс», 2002
  • Nocedal J., Wright S.J.   Numerical Optimization ,Springer, 1999
Личные инструменты