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

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

def grsearch(x0, tol):

kmax = 1000

alpha = 0.01

coords = []

LL = 1.3

x_k = x0.copy()

coords.append(x_k)

x = x_k

g_k = - df(x_k)

neval = 1

x_k = x_k + alpha * g_k

deltaX = x_k - x

k = 1

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

coords.append(x_k)

x = x_k

g_k = - df(x_k)

x_k = x_k + alpha * g_k

alpha = alpha / LL

deltaX = x_k - x

neval += 1

k += 1

xmin = x_k

fmin = f(xmin)

neval += 1

coords.append(x_k)

answer_ = [xmin, fmin, neval, coords]

return answer_

Итого

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

  • Сходимость и эффективность зависят от выбора шага α.

  • Для выпуклых функций он находит глобальный минимум, для невыпуклых — локальный.

  • Использование убывающего шага делает метод стабильнее и точнее, но требует аккуратного выбора формулы затухания.

  • Градиент показывает направление роста, антиградиент — спуска, а норма градиента — насколько близко мы к минимуму.

Можем ли говорить, что метод рождает фундаментальную последовательность?

Да. Итерационный метод создаёт последовательность:

{xk}k=0∞ сум(хк)=0

Именно эта последовательность и называется фундаментальной / итерационной / последовательностью приближений.

⭐ Что значит термин “метод спуска”?

Это общий класс методов, которые строят последовательность точек так, что:

f(xk+1)<f(xk)

То есть в каждом шаге функция уменьшается. Градиентный спуск — частный случай метода спуска.

Что будет, если α сделать очень маленьким, например 0.001?

График будет:

  • очень медленно спускаться

  • понадобится огромное число итераций

  • траектория будет почти “ползти”

То есть сходимость будет, но очень медленная.

  • Что произойдет с кривой (траекторией спуска): Кривая обучения (значение функции от номера итерации) будет очень плавной и монотонно убывающей.

  • Проблема: Сходимость будет очень медленной. Потребуется огромное количество итераций, чтобы достичь минимума, так как каждый шаг будет очень маленьким. Это похоже на спуск с холма очень мелкими, осторожными шажками.

Что конкретно ищем методом?

Метод ищет точку минимума функции:

min⁡f(x)

То есть мы уменьшаем значение функции и ищем координаты, где градиент равен нулю.

  • Что ищем: Мы ищем точку локального минимума функции f(x). В идеальном случае (для выпуклых функций) — это глобальный минимум

Можем ли мы найти максимум?

Чтобы найти максимум функции f(x), делаем антиспуск:

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

То есть двигаемся в направлении градиента (где функция быстрее растёт).

Что такое нормы? Какие бывают?

Норма — способ измерить длину вектора. Основные:

Градиентные методы обычно используют L2-норму.

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

  • L2-норма (Евклидова норма): ||x|| = √(x₁² + x₂² + ... + x_n²). Самая распространенная.

  • L1-норма (Манхэттенская норма): ||x|| = |x₁| + |x₂| + ... + |x_n|.

  • L∞-норма (Максимальная норма): ||x|| = max(|x₁|, |x₂|, ..., |x_n|).

В критерии остановки ||x_{k+1} - x_k|| < ε обычно используется L2-норма.

Работает ли метод градиентного спуска в одномерном пространстве?

Да. В одномерном случае:

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

Это полностью валидный градиентный спуск.

Ответ: Да, абсолютно работает. В одномерном случае (функция f(x) от одной переменной) градиент превращается в обычную производную f'(x). Формула градиентного спуска становится формулой метода Ньютона (в самом простом его варианте):

x_{k+1} = x_k - α * f'(x_k)

Мы просто двигаемся вдоль оси X в сторону, противоположную знаку производной.

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

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

Для функции f(x1,x2,...,xn) используется формула:

где ei​ — единичный вектор, h — малое число.

Для каждого из n аргументов требуется одно дополнительное вычисление функции f(x+hei) И одно вычисление самой функции f(x).

Итого:

число вычислений =n+1

2. Можем ли мы изменять коэффициент α? Какой алгоритм для этого?

Да, и нужно! α — это скорость обучения (шаг). Если шаг слишком большой → метод “скачет” и не сойдётся. Если слишком маленький → будет очень медленно.

Есть алгоритмы адаптации шага:

Constant α — постоянный (простой вариант); Line search — подбираем оптимальный α на каждом шаге так, чтобы f(xk+1​)<f(xk​);

Затухающий шаг: a1 = a0 / (1 + decay*k)

alpha = 1.0

while f(x - alpha*grad) > f(x) - c*alpha*norm(grad)**2:

alpha *= tau

3. Как код изменится для двумерного и десятимерного случая? Код уже работает в многомерном виде, потому что:

X — это вектор numpy любой размерности, df(X) возвращает такой же вектор, norm(deltaX) работает для любых размерностей.

То есть:

Для 2D → X = [x, y] Для 10D → X = [x1, x2, ..., x10]

5. Что значит “строго направленная функция”?

Вероятно, речь про строго выпуклую или строго направленную (монотонную) функцию. Если функция строго выпуклая, то у неё:

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

дипсик Если вопрос про выпуклость - для строго выпуклых функций градиентный спуш гарантированно находит глобальный минимум. Для невыпуклых (как Химмельблау) - только локальный.

Почему x_k = x0.copy() в начале?

→ Чтобы не изменять исходный вектор x0 и работать с его копией.

Что произойдёт, если функция многомерная и градиент почти нулевой в начале?

→ Алгоритм может сразу остановиться из-за маленького deltaX.

Можно ли изменить код так, чтобы использовался адаптивный шаг вместо деления на LL?

→ Да, можно реализовать линейный поиск по правилу Вульфа или по золотому сечению.

Почему метод может не сойтись?

→ Если шаг alpha слишком большой, градиентный спуск может “перепрыгивать” через минимум и не уменьшать функцию.