<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0+%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0+%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0"/>
	<updated>2026-10-22T16:47:47Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30376</id>
		<title>Участник:Брыскина Кристина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30376"/>
		<updated>2025-12-10T16:41:03Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: Полностью удалено содержимое страницы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0//%D0%97%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9D%D0%B5%D1%81%D1%82%D0%B5%D1%80%D0%BE%D0%B2%D0%B0&amp;diff=30375</id>
		<title>Участник:Брыскина Кристина//Зеркальный алгоритм Нестерова</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0//%D0%97%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9D%D0%B5%D1%81%D1%82%D0%B5%D1%80%D0%BE%D0%B2%D0%B0&amp;diff=30375"/>
		<updated>2025-12-10T16:40:40Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: Новая страница: «Автор: Брыскина Кристина  == Свойства и структура алгоритма == === Общее описание алгоритма === Алгоритм Нестерова с зеркальным шагом, известный как ускорен...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0|Брыскина Кристина]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм Нестерова с зеркальным шагом, известный как ускоренный зеркальный спуск, был предложен в рамках развития методов выпуклой оптимизации в конце ХХ века, с ключевыми идеями, заложенными Юрием Нестеровым в его работах по ускоренному градиентному спуску 1983 года.&lt;br /&gt;
&lt;br /&gt;
Идея зеркального спуска появилась раньше, в 1970-1980 годах, благодаря работам Аркадия Немировского и Давида Юдина.&lt;br /&gt;
&lt;br /&gt;
Позже произошло их объединение в общую ускоренную версию, например, в работе Кричена, Байена и Бартлетта.&lt;br /&gt;
&lt;br /&gt;
Изначально данный метод использовался для безусловной минимизации гладких выпуклых функций, давая скорость сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;, что лучше, чем &amp;lt;math&amp;gt;O(\frac{1}{k})&amp;lt;/math&amp;gt; у обычного градиентного спуска. Но с развитием вычислительных методов его применение расширилось на ограниченные выпуклые множества, такие как симплекс в задачах обучения с поддержкой векторов или положительно определенные матрицы в спектральной кластеризации.&lt;br /&gt;
В настоящее время ускоренный зеркальный спуск применяется в машинном обучении, включая стохастическую оптимизацию и распределенные системы. Для разреженных данных добавляют проксимальные операторы, а в итерационных методах - неполные версии с фильтрацией градиентов.&lt;br /&gt;
Алгоритм реализует итерации с инерцией и зеркальной проекцией из дискретизации ОДУ. Он популярен благодаря адаптации и ускорению.&lt;br /&gt;
&lt;br /&gt;
==== Адаптация к геометрия ====&lt;br /&gt;
Зеркальный спуск позволяет использовать неевклидовы нормы, что экономит вычисления по сравнению с проекциями в евклидовом пространстве.&lt;br /&gt;
&lt;br /&gt;
==== Ускорение сходимости ====&lt;br /&gt;
Встроенная инерция обеспечивает квадратичную скорость &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Это достигается за счет комбинации градиентного и зеркального шагов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: Пусть дано выпуклое замкнутое множество &amp;lt;math&amp;gt;X ⊆ R^n&amp;lt;/math&amp;gt;, гладкая выпуклая функция &amp;lt;math&amp;gt;f : X → R&amp;lt;/math&amp;gt; с L-липшицевым градиентом ∇f относительно нормы ∥·∥, и сильно выпуклая зеркальная функция &amp;lt;math&amp;gt;ψ : X → R&amp;lt;/math&amp;gt; с параметром l &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
Расхождение Брегмана для ψ определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;D_ψ(z, y) = ψ(z) − ψ(y) − ⟨∇ψ(y), z − y⟩.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача оптимизации формулируется следующим образом:&lt;br /&gt;
&amp;lt;math&amp;gt;min f(x), где f^∗ = min f(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дискретная версия ускоренного зеркального спуска с постоянным шагом s ≤ 1/L включает следующие итерации:&lt;br /&gt;
&lt;br /&gt;
* На k-й итерации вычисляем параметры и основную точку:&lt;br /&gt;
 α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2)/2*L&lt;br /&gt;
 τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2/(k+2)&lt;br /&gt;
 x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 − τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Сделать градиентный шаг:&lt;br /&gt;
  y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = arg min {L/2* ||y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;||^2 + ⟨∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
            y∈X&lt;br /&gt;
&lt;br /&gt;
* Сделать зеркальный шаг:&lt;br /&gt;
 Пусть V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) = D&amp;lt;sub&amp;gt;ψ&amp;lt;/sub&amp;gt;(z, x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;).&lt;br /&gt;
 z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = arg min {V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) + ⟨α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), z − z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
         z∈X&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма сосредоточено в процедуре адаптивного подбора шага и последующего обновления переменных. Здесь ключевую роль играет внутренний цикл backtracking, который выполняется на каждой итерации для оценки локальной константы Липшица &#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&#039;&#039;Курсивное начертание&#039;&#039;. Ядро состоит из:&lt;br /&gt;
&lt;br /&gt;
# Значение функции и градиента: Многократное вычисление значения функции &#039;&#039;&#039;&#039;&#039;f(y)&#039;&#039;&#039;&#039;&#039; и однократное вычисление градиента &#039;&#039;&#039;&#039;&#039;∇f(x)&#039;&#039;&#039;&#039;&#039; на итерацию. Это наиболее ресурсоемкая часть.&lt;br /&gt;
# Проверка условия Армихо: Проверка неравенства вида:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
                  f(y_{k+1}) &amp;lt;= f(x_{k+1}) - \frac{1}{2L} * ||f(x_{k+1})||^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
гарантирующего достаточное убывание функции.&lt;br /&gt;
# Зеркальный и градиентный шаги: Вычисление проекций для обновления последовательностей &#039;&#039;&#039;&#039;&#039;y&#039;&#039;&#039;&#039;&#039; и &#039;&#039;&#039;&#039;&#039;z&#039;&#039;&#039;&#039;&#039; с параметром &#039;&#039;&#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм сохраняет общую итерационную структуру, но каждая итерация является двухуровневой:&lt;br /&gt;
&lt;br /&gt;
# Внешний уровень: Управляет обновлением параметров инерции (&amp;lt;math&amp;gt;\alpha_k, \tau_k&amp;lt;/math&amp;gt;) и переходом к следующему шагу оптимизации.&lt;br /&gt;
# Внутренний уровень: Процедура поиска шага. Здесь происходит циклический подбор параметра L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;. Внутри этого цикла выполняются операции:&lt;br /&gt;
#* Вычисление кандидата на новую переменную y.&lt;br /&gt;
#* Вычисление значения f(y) и проверка условия Армихо.&lt;br /&gt;
#* Увеличение L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; в случае неудачи. В случае успешной проверки условия - принимается кандидат на новую переменную y.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Ниже приведен псевдокод, реализующий ускоренный зеркальный градиентный спуск с адаптивным поиском константы Липшица.&lt;br /&gt;
&lt;br /&gt;
  x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
  for k in 0...max_iterations {&lt;br /&gt;
      α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2) / 2L&lt;br /&gt;
      τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2 / (k+2)&lt;br /&gt;
      x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 - τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      while (True) {&lt;br /&gt;
          y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
          if f(y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;) &amp;lt;= f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) - 1/2L * ||∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:&lt;br /&gt;
              break&lt;br /&gt;
          L *= η&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;&lt;br /&gt;
      z&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; - α * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
      if f(y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) &amp;lt;= ε:&lt;br /&gt;
          break&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность одной итерации алгоритма складывается из:&lt;br /&gt;
&lt;br /&gt;
* Сложность вычисления градиента T&amp;lt;sub&amp;gt;∇f(x)&amp;lt;/sub&amp;gt;;&lt;br /&gt;
* Сложность векторных операций, равная O(n);&lt;br /&gt;
Пусть N&amp;lt;sub&amp;gt;back&amp;lt;/sub&amp;gt; - среднее число вызовов f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) внутри backtracking (N&amp;lt;sub&amp;gt;call&amp;lt;/sub&amp;gt; ≈ 2). Тогда общая сложность на одной итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{iter} = T_{\nabla f(x)} + N_{back} * T_f + O(n).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность для достижения точности внешним циклом будет порядка &amp;lt;math&amp;gt;O(\frac{1}{\sqrt{\varepsilon}})&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Тогда общей сложностью всего алгоритма будет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
         N_{call} ≈ O(1)\\&lt;br /&gt;
         T_{\nabla f(x)} ≈ O(n^2)\\&lt;br /&gt;
         T_f ≈ O(n)\\&lt;br /&gt;
         T_{nest} = O(\frac{1}{\sqrt{ε}} * (T_{\nabla f(x)} + N_{call} * T_f + O(n))) ≈ O(\frac{1}{ε} * n^2)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф для зеркального метода Нестерова.png|Информационный граф для зеркального метода Нестерова.png]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф зеркального метода Нестерова описывает структуру зависимостей между операциями внутри одной итерации алгоритма. Данный граф является динамическим, т.е. последовательную конкатенацию базового подграфа, т.к. заранее неизвестно количество итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Подграф имеет слоисто-ярусную структуру и состоит из следующих уровней:&lt;br /&gt;
# &#039;&#039;&#039;Уровень входа&#039;&#039;&#039; - входные данные: y и z с предыдущей итерации;&lt;br /&gt;
# &#039;&#039;&#039;Уровень экстраполяции&#039;&#039;&#039; - вычисление точки x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;;&lt;br /&gt;
# &#039;&#039;&#039;Уровень вычислений&#039;&#039;&#039; - вычисление градиента ∇f(x) и f(x);&lt;br /&gt;
# &#039;&#039;&#039;Уровень ветвления&#039;&#039;&#039; - вычисление новой точки y вместе с backtracking для L и новой точки z;&lt;br /&gt;
# &#039;&#039;&#039;Уровень проверки выхода&#039;&#039;&#039; - проверяется, достигли ли мы нужной точности. Если не достигли, то переходим к новой итерации, и выходим, если достигли;&lt;br /&gt;
# &#039;&#039;&#039;Уровень выхода&#039;&#039;&#039; - завершение алгоритма;&lt;br /&gt;
&lt;br /&gt;
Таким образом, информационный граф алгоритма - это последовательная цепь таких подграфов, длина которой заранее неизвестна и зависит от целевой функции.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Параллелизм алгоритма имеет двухуровневую структуру, связанную с циклическим профилем последовательной реализации.&lt;br /&gt;
* &#039;&#039;&#039;Внешний уровень: Последовательные зависимости&#039;&#039;&#039;&lt;br /&gt;
  На верхнем уровне алгоритм является строго последовательным. Итерации &#039;&#039;k&#039;&#039; зависимы по данным, т.к. начальное приближение шага определяется результатом предыдущего шага. Данный ярус не имеет параллельного ресурса.&lt;br /&gt;
  Внутри каждого шага последовательный подбор константы &#039;&#039;L&#039;&#039; также зависим от предыдущего результата проверки.&lt;br /&gt;
* &#039;&#039;&#039;Внутренний уровень: Конечный и массовый параллелизм&#039;&#039;&#039;&lt;br /&gt;
  Внутри одной итерации раскрывается основной ресурс параллелизма:&lt;br /&gt;
  *# &#039;&#039;&#039;Конечный параллелизм ветвей&#039;&#039;&#039;: после вычисления градиента обновление последовательностей &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039; &#039;&#039;&#039;потенциально&#039;&#039;&#039; информационно независимы.&lt;br /&gt;
  *# &#039;&#039;&#039;Массовый координатный параллелизм&#039;&#039;&#039;: все покомпонентные операции (сложение, вычитание, умножение на скаляр) векторов размерности n независимы. Обработка компонент при вычислении градиента ∇f(x) для многих задач также выполняется независимо.&lt;br /&gt;
&lt;br /&gt;
Высота одного шага: &amp;lt;math&amp;gt;T_{step} ≈ O(\log{n})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; - сложность выполнения редукции.&lt;br /&gt;
&lt;br /&gt;
Среднее число попыток backtracking ≈ O(1).&lt;br /&gt;
&lt;br /&gt;
Для успешного завершения алгоритма с заданной точностью &amp;lt;math&amp;gt;ε ≈ O(\frac{1}{\sqrt{ε}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общая сложность выполнения параллельной программы определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{nest} = O(\frac{1}{\sqrt{ε}}*\log{n}).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: начальное точка-вектор &amp;lt;math&amp;gt;x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&amp;lt;/math&amp;gt;, начальные параметры &amp;lt;math&amp;gt;\alpha_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0&amp;lt;/math&amp;gt;, точность вычислений &#039;&#039;ε&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &#039;&#039;n + 3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: найденная точка-вектор оптиума заданной функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычислительная мощность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм обладает высокой вычислительной мощностью в том случае, если вычисление значения функции и градиента является трудоемкой. Для простых задач  объем пересылаемых данных сопоставим с числом арифметических операций.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Детерминированность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм является детерминированным. При фиксации начального приближения и параметров результат работы алгоритма однозначно определён.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Сбалансированность вычислений&#039;&#039;&#039;&lt;br /&gt;
Алгоритм неравномерно сбалансирован. Векторных операции и вычисления градиента сбалансированы. Этапы проверки условий и backtracking являются последовательными и слабо загруженными.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Устойчивость&#039;&#039;&#039;&lt;br /&gt;
Метод обладает свойством самокоррекции ошибок за счет зеркального спуска и адаптивного подбора шага.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Динамичность&#039;&#039;&#039;&lt;br /&gt;
Число backtracking итераций зависит от свойств целевой функции и текущей точки, что делает время выполнения одной итерации заранее неизвестным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная последовательная реализация метода ускоренного зеркального спуска строится как итерационный процесс, на каждом шаге которого решается задача минимизации линейной модели функции. Основу реализации составляет цикл по итерациям, внутри которого выполняются 3 блока операций:&lt;br /&gt;
# &#039;&#039;&#039;Экстраполяция&#039;&#039;&#039;: вычисление точки &amp;lt;math&amp;gt;x_{k+1}&amp;lt;/math&amp;gt; как линейной комбинации точек &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;;&lt;br /&gt;
# &#039;&#039;&#039;Backtracking&#039;&#039;&#039;: вычисление градиента, значения функции и проверку условия Армихо;&lt;br /&gt;
# &#039;&#039;&#039;Обновление переменных&#039;&#039;&#039;: обновляются шаги &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Основной выбор реализации касается работы с памятью. Вместо динамического выделения буферов внутри цикла нужно предварительно аллоцировать все рабочие векторы при инициализации. Для задач высокой размерности эффективность повышается за счет слияния циклов.&lt;br /&gt;
&lt;br /&gt;
Ресурс параллелизма позволяет применять ассоциативность векторных операций (разбивать длинные циклы на независимые блоки).&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации ===&lt;br /&gt;
&lt;br /&gt;
Анализ информационного графа и иерархической структуры зависимостей показывает, что алгоритм допускает эффективное распараллеливание на основе декомпозиции данных (Data Parallelism). Специфика алгоритма не позволяет эффективно использовать конвейерный параллелизм.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Межпроцессорный параллелизм&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Векторы-точки (&#039;&#039;x, y, z&#039;&#039;) и градиент разбиваются на непрерывные блоки, которые распределяются между MPI-процессами. Каждый процесс отвечает за обновление своей части вектора.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Распределение данных&#039;&#039;&#039;: используется блочное разбиение. Размер блока определяется как &amp;lt;math&amp;gt;N / P&amp;lt;/math&amp;gt; (с учетом остатка).&lt;br /&gt;
* &#039;&#039;&#039;Минимизация обменов&#039;&#039;&#039;: векторные операции, вычисление значения функции и вычисление градиента выполняются локально. Обмен данными осуществляется только для операций редукции (скалярное произведение и норма) через &#039;&#039;&#039;MPI_Allreduce&#039;&#039;&#039;, и, если требуются соседние значения для других операций, то обмен ими (Halo Exchange).&lt;br /&gt;
&lt;br /&gt;
Главным узким местом является глобальная синхронизация в backtracking. Каждая проверка на условие Армихо требует синхронизации всех процессов для вычисления значения &#039;&#039;f(y)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&lt;br /&gt;
Прогоны программы производились на СК Ломоносов-2.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма на p процессах&lt;br /&gt;
|-&lt;br /&gt;
! P (кол-во процессов) !! T (время, с)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13.914765&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 7.891406&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 4.026877&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 3.038892&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 2.518778&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 2.188900&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.991381&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 1.067469&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Для данного алгоритма ключевым фактором производительности является пропускная способность памяти и латентность сети. Для этого больше всего подходят:&lt;br /&gt;
* &#039;&#039;&#039;Кластерные системы (MMID)&#039;&#039;&#039; - хорошая масштабируется при условии большой локальной памяти.&lt;br /&gt;
* &#039;&#039;&#039;Графические ускорители (SIMT/GPU)&#039;&#039;&#039; - идеально подходит для массово-параллельных векторных операций.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Нестеров, Ю.Е. (1983). Метод решения задачи выпуклого программирования с темпом сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Доклады Академии наук СССР, 27(2), 372–376.&lt;br /&gt;
* Немировский А. С., Юдин Д. Б. &amp;quot;Сложность задач и эффективность методов оптимизации.&amp;quot;— М.: Наука, 1979&lt;br /&gt;
* Krichene, W., Bayen, A., Bartlett, P. (2015). Accelerated Mirror Descent in Continuous and Discrete Time. NeurIPS.&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30371</id>
		<title>Участник:Брыскина Кристина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30371"/>
		<updated>2025-12-10T14:50:13Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0|Брыскина Кристина]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм Нестерова с зеркальным шагом, известный как ускоренный зеркальный спуск, был предложен в рамках развития методов выпуклой оптимизации в конце ХХ века, с ключевыми идеями, заложенными Юрием Нестеровым в его работах по ускоренному градиентному спуску 1983 года.&lt;br /&gt;
&lt;br /&gt;
Идея зеркального спуска появилась раньше, в 1970-1980 годах, благодаря работам Аркадия Немировского и Давида Юдина.&lt;br /&gt;
&lt;br /&gt;
Позже произошло их объединение в общую ускоренную версию, например, в работе Кричена, Байена и Бартлетта.&lt;br /&gt;
&lt;br /&gt;
Изначально данный метод использовался для безусловной минимизации гладких выпуклых функций, давая скорость сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;, что лучше, чем &amp;lt;math&amp;gt;O(\frac{1}{k})&amp;lt;/math&amp;gt; у обычного градиентного спуска. Но с развитием вычислительных методов его применение расширилось на ограниченные выпуклые множества, такие как симплекс в задачах обучения с поддержкой векторов или положительно определенные матрицы в спектральной кластеризации.&lt;br /&gt;
В настоящее время ускоренный зеркальный спуск применяется в машинном обучении, включая стохастическую оптимизацию и распределенные системы. Для разреженных данных добавляют проксимальные операторы, а в итерационных методах - неполные версии с фильтрацией градиентов.&lt;br /&gt;
Алгоритм реализует итерации с инерцией и зеркальной проекцией из дискретизации ОДУ. Он популярен благодаря адаптации и ускорению.&lt;br /&gt;
&lt;br /&gt;
==== Адаптация к геометрия ====&lt;br /&gt;
Зеркальный спуск позволяет использовать неевклидовы нормы, что экономит вычисления по сравнению с проекциями в евклидовом пространстве.&lt;br /&gt;
&lt;br /&gt;
==== Ускорение сходимости ====&lt;br /&gt;
Встроенная инерция обеспечивает квадратичную скорость &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Это достигается за счет комбинации градиентного и зеркального шагов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: Пусть дано выпуклое замкнутое множество &amp;lt;math&amp;gt;X ⊆ R^n&amp;lt;/math&amp;gt;, гладкая выпуклая функция &amp;lt;math&amp;gt;f : X → R&amp;lt;/math&amp;gt; с L-липшицевым градиентом ∇f относительно нормы ∥·∥, и сильно выпуклая зеркальная функция &amp;lt;math&amp;gt;ψ : X → R&amp;lt;/math&amp;gt; с параметром l &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
Расхождение Брегмана для ψ определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;D_ψ(z, y) = ψ(z) − ψ(y) − ⟨∇ψ(y), z − y⟩.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача оптимизации формулируется следующим образом:&lt;br /&gt;
&amp;lt;math&amp;gt;min f(x), где f^∗ = min f(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дискретная версия ускоренного зеркального спуска с постоянным шагом s ≤ 1/L включает следующие итерации:&lt;br /&gt;
&lt;br /&gt;
* На k-й итерации вычисляем параметры и основную точку:&lt;br /&gt;
 α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2)/2*L&lt;br /&gt;
 τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2/(k+2)&lt;br /&gt;
 x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 − τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Сделать градиентный шаг:&lt;br /&gt;
  y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = arg min {L/2* ||y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;||^2 + ⟨∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
            y∈X&lt;br /&gt;
&lt;br /&gt;
* Сделать зеркальный шаг:&lt;br /&gt;
 Пусть V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) = D&amp;lt;sub&amp;gt;ψ&amp;lt;/sub&amp;gt;(z, x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;).&lt;br /&gt;
 z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = arg min {V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) + ⟨α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), z − z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
         z∈X&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма сосредоточено в процедуре адаптивного подбора шага и последующего обновления переменных. Здесь ключевую роль играет внутренний цикл backtracking, который выполняется на каждой итерации для оценки локальной константы Липшица &#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&#039;&#039;Курсивное начертание&#039;&#039;. Ядро состоит из:&lt;br /&gt;
&lt;br /&gt;
# Значение функции и градиента: Многократное вычисление значения функции &#039;&#039;&#039;&#039;&#039;f(y)&#039;&#039;&#039;&#039;&#039; и однократное вычисление градиента &#039;&#039;&#039;&#039;&#039;∇f(x)&#039;&#039;&#039;&#039;&#039; на итерацию. Это наиболее ресурсоемкая часть.&lt;br /&gt;
# Проверка условия Армихо: Проверка неравенства вида:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
                  f(y_{k+1}) &amp;lt;= f(x_{k+1}) - \frac{1}{2L} * ||f(x_{k+1})||^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
гарантирующего достаточное убывание функции.&lt;br /&gt;
# Зеркальный и градиентный шаги: Вычисление проекций для обновления последовательностей &#039;&#039;&#039;&#039;&#039;y&#039;&#039;&#039;&#039;&#039; и &#039;&#039;&#039;&#039;&#039;z&#039;&#039;&#039;&#039;&#039; с параметром &#039;&#039;&#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм сохраняет общую итерационную структуру, но каждая итерация является двухуровневой:&lt;br /&gt;
&lt;br /&gt;
# Внешний уровень: Управляет обновлением параметров инерции (&amp;lt;math&amp;gt;\alpha_k, \tau_k&amp;lt;/math&amp;gt;) и переходом к следующему шагу оптимизации.&lt;br /&gt;
# Внутренний уровень: Процедура поиска шага. Здесь происходит циклический подбор параметра L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;. Внутри этого цикла выполняются операции:&lt;br /&gt;
#* Вычисление кандидата на новую переменную y.&lt;br /&gt;
#* Вычисление значения f(y) и проверка условия Армихо.&lt;br /&gt;
#* Увеличение L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; в случае неудачи. В случае успешной проверки условия - принимается кандидат на новую переменную y.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Ниже приведен псевдокод, реализующий ускоренный зеркальный градиентный спуск с адаптивным поиском константы Липшица.&lt;br /&gt;
&lt;br /&gt;
  x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
  for k in 0...max_iterations {&lt;br /&gt;
      α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2) / 2L&lt;br /&gt;
      τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2 / (k+2)&lt;br /&gt;
      x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 - τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      while (True) {&lt;br /&gt;
          y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
          if f(y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;) &amp;lt;= f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) - 1/2L * ||∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:&lt;br /&gt;
              break&lt;br /&gt;
          L *= η&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;&lt;br /&gt;
      z&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; - α * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
      if f(y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) &amp;lt;= ε:&lt;br /&gt;
          break&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность одной итерации алгоритма складывается из:&lt;br /&gt;
&lt;br /&gt;
* Сложность вычисления градиента T&amp;lt;sub&amp;gt;∇f(x)&amp;lt;/sub&amp;gt;;&lt;br /&gt;
* Сложность векторных операций, равная O(n);&lt;br /&gt;
Пусть N&amp;lt;sub&amp;gt;back&amp;lt;/sub&amp;gt; - среднее число вызовов f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) внутри backtracking (N&amp;lt;sub&amp;gt;call&amp;lt;/sub&amp;gt; ≈ 2). Тогда общая сложность на одной итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{iter} = T_{\nabla f(x)} + N_{back} * T_f + O(n).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность для достижения точности внешним циклом будет порядка &amp;lt;math&amp;gt;O(\frac{1}{\sqrt{\varepsilon}})&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Тогда общей сложностью всего алгоритма будет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
         N_{call} ≈ O(1)\\&lt;br /&gt;
         T_{\nabla f(x)} ≈ O(n^2)\\&lt;br /&gt;
         T_f ≈ O(n)\\&lt;br /&gt;
         T_{nest} = O(\frac{1}{\sqrt{ε}} * (T_{\nabla f(x)} + N_{call} * T_f + O(n))) ≈ O(\frac{1}{ε} * n^2)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф для зеркального метода Нестерова.png|Информационный граф для зеркального метода Нестерова.png]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф зеркального метода Нестерова описывает структуру зависимостей между операциями внутри одной итерации алгоритма. Данный граф является динамическим, т.е. последовательную конкатенацию базового подграфа, т.к. заранее неизвестно количество итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Подграф имеет слоисто-ярусную структуру и состоит из следующих уровней:&lt;br /&gt;
# &#039;&#039;&#039;Уровень входа&#039;&#039;&#039; - входные данные: y и z с предыдущей итерации;&lt;br /&gt;
# &#039;&#039;&#039;Уровень экстраполяции&#039;&#039;&#039; - вычисление точки x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;;&lt;br /&gt;
# &#039;&#039;&#039;Уровень вычислений&#039;&#039;&#039; - вычисление градиента ∇f(x) и f(x);&lt;br /&gt;
# &#039;&#039;&#039;Уровень ветвления&#039;&#039;&#039; - вычисление новой точки y вместе с backtracking для L и новой точки z;&lt;br /&gt;
# &#039;&#039;&#039;Уровень проверки выхода&#039;&#039;&#039; - проверяется, достигли ли мы нужной точности. Если не достигли, то переходим к новой итерации, и выходим, если достигли;&lt;br /&gt;
# &#039;&#039;&#039;Уровень выхода&#039;&#039;&#039; - завершение алгоритма;&lt;br /&gt;
&lt;br /&gt;
Таким образом, информационный граф алгоритма - это последовательная цепь таких подграфов, длина которой заранее неизвестна и зависит от целевой функции.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Параллелизм алгоритма имеет двухуровневую структуру, связанную с циклическим профилем последовательной реализации.&lt;br /&gt;
* &#039;&#039;&#039;Внешний уровень: Последовательные зависимости&#039;&#039;&#039;&lt;br /&gt;
  На верхнем уровне алгоритм является строго последовательным. Итерации &#039;&#039;k&#039;&#039; зависимы по данным, т.к. начальное приближение шага определяется результатом предыдущего шага. Данный ярус не имеет параллельного ресурса.&lt;br /&gt;
  Внутри каждого шага последовательный подбор константы &#039;&#039;L&#039;&#039; также зависим от предыдущего результата проверки.&lt;br /&gt;
* &#039;&#039;&#039;Внутренний уровень: Конечный и массовый параллелизм&#039;&#039;&#039;&lt;br /&gt;
  Внутри одной итерации раскрывается основной ресурс параллелизма:&lt;br /&gt;
  *# &#039;&#039;&#039;Конечный параллелизм ветвей&#039;&#039;&#039;: после вычисления градиента обновление последовательностей &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039; &#039;&#039;&#039;потенциально&#039;&#039;&#039; информационно независимы.&lt;br /&gt;
  *# &#039;&#039;&#039;Массовый координатный параллелизм&#039;&#039;&#039;: все покомпонентные операции (сложение, вычитание, умножение на скаляр) векторов размерности n независимы. Обработка компонент при вычислении градиента ∇f(x) для многих задач также выполняется независимо.&lt;br /&gt;
&lt;br /&gt;
Высота одного шага: &amp;lt;math&amp;gt;T_{step} ≈ O(\log{n})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; - сложность выполнения редукции.&lt;br /&gt;
&lt;br /&gt;
Среднее число попыток backtracking ≈ O(1).&lt;br /&gt;
&lt;br /&gt;
Для успешного завершения алгоритма с заданной точностью &amp;lt;math&amp;gt;ε ≈ O(\frac{1}{\sqrt{ε}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общая сложность выполнения параллельной программы определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{nest} = O(\frac{1}{\sqrt{ε}}*\log{n}).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: начальное точка-вектор &amp;lt;math&amp;gt;x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&amp;lt;/math&amp;gt;, начальные параметры &amp;lt;math&amp;gt;\alpha_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0&amp;lt;/math&amp;gt;, точность вычислений &#039;&#039;ε&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &#039;&#039;n + 3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: найденная точка-вектор оптиума заданной функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычислительная мощность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм обладает высокой вычислительной мощностью в том случае, если вычисление значения функции и градиента является трудоемкой. Для простых задач  объем пересылаемых данных сопоставим с числом арифметических операций.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Детерминированность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм является детерминированным. При фиксации начального приближения и параметров результат работы алгоритма однозначно определён.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Сбалансированность вычислений&#039;&#039;&#039;&lt;br /&gt;
Алгоритм неравномерно сбалансирован. Векторных операции и вычисления градиента сбалансированы. Этапы проверки условий и backtracking являются последовательными и слабо загруженными.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Устойчивость&#039;&#039;&#039;&lt;br /&gt;
Метод обладает свойством самокоррекции ошибок за счет зеркального спуска и адаптивного подбора шага.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Динамичность&#039;&#039;&#039;&lt;br /&gt;
Число backtracking итераций зависит от свойств целевой функции и текущей точки, что делает время выполнения одной итерации заранее неизвестным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная последовательная реализация метода ускоренного зеркального спуска строится как итерационный процесс, на каждом шаге которого решается задача минимизации линейной модели функции. Основу реализации составляет цикл по итерациям, внутри которого выполняются 3 блока операций:&lt;br /&gt;
# &#039;&#039;&#039;Экстраполяция&#039;&#039;&#039;: вычисление точки &amp;lt;math&amp;gt;x_{k+1}&amp;lt;/math&amp;gt; как линейной комбинации точек &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;;&lt;br /&gt;
# &#039;&#039;&#039;Backtracking&#039;&#039;&#039;: вычисление градиента, значения функции и проверку условия Армихо;&lt;br /&gt;
# &#039;&#039;&#039;Обновление переменных&#039;&#039;&#039;: обновляются шаги &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Основной выбор реализации касается работы с памятью. Вместо динамического выделения буферов внутри цикла нужно предварительно аллоцировать все рабочие векторы при инициализации. Для задач высокой размерности эффективность повышается за счет слияния циклов.&lt;br /&gt;
&lt;br /&gt;
Ресурс параллелизма позволяет применять ассоциативность векторных операций (разбивать длинные циклы на независимые блоки).&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации ===&lt;br /&gt;
&lt;br /&gt;
Анализ информационного графа и иерархической структуры зависимостей показывает, что алгоритм допускает эффективное распараллеливание на основе декомпозиции данных (Data Parallelism). Специфика алгоритма не позволяет эффективно использовать конвейерный параллелизм.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Межпроцессорный параллелизм&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Векторы-точки (&#039;&#039;x, y, z&#039;&#039;) и градиент разбиваются на непрерывные блоки, которые распределяются между MPI-процессами. Каждый процесс отвечает за обновление своей части вектора.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Распределение данных&#039;&#039;&#039;: используется блочное разбиение. Размер блока определяется как &amp;lt;math&amp;gt;N / P&amp;lt;/math&amp;gt; (с учетом остатка).&lt;br /&gt;
* &#039;&#039;&#039;Минимизация обменов&#039;&#039;&#039;: векторные операции, вычисление значения функции и вычисление градиента выполняются локально. Обмен данными осуществляется только для операций редукции (скалярное произведение и норма) через &#039;&#039;&#039;MPI_Allreduce&#039;&#039;&#039;, и, если требуются соседние значения для других операций, то обмен ими (Halo Exchange).&lt;br /&gt;
&lt;br /&gt;
Главным узким местом является глобальная синхронизация в backtracking. Каждая проверка на условие Армихо требует синхронизации всех процессов для вычисления значения &#039;&#039;f(y)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&lt;br /&gt;
Прогоны программы производились на СК Ломоносов-2.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма на p процессах&lt;br /&gt;
|-&lt;br /&gt;
! P (кол-во процессов) !! T (время, с)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13.914765&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 7.891406&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 4.026877&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 3.038892&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 2.518778&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 2.188900&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.991381&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 1.067469&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Для данного алгоритма ключевым фактором производительности является пропускная способность памяти и латентность сети. Для этого больше всего подходят:&lt;br /&gt;
* &#039;&#039;&#039;Кластерные системы (MMID)&#039;&#039;&#039; - хорошая масштабируется при условии большой локальной памяти.&lt;br /&gt;
* &#039;&#039;&#039;Графические ускорители (SIMT/GPU)&#039;&#039;&#039; - идеально подходит для массово-параллельных векторных операций.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Нестеров, Ю.Е. (1983). Метод решения задачи выпуклого программирования с темпом сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Доклады Академии наук СССР, 27(2), 372–376.&lt;br /&gt;
* Немировский А. С., Юдин Д. Б. &amp;quot;Сложность задач и эффективность методов оптимизации.&amp;quot;— М.: Наука, 1979&lt;br /&gt;
* Krichene, W., Bayen, A., Bartlett, P. (2015). Accelerated Mirror Descent in Continuous and Discrete Time. NeurIPS.&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30370</id>
		<title>Участник:Брыскина Кристина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30370"/>
		<updated>2025-12-10T14:48:14Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0|Брыскина Кристина]]//Быстрый зеркальный метод Нестерова&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм Нестерова с зеркальным шагом, известный как ускоренный зеркальный спуск, был предложен в рамках развития методов выпуклой оптимизации в конце ХХ века, с ключевыми идеями, заложенными Юрием Нестеровым в его работах по ускоренному градиентному спуску 1983 года.&lt;br /&gt;
&lt;br /&gt;
Идея зеркального спуска появилась раньше, в 1970-1980 годах, благодаря работам Аркадия Немировского и Давида Юдина.&lt;br /&gt;
&lt;br /&gt;
Позже произошло их объединение в общую ускоренную версию, например, в работе Кричена, Байена и Бартлетта.&lt;br /&gt;
&lt;br /&gt;
Изначально данный метод использовался для безусловной минимизации гладких выпуклых функций, давая скорость сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;, что лучше, чем &amp;lt;math&amp;gt;O(\frac{1}{k})&amp;lt;/math&amp;gt; у обычного градиентного спуска. Но с развитием вычислительных методов его применение расширилось на ограниченные выпуклые множества, такие как симплекс в задачах обучения с поддержкой векторов или положительно определенные матрицы в спектральной кластеризации.&lt;br /&gt;
В настоящее время ускоренный зеркальный спуск применяется в машинном обучении, включая стохастическую оптимизацию и распределенные системы. Для разреженных данных добавляют проксимальные операторы, а в итерационных методах - неполные версии с фильтрацией градиентов.&lt;br /&gt;
Алгоритм реализует итерации с инерцией и зеркальной проекцией из дискретизации ОДУ. Он популярен благодаря адаптации и ускорению.&lt;br /&gt;
&lt;br /&gt;
==== Адаптация к геометрия ====&lt;br /&gt;
Зеркальный спуск позволяет использовать неевклидовы нормы, что экономит вычисления по сравнению с проекциями в евклидовом пространстве.&lt;br /&gt;
&lt;br /&gt;
==== Ускорение сходимости ====&lt;br /&gt;
Встроенная инерция обеспечивает квадратичную скорость &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Это достигается за счет комбинации градиентного и зеркального шагов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: Пусть дано выпуклое замкнутое множество &amp;lt;math&amp;gt;X ⊆ R^n&amp;lt;/math&amp;gt;, гладкая выпуклая функция &amp;lt;math&amp;gt;f : X → R&amp;lt;/math&amp;gt; с L-липшицевым градиентом ∇f относительно нормы ∥·∥, и сильно выпуклая зеркальная функция &amp;lt;math&amp;gt;ψ : X → R&amp;lt;/math&amp;gt; с параметром l &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
Расхождение Брегмана для ψ определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;D_ψ(z, y) = ψ(z) − ψ(y) − ⟨∇ψ(y), z − y⟩.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача оптимизации формулируется следующим образом:&lt;br /&gt;
&amp;lt;math&amp;gt;min f(x), где f^∗ = min f(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дискретная версия ускоренного зеркального спуска с постоянным шагом s ≤ 1/L включает следующие итерации:&lt;br /&gt;
&lt;br /&gt;
* На k-й итерации вычисляем параметры и основную точку:&lt;br /&gt;
 α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2)/2*L&lt;br /&gt;
 τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2/(k+2)&lt;br /&gt;
 x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 − τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Сделать градиентный шаг:&lt;br /&gt;
  y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = arg min {L/2* ||y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;||^2 + ⟨∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
            y∈X&lt;br /&gt;
&lt;br /&gt;
* Сделать зеркальный шаг:&lt;br /&gt;
 Пусть V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) = D&amp;lt;sub&amp;gt;ψ&amp;lt;/sub&amp;gt;(z, x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;).&lt;br /&gt;
 z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = arg min {V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) + ⟨α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), z − z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
         z∈X&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма сосредоточено в процедуре адаптивного подбора шага и последующего обновления переменных. Здесь ключевую роль играет внутренний цикл backtracking, который выполняется на каждой итерации для оценки локальной константы Липшица &#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&#039;&#039;Курсивное начертание&#039;&#039;. Ядро состоит из:&lt;br /&gt;
&lt;br /&gt;
# Значение функции и градиента: Многократное вычисление значения функции &#039;&#039;&#039;&#039;&#039;f(y)&#039;&#039;&#039;&#039;&#039; и однократное вычисление градиента &#039;&#039;&#039;&#039;&#039;∇f(x)&#039;&#039;&#039;&#039;&#039; на итерацию. Это наиболее ресурсоемкая часть.&lt;br /&gt;
# Проверка условия Армихо: Проверка неравенства вида:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
                  f(y_{k+1}) &amp;lt;= f(x_{k+1}) - \frac{1}{2L} * ||f(x_{k+1})||^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
гарантирующего достаточное убывание функции.&lt;br /&gt;
# Зеркальный и градиентный шаги: Вычисление проекций для обновления последовательностей &#039;&#039;&#039;&#039;&#039;y&#039;&#039;&#039;&#039;&#039; и &#039;&#039;&#039;&#039;&#039;z&#039;&#039;&#039;&#039;&#039; с параметром &#039;&#039;&#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм сохраняет общую итерационную структуру, но каждая итерация является двухуровневой:&lt;br /&gt;
&lt;br /&gt;
# Внешний уровень: Управляет обновлением параметров инерции (&amp;lt;math&amp;gt;\alpha_k, \tau_k&amp;lt;/math&amp;gt;) и переходом к следующему шагу оптимизации.&lt;br /&gt;
# Внутренний уровень: Процедура поиска шага. Здесь происходит циклический подбор параметра L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;. Внутри этого цикла выполняются операции:&lt;br /&gt;
#* Вычисление кандидата на новую переменную y.&lt;br /&gt;
#* Вычисление значения f(y) и проверка условия Армихо.&lt;br /&gt;
#* Увеличение L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; в случае неудачи. В случае успешной проверки условия - принимается кандидат на новую переменную y.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Ниже приведен псевдокод, реализующий ускоренный зеркальный градиентный спуск с адаптивным поиском константы Липшица.&lt;br /&gt;
&lt;br /&gt;
  x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
  for k in 0...max_iterations {&lt;br /&gt;
      α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2) / 2L&lt;br /&gt;
      τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2 / (k+2)&lt;br /&gt;
      x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 - τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      while (True) {&lt;br /&gt;
          y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
          if f(y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;) &amp;lt;= f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) - 1/2L * ||∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:&lt;br /&gt;
              break&lt;br /&gt;
          L *= η&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;&lt;br /&gt;
      z&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; - α * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
      if f(y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) &amp;lt;= ε:&lt;br /&gt;
          break&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность одной итерации алгоритма складывается из:&lt;br /&gt;
&lt;br /&gt;
* Сложность вычисления градиента T&amp;lt;sub&amp;gt;∇f(x)&amp;lt;/sub&amp;gt;;&lt;br /&gt;
* Сложность векторных операций, равная O(n);&lt;br /&gt;
Пусть N&amp;lt;sub&amp;gt;back&amp;lt;/sub&amp;gt; - среднее число вызовов f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) внутри backtracking (N&amp;lt;sub&amp;gt;call&amp;lt;/sub&amp;gt; ≈ 2). Тогда общая сложность на одной итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{iter} = T_{\nabla f(x)} + N_{back} * T_f + O(n).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность для достижения точности внешним циклом будет порядка &amp;lt;math&amp;gt;O(\frac{1}{\sqrt{\varepsilon}})&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Тогда общей сложностью всего алгоритма будет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
         N_{call} ≈ O(1)\\&lt;br /&gt;
         T_{\nabla f(x)} ≈ O(n^2)\\&lt;br /&gt;
         T_f ≈ O(n)\\&lt;br /&gt;
         T_{nest} = O(\frac{1}{\sqrt{ε}} * (T_{\nabla f(x)} + N_{call} * T_f + O(n))) ≈ O(\frac{1}{ε} * n^2)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф для зеркального метода Нестерова.png|Информационный граф для зеркального метода Нестерова.png]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф зеркального метода Нестерова описывает структуру зависимостей между операциями внутри одной итерации алгоритма. Данный граф является динамическим, т.е. последовательную конкатенацию базового подграфа, т.к. заранее неизвестно количество итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Подграф имеет слоисто-ярусную структуру и состоит из следующих уровней:&lt;br /&gt;
# &#039;&#039;&#039;Уровень входа&#039;&#039;&#039; - входные данные: y и z с предыдущей итерации;&lt;br /&gt;
# &#039;&#039;&#039;Уровень экстраполяции&#039;&#039;&#039; - вычисление точки x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;;&lt;br /&gt;
# &#039;&#039;&#039;Уровень вычислений&#039;&#039;&#039; - вычисление градиента ∇f(x) и f(x);&lt;br /&gt;
# &#039;&#039;&#039;Уровень ветвления&#039;&#039;&#039; - вычисление новой точки y вместе с backtracking для L и новой точки z;&lt;br /&gt;
# &#039;&#039;&#039;Уровень проверки выхода&#039;&#039;&#039; - проверяется, достигли ли мы нужной точности. Если не достигли, то переходим к новой итерации, и выходим, если достигли;&lt;br /&gt;
# &#039;&#039;&#039;Уровень выхода&#039;&#039;&#039; - завершение алгоритма;&lt;br /&gt;
&lt;br /&gt;
Таким образом, информационный граф алгоритма - это последовательная цепь таких подграфов, длина которой заранее неизвестна и зависит от целевой функции.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Параллелизм алгоритма имеет двухуровневую структуру, связанную с циклическим профилем последовательной реализации.&lt;br /&gt;
* &#039;&#039;&#039;Внешний уровень: Последовательные зависимости&#039;&#039;&#039;&lt;br /&gt;
  На верхнем уровне алгоритм является строго последовательным. Итерации &#039;&#039;k&#039;&#039; зависимы по данным, т.к. начальное приближение шага определяется результатом предыдущего шага. Данный ярус не имеет параллельного ресурса.&lt;br /&gt;
  Внутри каждого шага последовательный подбор константы &#039;&#039;L&#039;&#039; также зависим от предыдущего результата проверки.&lt;br /&gt;
* &#039;&#039;&#039;Внутренний уровень: Конечный и массовый параллелизм&#039;&#039;&#039;&lt;br /&gt;
  Внутри одной итерации раскрывается основной ресурс параллелизма:&lt;br /&gt;
  *# &#039;&#039;&#039;Конечный параллелизм ветвей&#039;&#039;&#039;: после вычисления градиента обновление последовательностей &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039; &#039;&#039;&#039;потенциально&#039;&#039;&#039; информационно независимы.&lt;br /&gt;
  *# &#039;&#039;&#039;Массовый координатный параллелизм&#039;&#039;&#039;: все покомпонентные операции (сложение, вычитание, умножение на скаляр) векторов размерности n независимы. Обработка компонент при вычислении градиента ∇f(x) для многих задач также выполняется независимо.&lt;br /&gt;
&lt;br /&gt;
Высота одного шага: &amp;lt;math&amp;gt;T_{step} ≈ O(\log{n})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; - сложность выполнения редукции.&lt;br /&gt;
&lt;br /&gt;
Среднее число попыток backtracking ≈ O(1).&lt;br /&gt;
&lt;br /&gt;
Для успешного завершения алгоритма с заданной точностью &amp;lt;math&amp;gt;ε ≈ O(\frac{1}{\sqrt{ε}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общая сложность выполнения параллельной программы определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{nest} = O(\frac{1}{\sqrt{ε}}*\log{n}).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: начальное точка-вектор &amp;lt;math&amp;gt;x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&amp;lt;/math&amp;gt;, начальные параметры &amp;lt;math&amp;gt;\alpha_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0&amp;lt;/math&amp;gt;, точность вычислений &#039;&#039;ε&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &#039;&#039;n + 3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: найденная точка-вектор оптиума заданной функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычислительная мощность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм обладает высокой вычислительной мощностью в том случае, если вычисление значения функции и градиента является трудоемкой. Для простых задач  объем пересылаемых данных сопоставим с числом арифметических операций.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Детерминированность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм является детерминированным. При фиксации начального приближения и параметров результат работы алгоритма однозначно определён.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Сбалансированность вычислений&#039;&#039;&#039;&lt;br /&gt;
Алгоритм неравномерно сбалансирован. Векторных операции и вычисления градиента сбалансированы. Этапы проверки условий и backtracking являются последовательными и слабо загруженными.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Устойчивость&#039;&#039;&#039;&lt;br /&gt;
Метод обладает свойством самокоррекции ошибок за счет зеркального спуска и адаптивного подбора шага.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Динамичность&#039;&#039;&#039;&lt;br /&gt;
Число backtracking итераций зависит от свойств целевой функции и текущей точки, что делает время выполнения одной итерации заранее неизвестным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная последовательная реализация метода ускоренного зеркального спуска строится как итерационный процесс, на каждом шаге которого решается задача минимизации линейной модели функции. Основу реализации составляет цикл по итерациям, внутри которого выполняются 3 блока операций:&lt;br /&gt;
# &#039;&#039;&#039;Экстраполяция&#039;&#039;&#039;: вычисление точки &amp;lt;math&amp;gt;x_{k+1}&amp;lt;/math&amp;gt; как линейной комбинации точек &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;;&lt;br /&gt;
# &#039;&#039;&#039;Backtracking&#039;&#039;&#039;: вычисление градиента, значения функции и проверку условия Армихо;&lt;br /&gt;
# &#039;&#039;&#039;Обновление переменных&#039;&#039;&#039;: обновляются шаги &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Основной выбор реализации касается работы с памятью. Вместо динамического выделения буферов внутри цикла нужно предварительно аллоцировать все рабочие векторы при инициализации. Для задач высокой размерности эффективность повышается за счет слияния циклов.&lt;br /&gt;
&lt;br /&gt;
Ресурс параллелизма позволяет применять ассоциативность векторных операций (разбивать длинные циклы на независимые блоки).&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации ===&lt;br /&gt;
&lt;br /&gt;
Анализ информационного графа и иерархической структуры зависимостей показывает, что алгоритм допускает эффективное распараллеливание на основе декомпозиции данных (Data Parallelism). Специфика алгоритма не позволяет эффективно использовать конвейерный параллелизм.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Межпроцессорный параллелизм&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Векторы-точки (&#039;&#039;x, y, z&#039;&#039;) и градиент разбиваются на непрерывные блоки, которые распределяются между MPI-процессами. Каждый процесс отвечает за обновление своей части вектора.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Распределение данных&#039;&#039;&#039;: используется блочное разбиение. Размер блока определяется как &amp;lt;math&amp;gt;N / P&amp;lt;/math&amp;gt; (с учетом остатка).&lt;br /&gt;
* &#039;&#039;&#039;Минимизация обменов&#039;&#039;&#039;: векторные операции, вычисление значения функции и вычисление градиента выполняются локально. Обмен данными осуществляется только для операций редукции (скалярное произведение и норма) через &#039;&#039;&#039;MPI_Allreduce&#039;&#039;&#039;, и, если требуются соседние значения для других операций, то обмен ими (Halo Exchange).&lt;br /&gt;
&lt;br /&gt;
Главным узким местом является глобальная синхронизация в backtracking. Каждая проверка на условие Армихо требует синхронизации всех процессов для вычисления значения &#039;&#039;f(y)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&lt;br /&gt;
Прогоны программы производились на СК Ломоносов-2.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма на p процессах&lt;br /&gt;
|-&lt;br /&gt;
! P (кол-во процессов) !! T (время, с)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13.914765&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 7.891406&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 4.026877&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 3.038892&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 2.518778&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 2.188900&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.991381&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 1.067469&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Для данного алгоритма ключевым фактором производительности является пропускная способность памяти и латентность сети. Для этого больше всего подходят:&lt;br /&gt;
* &#039;&#039;&#039;Кластерные системы (MMID)&#039;&#039;&#039; - хорошая масштабируется при условии большой локальной памяти.&lt;br /&gt;
* &#039;&#039;&#039;Графические ускорители (SIMT/GPU)&#039;&#039;&#039; - идеально подходит для массово-параллельных векторных операций.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Нестеров, Ю.Е. (1983). Метод решения задачи выпуклого программирования с темпом сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Доклады Академии наук СССР, 27(2), 372–376.&lt;br /&gt;
* Немировский А. С., Юдин Д. Б. &amp;quot;Сложность задач и эффективность методов оптимизации.&amp;quot;— М.: Наука, 1979&lt;br /&gt;
* Krichene, W., Bayen, A., Bartlett, P. (2015). Accelerated Mirror Descent in Continuous and Discrete Time. NeurIPS.&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30369</id>
		<title>Участник:Брыскина Кристина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30369"/>
		<updated>2025-12-10T14:43:58Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0|Брыскина Кристина]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм Нестерова с зеркальным шагом, известный как ускоренный зеркальный спуск, был предложен в рамках развития методов выпуклой оптимизации в конце ХХ века, с ключевыми идеями, заложенными Юрием Нестеровым в его работах по ускоренному градиентному спуску 1983 года.&lt;br /&gt;
&lt;br /&gt;
Идея зеркального спуска появилась раньше, в 1970-1980 годах, благодаря работам Аркадия Немировского и Давида Юдина.&lt;br /&gt;
&lt;br /&gt;
Позже произошло их объединение в общую ускоренную версию, например, в работе Кричена, Байена и Бартлетта.&lt;br /&gt;
&lt;br /&gt;
Изначально данный метод использовался для безусловной минимизации гладких выпуклых функций, давая скорость сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;, что лучше, чем &amp;lt;math&amp;gt;O(\frac{1}{k})&amp;lt;/math&amp;gt; у обычного градиентного спуска. Но с развитием вычислительных методов его применение расширилось на ограниченные выпуклые множества, такие как симплекс в задачах обучения с поддержкой векторов или положительно определенные матрицы в спектральной кластеризации.&lt;br /&gt;
В настоящее время ускоренный зеркальный спуск применяется в машинном обучении, включая стохастическую оптимизацию и распределенные системы. Для разреженных данных добавляют проксимальные операторы, а в итерационных методах - неполные версии с фильтрацией градиентов.&lt;br /&gt;
Алгоритм реализует итерации с инерцией и зеркальной проекцией из дискретизации ОДУ. Он популярен благодаря адаптации и ускорению.&lt;br /&gt;
&lt;br /&gt;
==== Адаптация к геометрия ====&lt;br /&gt;
Зеркальный спуск позволяет использовать неевклидовы нормы, что экономит вычисления по сравнению с проекциями в евклидовом пространстве.&lt;br /&gt;
&lt;br /&gt;
==== Ускорение сходимости ====&lt;br /&gt;
Встроенная инерция обеспечивает квадратичную скорость &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Это достигается за счет комбинации градиентного и зеркального шагов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: Пусть дано выпуклое замкнутое множество &amp;lt;math&amp;gt;X ⊆ R^n&amp;lt;/math&amp;gt;, гладкая выпуклая функция &amp;lt;math&amp;gt;f : X → R&amp;lt;/math&amp;gt; с L-липшицевым градиентом ∇f относительно нормы ∥·∥, и сильно выпуклая зеркальная функция &amp;lt;math&amp;gt;ψ : X → R&amp;lt;/math&amp;gt; с параметром l &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
Расхождение Брегмана для ψ определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;D_ψ(z, y) = ψ(z) − ψ(y) − ⟨∇ψ(y), z − y⟩.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача оптимизации формулируется следующим образом:&lt;br /&gt;
&amp;lt;math&amp;gt;min f(x), где f^∗ = min f(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дискретная версия ускоренного зеркального спуска с постоянным шагом s ≤ 1/L включает следующие итерации:&lt;br /&gt;
&lt;br /&gt;
* На k-й итерации вычисляем параметры и основную точку:&lt;br /&gt;
 α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2)/2*L&lt;br /&gt;
 τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2/(k+2)&lt;br /&gt;
 x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 − τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Сделать градиентный шаг:&lt;br /&gt;
  y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = arg min {L/2* ||y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;||^2 + ⟨∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
            y∈X&lt;br /&gt;
&lt;br /&gt;
* Сделать зеркальный шаг:&lt;br /&gt;
 Пусть V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) = D&amp;lt;sub&amp;gt;ψ&amp;lt;/sub&amp;gt;(z, x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;).&lt;br /&gt;
 z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = arg min {V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) + ⟨α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), z − z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
         z∈X&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма сосредоточено в процедуре адаптивного подбора шага и последующего обновления переменных. Здесь ключевую роль играет внутренний цикл backtracking, который выполняется на каждой итерации для оценки локальной константы Липшица &#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&#039;&#039;Курсивное начертание&#039;&#039;. Ядро состоит из:&lt;br /&gt;
&lt;br /&gt;
# Значение функции и градиента: Многократное вычисление значения функции &#039;&#039;&#039;&#039;&#039;f(y)&#039;&#039;&#039;&#039;&#039; и однократное вычисление градиента &#039;&#039;&#039;&#039;&#039;∇f(x)&#039;&#039;&#039;&#039;&#039; на итерацию. Это наиболее ресурсоемкая часть.&lt;br /&gt;
# Проверка условия Армихо: Проверка неравенства вида:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
                  f(y_{k+1}) &amp;lt;= f(x_{k+1}) - \frac{1}{2L} * ||f(x_{k+1})||^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
гарантирующего достаточное убывание функции.&lt;br /&gt;
# Зеркальный и градиентный шаги: Вычисление проекций для обновления последовательностей &#039;&#039;&#039;&#039;&#039;y&#039;&#039;&#039;&#039;&#039; и &#039;&#039;&#039;&#039;&#039;z&#039;&#039;&#039;&#039;&#039; с параметром &#039;&#039;&#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм сохраняет общую итерационную структуру, но каждая итерация является двухуровневой:&lt;br /&gt;
&lt;br /&gt;
# Внешний уровень: Управляет обновлением параметров инерции (&amp;lt;math&amp;gt;\alpha_k, \tau_k&amp;lt;/math&amp;gt;) и переходом к следующему шагу оптимизации.&lt;br /&gt;
# Внутренний уровень: Процедура поиска шага. Здесь происходит циклический подбор параметра L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;. Внутри этого цикла выполняются операции:&lt;br /&gt;
#* Вычисление кандидата на новую переменную y.&lt;br /&gt;
#* Вычисление значения f(y) и проверка условия Армихо.&lt;br /&gt;
#* Увеличение L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; в случае неудачи. В случае успешной проверки условия - принимается кандидат на новую переменную y.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Ниже приведен псевдокод, реализующий ускоренный зеркальный градиентный спуск с адаптивным поиском константы Липшица.&lt;br /&gt;
&lt;br /&gt;
  x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
  for k in 0...max_iterations {&lt;br /&gt;
      α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2) / 2L&lt;br /&gt;
      τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2 / (k+2)&lt;br /&gt;
      x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 - τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      while (True) {&lt;br /&gt;
          y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
          if f(y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;) &amp;lt;= f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) - 1/2L * ||∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:&lt;br /&gt;
              break&lt;br /&gt;
          L *= η&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;&lt;br /&gt;
      z&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; - α * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
      if f(y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) &amp;lt;= ε:&lt;br /&gt;
          break&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность одной итерации алгоритма складывается из:&lt;br /&gt;
&lt;br /&gt;
* Сложность вычисления градиента T&amp;lt;sub&amp;gt;∇f(x)&amp;lt;/sub&amp;gt;;&lt;br /&gt;
* Сложность векторных операций, равная O(n);&lt;br /&gt;
Пусть N&amp;lt;sub&amp;gt;back&amp;lt;/sub&amp;gt; - среднее число вызовов f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) внутри backtracking (N&amp;lt;sub&amp;gt;call&amp;lt;/sub&amp;gt; ≈ 2). Тогда общая сложность на одной итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{iter} = T_{\nabla f(x)} + N_{back} * T_f + O(n).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность для достижения точности внешним циклом будет порядка &amp;lt;math&amp;gt;O(\frac{1}{\sqrt{\varepsilon}})&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Тогда общей сложностью всего алгоритма будет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
         N_{call} ≈ O(1)\\&lt;br /&gt;
         T_{\nabla f(x)} ≈ O(n^2)\\&lt;br /&gt;
         T_f ≈ O(n)\\&lt;br /&gt;
         T_{nest} = O(\frac{1}{\sqrt{ε}} * (T_{\nabla f(x)} + N_{call} * T_f + O(n))) ≈ O(\frac{1}{ε} * n^2)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф для зеркального метода Нестерова.png|Информационный граф для зеркального метода Нестерова.png]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф зеркального метода Нестерова описывает структуру зависимостей между операциями внутри одной итерации алгоритма. Данный граф является динамическим, т.е. последовательную конкатенацию базового подграфа, т.к. заранее неизвестно количество итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Подграф имеет слоисто-ярусную структуру и состоит из следующих уровней:&lt;br /&gt;
# &#039;&#039;&#039;Уровень входа&#039;&#039;&#039; - входные данные: y и z с предыдущей итерации;&lt;br /&gt;
# &#039;&#039;&#039;Уровень экстраполяции&#039;&#039;&#039; - вычисление точки x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;;&lt;br /&gt;
# &#039;&#039;&#039;Уровень вычислений&#039;&#039;&#039; - вычисление градиента ∇f(x) и f(x);&lt;br /&gt;
# &#039;&#039;&#039;Уровень ветвления&#039;&#039;&#039; - вычисление новой точки y вместе с backtracking для L и новой точки z;&lt;br /&gt;
# &#039;&#039;&#039;Уровень проверки выхода&#039;&#039;&#039; - проверяется, достигли ли мы нужной точности. Если не достигли, то переходим к новой итерации, и выходим, если достигли;&lt;br /&gt;
# &#039;&#039;&#039;Уровень выхода&#039;&#039;&#039; - завершение алгоритма;&lt;br /&gt;
&lt;br /&gt;
Таким образом, информационный граф алгоритма - это последовательная цепь таких подграфов, длина которой заранее неизвестна и зависит от целевой функции.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Параллелизм алгоритма имеет двухуровневую структуру, связанную с циклическим профилем последовательной реализации.&lt;br /&gt;
* &#039;&#039;&#039;Внешний уровень: Последовательные зависимости&#039;&#039;&#039;&lt;br /&gt;
  На верхнем уровне алгоритм является строго последовательным. Итерации &#039;&#039;k&#039;&#039; зависимы по данным, т.к. начальное приближение шага определяется результатом предыдущего шага. Данный ярус не имеет параллельного ресурса.&lt;br /&gt;
  Внутри каждого шага последовательный подбор константы &#039;&#039;L&#039;&#039; также зависим от предыдущего результата проверки.&lt;br /&gt;
* &#039;&#039;&#039;Внутренний уровень: Конечный и массовый параллелизм&#039;&#039;&#039;&lt;br /&gt;
  Внутри одной итерации раскрывается основной ресурс параллелизма:&lt;br /&gt;
  *# &#039;&#039;&#039;Конечный параллелизм ветвей&#039;&#039;&#039;: после вычисления градиента обновление последовательностей &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039; &#039;&#039;&#039;потенциально&#039;&#039;&#039; информационно независимы.&lt;br /&gt;
  *# &#039;&#039;&#039;Массовый координатный параллелизм&#039;&#039;&#039;: все покомпонентные операции (сложение, вычитание, умножение на скаляр) векторов размерности n независимы. Обработка компонент при вычислении градиента ∇f(x) для многих задач также выполняется независимо.&lt;br /&gt;
&lt;br /&gt;
Высота одного шага: &amp;lt;math&amp;gt;T_{step} ≈ O(\log{n})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; - сложность выполнения редукции.&lt;br /&gt;
&lt;br /&gt;
Среднее число попыток backtracking ≈ O(1).&lt;br /&gt;
&lt;br /&gt;
Для успешного завершения алгоритма с заданной точностью &amp;lt;math&amp;gt;ε ≈ O(\frac{1}{\sqrt{ε}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общая сложность выполнения параллельной программы определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{nest} = O(\frac{1}{\sqrt{ε}}*\log{n}).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: начальное точка-вектор &amp;lt;math&amp;gt;x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&amp;lt;/math&amp;gt;, начальные параметры &amp;lt;math&amp;gt;\alpha_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0&amp;lt;/math&amp;gt;, точность вычислений &#039;&#039;ε&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &#039;&#039;n + 3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: найденная точка-вектор оптиума заданной функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычислительная мощность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм обладает высокой вычислительной мощностью в том случае, если вычисление значения функции и градиента является трудоемкой. Для простых задач  объем пересылаемых данных сопоставим с числом арифметических операций.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Детерминированность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм является детерминированным. При фиксации начального приближения и параметров результат работы алгоритма однозначно определён.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Сбалансированность вычислений&#039;&#039;&#039;&lt;br /&gt;
Алгоритм неравномерно сбалансирован. Векторных операции и вычисления градиента сбалансированы. Этапы проверки условий и backtracking являются последовательными и слабо загруженными.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Устойчивость&#039;&#039;&#039;&lt;br /&gt;
Метод обладает свойством самокоррекции ошибок за счет зеркального спуска и адаптивного подбора шага.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Динамичность&#039;&#039;&#039;&lt;br /&gt;
Число backtracking итераций зависит от свойств целевой функции и текущей точки, что делает время выполнения одной итерации заранее неизвестным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная последовательная реализация метода ускоренного зеркального спуска строится как итерационный процесс, на каждом шаге которого решается задача минимизации линейной модели функции. Основу реализации составляет цикл по итерациям, внутри которого выполняются 3 блока операций:&lt;br /&gt;
# &#039;&#039;&#039;Экстраполяция&#039;&#039;&#039;: вычисление точки &amp;lt;math&amp;gt;x_{k+1}&amp;lt;/math&amp;gt; как линейной комбинации точек &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;;&lt;br /&gt;
# &#039;&#039;&#039;Backtracking&#039;&#039;&#039;: вычисление градиента, значения функции и проверку условия Армихо;&lt;br /&gt;
# &#039;&#039;&#039;Обновление переменных&#039;&#039;&#039;: обновляются шаги &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Основной выбор реализации касается работы с памятью. Вместо динамического выделения буферов внутри цикла нужно предварительно аллоцировать все рабочие векторы при инициализации. Для задач высокой размерности эффективность повышается за счет слияния циклов.&lt;br /&gt;
&lt;br /&gt;
Ресурс параллелизма позволяет применять ассоциативность векторных операций (разбивать длинные циклы на независимые блоки).&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации ===&lt;br /&gt;
&lt;br /&gt;
Анализ информационного графа и иерархической структуры зависимостей показывает, что алгоритм допускает эффективное распараллеливание на основе декомпозиции данных (Data Parallelism). Специфика алгоритма не позволяет эффективно использовать конвейерный параллелизм.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Межпроцессорный параллелизм&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Векторы-точки (&#039;&#039;x, y, z&#039;&#039;) и градиент разбиваются на непрерывные блоки, которые распределяются между MPI-процессами. Каждый процесс отвечает за обновление своей части вектора.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Распределение данных&#039;&#039;&#039;: используется блочное разбиение. Размер блока определяется как &amp;lt;math&amp;gt;N / P&amp;lt;/math&amp;gt; (с учетом остатка).&lt;br /&gt;
* &#039;&#039;&#039;Минимизация обменов&#039;&#039;&#039;: векторные операции, вычисление значения функции и вычисление градиента выполняются локально. Обмен данными осуществляется только для операций редукции (скалярное произведение и норма) через &#039;&#039;&#039;MPI_Allreduce&#039;&#039;&#039;, и, если требуются соседние значения для других операций, то обмен ими (Halo Exchange).&lt;br /&gt;
&lt;br /&gt;
Главным узким местом является глобальная синхронизация в backtracking. Каждая проверка на условие Армихо требует синхронизации всех процессов для вычисления значения &#039;&#039;f(y)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&lt;br /&gt;
Прогоны программы производились на СК Ломоносов-2.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма на p процессах&lt;br /&gt;
|-&lt;br /&gt;
! P (кол-во процессов) !! T (время, с)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13.914765&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 7.891406&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 4.026877&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 3.038892&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 2.518778&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 2.188900&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.991381&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 1.067469&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Для данного алгоритма ключевым фактором производительности является пропускная способность памяти и латентность сети. Для этого больше всего подходят:&lt;br /&gt;
* &#039;&#039;&#039;Кластерные системы (MMID)&#039;&#039;&#039; - хорошая масштабируется при условии большой локальной памяти.&lt;br /&gt;
* &#039;&#039;&#039;Графические ускорители (SIMT/GPU)&#039;&#039;&#039; - идеально подходит для массово-параллельных векторных операций.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Нестеров, Ю.Е. (1983). Метод решения задачи выпуклого программирования с темпом сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Доклады Академии наук СССР, 27(2), 372–376.&lt;br /&gt;
* Немировский А. С., Юдин Д. Б. &amp;quot;Сложность задач и эффективность методов оптимизации.&amp;quot;— М.: Наука, 1979&lt;br /&gt;
* Krichene, W., Bayen, A., Bartlett, P. (2015). Accelerated Mirror Descent in Continuous and Discrete Time. NeurIPS.&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30368</id>
		<title>Участник:Брыскина Кристина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30368"/>
		<updated>2025-12-10T14:42:03Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0|Брыскина Кристина]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм Нестерова с зеркальным шагом, известный как ускоренный зеркальный спуск, был предложен в рамках развития методов выпуклой оптимизации в конце ХХ века, с ключевыми идеями, заложенными Юрием Нестеровым в его работах по ускоренному градиентному спуску 1983 года.&lt;br /&gt;
&lt;br /&gt;
Идея зеркального спуска появилась раньше, в 1970-1980 годах, благодаря работам Аркадия Немировского и Давида Юдина.&lt;br /&gt;
&lt;br /&gt;
Позже произошло их объединение в общую ускоренную версию, например, в работе Кричена, Байена и Бартлетта.&lt;br /&gt;
&lt;br /&gt;
Изначально данный метод использовался для безусловной минимизации гладких выпуклых функций, давая скорость сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;, что лучше, чем &amp;lt;math&amp;gt;O(\frac{1}{k})&amp;lt;/math&amp;gt; у обычного градиентного спуска. Но с развитием вычислительных методов его применение расширилось на ограниченные выпуклые множества, такие как симплекс в задачах обучения с поддержкой векторов или положительно определенные матрицы в спектральной кластеризации.&lt;br /&gt;
В настоящее время ускоренный зеркальный спуск применяется в машинном обучении, включая стохастическую оптимизацию и распределенные системы. Для разреженных данных добавляют проксимальные операторы, а в итерационных методах - неполные версии с фильтрацией градиентов.&lt;br /&gt;
Алгоритм реализует итерации с инерцией и зеркальной проекцией из дискретизации ОДУ. Он популярен благодаря адаптации и ускорению.&lt;br /&gt;
&lt;br /&gt;
==== Адаптация к геометрия ====&lt;br /&gt;
Зеркальный спуск позволяет использовать неевклидовы нормы, что экономит вычисления по сравнению с проекциями в евклидовом пространстве.&lt;br /&gt;
&lt;br /&gt;
==== Ускорение сходимости ====&lt;br /&gt;
Встроенная инерция обеспечивает квадратичную скорость &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Это достигается за счет комбинации градиентного и зеркального шагов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: Пусть дано выпуклое замкнутое множество &amp;lt;math&amp;gt;X ⊆ R^n&amp;lt;/math&amp;gt;, гладкая выпуклая функция &amp;lt;math&amp;gt;f : X → R&amp;lt;/math&amp;gt; с L-липшицевым градиентом ∇f относительно нормы ∥·∥, и сильно выпуклая зеркальная функция &amp;lt;math&amp;gt;ψ : X → R&amp;lt;/math&amp;gt; с параметром l &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
Расхождение Брегмана для ψ определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;D_ψ(z, y) = ψ(z) − ψ(y) − ⟨∇ψ(y), z − y⟩.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача оптимизации формулируется следующим образом:&lt;br /&gt;
&amp;lt;math&amp;gt;min f(x), где f^∗ = min f(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дискретная версия ускоренного зеркального спуска с постоянным шагом s ≤ 1/L включает следующие итерации:&lt;br /&gt;
&lt;br /&gt;
* На k-й итерации вычисляем параметры и основную точку:&lt;br /&gt;
 α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2)/2*L&lt;br /&gt;
 τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2/(k+2)&lt;br /&gt;
 x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 − τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Сделать градиентный шаг:&lt;br /&gt;
  y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = arg min {L/2* ||y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;||^2 + ⟨∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
            y∈X&lt;br /&gt;
&lt;br /&gt;
* Сделать зеркальный шаг:&lt;br /&gt;
 Пусть V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) = D&amp;lt;sub&amp;gt;ψ&amp;lt;/sub&amp;gt;(z, x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;).&lt;br /&gt;
 z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = arg min {V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) + ⟨α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), z − z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
         z∈X&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма сосредоточено в процедуре адаптивного подбора шага и последующего обновления переменных. Здесь ключевую роль играет внутренний цикл backtracking, который выполняется на каждой итерации для оценки локальной константы Липшица &#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&#039;&#039;Курсивное начертание&#039;&#039;. Ядро состоит из:&lt;br /&gt;
&lt;br /&gt;
# Значение функции и градиента: Многократное вычисление значения функции &#039;&#039;&#039;&#039;&#039;f(y)&#039;&#039;&#039;&#039;&#039; и однократное вычисление градиента &#039;&#039;&#039;&#039;&#039;∇f(x)&#039;&#039;&#039;&#039;&#039; на итерацию. Это наиболее ресурсоемкая часть.&lt;br /&gt;
# Проверка условия Армихо: Проверка неравенства вида:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
                  f(y_{k+1}) &amp;lt;= f(x_{k+1}) - \frac{1}{2L} * ||f(x_{k+1})||^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
гарантирующего достаточное убывание функции.&lt;br /&gt;
# Зеркальный и градиентный шаги: Вычисление проекций для обновления последовательностей &#039;&#039;&#039;&#039;&#039;y&#039;&#039;&#039;&#039;&#039; и &#039;&#039;&#039;&#039;&#039;z&#039;&#039;&#039;&#039;&#039; с параметром &#039;&#039;&#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм сохраняет общую итерационную структуру, но каждая итерация является двухуровневой:&lt;br /&gt;
&lt;br /&gt;
# Внешний уровень: Управляет обновлением параметров инерции (&amp;lt;math&amp;gt;\alpha_k, \tau_k&amp;lt;/math&amp;gt;) и переходом к следующему шагу оптимизации.&lt;br /&gt;
# Внутренний уровень: Процедура поиска шага. Здесь происходит циклический подбор параметра L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;. Внутри этого цикла выполняются операции:&lt;br /&gt;
#* Вычисление кандидата на новую переменную y.&lt;br /&gt;
#* Вычисление значения f(y) и проверка условия Армихо.&lt;br /&gt;
#* Увеличение L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; в случае неудачи. В случае успешной проверки условия - принимается кандидат на новую переменную y.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Ниже приведен псевдокод, реализующий ускоренный зеркальный градиентный спуск с адаптивным поиском константы Липшица.&lt;br /&gt;
&lt;br /&gt;
  x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
  for k in 0...max_iterations {&lt;br /&gt;
      α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2) / 2L&lt;br /&gt;
      τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2 / (k+2)&lt;br /&gt;
      x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 - τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      while (True) {&lt;br /&gt;
          y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
          if f(y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;) &amp;lt;= f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) - 1/2L * ||∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:&lt;br /&gt;
              break&lt;br /&gt;
          L *= η&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;&lt;br /&gt;
      z&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; - α * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
      if f(y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) &amp;lt;= ε:&lt;br /&gt;
          break&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность одной итерации алгоритма складывается из:&lt;br /&gt;
&lt;br /&gt;
* Сложность вычисления градиента T&amp;lt;sub&amp;gt;∇f(x)&amp;lt;/sub&amp;gt;;&lt;br /&gt;
* Сложность векторных операций, равная O(n);&lt;br /&gt;
Пусть N&amp;lt;sub&amp;gt;back&amp;lt;/sub&amp;gt; - среднее число вызовов f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) внутри backtracking (N&amp;lt;sub&amp;gt;call&amp;lt;/sub&amp;gt; ≈ 2). Тогда общая сложность на одной итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{iter} = T_{\nabla f(x)} + N_{back} * T_f + O(n).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность для достижения точности внешним циклом будет порядка &amp;lt;math&amp;gt;O(\frac{1}{\sqrt{\varepsilon}})&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Тогда общей сложностью всего алгоритма будет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
         N_{call} ≈ O(1)\\&lt;br /&gt;
         T_{\nabla f(x)} ≈ O(n^2)\\&lt;br /&gt;
         T_f ≈ O(n)\\&lt;br /&gt;
         T_{nest} = O(\frac{1}{\sqrt{ε}} * (T_{\nabla f(x)} + N_{call} * T_f + O(n))) ≈ O(\frac{1}{ε} * n^2)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф для зеркального метода Нестерова.png|Информационный граф для зеркального метода Нестерова.png]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф зеркального метода Нестерова описывает структуру зависимостей между операциями внутри одной итерации алгоритма. Данный граф является динамическим, т.е. последовательную конкатенацию базового подграфа, т.к. заранее неизвестно количество итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Подграф имеет слоисто-ярусную структуру и состоит из следующих уровней:&lt;br /&gt;
# &#039;&#039;&#039;Уровень входа&#039;&#039;&#039; - входные данные: y и z с предыдущей итерации;&lt;br /&gt;
# &#039;&#039;&#039;Уровень экстраполяции&#039;&#039;&#039; - вычисление точки x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;;&lt;br /&gt;
# &#039;&#039;&#039;Уровень вычислений&#039;&#039;&#039; - вычисление градиента ∇f(x) и f(x);&lt;br /&gt;
# &#039;&#039;&#039;Уровень ветвления&#039;&#039;&#039; - вычисление новой точки y вместе с backtracking для L и новой точки z;&lt;br /&gt;
# &#039;&#039;&#039;Уровень проверки выхода&#039;&#039;&#039; - проверяется, достигли ли мы нужной точности. Если не достигли, то переходим к новой итерации, и выходим, если достигли;&lt;br /&gt;
# &#039;&#039;&#039;Уровень выхода&#039;&#039;&#039; - завершение алгоритма;&lt;br /&gt;
&lt;br /&gt;
Таким образом, информационный граф алгоритма - это последовательная цепь таких подграфов, длина которой заранее неизвестна и зависит от целевой функции.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Параллелизм алгоритма имеет двухуровневую структуру, связанную с циклическим профилем последовательной реализации.&lt;br /&gt;
* &#039;&#039;&#039;Внешний уровень: Последовательные зависимости&#039;&#039;&#039;&lt;br /&gt;
  На верхнем уровне алгоритм является строго последовательным. Итерации &#039;&#039;k&#039;&#039; зависимы по данным, т.к. начальное приближение шага определяется результатом предыдущего шага. Данный ярус не имеет параллельного ресурса.&lt;br /&gt;
  Внутри каждого шага последовательный подбор константы &#039;&#039;L&#039;&#039; также зависим от предыдущего результата проверки.&lt;br /&gt;
* &#039;&#039;&#039;Внутренний уровень: Конечный и массовый параллелизм&#039;&#039;&#039;&lt;br /&gt;
  Внутри одной итерации раскрывается основной ресурс параллелизма:&lt;br /&gt;
  *# &#039;&#039;&#039;Конечный параллелизм ветвей&#039;&#039;&#039;: после вычисления градиента обновление последовательностей &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039; &#039;&#039;&#039;потенциально&#039;&#039;&#039; информационно независимы.&lt;br /&gt;
  *# &#039;&#039;&#039;Массовый координатный параллелизм&#039;&#039;&#039;: все покомпонентные операции (сложение, вычитание, умножение на скаляр) векторов размерности n независимы. Обработка компонент при вычислении градиента ∇f(x) для многих задач также выполняется независимо.&lt;br /&gt;
&lt;br /&gt;
Высота одного шага: &amp;lt;math&amp;gt;T_{step} ≈ O(\log{n})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; - сложность выполнения редукции.&lt;br /&gt;
&lt;br /&gt;
Среднее число попыток backtracking ≈ O(1).&lt;br /&gt;
&lt;br /&gt;
Для успешного завершения алгоритма с заданной точностью &amp;lt;math&amp;gt;ε ≈ O(\frac{1}{\sqrt{ε}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общая сложность выполнения параллельной программы определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{nest} = O(\frac{1}{\sqrt{ε}}*\log{n}).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: начальное точка-вектор &amp;lt;math&amp;gt;x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&amp;lt;/math&amp;gt;, начальные параметры &amp;lt;math&amp;gt;\alpha_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0&amp;lt;/math&amp;gt;, точность вычислений &#039;&#039;ε&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &#039;&#039;n + 3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: найденная точка-вектор оптиума заданной функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычислительная мощность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм обладает высокой вычислительной мощностью в том случае, если вычисление значения функции и градиента является трудоемкой. Для простых задач  объем пересылаемых данных сопоставим с числом арифметических операций.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Детерминированность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм является детерминированным. При фиксации начального приближения и параметров результат работы алгоритма однозначно определён.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Сбалансированность вычислений&#039;&#039;&#039;&lt;br /&gt;
Алгоритм неравномерно сбалансирован. Векторных операции и вычисления градиента сбалансированы. Этапы проверки условий и backtracking являются последовательными и слабо загруженными.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Устойчивость&#039;&#039;&#039;&lt;br /&gt;
Метод обладает свойством самокоррекции ошибок за счет зеркального спуска и адаптивного подбора шага.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Динамичность&#039;&#039;&#039;&lt;br /&gt;
Число backtracking итераций зависит от свойств целевой функции и текущей точки, что делает время выполнения одной итерации заранее неизвестным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная последовательная реализация метода ускоренного зеркального спуска строится как итерационный процесс, на каждом шаге которого решается задача минимизации линейной модели функции. Основу реализации составляет цикл по итерациям, внутри которого выполняются 3 блока операций:&lt;br /&gt;
# &#039;&#039;&#039;Экстраполяция&#039;&#039;&#039;: вычисление точки &amp;lt;math&amp;gt;x_{k+1}&amp;lt;/math&amp;gt; как линейной комбинации точек &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;;&lt;br /&gt;
# &#039;&#039;&#039;Backtracking&#039;&#039;&#039;: вычисление градиента, значения функции и проверку условия Армихо;&lt;br /&gt;
# &#039;&#039;&#039;Обновление переменных&#039;&#039;&#039;: обновляются шаги &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Основной выбор реализации касается работы с памятью. Вместо динамического выделения буферов внутри цикла нужно предварительно аллоцировать все рабочие векторы при инициализации. Для задач высокой размерности эффективность повышается за счет слияния циклов.&lt;br /&gt;
&lt;br /&gt;
Ресурс параллелизма позволяет применять ассоциативность векторных операций (разбивать длинные циклы на независимые блоки).&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации ===&lt;br /&gt;
&lt;br /&gt;
Анализ информационного графа и иерархической структуры зависимостей показывает, что алгоритм допускает эффективное распараллеливание на основе декомпозиции данных (Data Parallelism). Специфика алгоритма не позволяет эффективно использовать конвейерный параллелизм.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Межпроцессорный параллелизм&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Векторы-точки (&#039;&#039;x, y, z&#039;&#039;) и градиент разбиваются на непрерывные блоки, которые распределяются между MPI-процессами. Каждый процесс отвечает за обновление своей части вектора.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Распределение данных&#039;&#039;&#039;: используется блочное разбиение. Размер блока определяется как &amp;lt;math&amp;gt;N / P&amp;lt;/math&amp;gt; (с учетом остатка).&lt;br /&gt;
* &#039;&#039;&#039;Минимизация обменов&#039;&#039;&#039;: векторные операции, вычисление значения функции и вычисление градиента выполняются локально. Обмен данными осуществляется только для операций редукции (скалярное произведение и норма) через &#039;&#039;&#039;MPI_Allreduce&#039;&#039;&#039;, и, если требуются соседние значения для других операций, то обмен ими (Halo Exchange).&lt;br /&gt;
&lt;br /&gt;
Главным узким местом является глобальная синхронизация в backtracking. Каждая проверка на условие Армихо требует синхронизации всех процессов для вычисления значения &#039;&#039;f(y)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&lt;br /&gt;
Прогоны программы производились на СК Ломоносов-2.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма на p процессах&lt;br /&gt;
|-&lt;br /&gt;
! P (кол-во ядер) !! T (время, с)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13.914765&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 7.891406&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 4.026877&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 3.038892&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 2.518778&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 2.188900&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.991381&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 1.067469&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Для данного алгоритма ключевым фактором производительности является пропускная способность памяти и латентность сети. Для этого больше всего подходят:&lt;br /&gt;
* &#039;&#039;&#039;Кластерные системы (MMID)&#039;&#039;&#039; - хорошая масштабируется при условии большой локальной памяти.&lt;br /&gt;
* &#039;&#039;&#039;Графические ускорители (SIMT/GPU)&#039;&#039;&#039; - идеально подходит для массово-параллельных векторных операций.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Нестеров, Ю.Е. (1983). Метод решения задачи выпуклого программирования с темпом сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Доклады Академии наук СССР, 27(2), 372–376.&lt;br /&gt;
* Немировский А. С., Юдин Д. Б. &amp;quot;Сложность задач и эффективность методов оптимизации.&amp;quot;— М.: Наука, 1979&lt;br /&gt;
* Krichene, W., Bayen, A., Bartlett, P. (2015). Accelerated Mirror Descent in Continuous and Discrete Time. NeurIPS.&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30367</id>
		<title>Участник:Брыскина Кристина</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0&amp;diff=30367"/>
		<updated>2025-12-10T14:40:55Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: Новая страница: «Автор: Брыскина Кристина  == Свойства и структура алгоритма == === Общее описание алгоритма === Алгоритм Нестерова с зеркальным шагом, известный как ускорен...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D1%80%D1%8B%D1%81%D0%BA%D0%B8%D0%BD%D0%B0_%D0%9A%D1%80%D0%B8%D1%81%D1%82%D0%B8%D0%BD%D0%B0|Брыскина Кристина]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Алгоритм Нестерова с зеркальным шагом, известный как ускоренный зеркальный спуск, был предложен в рамках развития методов выпуклой оптимизации в конце ХХ века, с ключевыми идеями, заложенными Юрием Нестеровым в его работах по ускоренному градиентному спуску 1983 года.&lt;br /&gt;
&lt;br /&gt;
Идея зеркального спуска появилась раньше, в 1970-1980 годах, благодаря работам Аркадия Немировского и Давида Юдина.&lt;br /&gt;
&lt;br /&gt;
Позже произошло их объединение в общую ускоренную версию, например, в работе Кричена, Байена и Бартлетта.&lt;br /&gt;
&lt;br /&gt;
Изначально данный метод использовался для безусловной минимизации гладких выпуклых функций, давая скорость сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;, что лучше, чем &amp;lt;math&amp;gt;O(\frac{1}{k})&amp;lt;/math&amp;gt; у обычного градиентного спуска. Но с развитием вычислительных методов его применение расширилось на ограниченные выпуклые множества, такие как симплекс в задачах обучения с поддержкой векторов или положительно определенные матрицы в спектральной кластеризации.&lt;br /&gt;
В настоящее время ускоренный зеркальный спуск применяется в машинном обучении, включая стохастическую оптимизацию и распределенные системы. Для разреженных данных добавляют проксимальные операторы, а в итерационных методах - неполные версии с фильтрацией градиентов.&lt;br /&gt;
Алгоритм реализует итерации с инерцией и зеркальной проекцией из дискретизации ОДУ. Он популярен благодаря адаптации и ускорению.&lt;br /&gt;
&lt;br /&gt;
==== Адаптация к геометрия ====&lt;br /&gt;
Зеркальный спуск позволяет использовать неевклидовы нормы, что экономит вычисления по сравнению с проекциями в евклидовом пространстве.&lt;br /&gt;
&lt;br /&gt;
==== Ускорение сходимости ====&lt;br /&gt;
Встроенная инерция обеспечивает квадратичную скорость &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Это достигается за счет комбинации градиентного и зеркального шагов.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: Пусть дано выпуклое замкнутое множество &amp;lt;math&amp;gt;X ⊆ R^n&amp;lt;/math&amp;gt;, гладкая выпуклая функция &amp;lt;math&amp;gt;f : X → R&amp;lt;/math&amp;gt; с L-липшицевым градиентом ∇f относительно нормы ∥·∥, и сильно выпуклая зеркальная функция &amp;lt;math&amp;gt;ψ : X → R&amp;lt;/math&amp;gt; с параметром l &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
Расхождение Брегмана для ψ определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;D_ψ(z, y) = ψ(z) − ψ(y) − ⟨∇ψ(y), z − y⟩.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Задача оптимизации формулируется следующим образом:&lt;br /&gt;
&amp;lt;math&amp;gt;min f(x), где f^∗ = min f(x).&amp;lt;/math&amp;gt;&lt;br /&gt;
                   x∈X                x∈X&lt;br /&gt;
&lt;br /&gt;
Дискретная версия ускоренного зеркального спуска с постоянным шагом s ≤ 1/L включает следующие итерации:&lt;br /&gt;
&lt;br /&gt;
* На k-й итерации вычисляем параметры и основную точку:&lt;br /&gt;
 α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2)/2*L&lt;br /&gt;
 τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2/(k+2)&lt;br /&gt;
 x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 − τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
* Сделать градиентный шаг:&lt;br /&gt;
  y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = arg min {L/2* ||y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;||^2 + ⟨∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), y − x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
            y∈X&lt;br /&gt;
&lt;br /&gt;
* Сделать зеркальный шаг:&lt;br /&gt;
 Пусть V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) = D&amp;lt;sub&amp;gt;ψ&amp;lt;/sub&amp;gt;(z, x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;).&lt;br /&gt;
 z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = arg min {V&amp;lt;sub&amp;gt;xk&amp;lt;/sub&amp;gt;(z) + ⟨α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;), z − z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;⟩}&lt;br /&gt;
         z∈X&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма сосредоточено в процедуре адаптивного подбора шага и последующего обновления переменных. Здесь ключевую роль играет внутренний цикл backtracking, который выполняется на каждой итерации для оценки локальной константы Липшица &#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;&#039;&#039;&#039;Курсивное начертание&#039;&#039;. Ядро состоит из:&lt;br /&gt;
&lt;br /&gt;
# Значение функции и градиента: Многократное вычисление значения функции &#039;&#039;&#039;&#039;&#039;f(y)&#039;&#039;&#039;&#039;&#039; и однократное вычисление градиента &#039;&#039;&#039;&#039;&#039;∇f(x)&#039;&#039;&#039;&#039;&#039; на итерацию. Это наиболее ресурсоемкая часть.&lt;br /&gt;
# Проверка условия Армихо: Проверка неравенства вида:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
                  f(y_{k+1}) &amp;lt;= f(x_{k+1}) - \frac{1}{2L} * ||f(x_{k+1})||^2,&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
гарантирующего достаточное убывание функции.&lt;br /&gt;
# Зеркальный и градиентный шаги: Вычисление проекций для обновления последовательностей &#039;&#039;&#039;&#039;&#039;y&#039;&#039;&#039;&#039;&#039; и &#039;&#039;&#039;&#039;&#039;z&#039;&#039;&#039;&#039;&#039; с параметром &#039;&#039;&#039;&#039;&#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм сохраняет общую итерационную структуру, но каждая итерация является двухуровневой:&lt;br /&gt;
&lt;br /&gt;
# Внешний уровень: Управляет обновлением параметров инерции (&amp;lt;math&amp;gt;\alpha_k, \tau_k&amp;lt;/math&amp;gt;) и переходом к следующему шагу оптимизации.&lt;br /&gt;
# Внутренний уровень: Процедура поиска шага. Здесь происходит циклический подбор параметра L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;. Внутри этого цикла выполняются операции:&lt;br /&gt;
#* Вычисление кандидата на новую переменную y.&lt;br /&gt;
#* Вычисление значения f(y) и проверка условия Армихо.&lt;br /&gt;
#* Увеличение L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; в случае неудачи. В случае успешной проверки условия - принимается кандидат на новую переменную y.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Ниже приведен псевдокод, реализующий ускоренный зеркальный градиентный спуск с адаптивным поиском константы Липшица.&lt;br /&gt;
&lt;br /&gt;
  x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;, z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
  for k in 0...max_iterations {&lt;br /&gt;
      α&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = (k+2) / 2L&lt;br /&gt;
      τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = 2 / (k+2)&lt;br /&gt;
      x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; + (1 - τ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;)y&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
      while (True) {&lt;br /&gt;
          y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt; = x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
          if f(y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;) &amp;lt;= f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) - 1/2L * ||∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)||&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:&lt;br /&gt;
              break&lt;br /&gt;
          L *= η&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = y&amp;lt;sub&amp;gt;cand&amp;lt;/sub&amp;gt;&lt;br /&gt;
      z&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt; = z&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; - α * ∇f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
      if f(y&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) &amp;lt;= ε:&lt;br /&gt;
          break&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Сложность одной итерации алгоритма складывается из:&lt;br /&gt;
&lt;br /&gt;
* Сложность вычисления градиента T&amp;lt;sub&amp;gt;∇f(x)&amp;lt;/sub&amp;gt;;&lt;br /&gt;
* Сложность векторных операций, равная O(n);&lt;br /&gt;
Пусть N&amp;lt;sub&amp;gt;back&amp;lt;/sub&amp;gt; - среднее число вызовов f(x&amp;lt;sub&amp;gt;k+1&amp;lt;/sub&amp;gt;) внутри backtracking (N&amp;lt;sub&amp;gt;call&amp;lt;/sub&amp;gt; ≈ 2). Тогда общая сложность на одной итерации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{iter} = T_{\nabla f(x)} + N_{back} * T_f + O(n).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Общая сложность для достижения точности внешним циклом будет порядка &amp;lt;math&amp;gt;O(\frac{1}{\sqrt{\varepsilon}})&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Тогда общей сложностью всего алгоритма будет:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
         N_{call} ≈ O(1)\\&lt;br /&gt;
         T_{\nabla f(x)} ≈ O(n^2)\\&lt;br /&gt;
         T_f ≈ O(n)\\&lt;br /&gt;
         T_{nest} = O(\frac{1}{\sqrt{ε}} * (T_{\nabla f(x)} + N_{call} * T_f + O(n))) ≈ O(\frac{1}{ε} * n^2)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Информационный граф для зеркального метода Нестерова.png|Информационный граф для зеркального метода Нестерова.png]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф зеркального метода Нестерова описывает структуру зависимостей между операциями внутри одной итерации алгоритма. Данный граф является динамическим, т.е. последовательную конкатенацию базового подграфа, т.к. заранее неизвестно количество итераций алгоритма.&lt;br /&gt;
&lt;br /&gt;
Подграф имеет слоисто-ярусную структуру и состоит из следующих уровней:&lt;br /&gt;
# &#039;&#039;&#039;Уровень входа&#039;&#039;&#039; - входные данные: y и z с предыдущей итерации;&lt;br /&gt;
# &#039;&#039;&#039;Уровень экстраполяции&#039;&#039;&#039; - вычисление точки x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;;&lt;br /&gt;
# &#039;&#039;&#039;Уровень вычислений&#039;&#039;&#039; - вычисление градиента ∇f(x) и f(x);&lt;br /&gt;
# &#039;&#039;&#039;Уровень ветвления&#039;&#039;&#039; - вычисление новой точки y вместе с backtracking для L и новой точки z;&lt;br /&gt;
# &#039;&#039;&#039;Уровень проверки выхода&#039;&#039;&#039; - проверяется, достигли ли мы нужной точности. Если не достигли, то переходим к новой итерации, и выходим, если достигли;&lt;br /&gt;
# &#039;&#039;&#039;Уровень выхода&#039;&#039;&#039; - завершение алгоритма;&lt;br /&gt;
&lt;br /&gt;
Таким образом, информационный граф алгоритма - это последовательная цепь таких подграфов, длина которой заранее неизвестна и зависит от целевой функции.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Параллелизм алгоритма имеет двухуровневую структуру, связанную с циклическим профилем последовательной реализации.&lt;br /&gt;
* &#039;&#039;&#039;Внешний уровень: Последовательные зависимости&#039;&#039;&#039;&lt;br /&gt;
  На верхнем уровне алгоритм является строго последовательным. Итерации &#039;&#039;k&#039;&#039; зависимы по данным, т.к. начальное приближение шага определяется результатом предыдущего шага. Данный ярус не имеет параллельного ресурса.&lt;br /&gt;
  Внутри каждого шага последовательный подбор константы &#039;&#039;L&#039;&#039; также зависим от предыдущего результата проверки.&lt;br /&gt;
* &#039;&#039;&#039;Внутренний уровень: Конечный и массовый параллелизм&#039;&#039;&#039;&lt;br /&gt;
  Внутри одной итерации раскрывается основной ресурс параллелизма:&lt;br /&gt;
  *# &#039;&#039;&#039;Конечный параллелизм ветвей&#039;&#039;&#039;: после вычисления градиента обновление последовательностей &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039; &#039;&#039;&#039;потенциально&#039;&#039;&#039; информационно независимы.&lt;br /&gt;
  *# &#039;&#039;&#039;Массовый координатный параллелизм&#039;&#039;&#039;: все покомпонентные операции (сложение, вычитание, умножение на скаляр) векторов размерности n независимы. Обработка компонент при вычислении градиента ∇f(x) для многих задач также выполняется независимо.&lt;br /&gt;
&lt;br /&gt;
Высота одного шага: &amp;lt;math&amp;gt;T_{step} ≈ O(\log{n})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; - сложность выполнения редукции.&lt;br /&gt;
&lt;br /&gt;
Среднее число попыток backtracking ≈ O(1).&lt;br /&gt;
&lt;br /&gt;
Для успешного завершения алгоритма с заданной точностью &amp;lt;math&amp;gt;ε ≈ O(\frac{1}{\sqrt{ε}})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда общая сложность выполнения параллельной программы определяется как:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
T_{nest} = O(\frac{1}{\sqrt{ε}}*\log{n}).&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: начальное точка-вектор &amp;lt;math&amp;gt;x&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&amp;lt;/math&amp;gt;, начальные параметры &amp;lt;math&amp;gt;\alpha_0&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\beta_0&amp;lt;/math&amp;gt;, точность вычислений &#039;&#039;ε&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &#039;&#039;n + 3&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: найденная точка-вектор оптиума заданной функции.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Вычислительная мощность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм обладает высокой вычислительной мощностью в том случае, если вычисление значения функции и градиента является трудоемкой. Для простых задач  объем пересылаемых данных сопоставим с числом арифметических операций.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Детерминированность&#039;&#039;&#039;&lt;br /&gt;
Алгоритм является детерминированным. При фиксации начального приближения и параметров результат работы алгоритма однозначно определён.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Сбалансированность вычислений&#039;&#039;&#039;&lt;br /&gt;
Алгоритм неравномерно сбалансирован. Векторных операции и вычисления градиента сбалансированы. Этапы проверки условий и backtracking являются последовательными и слабо загруженными.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Устойчивость&#039;&#039;&#039;&lt;br /&gt;
Метод обладает свойством самокоррекции ошибок за счет зеркального спуска и адаптивного подбора шага.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Динамичность&#039;&#039;&#039;&lt;br /&gt;
Число backtracking итераций зависит от свойств целевой функции и текущей точки, что делает время выполнения одной итерации заранее неизвестным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Стандартная последовательная реализация метода ускоренного зеркального спуска строится как итерационный процесс, на каждом шаге которого решается задача минимизации линейной модели функции. Основу реализации составляет цикл по итерациям, внутри которого выполняются 3 блока операций:&lt;br /&gt;
# &#039;&#039;&#039;Экстраполяция&#039;&#039;&#039;: вычисление точки &amp;lt;math&amp;gt;x_{k+1}&amp;lt;/math&amp;gt; как линейной комбинации точек &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;;&lt;br /&gt;
# &#039;&#039;&#039;Backtracking&#039;&#039;&#039;: вычисление градиента, значения функции и проверку условия Армихо;&lt;br /&gt;
# &#039;&#039;&#039;Обновление переменных&#039;&#039;&#039;: обновляются шаги &#039;&#039;y&#039;&#039; и &#039;&#039;z&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Основной выбор реализации касается работы с памятью. Вместо динамического выделения буферов внутри цикла нужно предварительно аллоцировать все рабочие векторы при инициализации. Для задач высокой размерности эффективность повышается за счет слияния циклов.&lt;br /&gt;
&lt;br /&gt;
Ресурс параллелизма позволяет применять ассоциативность векторных операций (разбивать длинные циклы на независимые блоки).&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации ===&lt;br /&gt;
&lt;br /&gt;
Анализ информационного графа и иерархической структуры зависимостей показывает, что алгоритм допускает эффективное распараллеливание на основе декомпозиции данных (Data Parallelism). Специфика алгоритма не позволяет эффективно использовать конвейерный параллелизм.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Межпроцессорный параллелизм&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Векторы-точки (&#039;&#039;x, y, z&#039;&#039;) и градиент разбиваются на непрерывные блоки, которые распределяются между MPI-процессами. Каждый процесс отвечает за обновление своей части вектора.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Распределение данных&#039;&#039;&#039;: используется блочное разбиение. Размер блока определяется как &amp;lt;math&amp;gt;N / P&amp;lt;/math&amp;gt; (с учетом остатка).&lt;br /&gt;
* &#039;&#039;&#039;Минимизация обменов&#039;&#039;&#039;: векторные операции, вычисление значения функции и вычисление градиента выполняются локально. Обмен данными осуществляется только для операций редукции (скалярное произведение и норма) через &#039;&#039;&#039;MPI_Allreduce&#039;&#039;&#039;, и, если требуются соседние значения для других операций, то обмен ими (Halo Exchange).&lt;br /&gt;
&lt;br /&gt;
Главным узким местом является глобальная синхронизация в backtracking. Каждая проверка на условие Армихо требует синхронизации всех процессов для вычисления значения &#039;&#039;f(y)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Результаты прогонов ===&lt;br /&gt;
&lt;br /&gt;
Прогоны программы производились на СК Ломоносов-2.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма на p процессах&lt;br /&gt;
|-&lt;br /&gt;
! P (кол-во ядер) !! T (время, с)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 13.914765&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 7.891406&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 4.026877&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 3.038892&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 2.518778&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 2.188900&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.991381&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 1.067469&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
Для данного алгоритма ключевым фактором производительности является пропускная способность памяти и латентность сети. Для этого больше всего подходят:&lt;br /&gt;
* &#039;&#039;&#039;Кластерные системы (MMID)&#039;&#039;&#039; - хорошая масштабируется при условии большой локальной памяти.&lt;br /&gt;
* &#039;&#039;&#039;Графические ускорители (SIMT/GPU)&#039;&#039;&#039; - идеально подходит для массово-параллельных векторных операций.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Нестеров, Ю.Е. (1983). Метод решения задачи выпуклого программирования с темпом сходимости &amp;lt;math&amp;gt;O(\frac{1}{k^2})&amp;lt;/math&amp;gt;. Доклады Академии наук СССР, 27(2), 372–376.&lt;br /&gt;
* Немировский А. С., Юдин Д. Б. &amp;quot;Сложность задач и эффективность методов оптимизации.&amp;quot;— М.: Наука, 1979&lt;br /&gt;
* Krichene, W., Bayen, A., Bartlett, P. (2015). Accelerated Mirror Descent in Continuous and Discrete Time. NeurIPS.&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D0%9D%D0%B5%D1%81%D1%82%D0%B5%D1%80%D0%BE%D0%B2%D0%B0.png&amp;diff=30322</id>
		<title>Файл:Информационный граф для зеркального метода Нестерова.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0_%D0%9D%D0%B5%D1%81%D1%82%D0%B5%D1%80%D0%BE%D0%B2%D0%B0.png&amp;diff=30322"/>
		<updated>2025-12-09T15:50:59Z</updated>

		<summary type="html">&lt;p&gt;Брыскина Кристина: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф для зеркального метода Нестерова&lt;/div&gt;</summary>
		<author><name>Брыскина Кристина</name></author>
	</entry>
</feed>