Метод коллинеарных градиентов: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
(не показано 39 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''Метод коллинеарных градиентов'''<ref>''Tolstykh V.K.'' Collinear Gradients Method for Minimizing Smooth Functions // Oper. Res. Forum. — 2023. — Vol. 4. — No. 20. — doi: [https://doi.org/10.1007/s43069-023-00193-9 s43069-023-00193-9]</ref> — [[Итерация (математика)|итерационный метод]] направленного поиска [[Локальный экстремум|локального экстремума]] функции <math>J(u)</math>, <math>u\in E^n</math> с движением к экстремуму вдоль вектора <math>d\in E^n</math> такого, где [[градиент]]ы <math>\nabla J(u)</math> и <math>\nabla J(u+d)</math> [[Коллинеарность|коллинеарные]]. Это метод перового порядка со [[скорость сходимости|скоростью сходимости]] второго порядка. Может применяться к функциям высокой размерности с несколькими локальными экстремумами.
'''Метод коллинеарных градиентов (МКГ)'''<ref>''Tolstykh V.K.'' Collinear Gradients Method for Minimizing Smooth Functions // Oper. Res. Forum. — 2023. — Vol. 4. — No. 20. — doi: [https://doi.org/10.1007/s43069-023-00193-9 s43069-023-00193-9]</ref> — [[Итерация (математика)|итерационный метод]] направленного поиска [[Локальный экстремум|локального экстремума]] [[Гладкая функция|гладкой]] [[функция многих переменных|функции многих переменных]] <math>J(u)\colon\R^n\to\R</math> с движением к экстремуму вдоль вектора <math>d\in \mathbb R^n</math> такого, где [[градиент]]ы <math>\nabla J(u)</math> и <math>\nabla J(u+d)</math> [[Коллинеарность|коллинеарные]]. Это метод перового порядка (использует только первые производные <math>\nabla J</math>) с квадратичной [[скорость сходимости|скоростью сходимости]]. Может применяться к функциям высокой размерности <math>n</math> с несколькими локальными экстремумами. МКГ можно отнести к семейству методов [https://en.wikipedia.org/wiki/Truncated_Newton_method Truncated Newton method]
[[Файл:Collinearity.png|thumb|Коллинеарные векторы <math>\nabla J(u^k)</math> и <math>\nabla J(u^{k_\ast})</math> с направлением минимизации <math>d^k</math> для выпуклой функции, <math>n=2</math>]]
[[Файл:Collinearity.png|thumb|Коллинеарные векторы <math>\nabla J(u^k)</math> и <math>\nabla J(u^{k_\ast})</math> с направлением минимизации <math>d^k</math> для выпуклой функции, <math>n=2</math>]]


=== Идея метода ===
=== Идея метода ===


На каждой итерации <math>k=0,1\dots</math> в относительно большой окрестности <math>u^k</math> существует точка <math>u^{k_\ast}</math>, где градиенты <math>\nabla J\left(u^k\right)\equiv\nabla J^k</math> и <math>\nabla J(u^{k_\ast})\equiv\nabla J^{k_\ast}</math> коллинеарные. Направлением на экстремум <math>u_\ast</math> из точки <math>u^k</math> будет направление <math>d^k={(u^{k_\ast}-u}^k)</math>. Вектор <math>d^k</math> указывает на максимум или на минимум в зависимости от положения точки <math>u^{k_\ast}</math>. Она может быть спереди или сзади от <math>u^k</math> относительно направления на <math>u_\ast</math> (см.рисунок). Далее будем рассматривать минимизацию.
Для гладкой функции <math>J(u)</math> в относительно большой окрестности точки <math>u^k</math> найдётся точка <math>u^{k_\ast}</math>, где градиенты <math>\nabla J^k\,\overset{\textrm{def}}{=}\,\nabla J(u^k)</math> и <math>\nabla J^{k_\ast}\,\overset{\textrm{def}}{=}\,\nabla J(u^{k_\ast})</math> коллинеарные. Направлением на экстремум <math>u_\ast</math> из точки <math>u^k</math> будет направление <math>d^k={(u^{k_\ast}-u}^k)</math>. Вектор <math>d^k</math> указывает на максимум или на минимум в зависимости от положения точки <math>u^{k_\ast}</math>. Она может быть спереди или сзади от <math>u^k</math> относительно направления на <math>u_\ast</math> (см. рисунок). Далее будем рассматривать минимизацию.




Очередная итерация МКГ:
Очередная {{font color|pink||итерация МКГ}}:
(1) <math>\quad u^{k+1}=u^k+b^kd^k, \quad k\in \left\{ 0,1\dots\right\},</math>
где оптимальное <math>b^k\in \mathbb R</math> находится аналитически из предположения [[Квадратичная функция одной переменной|квадратичности одномерной функции]] <math>J(u^k+bd^k)</math>:


: (1) <math>\quad u^{k+1}=u^k+b^kd^k,</math>
: (2) <math>\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}.</math>


Угловые скобки — это [[скалярное произведение]] в [[Евклидово пространство|евклидовом пространстве]] <math>\mathbb R^n</math>. Если <math>J(u)</math> [[выпуклая функция]] в окрестности <math>u^k</math>, то для передней точки <math>u^{k_\ast}</math> получаем число <math>b^k>0</math>, для задней <math>b^k<0</math>. Делаем шаг (1).
где оптимальное <math>b^k\in E</math> находится аналитически из предположения [[Квадратичная функция одной переменной|квадратичности одномерной функции]] <math>J(u^k+bd^k)</math>:

: (2) <math>\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}.</math>


Для строго выпуклой квадратичной функции <math>J(u)</math> {{font color|pink||шаг МКГ}}
Угловые скобки — это [[скалярное произведение]] в <math>E^n</math>. Если <math>J(u)</math> [[выпуклая функция]] в окрестности <math>u^k</math>, то для передней точки <math>u^{k_\ast}</math> получаем число <math>b^k>0</math>, для задней <math>b^k<0</math>. Делаем шаг (1). В общем случае, если <math>J(u)</math> имеет переменную выпуклость и возможны седловые точки, то следует контролировать направление минимизации по углу <math>\gamma</math> между векторами <math>\nabla J^k</math> и <math>d^k</math>. Если <math>\cos(\gamma)=\frac{\langle \nabla J^k,d^k\rangle}{||\nabla J(u^k)||\; ||d^k||}\geq 0</math>, то <math>d^k</math> — это направление максимизации и в (1) следует брать <math>b^k</math> с обратным знаком.
<math>b^kd^k=-H^{-1}\nabla J^k,</math>
т.е. {{font color|pink||это шаг [[метод Ньютона|метода Ньютона]]}} (метод второго порядка с квадратичной скоростью сходимости), где <math>H</math> — [[матрица Гессе]]. Такие шаги обеспечивают МКГ квадратичную скорость сходимости.


=== Поиск коллинеарных градиентов ===
Из [[невязка|невязки]] [[орт вектора|ортов]] градиентов можно найти <math>u^{k_\ast}</math> как корень системы <math>n</math> уравнений:


В общем случае, если <math>J(u)</math> имеет переменную выпуклость и возможны [[Седловая точка|седловые точки]], то следует контролировать направление минимизации по углу <math>\gamma</math> между векторами <math>\nabla J^k</math> и <math>d^k</math>. Если <math>\cos(\gamma)=\frac{\langle \nabla J^k,d^k\rangle}{||\nabla J(u^k)||\; ||d^k||}\geq 0</math>, то <math>d^k</math> — это направление максимизации и в (1) следует брать <math>b^k</math> с обратным знаком.
: (3) <math>\quad r^k(u)=\frac{\nabla J(u)}{||\nabla J(u)||}s-\frac{\nabla J(u^k)}{||\nabla J(u^k)||}=0 \in E^n,</math>


== Поиск коллинеарных градиентов ==
{{font color|pink||Коллинеарность градиентов}} оценивается [[невязка|невязкой]] их [[орт вектора|ортов]], которая имеет вид системы <math>n</math> уравнений для поиска корня <math>u=u^{k_\ast}</math>:
(3) <math>\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,</math>
где [[sgn|знак]] <math>s=\sgn\langle\nabla J(u),\nabla J(u^k)\rangle</math> позволяет одинаково оценивать коллинеарность градиентов по одну или разные стороны от минимума <math>u_\ast</math>, <math>||r^k(u)||\le \sqrt{2}</math>.
где [[sgn|знак]] <math>s=\sgn\langle\nabla J(u),\nabla J(u^k)\rangle</math> позволяет одинаково оценивать коллинеарность градиентов по одну или разные стороны от минимума <math>u_\ast</math>, <math>||r^k(u)||\le \sqrt{2}</math>.




Система (3) решается итерационно (подитерации <math>l</math>) [[Метод сопряжённых градиентов (СЛАУ)|методом сопряжённых градиентов]] в предположении, что она линейна в окрестности <math>u^k</math>:
Система (3) решается итерационно ('''''подитерации''''' <math>l\,</math>) [[Метод сопряжённых градиентов (СЛАУ)|методом сопряжённых градиентов]] в предположении, что она линейна в окрестности <math>u^k</math>:


: (4) <math>\quad u^{k_{l+1}}=u^{k_l}+\tau^lp^l, \quad l=1,2\ldots,</math>
: (4) <math>\quad u^{k_{l+1}}=u^{k_l}+\tau^lp^l, \quad l=1,2\ldots,</math>


где вектор <math>p^l\equiv p(u^{k_l})=-r^l+{\beta^lp}^{l-1}</math>, <math>r^l\equiv r(u^{k_l})</math>, <math>\beta^l=||r^l||^2/||r^{l-1}||^2, \beta^{1,n,2n...}=0</math>, <math>\tau^l=||r^l||^2/\langle p^l,H^lp^l\rangle</math>, произведение матрицы Гессе <math>H^l</math> на <math>p^l</math> находится численным дифференцированием:
где вектор <math>\;p^l\;\overset{\textrm{def}}{=}\,p(u^{k_l})=-r^l+{\beta^lp}^{l-1}</math>, <math>\;r^l\,\overset{\textrm{def}}{=}\,r(u^{k_l})</math>, <math>\;\beta^l=||r^l||^2/||r^{l-1}||^2, \ \beta^{1,n,2n...}=0</math>, <math>\;\tau^l=||r^l||^2/\langle p^l,H^lp^l\rangle</math>, произведение матрицы Гессе <math>H^l</math> на <math>p^l</math> находится численным дифференцированием:


: (5) <math>\quad H^lp^l\approx \frac{r(u^{k_h})-r(u^{k_l})}{h/||p^l||},</math>
: (5) <math>\quad H^lp^l\approx \frac{r(u^{k_h})-r(u^{k_l})}{h/||p^l||},</math>
Строка 52: Строка 55:
# <math>\left| \frac{||r^l||-||r^{l-1}||}{||r^l||}\right| \leq c_1,\quad l>1 </math> — прекратилась сходимость;
# <math>\left| \frac{||r^l||-||r^{l-1}||}{||r^l||}\right| \leq c_1,\quad l>1 </math> — прекратилась сходимость;
# <math>l \leq l_{max}=\operatorname{integer} \left| c_2 \ln c_1 \ln n \right|,\quad c_2 \geq 1 </math> — избыточность подитераций.
# <math>l \leq l_{max}=\operatorname{integer} \left| c_2 \ln c_1 \ln n \right|,\quad c_2 \geq 1 </math> — избыточность подитераций.



== Алгоритм выбора направления минимизации ==
== Алгоритм выбора направления минимизации ==
* Параметры: <math>c_1, c_2, \delta^0, \delta_m = 10^{-15}\delta^0, h=10^{-5}</math>.
* Входные данные: <math>n, k=0, u^k, J(u^k), \nabla J(u^k), \nabla J^k </math>.
# <math>l=1</math>. Если <math>k>0</math> задаём <math>\delta^k</math> из (7).
# Находим <math>u^{k_l}</math> из (6).
# Вычисляем <math>\nabla J^l, ||\nabla J^l||</math> и находим <math>r^l</math> из (3) при <math>u=u^{k_l}</math>.
# Если <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>.
# Если <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>.
# Вычисляем <math>p^l=-r^l+\beta^l p^{l-1}</math>.
# Находим шаговый множитель <math>\tau^l</math> для подитераций:
## запоминаем <math>u^{k_l}</math>, <math>\nabla J^l</math>, <math>||\nabla J^l||</math>, <math>r^l</math>, <math>||r^l||</math>;
## задаём <math>u^{k_h}=u^{k_l}+hp^l/||p^l||</math>, вычисляем <math>\nabla J(u^{k_h})</math>, <math>r\left(u^{k_h}\right)</math> и находим <math>H^lp^l</math> из (5), присваиваем <math>w\leftarrow\langle p^l,H^lp^l\rangle</math>;
## если <math>w=0</math>, тогда <math>h\leftarrow 10h</math>, возвращаемся к шагу 7.2;
## восстанавливаем <math>u^{k_l}</math>, <math>\nabla J^l</math>, <math>||\nabla J^l||</math>, <math>r^l</math>, <math>||r^l||</math>;
## находим <math>\tau^l=||r^l||^2/w </math>.
# Делаем подитерацию <math>u^{k_{l+1}}</math> из (4).
# <math>l\leftarrow l+1</math>, переходим к шагу 3.


* <code>Параметры: <math>c_1, c_2, \delta^0, \delta_m = 10^{-15}\delta^0, h=10^{-5}</math>.</code>
* <code>Входные данные: <math>n, k=0, u^k, J(u^k), \nabla J(u^k), \nabla J^k </math>.</code>
# <code><math>l=1</math>. Если <math>k>0</math> задаём <math>\delta^k</math> из (7).</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>||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>p^l=-r^l+\beta^l p^{l-1}</math>.</code>
# <code>Находим шаговый множитель <math>\tau^l</math> для подитераций:</code>
## <code>запоминаем <math>u^{k_l}</math>, <math>\nabla J^l</math>, <math>||\nabla J^l||</math>, <math>r^l</math>, <math>||r^l||</math>;</code>
## <code>задаём <math>u^{k_h}=u^{k_l}+hp^l/||p^l||</math>, вычисляем <math>\nabla J(u^{k_h})</math>, <math>r\left(u^{k_h}\right)</math> и находим <math>H^lp^l</math> из (5), присваиваем <math>w\leftarrow\langle p^l,H^lp^l\rangle</math>;</code>
## <code>если <math>w=0</math>, тогда <math>h\leftarrow 10h</math>, возвращаемся к шагу 7.2;</code>
## <code>восстанавливаем <math>u^{k_l}</math>, <math>\nabla J^l</math>, <math>||\nabla J^l||</math>, <math>r^l</math>, <math>||r^l||</math>;</code>
## <code>находим <math>\tau^l=||r^l||^2/w </math>.</code>
# <code>Делаем подитерацию <math>u^{k_{l+1}}</math> из (4).</code>
# <code><math>l\leftarrow l+1</math>, переходим к шагу 3.</code>


Параметр <math>c_2=3\div 5</math>, можно уменьшить до 2 при больших <math>n</math>. Для функций без седловых точек рекомендуется <math>c_1\approx 10^{-8}</math>, <math>\delta\approx{10}^{-5}</math>. Для «обхода» седловых точек рекомендуется <math>c_1\approx 0.1</math>, <math>\delta\approx 0.1</math>.


Параметр <math>c_2=3\div 5</math>. Для функций без седловых точек рекомендуется <math>c_1\approx 10^{-8}</math>, <math>\delta\approx{10}^{-5}</math>. Для «обхода» седловых точек рекомендуется <math>c_1\approx 0.1</math>, <math>\delta\approx 0.1</math>.

Описанный алгоритм позволяет приблизительно найти коллинеарные градиенты из системы уравнений (3). Полученное направление <math>b^kd^k</math> для алгоритма МКГ (1) будет {{font color|pink||приблизительным направлением Ньютона}} (truncated Newton method).


== Демонстрации<ref>''Tolstykh V.K.'' Демонстрационное Windows-приложение [https://tolstykh.com/docs/Оптимизация/optimization.rar Optimization ]</ref> ==
== Демонстрации<ref>''Tolstykh V.K.'' Демонстрационное Windows-приложение [https://tolstykh.com/docs/Оптимизация/optimization.rar Optimization ]</ref> ==
Во всех демонстрациях МКГ показывает сходимость не хуже, а иногда и лучше, [[метод Ньютона|метода Ньютона]] второго порядка с квадратичной скоростью сходимости.
Во всех демонстрациях МКГ показывает сходимость не хуже, а иногда и лучше (для функций переменной выпуклости), чем метод Ньютона.


=== Тестовая функция «повёрнутый эллипсоид» ===
=== Тестовая функция «повёрнутый эллипсоид» ===

Строго выпуклая квадратичная функция:

[[Файл:ColGM.png|thumb|Минимизация МКГ, <math>n=2</math>]]
[[Файл:ColGM.png|thumb|Минимизация МКГ, <math>n=2</math>]]
: <math>J(u)=\sum_{i=1}^{n}\left(\sum_{j=1}^{i}u_j\right)^2,\quad u_{\ast}=(0...0).</math>
: <math>J(u)=\sum_{i=1}^{n}\left(\sum_{j=1}^{i}u_j\right)^2,\quad u_{\ast}=(0...0).</math>
Строка 86: Строка 93:




При <math>{\color{red}n=1000}</math> (параметр <math>\delta^0={10}^{-5}</math>) с начальной точкой <math>u^0=(-1...1)</math> МКГ достиг <math>u_\ast</math> с точностью 1 % за 3 итерации и 754 вычисления <math>J</math> и <math>\nabla J</math>. Другие методы первого порядка: [[Квазиньютоновские методы|Квазиньютоновский BFGS]] (работа с матрицами) потребовал 66 итерации и 788 вычислений; [[метод сопряжённых градиентов|сопряжённых градиентов]] (Fletcher-Reeves) — 274 итерации и 2236 вычислений. [[Метод Ньютона]] второго порядка — 1 итерация.
При <math>{\color{red}n=1000}</math> (параметр <math>\delta^0={10}^{-5}</math>) с начальной точкой <math>u^0=(-1...1)</math> МКГ достиг <math>u_\ast</math> с точностью 1 % за 3 итерации и 754 вычисления <math>J</math> и <math>\nabla J</math>. Другие методы первого порядка: [[Квазиньютоновские методы|Квазиньютоновский BFGS]] (работа с матрицами) потребовал 66 итераций и 788 вычислений; [[метод сопряжённых градиентов|сопряжённых градиентов]] (Fletcher-Reeves) — 274 итерации и 2236 вычислений; конечно-разностный метод Ньютона — 1 итерация и 1001 вычислений. [[Метод Ньютона]] второго порядка — 1 итерация.


С ростом размерности <math>\color{red}n</math>, вычислительные погрешности при реализации условия коллинеарности (3), могут заметно возрастать. Поэтому МКГ, по сравнению с методом Ньютона, в рассматриваемом примере потребовал более одной итерации.


[[Файл:ColGM-Rosenbrock.png|thumb|Минимизация МКГ: 3 итерации и 16 вычислений <math>J</math> и <math>\nabla J</math>]]
[[Файл:ColGM-Rosenbrock.png|thumb|Минимизация МКГ: 3 итерации и 16 вычислений <math>J</math> и <math>\nabla J</math>]]


=== Тестовая функция Розенброка ===
=== Тестовая функция [[Функция Розенброка|Розенброка]] ===
: <math>J(u)=100(u_1^2-u_2)^2+(u_1-1)^2,\quad u_\ast=(1,1).</math>
: <math>J(u)=100(u_1^2-u_2)^2+(u_1-1)^2,\quad u_\ast=(1,1).</math>


Строка 111: Строка 121:




МКГ является очень экономичным по количеству вычислений <math>J</math> и <math>\nabla J</math>. Благодаря формуле (2), он не требует затратных вычислений шагового множителя <math>b^k</math> посредством линейного поиска ([[метод золотого сечения]] и т. п.).
{{font color|pink||МКГ является очень экономичным}} по количеству вычислений <math>J</math> и <math>\nabla J</math>. Благодаря формуле (2), он не требует затратных вычислений шагового множителя <math>b^k</math> посредством линейного поиска (например, [[метод золотого сечения|методом золотого сечения]] и т.п.).


== Примечания ==
== Примечания ==
{{примечания}}
{{примечания}}


[[Категория:Итеративные методы]]
[[Категория:Численные методы]]
[[Категория:Алгоритмы и методы оптимизации]]
[[Категория:Алгоритмы оптимизации]]

Версия от 15:11, 27 декабря 2024

Метод коллинеарных градиентов (МКГ)[1] — итерационный метод направленного поиска локального экстремума гладкой функции многих переменных с движением к экстремуму вдоль вектора такого, где градиенты и коллинеарные. Это метод перового порядка (использует только первые производные ) с квадратичной скоростью сходимости. Может применяться к функциям высокой размерности с несколькими локальными экстремумами. МКГ можно отнести к семейству методов Truncated Newton method

Коллинеарные векторы и с направлением минимизации для выпуклой функции,

Идея метода

Для гладкой функции в относительно большой окрестности точки найдётся точка , где градиенты и коллинеарные. Направлением на экстремум из точки будет направление . Вектор указывает на максимум или на минимум в зависимости от положения точки . Она может быть спереди или сзади от относительно направления на (см. рисунок). Далее будем рассматривать минимизацию.


Очередная итерация МКГ:

(1) 

где оптимальное находится аналитически из предположения квадратичности одномерной функции :

(2)

Угловые скобки — это скалярное произведение в евклидовом пространстве . Если выпуклая функция в окрестности , то для передней точки получаем число , для задней . Делаем шаг (1).

Для строго выпуклой квадратичной функции шаг МКГ

 

т.е. это шаг метода Ньютона (метод второго порядка с квадратичной скоростью сходимости), где матрица Гессе. Такие шаги обеспечивают МКГ квадратичную скорость сходимости.


В общем случае, если имеет переменную выпуклость и возможны седловые точки, то следует контролировать направление минимизации по углу между векторами и . Если , то  — это направление максимизации и в (1) следует брать с обратным знаком.

Поиск коллинеарных градиентов

Коллинеарность градиентов оценивается невязкой их ортов, которая имеет вид системы уравнений для поиска корня :

(3) 

где знак позволяет одинаково оценивать коллинеарность градиентов по одну или разные стороны от минимума , .


Система (3) решается итерационно (подитерации ) методом сопряжённых градиентов в предположении, что она линейна в окрестности :

(4)

где вектор , , , , произведение матрицы Гессе на находится численным дифференцированием:

(5)

где ,  — малое положительное число такое, что .


Начальное приближение задаётся под 45° ко всем осям координат длинной :

(6)

Начальный радиус -окрестности точки корректируется:

(7)

Необходимо . Здесь малое положительное число заметно больше машинного эпсилон.


Подитерации завершаются при выполнении хотя бы одного из условий:

  1.  — достигнута точность;
  2.  — прекратилась сходимость;
  3.  — избыточность подитераций.

Алгоритм выбора направления минимизации

  • Параметры: .
  • Входные данные: .
  1. . Если задаём из (7).
  2. Находим из (6).
  3. Вычисляем и находим из (3) при .
  4. Если или , или , или { и }, то принимаем , возвращаем , , стоп.
  5. Если , задаём , иначе .
  6. Вычисляем .
  7. Находим шаговый множитель для подитераций:
    1. запоминаем , , , , ;
    2. задаём , вычисляем , и находим из (5), присваиваем ;
    3. если , тогда , возвращаемся к шагу 7.2;
    4. восстанавливаем , , , , ;
    5. находим .
  8. Делаем подитерацию из (4).
  9. , переходим к шагу 3.


Параметр . Для функций без седловых точек рекомендуется , . Для «обхода» седловых точек рекомендуется , .

Описанный алгоритм позволяет приблизительно найти коллинеарные градиенты из системы уравнений (3). Полученное направление для алгоритма МКГ (1) будет приблизительным направлением Ньютона (truncated Newton method).

Демонстрации[2]

Во всех демонстрациях МКГ показывает сходимость не хуже, а иногда и лучше (для функций переменной выпуклости), чем метод Ньютона.

Тестовая функция «повёрнутый эллипсоид»

Строго выпуклая квадратичная функция:

Минимизация МКГ,

На рисунке для заданы три чёрные стартовые точки . Серые точки — подитерации с (показано пунктиром, завышено для демонстрации). Параметры , . Для всех потребовалась одна итерация и подитераций не более двух.


При (параметр ) с начальной точкой МКГ достиг с точностью 1 % за 3 итерации и 754 вычисления и . Другие методы первого порядка: Квазиньютоновский BFGS (работа с матрицами) потребовал 66 итераций и 788 вычислений; сопряжённых градиентов (Fletcher-Reeves) — 274 итерации и 2236 вычислений; конечно-разностный метод Ньютона — 1 итерация и 1001 вычислений. Метод Ньютона второго порядка — 1 итерация.


С ростом размерности , вычислительные погрешности при реализации условия коллинеарности (3), могут заметно возрастать. Поэтому МКГ, по сравнению с методом Ньютона, в рассматриваемом примере потребовал более одной итерации.

Минимизация МКГ: 3 итерации и 16 вычислений и

Тестовая функция Розенброка

Параметры те же, кроме . Траектория спуска МКГ полностью совпадает с методом Ньютона. На рисунке синяя начальная точка , красная — . В каждой точке нарисованы орты градиентов.

Тестовая функция Химмельблау

Параметры , .

Минимизация МКГ: 7 итераций и 22 вычисления и . Красные линии — .
Минимизация методом Ньютона: 9 итераций ()
Метод сопряжённых градиентов (Fletcher-Reeves): 9 итерации и 62 вычисления и
Квазиньютоновский BFGS: 6 итераций и 55 вычислений и . Красная линия (нарушение условия кривизны) — метод наискорейшего спуска.


МКГ является очень экономичным по количеству вычислений и . Благодаря формуле (2), он не требует затратных вычислений шагового множителя посредством линейного поиска (например, методом золотого сечения и т.п.).

Примечания

  1. Tolstykh V.K. Collinear Gradients Method for Minimizing Smooth Functions // Oper. Res. Forum. — 2023. — Vol. 4. — No. 20. — doi: s43069-023-00193-9
  2. Tolstykh V.K. Демонстрационное Windows-приложение Optimization