- •1. Множество. Функция. Скалярные и векторные функции.
- •2. Поле, пространство. Виды пространств.
- •3. Критические точки. Стационарные точки. Лемма Ферма. Связь оптимизации и поиска корня.
- •Вопрос 6. Чем выпуклая функция упрощает задачу оптимизации?
- •Вопрос 7. Если функция имеет одинаковые минимальные значения в двух точках, можно ли говорить о двух глобальных минимумах?
- •Вопрос 8. Как критерии максимума связаны с критериями минимума?
- •4. Градиент. Матрица Гессе. Ряд Тейлора.
- •5. Квадратичная форма. Квадратичная функция. Связь знакоопределенности и собственных чисел матрицы.
- •6. Квадратичная форма. Квадратичная функция. Критерии минимума (максимума) квадратичной формы.
- •7. Условия Вульфа. Их геометрическая интерпретация. Правило Армихо.
- •8. Метод дихотомии. Запрограммировать, показать работу на функциях.
- •9. Метод трехточечного деления. Запрограммировать, показать работу на функциях.
- •10. Метод золотого сечения. Запрограммировать, показать работу на функциях.
- •11. Метод Фибоначчи. Запрограммировать, показать работу на функциях.
- •12. Метод Ньютона одномерный. Запрограммировать, показать работу на функциях.
- •13. Метод секущих. Запрограммировать, показать работу на функциях.
- •14. Метод Мюллера. Запрограммировать, показать работу на функциях.
- •15. Метод обратной параболической интерполяции. Запрограммировать, показать работу на функциях.
- •16. Запрограммировать метод градиентного спуска. Показать его работу на функциях.
- •17. Запрограммировать метод наискорейшего спуска. Показать его работу на функциях.
- •19. Запрограммировать метод Ньютона многомерный. Показать его работу на функциях.
- •20. Запрограммировать метод Левенберга-Марквардта. Показать его работу на функциях.
- •21. Запрограммировать метод Нестерова-Немировского. Показать его работу на функциях.
- •22. Запрограммировать метод Барзилая-Борвейна 1. Показать его работу на функциях.
- •23. Запрограммировать метод Барзилая-Борвейна 2. Показать его работу на функциях.
- •28. Запрограммировать метод Армихо. Показать его работу на функциях.
- •29. Запрограммировать метод dfp. Показать его работу на функциях.
- •30. Запрограммировать метод bfgs. Показать его работу на функциях.
- •31. Запрограммировать метод l- bfgs. Показать его работу на функциях.
- •32. Запрограммировать метод доверительных областей. Показать его работу на функциях.
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?
График будет:
очень медленно спускаться
понадобится огромное число итераций
траектория будет почти “ползти”
То есть сходимость будет, но очень медленная.
Что произойдет с кривой (траекторией спуска): Кривая обучения (значение функции от номера итерации) будет очень плавной и монотонно убывающей.
Проблема: Сходимость будет очень медленной. Потребуется огромное количество итераций, чтобы достичь минимума, так как каждый шаг будет очень маленьким. Это похоже на спуск с холма очень мелкими, осторожными шажками.
Что конкретно ищем методом?
Метод ищет точку минимума функции:
minf(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 слишком большой, градиентный спуск может “перепрыгивать” через минимум и не уменьшать функцию.
