Метод сопряжённых градиентов (Метод Флетчера — Рив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.