Метод коллинеарных градиентов: различия между версиями
[непроверенная версия] | [непроверенная версия] |
(не показана 31 промежуточная версия этого же участника) | |||
Строка 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) |
'''Метод коллинеарных градиентов (МКГ)'''<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>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||итерация МКГ}}: |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
: (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> |
: (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> |
Угловые скобки — это [[скалярное произведение]] в [[Евклидово пространство|евклидовом пространстве]] <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>J(u)</math> {{font color|pink||шаг МКГ}} |
|||
⚫ | В общем случае, если <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>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> с обратным знаком. |
||
⚫ | |||
⚫ | |||
{{font color|pink||Коллинеарность градиентов}} оценивается [[невязка|невязкой]] их [[орт вектора|ортов]], которая имеет вид системы <math>n</math> уравнений для поиска корня <math>u=u^{k_\ast}</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\ |
где вектор <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> |
||
Строка 59: | Строка 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>. |
|||
* |
* <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> |
||
# Вычисляем <math>\nabla J^l, ||\nabla J^l||</math> и находим <math>r^l</math> из (3) при <math>u=u^{k_l}</math>. |
# <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> |
|||
# Если <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>''' |
# <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> |
||
# Если <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>Если <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> |
||
# Вычисляем <math>p^l=-r^l+\beta^l p^{l-1}</math>. |
# <code>Вычисляем <math>p^l=-r^l+\beta^l p^{l-1}</math>.</code> |
||
# Находим шаговый множитель <math>\tau^l</math> для подитераций: |
# <code>Находим шаговый множитель <math>\tau^l</math> для подитераций:</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>запоминаем <math>u^{k_l}</math>, <math>\nabla J^l</math>, <math>||\nabla J^l||</math>, <math>r^l</math>, <math>||r^l||</math>;</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>задаём <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> |
||
## если <math>w=0</math>, тогда <math>h\leftarrow 10h</math>, возвращаемся к шагу 7.2; |
## <code>если <math>w=0</math>, тогда <math>h\leftarrow 10h</math>, возвращаемся к шагу 7.2;</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>восстанавливаем <math>u^{k_l}</math>, <math>\nabla J^l</math>, <math>||\nabla J^l||</math>, <math>r^l</math>, <math>||r^l||</math>;</code> |
||
## находим <math>\tau^l=||r^l||^2/w </math>. |
## <code>находим <math>\tau^l=||r^l||^2/w </math>.</code> |
||
# Делаем подитерацию <math>u^{k_{l+1}}</math> из (4). |
# <code>Делаем подитерацию <math>u^{k_{l+1}}</math> из (4).</code> |
||
# <math>l\leftarrow l+1</math>, переходим к шагу 3. |
# <code><math>l\leftarrow l+1</math>, переходим к шагу 3.</code> |
||
Параметр <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>. |
Параметр <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> == |
||
Во всех демонстрациях МКГ показывает сходимость не хуже, а иногда и лучше |
Во всех демонстрациях МКГ показывает сходимость не хуже, а иногда и лучше (для функций переменной выпуклости), чем метод Ньютона. |
||
=== Тестовая функция «повёрнутый эллипсоид» === |
=== Тестовая функция «повёрнутый эллипсоид» === |
||
Строка 96: | Строка 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 |
При <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>]] |
||
Строка 124: | Строка 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)
Необходимо . Здесь малое положительное число заметно больше машинного эпсилон.
Подитерации завершаются при выполнении хотя бы одного из условий:
- — достигнута точность;
- — прекратилась сходимость;
- — избыточность подитераций.
Алгоритм выбора направления минимизации
Параметры: .
Входные данные: .
. Если задаём из (7).
Находим из (6).
Вычисляем и находим из (3) при .
Если или , или , или { и }, то принимаем , возвращаем , , стоп.
Если , задаём , иначе .
Вычисляем .
Находим шаговый множитель для подитераций:
запоминаем , , , , ;
задаём , вычисляем , и находим из (5), присваиваем ;
если , тогда , возвращаемся к шагу 7.2;
восстанавливаем , , , , ;
находим .
Делаем подитерацию из (4).
, переходим к шагу 3.
Параметр . Для функций без седловых точек рекомендуется , . Для «обхода» седловых точек рекомендуется , .
Описанный алгоритм позволяет приблизительно найти коллинеарные градиенты из системы уравнений (3). Полученное направление для алгоритма МКГ (1) будет приблизительным направлением Ньютона (truncated Newton method).
Демонстрации[2]
Во всех демонстрациях МКГ показывает сходимость не хуже, а иногда и лучше (для функций переменной выпуклости), чем метод Ньютона.
Тестовая функция «повёрнутый эллипсоид»
Строго выпуклая квадратичная функция:
На рисунке для заданы три чёрные стартовые точки . Серые точки — подитерации с (показано пунктиром, завышено для демонстрации). Параметры , . Для всех потребовалась одна итерация и подитераций не более двух.
При (параметр ) с начальной точкой МКГ достиг с точностью 1 % за 3 итерации и 754 вычисления и . Другие методы первого порядка: Квазиньютоновский BFGS (работа с матрицами) потребовал 66 итераций и 788 вычислений; сопряжённых градиентов (Fletcher-Reeves) — 274 итерации и 2236 вычислений; конечно-разностный метод Ньютона — 1 итерация и 1001 вычислений. Метод Ньютона второго порядка — 1 итерация.
С ростом размерности , вычислительные погрешности при реализации условия коллинеарности (3), могут заметно возрастать. Поэтому МКГ, по сравнению с методом Ньютона, в рассматриваемом примере потребовал более одной итерации.
Тестовая функция Розенброка
Параметры те же, кроме . Траектория спуска МКГ полностью совпадает с методом Ньютона. На рисунке синяя начальная точка , красная — . В каждой точке нарисованы орты градиентов.
Тестовая функция Химмельблау
Параметры , .
МКГ является очень экономичным по количеству вычислений и . Благодаря формуле (2), он не требует затратных вычислений шагового множителя посредством линейного поиска (например, методом золотого сечения и т.п.).
Примечания
- ↑ 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