Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
непрмо_подготовка к экзую.docx
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
6.31 Mб
Скачать

17. Запрограммировать метод наискорейшего спуска. Показать его работу на функциях.

def sdsearch(f, df, x0, tol):

kmax = 1000

x = x0.copy()

coords = [x.copy()]

neval = 0

interval = [0, 1]

deltaX = np.ones_like(x) * 1e6

k = 0

while (norm(deltaX) >= tol) and (k < kmax):

g = df(x)

neval += 1

f1dim = lambda a: f(x - a * g)

alpha = goldensectionsearch(f1dim, interval, tol)

x_new = x - alpha * g

coords.append(x_new.copy())

deltaX = x_new - x

x = x_new.copy()

k += 1

xmin = x

fmin = f(xmin)

neval += 1

answer_ = [xmin, fmin, neval, coords]

return answer_

Проблемы метода наискорейшего спуска:

1. Градиент не обязательно направлен в сторону минимума.

2. Метод легко «промахивается» мимо минимума, что приводит к избыточному числу итераций.

1. Можно ли улучшить метод наискорейшего спуска, чтобы он быстро справился с функцией Розенброка?

Да, можно улучшить. Функция Розенброка создает особые трудности из-за своей формы.

Почему функция Розенброка сложная:

Функция Розенброка: f(x,y) = (1-x)² + 100(y-x²)²

  • Она имеет длинный изогнутый "овраг" вдоль линии y = x²

  • На дне оврага функция меняется медленно, но стенки оврага очень крутые

  • Градиентный спуск движется зигзагами по дну оврага очень медленно

Адаптивный шаг (Line Search):

Вместо фиксированного шага α, можно использовать адаптивный подход, например, поиск шага с использованием методов золотого сечения или других методов оптимизации. Это позволяет находить оптимальный шаг для каждой итерации, что может значительно ускорить сходимость.

2. От чего зависит величина шага метода наискорейшего спуска внутри оврага? Обоснуйте ответ численным экспериментом и/или математическим доказательством. Величина шага в методе наискорейшего спуска внутри оврага зависит от формы функции и характеристик градиента на данной области. Конкретно:

Если овраг очень вытянут (как в функции Розенброк, где вдоль одной оси «долина» очень узкая), то градиент будет направлен почти вдоль этой оси, и шаг по нормали к этому направлению будет очень маленьким. Это значит, что метод будет двигаться медленно вдоль долины, пока не достигнет минимума. На плоских участках (где градиент близок к нулю), шаг будет очень мал, что может затруднить сходимость.

Математическое объяснение

В случае вытянутых функций (с оврагами) градиент будет направлен преимущественно вдоль «долины», что делает шаг маленьким вдоль направлений, где функция меняется медленно, и большим в направлении, где она меняется резко. Однако если шаг слишком велик, метод может "перепрыгнуть" через минимум, если шаг мал, сходимость будет медленной.

Формула шага на каждой итерации:

xk+1=xk−α∇f(xk)

Где величина шага α зависит от градиента функции ∇f(xk). Вдоль долины с маленьким градиентом величина шага будет маленькой, что замедлит сходимость, а вдоль «крутого» направления, где градиент больше, шаг будет более заметным.

Размер шага зависит от:

  1. Крутизны склона - чем круче, тем опаснее большой шаг

  2. Изогнутости оврага - чем сильнее изгиб, тем больше поворотов

  3. Соотношения между разными направлениями - в овраге одно направление гораздо круче другого

Оптимальный шаг можно оценить как: α ≈ (сила градиента) / (кривизна поверхности)

В овраге кривизна очень большая поперек оврага, поэтому шаг получается маленьким.

вопросы с пар

1. Что будет, если заменить метод золотого сечения на метод Ньютона? Если вместо метода золотого сечения использовать метод Ньютона для поиска оптимального шага (αₖ), то сходимость метода наискорейшего спуска может стать быстрее, особенно вблизи минимума. Метод Ньютона использует информацию о второй производной (или гессиане), поэтому он адаптивно подбирает шаг, учитывая кривизну функции. Однако при этом метод становится более чувствительным к форме функции — если гессиан плохо обусловлен или близок к вырожденному, шаг может оказаться слишком большим или слишком маленьким, что приведёт к «скачкам» или замедлению. Кроме того, вычисление второй производной увеличивает вычислительные затраты.

зс: 10 шагов

1 шаг зс: (20 итераций) -> минимум на напр

нью: 10 шагов

1 шаг ньютона (15 итераций) -> минимум на направлении

В одномерном поиске: Метод Ньютона для одномерной оптимизации использует вторую производную:

αₖ₊₁ = αₖ - f'(α)/f''(α)

Преимущества:

  • Квадратичная сходимость (очень быстрая)

  • Меньше вычислений функции

Проблемы:

  • Нужна вторая производная f''(α)

  • Может расходиться если f''(α) близка к 0

  • Более сложная реализация

В нашем случае: Мы минимизируем f(xₖ - α∇f(xₖ)) по α, поэтому нужно вычислять производные этой сложной функции.

2. Что произойдет с траекторией метода? При использовании метода Ньютона шаги становятся направленными не строго против градиента, а с учетом геометрии поверхности функции. Поэтому траектория будет более “изогнутой” и может огибать овраг, а не двигаться зигзагами поперек него, как это делает метод наискорейшего спуска с фиксированным или одномерным поиском. Это делает траекторию более гладкой и прямой по направлению к минимуму, но также может привести к отклонениям, если гессиан рассчитан неточно.

Для функции Розенброка:

  • Траектория зигзагообразная

  • Движение перпендикулярно линиям уровня

  • Много поворотов в овраге

  • Медленное продвижение к минимуму

Для функции Химмельблау:

  • Более прямая траектория к ближайшему минимуму

  • Меньше осцилляций

  • Быстрее сходимость

3. Какая особенность овражных задач? Овражные функции (например, функция Розенброка) характеризуются вытянутыми, узкими областями минимума — «оврагами». В таких областях направление наискорейшего спуска постоянно колеблется между стенками оврага: шаг вдоль градиента направлен поперёк, а не вдоль оврага. Из-за этого метод делает мелкие шаги, сильно замедляется и теряет эффективность.

Овражные функции имеют:

  • Сильно вытянутые линии уровня

  • Разную крутизну в разных направлениях

  • "Долины" с очень пологим дном и крутыми склонами

Математически: Собственные числа гессиана сильно различаются

  • Для Розенброка: λ₁ ≈ 2, λ₂ ≈ 200 (отношение 1:100)

  • Чем больше отношение, тем "овражнее" функция

4. Насколько проблемны овражные задачи для других методов? Для простых методов (градиентного спуска, наискорейшего спуска) овражные задачи очень трудны: им требуется много итераций, и они часто застревают в узких долинах. Методы второго порядка (Ньютона, квазиньютоновские) справляются значительно лучше, так как учитывают кривизну функции. Методы с адаптивным шагом (например, BFGS, L-BFGS, Adam) также решают проблему оврагов быстрее, поскольку корректируют направление спуска в зависимости от накопленной информации о градиентах.

Почему возникают:

  • Физические системы с разными масштабами времени

  • Задачи с жесткими ограничениями

  • Функции с сильно коррелированными переменными

Как распознать:

  • Градиенты быстро меняют направление

  • Значения функции почти не меняются, но позиция сильно колеблется

  • Отношение собственных чисел гессиана >> 1

Методы борьбы:

  1. Предобуславливание - масштабирование переменных

  2. Методы второго порядка - учет кривизны

  3. Методы сопряженных градиентов - ортогонализация направлений

  4. Адаптивные шаги - автоматический подбор параметров

вопросы с пар2

⭐ 1. Сравнение с градиентным: насколько “наискорейший” быстрее?

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

xk+1= xk − λk ∇f(xk)

где λk выбирается оптимально (минимизирует функцию по прямой).

Поэтому:

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

  • но направления меняются медленно, что создаёт зигзаги в овражных задачах.

По итерациям он почти всегда медленнее, чем кажется по названию.

Ответ: Ключевое отличие — в выборе шага α.

  • Градиентный спуск (с постоянным шагом): α = const. Мы выбираем шаг заранее и надеемся, что он подойдет.

  • Наискорейший спуск (Gradient Descent with Exact Line Search): На каждой итерации мы решаем одномерную задачу оптимизации: α_k = argmin_α f(x_k - α * ∇f(x_k)). То есть мы ищем наилучший возможный шаг вдоль направления антиградиента.

Какой быстрее?

  • На неовражных (хорошо обусловленных) задачах: Наискорейший спуск почти всегда сходится за меньшее число итераций. Каждый его шаг оптимален для текущего направления.

  • На овражных задачах: Здесь начинаются нюансы.

    • Наискорейший спуск на овражных функциях демонстрирует известный недостаток: он часто генерирует последующие направления поиска, которые почти ортогональны предыдущему. Это приводит к "зигзагообразному" движению по дну оврага и медленной сходимости (см. вопрос 9).

    • Градиентный спуск с постоянным, но хорошо подобранным шагом на овражных функциях иногда может вести себя стабильнее, хотя тоже будет делать зигзаги.

Вывод: "Наискорейший" — это не про общую скорость сходимости к ответу, а про то, что на каждом конкретном шаге мы делаем самый лучший шаг в выбранном нами направлении (антиградиента). В целом, он эффективнее градиентного с постоянным шагом.

⭐ 2. Какой метод быстрее: градиентный или наискорейший?

Ответ зависит от формы функции:

✔ Неовражная (выпуклая, примерно изотропная) задача

Наискорейший спуск выигрывает: он не требует маленького шага и сам подбирает оптимальный λ.

✔ Овражная (узкая долина, сильно различающиеся собственные числа Гессиана)

Наискорейший спуск:

  • делает зигзаги,

  • направления почти ортогональны между шагами,

  • сходимость медленная.

В овражных задачах обычный градиентный с нормально подобранным шагом быстрее.

⭐ 3. Функция Химмельблау — овражная или нет? Какой метод быстрее?

Функция Химмельблау НЕ выпуклая, содержит несколько минимумов → это не овражная задача.

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

⭐ 4. Про λ-функцию и f1dim: что это за способ задания функции?

Когда пишут:

f1dim = lambda lam: f(xk - lam * gk)

Это:

✔ Лямбда-функция = анонимная функция

Без имени, создаётся на месте.

Она передаётся в одномерный оптимизатор (golden search / brent / fibonacci).

Такой приём называется:

👉 “Функция первого аргумента” или “функция одной переменной по прямой”

Одномерная редукция исходной задачи.

Ответ:

  • f1dim и лямбда-функция: В реализации наискорейшего спуска нам нужно минимизировать функцию φ(α) = f(x_k + α * p_k). Это функция одной переменной (α). Часто эту функцию передают в одномерный оптимизатор (вроде золотого сечения) в виде анонимной функции (лямбда-функции).

f1dim — это, по сути, "обертка", которая фиксирует точку x_k и направление p_k и создает из многомерной f одномерную функцию φ(α).

Лямбда-функция — это безымянная функция, заданная "на месте". Например, в коде это может выглядеть так: lambda alpha: f(xk + alpha * pk).

  • В контексте f1dim мы создаем анонимную функцию от α, которая "запоминает" текущие x_k и p_k и вызывает основную многомерную функцию f. Это удобно для передачи в процедуру одномерной оптимизации.

⭐ 5. Обязательно ли использовать золотое сечение? Чем заменить?

Нет, не обязательно. Золотое сечение — просто одномерный метод поиска минимума без производных.

Его можно заменить на:

  • Метод деления пополам

  • Метод Фибоначчи

  • Одномерный метод Ньютона (если есть производная)

Золотое сечение просто простое и надёжное.

  • Golden Section Search (поиск золотого сечения): Это метод одномерной оптимизации для нахождения минимума унимодальной функции на отрезке. Он используется внутри наискорейшего спуска для точного нахождения α_k.

⭐ 6. Лямбда-функция это что? А как называется сама функция?

  • Лямбда-функция = анонимная функция.

  • Она описывает отображение λ↦f(xk−λgk)

  • Это не ссылка, это создание функции на месте.

⭐ 7. “Генерирует ортогональное направление” — баг или фича?

Это фича метода наискорейшего спуска, не баг.

Доказанный факт:

⟨gk+1,gk⟩=0

То есть градиенты на последовательных шагах ортогональны.

Это происходит потому, что мы оптимизируем по линейному направлению, и минимум вдоль прямой делает следующий градиент перпендикулярным предыдущему.

Но именно это свойство и вызывает зигзаги, поэтому метод часто медленный.

Это ФИЧА (точнее, фундаментальное математическое свойство), которая в данном контексте становится БАГОМ.

  • С чем связано: При использовании точного одномерного поиска в методе наискорейшего спуска, градиент в следующей точке ∇f(x_{k+1}) оказывается ортогонален направлению предыдущего шага p_k (который был -∇f(x_k)). То есть (∇f(x_{k+1}), p_k) = 0.

  • Почему это проблема (баг): На овражных функциях это приводит к тому, что направления p_k и p_{k+1} становятся почти ортогональными. Вместо того чтобы двигаться прямо вдоль дна оврага, алгоритм постоянно "ныряет" в его стенку, что вызывает знаменитый "зигзагообразный" путь и резко замедляет сходимость.

⭐ 8. Про "коп" и перенос переменной наверх.

Вопрос: “что будет, если перенести вычисление коп наверх, и взять готовую точку, которая сразу является минимумом? Будет ли ошибка?”

Если:

xmin = x # но минимум уже равен x

while True:

...

То есть начальная точка уже минимум.

✔ Ошибки не будет.

Просто:

  • градиент будет нулевой,

  • f1dim даст нулевое смещение,

  • xmin не изменится.

Метод закончит работу по критерию “градиент маленький”.

Ответ: Это вопрос про структуру кода.

  • Плохая структура: while True: ... if (КОП): break. Бесконечный цикл с прерыванием внутри.

  • Хорошая структура: while not (КОП): .... Условие продолжения работы цикла проверяется в его заголовке.

  • Что будет, если начать с точки минимума:

    • В "хорошей" структуре условие not (КОП) будет ложным (т.к. градиент почти нулевой), и цикл не выполнится ни разу. Переменная x_min так и останется неинициализированной внутри цикла, что вызовет ошибку.

    • В "плохой" структуре цикл выполнится один раз, внутри проверится КОП и произойдет выход, и x_min успеет присвоиться.

Вывод: "Хорошую" структуру нужно дополнять корректной инициализацией. Например, инициализировать x_min = x0 до входа в цикл.

⭐ 9. Что будет, если использовать одномерный метод Ньютона? Можно ли?

Да, можно.

Если у одномерной функции f(λ) есть производная, можно применять:

λk+1=λk−f′(λk)f′′(λk)

Но:

  • он требует производных,

  • чувствителен к старту,

  • может выйти за интервал,

  • может дать отрицательный шаг.

Поэтому в лабораторных чаще рекомендуют golden search как более устойчивый.

Не обязательно. Золотое сечение — надежный и устойчивый метод, но не единственный.

Альтернативы для точного одномерного поиска:

  • Метод дихотомии (похож на золотое сечение, но проще).

  • Метод Фибоначчи (дает наименьшее число вычислений функции для заданной точности).

  • Метод квадратичной или кубической интерполяции (может сходиться быстрее, если функция гладкая).

⭐ 10. Объяснить ортогональность отрезков

В наискорейшем спуске:

gk+1⊥gk

А направление шага всегда сонаправлено с градиентом.

Значит и отрезки движения:

(xk+1−xk)⊥(xk−xk−1)

То есть траектория состоит из почти прямых углов — отсюда «лесенка» и зигзаги в овраге.

Ответ: Как уже было сказано в п.6, это следствие использования точного одномерного поиска.

  • Математически: Мы ищем min φ(α). В точке минимума α_k производная φ'(α_k) = 0.

  • По правилу цепи: φ'(α) = (∇f(x_k + α * p_k), p_k).

  • Подставляем α_k: (∇f(x_{k+1}), p_k) = 0.

  • Так как p_k = -∇f(x_k), получаем, что (∇f(x_{k+1}), ∇f(x_k)) = 0.

Геометрически: Каждое новое направление движения перпендикулярно предыдущему. Это и есть та самая "ортогональность отрезков" на траектории спуска.

⭐ 11. Как искать максимум?

Так же, как и в градиентном:

xk+1=xk+λk∇f(xk​)

ИЛИ решаем:

max⁡f=min⁡(−f)

И используем обычный метод наискорейшего спуска на функции −f.

Ответ: Аналогично градиентному спуску. Чтобы найти максимум методом наискорейшего подъема, нужно:

  1. Менять направление: p_k = +∇f(x_k) (двигаться по градиенту).

  2. На каждой итерации решать задачу одномерной максимизации: α_k = argmax_α f(x_k + α * p_k)

⭐ 12. Сравнение по числу итераций и ЦФ (числу вычислений функции) с градиентным спуском

Общее правило:

✔ Наискорейший спуск:

  • Много вычислений f (каждая итерация требует голден-сёрч → 20–40 вызовов функции)

  • итераций обычно меньше, но каждая итерация дорогая.

✔ Градиентный спуск:

  • много итераций,

  • но каждая — дешёвая (1 f и 1 ∇f).

В итоге:

✔ По числу итераций:

наискорейший почти всегда лучше.

✔ По числу вычислений функции (ЦФ):

градиентный спуск чаще выгоднее.

Поэтому в реальных задачах градиентный предпочтительнее.

Критерий

Градиентный спуск (постоянный шаг)

Наискорейший спуск

Число итераций

Больше

Меньше (каждый шаг оптимален)

Число вычислений ЦФ

Одно на итерацию

Много на итерацию (т.к. внутри каждой итерации вызывается одномерный оптимизатор, который сам много раз считает f)

Скорость сходимости

Линейная

Линейная (но с лучшей константой)

Надежность

Зависит от выбора α

Более надежен, не требует подбора α

Итог: Наискорейший спуск "побеждает" по числу итераций, но часто проигрывает по общему времени счета из-за больших затрат на одномерную оптимизацию.

18. Запрограммировать демпфированный метод Ньютона одномерный. Показать его работу на функциях.