<?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/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3A%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%2F%2F%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</id>
	<title>Участник:Брыскина Кристина//Зеркальный алгоритм Нестерова - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3A%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%2F%2F%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"/>
	<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;action=history"/>
	<updated>2026-10-22T16:50:56Z</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//%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&amp;oldid=prev</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&amp;oldid=prev"/>
		<updated>2025-12-10T16:40:40Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «Автор: &lt;a href=&quot;/w/ru/index.php?title=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&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Https://algowiki-project.org/ru/Участник:Брыскина Кристина (страница не существует)&quot;&gt;Брыскина Кристина&lt;/a&gt;  == Свойства и структура алгоритма == === Общее описание алгоритма === Алгоритм Нестерова с зеркальным шагом, известный как ускорен...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&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, который выполняется на каждой итерации для оценки локальной константы Липшица &amp;#039;&amp;#039;&amp;#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Курсивное начертание&amp;#039;&amp;#039;. Ядро состоит из:&lt;br /&gt;
&lt;br /&gt;
# Значение функции и градиента: Многократное вычисление значения функции &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;f(y)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; и однократное вычисление градиента &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;∇f(x)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#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;
# Зеркальный и градиентный шаги: Вычисление проекций для обновления последовательностей &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;y&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;z&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; с параметром &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;L&amp;lt;sub&amp;gt;k&amp;lt;/sup&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#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;
# &amp;#039;&amp;#039;&amp;#039;Уровень входа&amp;#039;&amp;#039;&amp;#039; - входные данные: y и z с предыдущей итерации;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Уровень экстраполяции&amp;#039;&amp;#039;&amp;#039; - вычисление точки x&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Уровень вычислений&amp;#039;&amp;#039;&amp;#039; - вычисление градиента ∇f(x) и f(x);&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Уровень ветвления&amp;#039;&amp;#039;&amp;#039; - вычисление новой точки y вместе с backtracking для L и новой точки z;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Уровень проверки выхода&amp;#039;&amp;#039;&amp;#039; - проверяется, достигли ли мы нужной точности. Если не достигли, то переходим к новой итерации, и выходим, если достигли;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Уровень выхода&amp;#039;&amp;#039;&amp;#039; - завершение алгоритма;&lt;br /&gt;
&lt;br /&gt;
Таким образом, информационный граф алгоритма - это последовательная цепь таких подграфов, длина которой заранее неизвестна и зависит от целевой функции.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Параллелизм алгоритма имеет двухуровневую структуру, связанную с циклическим профилем последовательной реализации.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Внешний уровень: Последовательные зависимости&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
  На верхнем уровне алгоритм является строго последовательным. Итерации &amp;#039;&amp;#039;k&amp;#039;&amp;#039; зависимы по данным, т.к. начальное приближение шага определяется результатом предыдущего шага. Данный ярус не имеет параллельного ресурса.&lt;br /&gt;
  Внутри каждого шага последовательный подбор константы &amp;#039;&amp;#039;L&amp;#039;&amp;#039; также зависим от предыдущего результата проверки.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Внутренний уровень: Конечный и массовый параллелизм&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
  Внутри одной итерации раскрывается основной ресурс параллелизма:&lt;br /&gt;
  *# &amp;#039;&amp;#039;&amp;#039;Конечный параллелизм ветвей&amp;#039;&amp;#039;&amp;#039;: после вычисления градиента обновление последовательностей &amp;#039;&amp;#039;y&amp;#039;&amp;#039; и &amp;#039;&amp;#039;z&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;потенциально&amp;#039;&amp;#039;&amp;#039; информационно независимы.&lt;br /&gt;
  *# &amp;#039;&amp;#039;&amp;#039;Массовый координатный параллелизм&amp;#039;&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Входные данные&amp;#039;&amp;#039;&amp;#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;, точность вычислений &amp;#039;&amp;#039;ε&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Объём входных данных&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;n + 3&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Выходные данные&amp;#039;&amp;#039;&amp;#039;: найденная точка-вектор оптиума заданной функции.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Объём выходных данных&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;n&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Вычислительная мощность&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Алгоритм обладает высокой вычислительной мощностью в том случае, если вычисление значения функции и градиента является трудоемкой. Для простых задач  объем пересылаемых данных сопоставим с числом арифметических операций.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Детерминированность&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Алгоритм является детерминированным. При фиксации начального приближения и параметров результат работы алгоритма однозначно определён.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Сбалансированность вычислений&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Алгоритм неравномерно сбалансирован. Векторных операции и вычисления градиента сбалансированы. Этапы проверки условий и backtracking являются последовательными и слабо загруженными.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Устойчивость&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Метод обладает свойством самокоррекции ошибок за счет зеркального спуска и адаптивного подбора шага.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Динамичность&amp;#039;&amp;#039;&amp;#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;
# &amp;#039;&amp;#039;&amp;#039;Экстраполяция&amp;#039;&amp;#039;&amp;#039;: вычисление точки &amp;lt;math&amp;gt;x_{k+1}&amp;lt;/math&amp;gt; как линейной комбинации точек &amp;#039;&amp;#039;y&amp;#039;&amp;#039; и &amp;#039;&amp;#039;z&amp;#039;&amp;#039;;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Backtracking&amp;#039;&amp;#039;&amp;#039;: вычисление градиента, значения функции и проверку условия Армихо;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Обновление переменных&amp;#039;&amp;#039;&amp;#039;: обновляются шаги &amp;#039;&amp;#039;y&amp;#039;&amp;#039; и &amp;#039;&amp;#039;z&amp;#039;&amp;#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;
&amp;#039;&amp;#039;&amp;#039;Межпроцессорный параллелизм&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Векторы-точки (&amp;#039;&amp;#039;x, y, z&amp;#039;&amp;#039;) и градиент разбиваются на непрерывные блоки, которые распределяются между MPI-процессами. Каждый процесс отвечает за обновление своей части вектора.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Распределение данных&amp;#039;&amp;#039;&amp;#039;: используется блочное разбиение. Размер блока определяется как &amp;lt;math&amp;gt;N / P&amp;lt;/math&amp;gt; (с учетом остатка).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Минимизация обменов&amp;#039;&amp;#039;&amp;#039;: векторные операции, вычисление значения функции и вычисление градиента выполняются локально. Обмен данными осуществляется только для операций редукции (скалярное произведение и норма) через &amp;#039;&amp;#039;&amp;#039;MPI_Allreduce&amp;#039;&amp;#039;&amp;#039;, и, если требуются соседние значения для других операций, то обмен ими (Halo Exchange).&lt;br /&gt;
&lt;br /&gt;
Главным узким местом является глобальная синхронизация в backtracking. Каждая проверка на условие Армихо требует синхронизации всех процессов для вычисления значения &amp;#039;&amp;#039;f(y)&amp;#039;&amp;#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;
* &amp;#039;&amp;#039;&amp;#039;Кластерные системы (MMID)&amp;#039;&amp;#039;&amp;#039; - хорошая масштабируется при условии большой локальной памяти.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Графические ускорители (SIMT/GPU)&amp;#039;&amp;#039;&amp;#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>
</feed>