Метод сопряжённых градиентов (Метод Флетчера — Ривcа) — метод нахождения локального экстремума функции на основе информации о её значениях и её градиенте . В случае квадратичной функции в
R
n
{\displaystyle \mathbb {R} ^{n}}
минимум находится не более чем за
n
{\displaystyle n}
шагов.
Определим терминологию:
Пусть
S
1
→
,
…
,
S
n
→
∈
X
⊂
R
n
{\displaystyle {\vec {S_{1}}},\ldots ,{\vec {S_{n}}}\in \mathbb {X} \subset \mathbb {R} ^{n}}
.
Введём на
X
{\displaystyle \mathbb {X} }
целевую функцию
f
(
x
→
)
∈
C
2
(
X
)
{\displaystyle f({\vec {x}})\in \mathrm {C^{2}} (\mathbb {X} )}
.
Векторы
S
1
→
,
…
,
S
n
→
{\displaystyle {\vec {S_{1}}},\ldots ,{\vec {S_{n}}}}
называются сопряжёнными , если:
S
i
→
T
H
S
j
→
=
0
,
i
≠
j
,
i
,
j
=
1
,
…
,
n
{\displaystyle {\vec {S_{i}}}^{T}H{\vec {S_{j}}}=0,\quad i\neq j,\quad i,j=1,\ldots ,n}
S
i
→
T
H
S
i
→
⩾
0
,
i
=
1
,
…
,
n
{\displaystyle {\vec {S_{i}}}^{T}H{\vec {S_{i}}}\geqslant 0,\quad i=1,\ldots ,n}
где
H
{\displaystyle H}
— матрица Гессе
f
(
x
→
)
{\displaystyle f({\vec {x}})}
.
Теорема (о существовании ). Существует хотя бы одна система
n
{\displaystyle n}
сопряжённых направлений для матрицы
H
{\displaystyle H}
, т.к. сама матрица
H
{\displaystyle H}
(её собственные вектора ) представляет собой такую систему.
Иллюстрация последовательных приближений метода наискорейшего спуска (зелёная ломаная) и метода сопряжённых градиентов (красная ломаная) к точке экстремума .
Пусть
S
0
→
=
−
∇
f
(
x
0
→
)
(
1
)
{\displaystyle {\vec {S_{0}}}=-\nabla f({\vec {x_{0}}})\qquad (1)}
Тогда
x
1
→
=
x
0
→
+
λ
1
S
0
→
{\displaystyle {\vec {x_{1}}}={\vec {x_{0}}}+\lambda _{1}{\vec {S_{0}}}\qquad }
.
Определим направление
S
1
→
=
−
∇
f
(
x
1
→
)
+
ω
1
S
0
→
(
2
)
{\displaystyle {\vec {S_{1}}}=-\nabla f({\vec {x_{1}}})+\omega _{1}{\vec {S_{0}}}\ \qquad (2)}
так, чтобы оно было сопряжено с
S
0
→
{\displaystyle {\vec {S_{0}}}}
:
S
0
→
T
H
S
1
→
=
0
(
3
)
{\displaystyle {\vec {S_{0}}}^{T}H{\vec {S_{1}}}=0\qquad (3)}
Разложим
∇
f
(
x
→
)
{\displaystyle \nabla f({\vec {x}})}
в окрестности
x
0
→
{\displaystyle {\vec {x_{0}}}}
и подставим
x
→
=
x
1
→
{\displaystyle {\vec {x}}={\vec {x_{1}}}}
:
∇
f
(
x
1
→
)
−
∇
f
(
x
0
→
)
=
H
(
x
1
→
−
x
0
→
)
=
λ
1
H
S
0
→
{\displaystyle \nabla f({\vec {x_{1}}})-\nabla f({\vec {x_{0}}})=H\,({\vec {x_{1}}}-{\vec {x_{0}}})=\lambda _{1}H{\vec {S_{0}}}}
Транспонируем полученное выражение и домножаем на
H
−
1
{\displaystyle H^{-1}}
справа:
(
∇
f
(
x
1
→
)
−
∇
f
(
x
0
→
)
)
T
H
−
1
=
λ
1
S
0
→
T
H
T
H
−
1
{\displaystyle (\nabla f({\vec {x_{1}}})-\nabla f({\vec {x_{0}}}))^{T}H^{-1}=\lambda _{1}{\vec {S_{0}}}^{T}H^{T}H^{-1}}
В силу непрерывности вторых частных производных
H
T
=
H
{\displaystyle H^{T}=H}
. Тогда:
S
0
→
T
=
(
∇
f
(
x
1
→
)
−
∇
f
(
x
0
→
)
)
T
H
−
1
λ
1
{\displaystyle {\vec {S_{0}}}^{T}={\frac {(\nabla f({\vec {x_{1}}})-\nabla f({\vec {x_{0}}}))^{T}H^{-1}}{\lambda _{1}}}}
Подставим полученное выражение в (3):
(
∇
f
(
x
1
→
)
−
∇
f
(
x
0
→
)
)
T
H
−
1
H
S
1
→
λ
1
=
0
{\displaystyle {\frac {(\nabla f({\vec {x_{1}}})-\nabla f({\vec {x_{0}}}))^{T}H^{-1}H{\vec {S_{1}}}}{\lambda _{1}}}=0}
Тогда, воспользовавшись (1) и (2):
(
∇
f
(
x
1
→
)
−
∇
f
(
x
0
→
)
)
T
(
−
∇
f
(
x
1
→
)
−
ω
1
∇
f
(
x
0
→
)
)
)
=
0
(
4
)
{\displaystyle (\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)}
Если
λ
=
arg
min
λ
f
(
x
0
→
+
λ
S
0
→
)
{\displaystyle \lambda =\arg \min _{\lambda }f({\vec {x_{0}}}+\lambda {\vec {S_{0}}})}
, то градиент в точке
x
1
→
=
x
0
→
+
λ
S
0
→
{\displaystyle {\vec {x_{1}}}={\vec {x_{0}}}+\lambda {\vec {S_{0}}}}
перпендикулярен градиенту в точке
x
0
→
{\displaystyle {\vec {x_{0}}}}
, тогда по правилам скалярного произведения векторов :
(
∇
f
(
x
0
→
)
,
∇
f
(
x
1
→
)
)
=
0
{\displaystyle (\nabla f({\vec {x_{0}}}),\nabla f({\vec {x_{1}}}))=0}
Приняв во внимание последнее, получим из выражения (4) окончательную формулу для вычисления
ω
{\displaystyle \omega }
:
ω
1
=
|
|
∇
f
(
x
1
→
)
|
|
2
|
|
∇
f
(
x
0
→
)
|
|
2
{\displaystyle \omega _{1}={\frac {||\nabla f({\vec {x_{1}}})||^{2}}{||\nabla f({\vec {x_{0}}})||^{2}}}}
На k-й итерации имеем набор
S
0
→
,
…
,
S
k
−
1
→
{\displaystyle {\vec {S_{0}}},\ldots ,{\vec {S_{k-1}}}}
.
Тогда следующее направление вычисляется по формуле:
S
k
→
=
−
∇
f
(
x
k
→
)
−
‖
∇
f
(
x
k
→
)
‖
2
⋅
(
∇
f
(
x
→
k
−
1
)
‖
∇
f
(
x
→
k
−
1
)
‖
2
+
…
+
∇
f
(
x
0
→
)
‖
∇
f
(
x
→
0
)
‖
2
)
{\displaystyle {\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)}
Это выражение может быть переписано в более удобном итеративном виде:
S
k
→
=
−
∇
f
(
x
k
→
)
+
ω
k
S
→
k
−
1
,
ω
i
=
‖
∇
f
(
x
i
→
)
‖
2
‖
∇
f
(
x
→
i
−
1
)
‖
2
,
{\displaystyle {\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}}},}
где
ω
k
{\displaystyle \omega _{k}}
непосредственно рассчитывается на k-й итерации.
Пусть
x
→
0
{\displaystyle {\vec {x}}_{0}}
— начальная точка,
r
→
0
{\displaystyle {\vec {r}}_{0}}
— направление антиградиента и мы пытаемся найти минимум функции
f
(
x
→
)
{\displaystyle f({\vec {x}})}
. Положим
S
→
0
=
r
→
0
{\displaystyle {\vec {S}}_{0}={\vec {r}}_{0}}
и найдём минимум вдоль направления
S
→
0
{\displaystyle {\vec {S}}_{0}}
. Обозначим точку минимума
x
→
1
{\displaystyle {\vec {x}}_{1}}
.
Пусть на некотором шаге мы находимся в точке
x
→
k
{\displaystyle {\vec {x}}_{k}}
, и
r
→
k
{\displaystyle {\vec {r}}_{k}}
— направление антиградиента. Положим
S
→
k
=
r
→
k
+
ω
k
S
→
k
−
1
{\displaystyle {\vec {S}}_{k}={\vec {r}}_{k}+\omega _{k}{\vec {S}}_{k-1}}
, где
ω
k
{\displaystyle \omega _{k}}
выбирают либо
(
r
→
k
,
r
→
k
)
(
r
→
k
−
1
,
r
→
k
−
1
)
{\displaystyle {\frac {({\vec {r}}_{k},{\vec {r}}_{k})}{({\vec {r}}_{k-1},{\vec {r}}_{k-1})}}}
(стандартный алгоритм — Флетчера-Ривса, для квадратичных функций с
H
>
0
{\displaystyle H>0}
), либо
max
(
0
,
(
r
→
k
,
r
→
k
−
r
→
k
−
1
)
(
r
→
k
−
1
,
r
→
k
−
1
)
)
{\displaystyle \max(0,{\frac {({\vec {r}}_{k},{\vec {r}}_{k}-{\vec {r}}_{k-1})}{({\vec {r}}_{k-1},{\vec {r}}_{k-1})}})}
(алгоритм Полака–Рибьера ). После чего найдём минимум в направлении
S
k
→
{\displaystyle {\vec {S_{k}}}}
и обозначим точку минимума
x
→
k
+
1
{\displaystyle {\vec {x}}_{k+1}}
. Если в вычисленном направлении функция не уменьшается, то нужно забыть предыдущее направление, положив
ω
k
=
0
{\displaystyle \omega _{k}=0}
и повторив шаг.
Задаются начальным приближением и погрешностью:
x
→
0
,
ε
,
k
=
0
{\displaystyle {\vec {x}}_{0},\quad \varepsilon ,\quad k=0}
Рассчитывают начальное направление:
j
=
0
,
S
→
k
j
=
−
∇
f
(
x
→
k
)
,
x
→
k
j
=
x
→
k
{\displaystyle j=0,\quad {\vec {S}}_{k}^{j}=-\nabla f({\vec {x}}_{k}),\quad {\vec {x}}_{k}^{j}={\vec {x}}_{k}}
x
→
k
j
+
1
=
x
→
k
j
+
λ
S
→
k
j
,
λ
=
arg
min
λ
f
(
x
→
k
j
+
λ
S
→
k
j
)
,
S
→
k
j
+
1
=
−
∇
f
(
x
→
k
j
+
1
)
+
ω
S
→
k
j
,
ω
=
|
|
∇
f
(
x
→
k
j
+
1
)
|
|
2
|
|
∇
f
(
x
→
k
j
)
|
|
2
{\displaystyle {\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}}}}
Если
|
|
S
→
k
j
+
1
|
|
<
ε
{\displaystyle ||{\vec {S}}_{k}^{j+1}||<\varepsilon }
или
|
|
x
→
k
j
+
1
−
x
→
k
j
|
|
<
ε
{\displaystyle ||{\vec {x}}_{k}^{j+1}-{\vec {x}}_{k}^{j}||<\varepsilon }
, то
x
→
=
x
→
k
j
+
1
{\displaystyle {\vec {x}}={\vec {x}}_{k}^{j+1}}
и остановка.
Иначе
если
(
j
+
1
)
<
n
{\displaystyle (j+1)<n}
, то
j
=
j
+
1
{\displaystyle j=j+1}
и переход к 3;
иначе
x
→
k
+
1
=
x
→
k
j
+
1
,
k
=
k
+
1
{\displaystyle {\vec {x}}_{k+1}={\vec {x}}_{k}^{j+1},\quad k=k+1}
и переход к 2.
Теорема. Если сопряжённые направления используются для поиска минимума квадратичной функции, то эта функция может быть минимизирована за
n
{\displaystyle n}
шагов, по одному в каждом направлении, причём порядок несущественен.
Акулич И. Л. Математическое программирование в примерах и задачах: Учеб. пособие для студентов эконом. спец. вузов. — М. : Высш. шк., 1986.
Гилл Ф., Мюррей У., Райт М. Практическая оптимизация. Пер. с англ. — М. : Мир, 1985.
Коршунов Ю. М., Коршунов Ю. М. Математические основы кибернетики. — М. : Энергоатомиздат, 1972.
Максимов Ю. А.,Филлиповская Е. А. Алгоритмы решения задач нелинейного программирования. — М. : МИФИ, 1982.
Максимов Ю. А. Алгоритмы линейного и дискретного программирования. — М. : МИФИ, 1980.
Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. — М. : Наука, 1970. — С. 575—576.