Перейти к основному содержимому

Целевая функция: определение, примеры и оптимизация

Узнайте, что такое целевая функция, как она работает в оптимизации и машинном обучении, и как её определять и интерпретировать на реальных примерах.
Обновлено 4 мая 2026 г.  · 11 мин читать

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

Проще говоря, это математическая функция, которая измеряет, насколько «хорошо» решение. Она принимает набор входных данных и возвращает одно число. Цель всегда одна — найти значения, которые максимизируют или минимизируют это число. Целевые функции лежат в основе всего — от линейного программирования до глубокого обучения. Как только вы поймёте, как они устроены, будете видеть их повсюду.

В этой статье я объясню, что такое целевые функции, чем они отличаются от функций потерь и стоимости, и как используются в машинном обучении и оптимизации.

Ищете актуальный в 2026 году глубокий разбор deep learning? Запишитесь на наш курс Deep Learning in Python и соберите портфолио на PyTorch.

Что такое целевая функция?

Целевая функция — это математическая функция, которая оценивает качество решения.

Вы передаёте ей набор входных данных — параметры модели, управляемые переменные — и получаете одно число. Это число показывает, насколько хорошо работает текущее решение. Чем выше (или ниже) это число, тем лучше (или хуже) ваше решение.

Раз уж мы об этом, давайте обсудим оптимизацию в целом.

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

Проще говоря, это система оценивания. Каждый кандидат на решение получает балл, а ваша задача — найти тот, у которого балл лучший.

Целевая функция vs функция потерь vs функция стоимости

Эти три термина часто используют как синонимы — но это не совсем одно и то же.

Термин целевая функция — самый общий. Это любая функция, которую вы пытаетесь максимизировать или минимизировать. Она не обязана учитывать ошибку или предсказания — она просто определяет, что значит «лучше» для вашей задачи.

Функция потерь измеряет ошибку для одного обучающего примера — насколько предсказание модели отклоняется от фактического значения. Например, среднеквадратичная ошибка для одной точки данных — это функция потерь.

Функция стоимости агрегирует потери по всему набору данных, обычно усредняя их. Именно функцию стоимости вы минимизируете при обучении — она суммирует качество модели по всем примерам, а не по одному.

На практике большинство ML-фреймворков и статей используют эти термины вольно. Вы увидите «loss» там, где точнее было бы «cost», а «objective» — в значении всех трёх.

Эти различия важны при чтении научных статей. Контекст подсказывает, о чём на самом деле говорит автор.

Для более наглядного сравнения см. таблицу ниже:

Сравнительная таблица целевой/функции потерь/функции стоимости

Сравнительная таблица целевой/функции потерь/функции стоимости

Целевые функции в оптимизации

У любой задачи оптимизации есть цель и набор ограничений.

Целевая функция определяет цель — что вы пытаетесь максимизировать или минимизировать. Ограничения определяют границы — рамки, в которых должно оставаться решение. Вместе они формируют постановку задачи.

Рассмотрим простой пример распределения ресурсов.

Допустим, вы управляете фабрикой, выпускающей два продукта, и хотите максимизировать прибыль. Целевая функция выражает суммарную прибыль как функцию от количества произведённых единиц каждого продукта. Ограничения отражают лимиты — доступные сырьё, машинное время, трудовые ресурсы. Целевая функция указывает, что оптимизировать, а ограничения — в каких рамках работать.

Линейное программирование — один из самых распространённых случаев применения. Это метод оптимизации линейной целевой функции при линейных ограничениях. Он используется повсюду: логистика, расписания, цепочки поставок, финансы. Математика хорошо изучена, а солверы справляются с задачами с тысячами переменных.

Важно отметить, что целевая функция не меняет существующие ограничения — она лишь указывает солверу, к чему стремиться. Если изменить целевую функцию, вы получите совсем иное решение, даже при тех же ограничениях.

Целевые функции в машинном обучении

В машинном обучении целевая функция определяет, чему на самом деле учится ваша модель.

Каждый раз, когда вы обучаете модель, вы запускаете алгоритм оптимизации (вроде градиентного спуска, Adam, RMSProp), который настраивает параметры модели, чтобы минимизировать или максимизировать целевую функцию. Модель не знает ничего о вашей задаче. Она знает только оценку, которую выдаёт целевая функция, и пытается улучшить её с каждым обновлением.

Это означает, что выбор целевой функции определяет результат. Имеет смысл попробовать несколько вариантов и посмотреть, что лучше сработает в вашем случае.

Среднеквадратичная ошибка (регрессия)

Mean Squared Error (MSE) — целевая функция по умолчанию для задач регрессии. Она измеряет среднее квадратов расхождений между предсказаниями модели и истинными значениями целевой переменной.

Формула MSE

Формула MSE

Возведение разностей в квадрат делает все ошибки положительными и сильнее наказывает большие ошибки по сравнению с малыми. Предсказание с ошибкой 10 вносит в сумму 100, а не 10. Поэтому MSE чувствительна к выбросам — это важно учитывать на «шумных» реальных данных.

import numpy as np

y_true = np.array([3.0, 5.0, 2.5, 7.0])
y_pred = np.array([2.8, 5.2, 2.0, 6.5])

mse = np.mean((y_true - y_pred) ** 2)
print(f"MSE: {mse:.4f}")

Результат MSE

Результат MSE

Кросс-энтропийная потеря (классификация)

Cross-Entropy Loss — стандартная целевая функция для задач классификации. Она измеряет, насколько распределение вероятностей, предсказанное моделью, отличается от истинного распределения классов.

Функция потерь кросс-энтропии

Функция потерь кросс-энтропии

Если модель назначает высокой вероятности правильному классу, потеря мала. Если она уверена, но не права, потеря велика — и это наказывается. Именно это подталкивает модель предсказывать правильный класс и быть уверенной в предсказании.

import numpy as np

# True labels (one-hot encoded)
y_true = np.array([1, 0, 0])

# Model's predicted probabilities
y_pred = np.array([0.7, 0.2, 0.1])

cross_entropy = -np.sum(y_true * np.log(y_pred))
print(f"Cross-Entropy Loss: {cross_entropy:.4f}")

Результат кросс-энтропии

Результат кросс-энтропии

Лог-правдоподобие

Лог-правдоподобие часто используется в вероятностных и статистических моделях. Функция максимизирует вероятность того, что параметры вашей модели породили наблюдаемые данные.

Формула лог-правдоподобия

Формула лог-правдоподобия

Работают с логарифмом правдоподобия, а не с самим правдоподобием, потому что он превращает произведение вероятностей в сумму — так намного проще вычислять и оптимизировать.

На практике большинство фреймворков минимизируют отрицательное лог-правдоподобие (NLL) вместо максимизации лог-правдоподобия. Это то же самое — только «перевёрнуто», чтобы работал градиентный спуск.

import numpy as np
from scipy.stats import norm

# Observed data
data = np.array([1.2, 2.3, 1.8, 2.1, 1.9])

# Assumed model parameters
mu, sigma = 2.0, 0.5

# Compute negative log-likelihood
nll = -np.sum(norm.logpdf(data, loc=mu, scale=sigma))
print(f"Negative Log-Likelihood: {nll:.4f}")

Результат лог-правдоподобия

Результат лог-правдоподобия

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

Выпуклые и невыпуклые целевые функции

Целевые функции различаются. Их форма определяет сложность оптимизации и надёжность найденного решения.

Линейные целевые функции

Линейная целевая функция задаёт линейную связь между входами и выходом. Если вы изменяете любой вход на фиксированную величину, выход меняется на фиксированную величину.

Линейные функции используются в линейном программировании, где и целевая функция, и ограничения линейны. Это самый простой класс целевых функций для оптимизации: солверы надёжно находят глобальный оптимум даже для больших задач.

Нелинейные целевые функции

Нелинейная целевая функция описывает более сложную зависимость между входами и выходом. Большинство реальных задач — и почти все модели машинного обучения — относятся к этой категории.

MSE — нелинейна. Кросс-энтропия — нелинейна. Поверхности потерь нейросетей — нелинейны. Дополнительная сложность позволяет захватывать сложные связи в данных, но делает оптимизацию труднее.

Выпуклые и невыпуклые функции

Здесь становится интересно.

Выпуклая функция имеет форму чаши. Любой отрезок между двумя точками на кривой лежит над кривой или на ней. Это гарантирует, что любой локальный минимум — также глобальный минимум, то есть если оптимизатор нашёл «дно», это действительно дно.

Невыпуклая функция имеет более «ломаную» форму — несколько долин, плато и седловых точек. Оптимизаторы могут застрять в локальном минимуме — долине, похожей на дно, но им не являющейся. У глубоких нейросетей поверхности потерь сильно невыпуклые, поэтому для их обучения требуется тонкая настройка скоростей обучения, оптимизаторов и инициализации.

Выпуклые задачи решаются точно, а невыпуклые — приблизительно. Качество решения зависит от стратегии оптимизации.

Для наглядности — сравнение линейных, нелинейных, выпуклых и невыпуклых целевых функций:

Сравнение типов целевых функций

Сравнение типов целевых функций

Как оптимизируют целевые функции

Когда у вас есть целевая функция, нужен способ её минимизировать или максимизировать. Здесь и вступают в игру алгоритмы оптимизации.

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

Градиент — это просто производная целевой функции.

Он показывает наклон в текущей точке и направление «вверх». Чтобы минимизировать функцию, двигаются в противоположную сторону. Чтобы максимизировать — в ту же сторону.

Этот процесс итеративный: чтобы прийти к решению, вы делаете серию небольших обновлений, каждое из которых приближает параметры к оптимуму. Величина шага задаётся скоростью обучения. Слишком большая — можно «перепрыгнуть» оптимум, слишком малая — обучение идёт дольше.

На практике большинство ML-фреймворков используют варианты градиентного спуска, которые быстрее и стабильнее базовой версии:

  • Stochastic Gradient Descent (SGD) вычисляет градиент по одному случайному примеру на шаг вместо всего датасета
  • Мини-пакетный градиентный спуск использует небольшой пакет примеров на шаг — золотая середина между SGD и полным пакетом
  • Adam адаптирует скорость обучения для каждого параметра, что упрощает настройку

Для градиентных методов целевая функция должна быть дифференцируемой, или хотя бы в основном дифференцируемой. Нет производной — нет градиента, а значит, у оптимизатора нет направления движения. Это важно помнить.

Пример целевой функции

Давайте конкретизируем на примере простой линейной регрессии.

Предположим, вы предсказываете цены на дома по площади. У вас есть датасет домов с известными ценами, и вы хотите провести линию через данные, минимизируя ошибку предсказаний. Ваша целевая функция — Mean Squared Error (MSE), формулу которой вы уже знаете.

Входы — это параметры модели: наклон и сдвиг прямой. Выход — одно число: средняя квадратичная ошибка по всем предсказаниям. В данном случае меньше — лучше.

Вот как может выглядеть потенциальная реализация на Python:

import numpy as np

np.random.seed(42)

# Generate some fake housing data
square_footage = np.random.uniform(500, 3000, 100)
true_price = 150 * square_footage + 50000 + np.random.normal(0, 15000, 100)

def predict(x, slope, intercept):
    return slope * x + intercept

def mse(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

# Try two different parameter sets
slope_a, intercept_a = 150, 50000  # good fit
slope_b, intercept_b = 80, 100000  # bad fit

pred_a = predict(square_footage, slope_a, intercept_a)
pred_b = predict(square_footage, slope_b, intercept_b)

print(f"MSE (good fit):  {mse(true_price, pred_a):,.2f}")
print(f"MSE (poor fit):  {mse(true_price, pred_b):,.2f}")

Сравнение хорошей и плохой подгонки по MSE

Сравнение хорошей и плохой подгонки по MSE

Первый набор параметров даёт намного меньший MSE, значит, лучше описывает данные. Именно это использует оптимизатор, чтобы решить, в каком направлении двигаться.

Для наглядности рассмотрите изображение ниже:

Пример MSE

Пример MSE

Здесь видно обе подгонки относительно данных, а также поверхность MSE по диапазону значений наклона — то есть саму целевую функцию.

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

Ограничения и целевые функции

Целевая функция говорит, что оптимизировать. Ограничения — что вам разрешено делать.

В большинстве реальных задач нельзя просто безгранично максимизировать или минимизировать. Вы работаете в рамках ограничений — бюджет, время, производственные мощности. Эти ограничения называются ограничениями и определяют множество допустимых решений, из которых может выбирать оптимизатор.

Возьмём пример из производства.

Допустим, вы хотите максимизировать прибыль по двум товарным линиям. Без ограничений ответ прост: производить как можно больше. Но у вас есть 500 часов машинного времени и 1000 единиц сырья. Это ваши ограничения. Целевая функция та же (максимизация прибыли), но оптимизатор может искать решение только в регионе, определённом этими ограничениями.

Меняются ограничения — меняется и оптимальное решение, даже если целевая функция остаётся прежней.

Такая структура — целевая функция плюс набор ограничений — лежит в основе задач оптимизации с ограничениями. Так работает линейное программирование, оптимизация портфеля и множество реальных задач планирования.

Выводы

Любая задача оптимизации — будь то обучение нейросети, распределение ресурсов или подгонка регрессионной модели — сводится к одному: к функции, которую вы пытаетесь минимизировать или максимизировать.

Целевая функция — это и есть такая функция. Она определяет, что значит «лучше», направляет каждое обновление параметров и задаёт, чему на самом деле учится ваша модель. Если выбрать её правильно, модель сможет решить вашу задачу. Если ошибиться — она будет решать совсем другую задачу, часто без очевидных сигналов об ошибке.

Выбор целевой функции — это дизайнерское решение в data science, которое определяет всё последующее. Как практикующий специалист, не бойтесь экспериментировать — существует много целевых функций на выбор.

Не знаете, с чего начать? Наши курсы Model Validation in Python и Hyperparameter Tuning in Python — отличная отправная точка для специалистов начального и среднего уровня.

FAQs

Что такое целевая функция?

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

В чём разница между целевой функцией и функцией потерь?

Функция потерь — это частный случай целевой функции в машинном обучении, измеряющий ошибку предсказания для одного обучающего примера. Целевая функция — более широкий термин: это любая функция, которую вы минимизируете или максимизируете, не обязательно ошибка предсказания. На практике эти термины часто используют как синонимы, но при чтении научных статей различие важно.

Где используются целевые функции?

Целевые функции встречаются в любых задачах, где есть оптимизация: машинное обучение, линейное программирование, распределение ресурсов, финансы, логистика и многое другое. В машинном обучении целевая функция определяет, чему учится модель во время тренировки. Вне ML она определяет цель в любой задаче оптимизации — с ограничениями или без них.

Почему выбор целевой функции важен в машинном обучении?

Целевая функция определяет, что именно оптимизирует ваша модель при обучении. Если выбрать неверную, модель будет минимизировать не то — и делать это эффективно, из-за чего проблему сложнее заметить. Например, использование MSE для задачи классификации даст не просто плохие результаты, а уверенно плохие — что ещё хуже.

Может ли у целевой функции быть несколько минимумов?

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

Темы

Учитесь с DataCamp

Course

Understanding Data Science

2 ч
849K
An introduction to data science with no coding involved.
ПодробнееRight Arrow
Начать курс
Смотрите большеRight Arrow