Строка 63:
Строка 63:
# <code>Находим <math>u^{k_l}</math> из (6).</code>
# <code>Находим <math>u^{k_l}</math> из (6).</code>
# <code>Вычисляем <math>\nabla J^l, ||\nabla J^l||</math> и находим <math>r^l</math> из (3) при <math>u=u^{k_l}</math>.</code>
# <code>Вычисляем <math>\nabla J^l, ||\nabla J^l||</math> и находим <math>r^l</math> из (3) при <math>u=u^{k_l}</math>.</code>
# <code>Если <math>||r^l||\leq c_1\sqrt{2}\,</math> или <math> l \geq l_{max}</math>, или <math>||u^{k_l}-u^k|| < \delta_m </math>, или {<math>\,l>1</math> и <math>\left| \frac{||r^l||-||r^{l-1}||}{||r^l||}\right| \leq c_1 </math>}, то принимаем <math>u^{k_\ast}=u^{k_l}</math>, возвращаем <math>\nabla J\left(u^{k_\ast}\right)</math>, <math>d^k={(u^{k_\ast}-u}^k)</math>, '''<big>стоп</big>''' <math>\color{red}\blacksquare</math>.</code>
# <code>Если <math>||r^l||\leq c_1\sqrt{2}\,</math> или <math> l \geq l_{max}</math>, или <math>||u^{k_l}-u^k|| < \delta_m </math>, или {<math>\,l>1</math> и <math>\left| \frac{||r^l||-||r^{l-1}||}{||r^l||}\right| \leq c_1 </math>}, то принимаем <math>u^{k_\ast}=u^{k_l}</math>, возвращаем <math>\nabla J\left(u^{k_\ast}\right)</math>, <math>d^k={(u^{k_\ast}-u}^k)</math>, {{font color||red| '''<big>стоп</big>'''}} .</code>
# <code>Если <math>l\neq 1,n,2n,3n\ldots</math>, задаём <math>\beta^l=||r^l||^2/||r^{l-1}||^2</math>, иначе <math>\beta^l=0</math>.</code>
# <code>Если <math>l\neq 1,n,2n,3n\ldots</math>, задаём <math>\beta^l=||r^l||^2/||r^{l-1}||^2</math>, иначе <math>\beta^l=0</math>.</code>
# <code>Вычисляем <math>p^l=-r^l+\beta^l p^{l-1}</math>.</code>
# <code>Вычисляем <math>p^l=-r^l+\beta^l p^{l-1}</math>.</code>
Метод коллинеарных градиентов (МКГ) [ 1] — итерационный метод направленного поиска локального экстремума гладкой функции многих переменных
J
(
u
)
:
R
n
→
R
{\displaystyle J(u)\colon \mathbb {R} ^{n}\to \mathbb {R} }
с движением к экстремуму вдоль вектора
d
∈
R
n
{\displaystyle d\in \mathbb {R} ^{n}}
такого, где градиенты
∇
J
(
u
)
{\displaystyle \nabla J(u)}
и
∇
J
(
u
+
d
)
{\displaystyle \nabla J(u+d)}
коллинеарные . Это метод перового порядка (использует только первые производные
∇
J
{\displaystyle \nabla J}
) с квадратичной скоростью сходимости . Может применяться к функциям высокой размерности
n
{\displaystyle n}
с несколькими локальными экстремумами. МКГ можно отнести к семейству методов Truncated Newton method
Коллинеарные векторы
∇
J
(
u
k
)
{\displaystyle \nabla J(u^{k})}
и
∇
J
(
u
k
∗
)
{\displaystyle \nabla J(u^{k_{\ast }})}
с направлением минимизации
d
k
{\displaystyle d^{k}}
для выпуклой функции,
n
=
2
{\displaystyle n=2}
Идея метода
Для гладкой функции
J
(
u
)
{\displaystyle J(u)}
в относительно большой окрестности точки
u
k
{\displaystyle u^{k}}
найдётся точка
u
k
∗
{\displaystyle u^{k_{\ast }}}
, где градиенты
∇
J
k
=
def
∇
J
(
u
k
)
{\displaystyle \nabla J^{k}\,{\overset {\textrm {def}}{=}}\,\nabla J(u^{k})}
и
∇
J
k
∗
=
def
∇
J
(
u
k
∗
)
{\displaystyle \nabla J^{k_{\ast }}\,{\overset {\textrm {def}}{=}}\,\nabla J(u^{k_{\ast }})}
коллинеарные. Направлением на экстремум
u
∗
{\displaystyle u_{\ast }}
из точки
u
k
{\displaystyle u^{k}}
будет направление
d
k
=
(
u
k
∗
−
u
k
)
{\displaystyle d^{k}={(u^{k_{\ast }}-u}^{k})}
. Вектор
d
k
{\displaystyle d^{k}}
указывает на максимум или на минимум в зависимости от положения точки
u
k
∗
{\displaystyle u^{k_{\ast }}}
. Она может быть спереди или сзади от
u
k
{\displaystyle u^{k}}
относительно направления на
u
∗
{\displaystyle u_{\ast }}
(см. рисунок). Далее будем рассматривать минимизацию.
Очередная итерация МКГ :
(1)
u
k
+
1
=
u
k
+
b
k
d
k
,
k
∈
{
0
,
1
…
}
,
{\displaystyle \quad u^{k+1}=u^{k}+b^{k}d^{k},\quad k\in \left\{0,1\dots \right\},}
где оптимальное
b
k
∈
R
{\displaystyle b^{k}\in \mathbb {R} }
находится аналитически из предположения квадратичности одномерной функции
J
(
u
k
+
b
d
k
)
{\displaystyle J(u^{k}+bd^{k})}
:
(2)
b
k
=
(
1
−
⟨
∇
J
(
u
k
∗
,
d
k
⟩
⟨
∇
J
(
u
k
)
,
d
k
⟩
)
−
1
,
∀
u
k
∗
.
{\displaystyle \quad b^{k}=\left(1-{\frac {\langle \nabla J(u^{k_{\ast }},d^{k}\rangle }{\langle \nabla J(u^{k}),d^{k}\rangle }}\right)^{-1},\quad \forall u^{k_{\ast }}.}
Угловые скобки — это скалярное произведение в евклидовом пространстве
R
n
{\displaystyle \mathbb {R} ^{n}}
. Если
J
(
u
)
{\displaystyle J(u)}
выпуклая функция в окрестности
u
k
{\displaystyle u^{k}}
, то для передней точки
u
k
∗
{\displaystyle u^{k_{\ast }}}
получаем число
b
k
>
0
{\displaystyle b^{k}>0}
, для задней
b
k
<
0
{\displaystyle b^{k}<0}
. Делаем шаг (1).
Для строго выпуклой квадратичной функции
J
(
u
)
{\displaystyle J(u)}
шаг МКГ
b
k
d
k
=
−
H
−
1
∇
J
k
,
{\displaystyle b^{k}d^{k}=-H^{-1}\nabla J^{k},}
т.е. это шаг метода Ньютона (метод второго порядка с квадратичной скоростью сходимости), где
H
{\displaystyle H}
— матрица Гессе . Такие шаги обеспечивают МКГ квадратичную скорость сходимости.
В общем случае, если
J
(
u
)
{\displaystyle J(u)}
имеет переменную выпуклость и возможны седловые точки , то следует контролировать направление минимизации по углу
γ
{\displaystyle \gamma }
между векторами
∇
J
k
{\displaystyle \nabla J^{k}}
и
d
k
{\displaystyle d^{k}}
. Если
cos
(
γ
)
=
⟨
∇
J
k
,
d
k
⟩
|
|
∇
J
(
u
k
)
|
|
|
|
d
k
|
|
≥
0
{\displaystyle \cos(\gamma )={\frac {\langle \nabla J^{k},d^{k}\rangle }{||\nabla J(u^{k})||\;||d^{k}||}}\geq 0}
, то
d
k
{\displaystyle d^{k}}
— это направление максимизации и в (1) следует брать
b
k
{\displaystyle b^{k}}
с обратным знаком.
Поиск коллинеарных градиентов
Коллинеарность градиентов оценивается невязкой их ортов , которая имеет вид системы
n
{\displaystyle n}
уравнений для поиска корня
u
=
u
k
∗
{\displaystyle u=u^{k_{\ast }}}
:
(3)
r
k
(
u
)
=
∇
J
(
u
)
|
|
∇
J
(
u
)
|
|
s
−
∇
J
(
u
k
)
|
|
∇
J
(
u
k
)
|
|
=
0
∈
R
n
,
{\displaystyle \quad r^{k}(u)={\frac {\nabla J(u)}{||\nabla J(u)||}}s-{\frac {\nabla J(u^{k})}{||\nabla J(u^{k})||}}=0\in \mathbb {R} ^{n},}
где знак
s
=
sgn
⟨
∇
J
(
u
)
,
∇
J
(
u
k
)
⟩
{\displaystyle s=\operatorname {sgn} \langle \nabla J(u),\nabla J(u^{k})\rangle }
позволяет одинаково оценивать коллинеарность градиентов по одну или разные стороны от минимума
u
∗
{\displaystyle u_{\ast }}
,
|
|
r
k
(
u
)
|
|
≤
2
{\displaystyle ||r^{k}(u)||\leq {\sqrt {2}}}
.
Система (3) решается итерационно (подитерации
l
{\displaystyle l\,}
) методом сопряжённых градиентов в предположении, что она линейна в окрестности
u
k
{\displaystyle u^{k}}
:
(4)
u
k
l
+
1
=
u
k
l
+
τ
l
p
l
,
l
=
1
,
2
…
,
{\displaystyle \quad u^{k_{l+1}}=u^{k_{l}}+\tau ^{l}p^{l},\quad l=1,2\ldots ,}
где вектор
p
l
=
def
p
(
u
k
l
)
=
−
r
l
+
β
l
p
l
−
1
{\displaystyle \;p^{l}\;{\overset {\textrm {def}}{=}}\,p(u^{k_{l}})=-r^{l}+{\beta ^{l}p}^{l-1}}
,
r
l
=
def
r
(
u
k
l
)
{\displaystyle \;r^{l}\,{\overset {\textrm {def}}{=}}\,r(u^{k_{l}})}
,
β
l
=
|
|
r
l
|
|
2
/
|
|
r
l
−
1
|
|
2
,
β
1
,
n
,
2
n
.
.
.
=
0
{\displaystyle \;\beta ^{l}=||r^{l}||^{2}/||r^{l-1}||^{2},\ \beta ^{1,n,2n...}=0}
,
τ
l
=
|
|
r
l
|
|
2
/
⟨
p
l
,
H
l
p
l
⟩
{\displaystyle \;\tau ^{l}=||r^{l}||^{2}/\langle p^{l},H^{l}p^{l}\rangle }
, произведение матрицы Гессе
H
l
{\displaystyle H^{l}}
на
p
l
{\displaystyle p^{l}}
находится численным дифференцированием:
(5)
H
l
p
l
≈
r
(
u
k
h
)
−
r
(
u
k
l
)
h
/
|
|
p
l
|
|
,
{\displaystyle \quad H^{l}p^{l}\approx {\frac {r(u^{k_{h}})-r(u^{k_{l}})}{h/||p^{l}||}},}
где
u
k
h
=
u
k
l
+
h
p
l
/
|
|
p
l
|
|
{\displaystyle u^{k_{h}}=u^{k_{l}}+hp^{l}/||p^{l}||}
,
h
{\displaystyle h}
— малое положительное число такое, что
⟨
p
l
,
H
l
p
l
⟩
≠
0
{\displaystyle \langle p^{l},H^{l}p^{l}\rangle \neq 0}
.
Начальное приближение задаётся под 45° ко всем осям координат длинной
δ
k
{\displaystyle \delta ^{k}}
:
(6)
u
i
k
1
=
u
i
k
+
δ
k
n
sgn
∇
i
J
k
,
i
=
1
…
n
.
{\displaystyle \quad u_{i}^{k_{1}}=u_{i}^{k}+{\frac {\delta ^{k}}{\sqrt {n}}}\operatorname {sgn} {\ \nabla _{i}J}^{k},\quad i=1\ldots n.}
Начальный радиус
δ
k
{\displaystyle \delta ^{k}}
-окрестности точки
u
k
{\displaystyle u^{k}}
корректируется:
(7)
δ
k
=
max
[
min
(
δ
k
−
1
|
|
∇
J
(
u
k
)
|
|
|
|
∇
J
(
u
k
−
1
)
|
|
,
δ
0
)
,
δ
m
]
,
k
>
0.
{\displaystyle \quad \delta ^{k}=\max \left[\min \left(\delta ^{k-1}{\frac {||\nabla J(u^{k})||}{||\nabla J(u^{k-1})||}},\delta ^{0}\right),\delta _{m}\right],\quad k>0.}
Необходимо
|
|
u
k
l
−
u
k
|
|
≥
δ
m
,
l
≥
1
{\displaystyle ||u^{k_{l}}-u^{k}||\geq \delta ^{m},\quad l\geq 1}
. Здесь малое положительное число
δ
m
{\displaystyle \delta _{m}}
заметно больше машинного эпсилон .
Подитерации
l
{\displaystyle l}
завершаются при выполнении хотя бы одного из условий:
|
|
r
l
|
|
≤
c
1
2
,
0
≤
c
1
<
1
{\displaystyle ||r^{l}||\leq c_{1}{\sqrt {2}},\quad 0\leq c_{1}<1}
— достигнута точность;
|
|
|
r
l
|
|
−
|
|
r
l
−
1
|
|
|
|
r
l
|
|
|
≤
c
1
,
l
>
1
{\displaystyle \left|{\frac {||r^{l}||-||r^{l-1}||}{||r^{l}||}}\right|\leq c_{1},\quad l>1}
— прекратилась сходимость;
l
≤
l
m
a
x
=
integer
|
c
2
ln
c
1
ln
n
|
,
c
2
≥
1
{\displaystyle l\leq l_{max}=\operatorname {integer} \left|c_{2}\ln c_{1}\ln n\right|,\quad c_{2}\geq 1}
— избыточность подитераций.
Алгоритм выбора направления минимизации
Параметры:
c
1
,
c
2
,
δ
0
,
δ
m
=
10
−
15
δ
0
,
h
=
10
−
5
{\displaystyle c_{1},c_{2},\delta ^{0},\delta _{m}=10^{-15}\delta ^{0},h=10^{-5}}
.
Входные данные:
n
,
k
=
0
,
u
k
,
J
(
u
k
)
,
∇
J
(
u
k
)
,
∇
J
k
{\displaystyle n,k=0,u^{k},J(u^{k}),\nabla J(u^{k}),\nabla J^{k}}
.
l
=
1
{\displaystyle l=1}
. Если
k
>
0
{\displaystyle k>0}
задаём
δ
k
{\displaystyle \delta ^{k}}
из (7).
Находим
u
k
l
{\displaystyle u^{k_{l}}}
из (6).
Вычисляем
∇
J
l
,
|
|
∇
J
l
|
|
{\displaystyle \nabla J^{l},||\nabla J^{l}||}
и находим
r
l
{\displaystyle r^{l}}
из (3) при
u
=
u
k
l
{\displaystyle u=u^{k_{l}}}
.
Если
|
|
r
l
|
|
≤
c
1
2
{\displaystyle ||r^{l}||\leq c_{1}{\sqrt {2}}\,}
или
l
≥
l
m
a
x
{\displaystyle l\geq l_{max}}
, или
|
|
u
k
l
−
u
k
|
|
<
δ
m
{\displaystyle ||u^{k_{l}}-u^{k}||<\delta _{m}}
, или {
l
>
1
{\displaystyle \,l>1}
и
|
|
|
r
l
|
|
−
|
|
r
l
−
1
|
|
|
|
r
l
|
|
|
≤
c
1
{\displaystyle \left|{\frac {||r^{l}||-||r^{l-1}||}{||r^{l}||}}\right|\leq c_{1}}
}, то принимаем
u
k
∗
=
u
k
l
{\displaystyle u^{k_{\ast }}=u^{k_{l}}}
, возвращаем
∇
J
(
u
k
∗
)
{\displaystyle \nabla J\left(u^{k_{\ast }}\right)}
,
d
k
=
(
u
k
∗
−
u
k
)
{\displaystyle d^{k}={(u^{k_{\ast }}-u}^{k})}
, стоп .
Если
l
≠
1
,
n
,
2
n
,
3
n
…
{\displaystyle l\neq 1,n,2n,3n\ldots }
, задаём
β
l
=
|
|
r
l
|
|
2
/
|
|
r
l
−
1
|
|
2
{\displaystyle \beta ^{l}=||r^{l}||^{2}/||r^{l-1}||^{2}}
, иначе
β
l
=
0
{\displaystyle \beta ^{l}=0}
.
Вычисляем
p
l
=
−
r
l
+
β
l
p
l
−
1
{\displaystyle p^{l}=-r^{l}+\beta ^{l}p^{l-1}}
.
Находим шаговый множитель
τ
l
{\displaystyle \tau ^{l}}
для подитераций:
запоминаем
u
k
l
{\displaystyle u^{k_{l}}}
,
∇
J
l
{\displaystyle \nabla J^{l}}
,
|
|
∇
J
l
|
|
{\displaystyle ||\nabla J^{l}||}
,
r
l
{\displaystyle r^{l}}
,
|
|
r
l
|
|
{\displaystyle ||r^{l}||}
;
задаём
u
k
h
=
u
k
l
+
h
p
l
/
|
|
p
l
|
|
{\displaystyle u^{k_{h}}=u^{k_{l}}+hp^{l}/||p^{l}||}
, вычисляем
∇
J
(
u
k
h
)
{\displaystyle \nabla J(u^{k_{h}})}
,
r
(
u
k
h
)
{\displaystyle r\left(u^{k_{h}}\right)}
и находим
H
l
p
l
{\displaystyle H^{l}p^{l}}
из (5), присваиваем
w
←
⟨
p
l
,
H
l
p
l
⟩
{\displaystyle w\leftarrow \langle p^{l},H^{l}p^{l}\rangle }
;
если
w
=
0
{\displaystyle w=0}
, тогда
h
←
10
h
{\displaystyle h\leftarrow 10h}
, возвращаемся к шагу 7.2;
восстанавливаем
u
k
l
{\displaystyle u^{k_{l}}}
,
∇
J
l
{\displaystyle \nabla J^{l}}
,
|
|
∇
J
l
|
|
{\displaystyle ||\nabla J^{l}||}
,
r
l
{\displaystyle r^{l}}
,
|
|
r
l
|
|
{\displaystyle ||r^{l}||}
;
находим
τ
l
=
|
|
r
l
|
|
2
/
w
{\displaystyle \tau ^{l}=||r^{l}||^{2}/w}
.
Делаем подитерацию
u
k
l
+
1
{\displaystyle u^{k_{l+1}}}
из (4).
l
←
l
+
1
{\displaystyle l\leftarrow l+1}
, переходим к шагу 3.
Параметр
c
2
=
3
÷
5
{\displaystyle c_{2}=3\div 5}
. Для функций без седловых точек рекомендуется
c
1
≈
10
−
8
{\displaystyle c_{1}\approx 10^{-8}}
,
δ
≈
10
−
5
{\displaystyle \delta \approx {10}^{-5}}
. Для «обхода» седловых точек рекомендуется
c
1
≈
0.1
{\displaystyle c_{1}\approx 0.1}
,
δ
≈
0.1
{\displaystyle \delta \approx 0.1}
.
Описанный алгоритм позволяет приблизительно найти коллинеарные градиенты из системы уравнений (3). Полученное направление
b
k
d
k
{\displaystyle b^{k}d^{k}}
для алгоритма МКГ (1) будет приблизительным направлением Ньютона (truncated Newton method).
Во всех демонстрациях МКГ показывает сходимость не хуже, а иногда и лучше (для функций переменной выпуклости), чем метод Ньютона.
Тестовая функция «повёрнутый эллипсоид»
Строго выпуклая квадратичная функция:
Минимизация МКГ,
n
=
2
{\displaystyle n=2}
J
(
u
)
=
∑
i
=
1
n
(
∑
j
=
1
i
u
j
)
2
,
u
∗
=
(
0...0
)
.
{\displaystyle J(u)=\sum _{i=1}^{n}\left(\sum _{j=1}^{i}u_{j}\right)^{2},\quad u_{\ast }=(0...0).}
На рисунке для
n
=
2
{\displaystyle {\color {red}n=2}}
заданы три чёрные стартовые точки
u
0
{\displaystyle u^{0}}
. Серые точки — подитерации
u
0
l
{\displaystyle u^{0_{l}}}
с
δ
0
=
0.5
{\displaystyle \delta ^{0}=0.5}
(показано пунктиром, завышено для демонстрации). Параметры
c
1
=
10
−
8
{\displaystyle c_{1}=10^{-8}}
,
c
2
=
4
{\displaystyle c_{2}=4}
. Для всех
u
0
{\displaystyle u^{0}}
потребовалась одна итерация и подитераций
l
{\displaystyle l}
не более двух.
При
n
=
1000
{\displaystyle {\color {red}n=1000}}
(параметр
δ
0
=
10
−
5
{\displaystyle \delta ^{0}={10}^{-5}}
) с начальной точкой
u
0
=
(
−
1...1
)
{\displaystyle u^{0}=(-1...1)}
МКГ достиг
u
∗
{\displaystyle u_{\ast }}
с точностью 1 % за 3 итерации и 754 вычисления
J
{\displaystyle J}
и
∇
J
{\displaystyle \nabla J}
. Другие методы первого порядка: Квазиньютоновский BFGS (работа с матрицами) потребовал 66 итераций и 788 вычислений; сопряжённых градиентов (Fletcher-Reeves) — 274 итерации и 2236 вычислений; конечно-разностный метод Ньютона — 1 итерация и 1001 вычислений. Метод Ньютона второго порядка — 1 итерация.
С ростом размерности
n
{\displaystyle \color {red}n}
, вычислительные погрешности при реализации условия коллинеарности (3), могут заметно возрастать. Поэтому МКГ, по сравнению с методом Ньютона, в рассматриваемом примере потребовал более одной итерации.
Минимизация МКГ: 3 итерации и 16 вычислений
J
{\displaystyle J}
и
∇
J
{\displaystyle \nabla J}
J
(
u
)
=
100
(
u
1
2
−
u
2
)
2
+
(
u
1
−
1
)
2
,
u
∗
=
(
1
,
1
)
.
{\displaystyle J(u)=100(u_{1}^{2}-u_{2})^{2}+(u_{1}-1)^{2},\quad u_{\ast }=(1,1).}
Параметры те же, кроме
δ
0
=
10
−
5
{\displaystyle \delta ^{0}={10}^{-5}}
. Траектория спуска МКГ полностью совпадает с методом Ньютона. На рисунке синяя начальная точка
u
0
=
(
−
0.8
;
−
1.2
)
{\displaystyle u^{0}=\left(-0.8;-1.2\right)}
, красная —
u
∗
{\displaystyle u_{\ast }}
. В каждой точке нарисованы орты градиентов.
J
(
u
)
=
(
u
1
2
+
u
2
−
11
)
2
+
(
u
1
+
u
2
2
−
7
)
2
.
{\displaystyle J(u)=(u_{1}^{2}+u_{2}-11)^{2}+(u_{1}+u_{2}^{2}-7)^{2}.}
Параметры
c
1
=
0.1
{\displaystyle c_{1}=0.1}
,
δ
=
0.05
{\displaystyle \delta =0.05}
.
Минимизация МКГ: 7 итераций и 22 вычисления
J
{\displaystyle J}
и
∇
J
{\displaystyle \nabla J}
. Красные линии —
cos
γ
≥
0
{\displaystyle \cos {\gamma }\geq 0}
.
Минимизация методом Ньютона: 9 итераций (
b
k
=
1
{\displaystyle b^{k}=1}
)
Метод сопряжённых градиентов (Fletcher-Reeves): 9 итерации и 62 вычисления
J
{\displaystyle J}
и
∇
J
{\displaystyle \nabla J}
Квазиньютоновский BFGS: 6 итераций и 55 вычислений
J
{\displaystyle J}
и
∇
J
{\displaystyle \nabla J}
. Красная линия (нарушение условия кривизны) — метод наискорейшего спуска .
МКГ является очень экономичным по количеству вычислений
J
{\displaystyle J}
и
∇
J
{\displaystyle \nabla J}
. Благодаря формуле (2), он не требует затратных вычислений шагового множителя
b
k
{\displaystyle b^{k}}
посредством линейного поиска (например, методом золотого сечения и т.п.).
Примечания
↑ Tolstykh V.K. Collinear Gradients Method for Minimizing Smooth Functions // Oper. Res. Forum. — 2023. — Vol. 4. — No. 20. — doi: s43069-023-00193-9
↑ Tolstykh V.K. Демонстрационное Windows-приложение Optimization