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

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

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

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

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