Минимумы и максимумы функций
Минимум функции — это «дно долины»; именно его ищет любая обучающаяся модель, минимизируя ошибку.
Экстремум — точка минимума или максимума функции. В гладкой точке экстремума производная равна нулю: график там горизонтален.
Условие экстремума: производная равна нулю
На вершине холма и на дне долины касательная горизонтальна, то есть наклон (производная) равен нулю. Это необходимое условие экстремума гладкой функции: ищем точки, где f'(x) = 0. Например, у f(x) = x² − 4x + 3 производная 2x − 4 обнуляется при x = 2 — там минимум.
def derivative(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
def f(x):
return x * x - 4 * x + 3 # минимум в x = 2
# Ищем, где производная меняет знак — это и есть экстремум
for x_int in range(0, 5):
x = float(x_int)
print(f"x={x}: f={f(x):5} f'={round(derivative(f, x), 3):6}")
Вывод:
x=0.0: f= 3.0 f'= -4.0 x=1.0: f= 0.0 f'= -2.0 x=2.0: f= -1.0 f'= 0.0 x=3.0: f= 0.0 f'= 2.0 x=4.0: f= 3.0 f'= 4.0
Производная меняет знак с минуса на плюс ровно в x = 2, и там же значение функции наименьшее: f(2) = −1. Слева функция убывает (f' < 0), справа растёт (f' > 0) — это «дно».
Минимум против максимума
Нулевая производная сама по себе не различает дно и вершину. Различие в том, как ведёт себя наклон вокруг точки:
- Минимум: слева функция убывает (f' < 0), справа растёт (f' > 0). Наклон растёт, проходя через ноль.
- Максимум: слева растёт (f' > 0), справа убывает (f' < 0). Наклон убывает.
Локальные и глобальные экстремумы
Это ключевая боль оптимизации. Глобальный минимум — самое низкое значение функции вообще. Локальный минимум — дно отдельной ямки, ниже соседей, но не обязательно самое низкое в мире. Если функция имеет много ямок, градиентный спуск может застрять в локальной, не дойдя до глобальной. Посмотрим на функцию с двумя минимумами.
import math
# Функция с несколькими впадинами
def f(x):
return x * x / 10 + math.sin(x) * 3
# Грубый перебор по сетке: ищем глобальный минимум
best_x, best_y = None, float("inf")
x = -10.0
while x <= 10.0:
y = f(x)
if y < best_y:
best_y, best_x = y, x
x += 0.1
print("Глобальный минимум около x =", round(best_x, 2))
print("Значение функции там =", round(best_y, 4))
Вывод:
Глобальный минимум около x = -1.5 Значение функции там = -2.7675
Выпуклые функции — мечта оптимизатора
Выпуклая функция (как чаша x²) имеет ровно один минимум — он же глобальный, никаких ловушек. Для таких функций градиентный спуск гарантированно находит наилучшее решение. Поэтому многие функции потерь специально проектируют выпуклыми (например, в линейной регрессии и логистической регрессии). Когда функция невыпуклая (нейросети), приходится мириться с локальными минимумами и применять хитрости — об этом в разделе про оптимизацию.
Итог
- В точке экстремума гладкой функции производная равна нулю (горизонтальная касательная).
- Минимум: наклон меняется с минуса на плюс; максимум — наоборот.
- Локальный минимум — дно отдельной ямки; глобальный — самое низкое значение вообще.
- Выпуклые функции имеют единственный минимум — для них оптимизация надёжна.