Минимумы и максимумы функций

Минимум функции — это «дно долины»; именно его ищет любая обучающаяся модель, минимизируя ошибку.

Экстремум — точка минимума или максимума функции. В гладкой точке экстремума производная равна нулю: график там горизонтален.

Условие экстремума: производная равна нулю

На вершине холма и на дне долины касательная горизонтальна, то есть наклон (производная) равен нулю. Это необходимое условие экстремума гладкой функции: ищем точки, где 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

Выпуклые функции — мечта оптимизатора

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

Итог

  • В точке экстремума гладкой функции производная равна нулю (горизонтальная касательная).
  • Минимум: наклон меняется с минуса на плюс; максимум — наоборот.
  • Локальный минимум — дно отдельной ямки; глобальный — самое низкое значение вообще.
  • Выпуклые функции имеют единственный минимум — для них оптимизация надёжна.
Проверьте себя
1. Чему равна производная в точке гладкого минимума или максимума?
Aединице
Bнулю
Cбесконечности
Dсамому значению функции
2. Чем локальный минимум отличается от глобального?
AНичем, это синонимы
BЛокальный — дно отдельной ямки (ниже соседей), глобальный — самое низкое значение функции вообще
CГлобальный всегда в нуле координат
DЛокальный больше глобального
3. Почему выпуклые функции удобны для оптимизации?
AОни быстрее вычисляются
BУ них ровно один минимум, который и есть глобальный — спуск не застрянет
CОни всегда линейны
DУ них нет производной
Поддержать проект