course
Każdy model uczenia maszynowego, który Pan/Pani trenuje, rozwiązuje problem optymalizacyjny — a to, co faktycznie próbujemy rozwiązać, nazywa się funkcją celu.
W prostych słowach to funkcja matematyczna, która mierzy, jak „dobre” jest rozwiązanie. Przyjmuje zestaw wejść i zwraca pojedynczy wynik. Celem jest zawsze znalezienie wartości, które maksymalizują lub minimalizują ten wynik. Funkcje celu spotka Pan/Pani u podstaw wszystkiego — od programowania liniowego po deep learning. To jedna z tych rzeczy, które będzie Pan/Pani widzieć wszędzie, gdy już zrozumie, jak działają.
W tym artykule wyjaśnię, czym są funkcje celu, czym różnią się od funkcji straty i kosztu oraz jak są używane w uczeniu maszynowym i optymalizacji.
Szukają Państwo solidnego wprowadzenia do deep learningu, które nadal będzie aktualne w 2026 roku? Proszę zapisać się na nasz kurs Deep Learning in Python, aby zbudować portfolio w PyTorch.
Czym jest funkcja celu?
Funkcja celu to funkcja matematyczna, która ocenia, jak dobre jest rozwiązanie.
Podaje się do niej zestaw wejść — parametry modelu, zmienne decyzyjne — a ona zwraca jedną liczbę. Ta liczba mówi, jak dobrze działa Państwa bieżące rozwiązanie. Im wyższa (lub niższa) ta liczba, tym lepsze (lub gorsze) jest rozwiązanie.
Przy okazji porozmawiajmy ogólnie o optymalizacji.
To proces znajdowania takich wejść, które popychają tę liczbę we właściwym kierunku. Jeśli minimalizujemy, chcemy jak najmniejszej wartości. Jeśli maksymalizujemy, chcemy jak największej. W każdym przypadku funkcja celu jest tym, względem czego mierzymy postęp.
Mówiąc prosto, proszę myśleć o niej jak o systemie punktacji. Każde potencjalne rozwiązanie dostaje wynik, a Państwa zadaniem jest znaleźć to z najlepszym wynikiem.
Funkcja celu vs funkcja straty vs funkcja kosztu
Te trzy terminy są często używane zamiennie — ale nie oznaczają dokładnie tego samego.
Termin funkcja celu jest najszerszy. To dowolna funkcja, którą staramy się maksymalizować lub minimalizować. Nie musi w ogóle dotyczyć błędu czy predykcji — po prostu definiuje, co w Państwa problemie znaczy „lepiej”.
Funkcja straty mierzy błąd dla pojedynczego przykładu treningowego — o ile prognoza modelu odbiega od rzeczywistej wartości. Na przykład średni błąd kwadratowy dla jednego punktu danych to funkcja straty.
Funkcja kosztu agreguje stratę w całym zbiorze danych, zazwyczaj poprzez jej uśrednienie. To funkcję kosztu faktycznie minimalizuje się podczas treningu — podsumowuje ona wydajność modelu we wszystkich przykładach, a nie tylko w jednym.
W praktyce większość frameworków ML i publikacji używa tych terminów luźno. Zobaczy Pan/Pani „stratę” tam, gdzie precyzyjniej byłoby „koszt”, a „cel” w znaczeniu wszystkich trzech.
Różnice mają znaczenie przy lekturze prac naukowych. Kontekst podpowiada, o który z terminów autorowi faktycznie chodzi.
Bardziej konkretną ilustrację przedstawia tabela poniżej:

Tabela porównawcza funkcji celu/straty/kosztu
Funkcje celu w optymalizacji
Każdy problem optymalizacyjny ma cel i zestaw ograniczeń.
Funkcja celu definiuje cel — to, co próbujemy maksymalizować lub minimalizować. Ograniczenia definiują limity — granice, w których musi się mieścić rozwiązanie. Razem określają ramy problemu.
Weźmy prosty przykład alokacji zasobów.
Załóżmy, że prowadzi Pan/Pani fabrykę produkującą dwa produkty i chce maksymalizować zysk. Funkcja celu ujmuje łączny zysk w funkcji liczby wyprodukowanych jednostek każdego produktu. Ograniczenia odzwierciedlają limity — dostępność surowców, czas pracy maszyn, moce przerobowe pracy. Funkcja celu mówi, co optymalizować, a ograniczenia określają, jakimi zasobami dysponujemy.
Programowanie liniowe to jedno z najczęstszych zastosowań. To metoda optymalizacji liniowej funkcji celu przy liniowych ograniczeniach. Jest używana wszędzie — od logistyki, harmonogramowania, łańcucha dostaw po finanse. Matematyka jest dobrze poznana, a solvery radzą sobie z problemami o tysiącach zmiennych.
Warto zauważyć, że funkcja celu nie zmienia tego, jakie istnieją ograniczenia — po prostu mówi solverowi, za czym ma podążać. Zmiana funkcji celu da zupełnie inne rozwiązanie, nawet przy tych samych ograniczeniach.
Funkcje celu w uczeniu maszynowym
W uczeniu maszynowym funkcja celu definiuje, czego model faktycznie się uczy.
Za każdym razem, gdy trenuje Pan/Pani model, uruchamia Pan/Pani algorytm optymalizacyjny (np. spadek gradientowy, Adam, RMSProp), który dostraja parametry modelu, by minimalizować lub maksymalizować funkcję celu. Model nic nie wie o Państwa problemie. Zna tylko wynik zwracany przez funkcję celu i przy każdej aktualizacji stara się ten wynik poprawić.
To oznacza, że wybór funkcji celu kształtuje rezultat. Warto wypróbować kilka opcji, by sprawdzić, która najlepiej działa w Państwa przypadku.
Średni błąd kwadratowy (regresja)
Mean Squared Error (MSE) to domyślna funkcja celu dla problemów regresyjnych. Mierzy średnią kwadratową różnicę między predykcjami modelu a rzeczywistymi wartościami celu.

Wzór MSE
Podnoszenie różnic do kwadratu sprawia, że wszystkie błędy są dodatnie i mocniej karze duże błędy niż małe. Predykcja chybiona o 10 wnosi do sumy 100 — nie tylko 10. To czyni MSE wrażliwym na obserwacje odstające, na co warto uważać w nieuporządkowanych danych rzeczywistych.
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}")

Wynik MSE
Strata entropii krzyżowej (klasyfikacja)
Cross-Entropy Loss to standardowa funkcja celu dla problemów klasyfikacyjnych. Mierzy, jak bardzo rozkład prawdopodobieństw przewidywany przez model odbiega od prawdziwego rozkładu klas.

Funkcja straty entropii krzyżowej
Jeśli model przypisuje wysokie prawdopodobieństwo właściwej klasie, strata jest niska. Jeśli jest pewny, ale się myli, strata jest wysoka i to jest karane. To popycha model do przewidywania właściwej klasy i do bycia tego pewnym.
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}")

Wynik entropii krzyżowej
Log-wiarogodność
Log-wiarogodność jest powszechna w modelach probabilistycznych i statystycznych. Funkcję maksymalizuje się tak, by zwiększyć prawdopodobieństwo, że parametry modelu wygenerowały zaobserwowane dane.

Wzór log-wiarogodności
Pracuje się z logarytmem wiarogodności zamiast z samą wiarogodnością, ponieważ zamienia iloczyn prawdopodobieństw w sumę, co jest dużo łatwiejsze obliczeniowo i wygodniejsze do optymalizacji.
W praktyce większość frameworków minimalizuje ujemną log-wiarogodność (NLL) zamiast maksymalizować log-wiarogodność. To to samo — tylko odwrócone, aby można było stosować spadek gradientowy.
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}")

Wynik log-wiarogodności
Trenowanie to w gruncie rzeczy optymalizacja. Każde przejście w przód oblicza wartość funkcji celu. Każde przejście wstecz oblicza gradienty. A każda aktualizacja parametrów przesuwa model w kierunku poprawy wyniku.
Funkcje celu wypukłe vs. niewypukłe
Nie wszystkie funkcje celu są sobie równe. Ich kształt determinuje, jak trudna jest optymalizacja i na ile można zaufać znalezionemu rozwiązaniu.
Liniowe funkcje celu
Liniowa funkcja celu daje liniową zależność między wejściami a wyjściem. Gdy dowolne wejście zmieni się o stałą wartość, wyjście zmienia się o stałą wartość.
Funkcje liniowe są używane w programowaniu liniowym, gdzie zarówno funkcja celu, jak i ograniczenia są liniowe. To najprostsza klasa funkcji celu do optymalizacji, ponieważ solvery mogą niezawodnie znaleźć optimum globalne, nawet dla dużych problemów.
Nieliniowe funkcje celu
Nieliniowa funkcja celu ma bardziej złożoną zależność między wejściami a wyjściem. Większość problemów rzeczywistych — i niemal wszystkie modele uczenia maszynowego — należy do tej kategorii.
MSE jest nieliniowe. Entropia krzyżowa jest nieliniowa. Powierzchnie strat sieci neuronowych są nieliniowe. Dodatkowa złożoność pozwala tym funkcjom uchwycić złożone zależności w danych, ale utrudnia optymalizację.
Funkcje wypukłe i niewypukłe
Tu robi się ciekawie.
Funkcja wypukła ma kształt miski. Każdy odcinek łączący dwa punkty na krzywej leży nad krzywą lub na niej. To gwarantuje, że każde minimum lokalne jest też minimum globalnym — czyli jeśli optymalizator znajdzie dno, to jest to prawdziwe dno.
Funkcja niewypukła ma bardziej nieregularny kształt — wiele dolin, płaskowyżów i punktów siodłowych. Optymalizatory mogą utknąć w minimum lokalnym, dolinie, która wygląda jak dno, ale nim nie jest. Głębokie sieci neuronowe mają silnie niewypukłe powierzchnie strat, dlatego ich trenowanie wymaga starannego doboru współczynników uczenia, optymalizatorów i inicjalizacji.
Problemy wypukłe rozwiązuje się dokładnie, a niewypukłe — przybliżenie. Jakość rozwiązania zależy od strategii optymalizacji.
Dla wzrokowców — oto porównanie liniowych, nieliniowych, wypukłych i niewypukłych funkcji celu:

Porównanie typów funkcji celu
Jak optymalizuje się funkcje celu
Gdy ma Pan/Pani funkcję celu, potrzebuje Pan/Pani sposobu na jej minimalizację lub maksymalizację. Tu wkraczają algorytmy optymalizacyjne.
Najczęstszym podejściem jest spadek gradientowy. Pomysł polega na obliczeniu gradientu funkcji celu względem parametrów modelu, a następnie wykonaniu małego kroku w kierunku zmniejszającym jej wartość. Potem powtarzamy, aż wartość przestanie się poprawiać.
Gradient to po prostu pochodna funkcji celu.
Mówi o nachyleniu w bieżącym punkcie i wskazuje kierunek „pod górę”. Aby zminimalizować funkcję, poruszamy się w przeciwnym kierunku. Aby ją zmaksymalizować — w tym samym.
Proces jest iteracyjny — aby dojść do rozwiązania, wykonuje się serię małych aktualizacji, z których każda zbliża parametry do optimum. Wielkość kroku kontroluje współczynnik uczenia. Zbyt duża wartość może spowodować przeskoczenie optimum, a zbyt mała — wydłuża trening.
W praktyce większość frameworków ML używa wariantów spadku gradientowego, które są szybsze i stabilniejsze niż wersja podstawowa:
- Stochastic Gradient Descent (SGD) oblicza gradient na pojedynczym losowym przykładzie na krok zamiast na całym zbiorze danych
- Mini-batch gradient descent używa niewielkiej partii przykładów na krok — rozwiązanie pośrednie między SGD a pełną partią
- Adam dostosowuje współczynnik uczenia dla każdego parametru, co ułatwia jego strojenie
Funkcja celu musi być różniczkowalna, albo przynajmniej w większości różniczkowalna, aby metody gradientowe działały. Brak pochodnej oznacza brak gradientu — a więc optymalizator nie ma, za czym podążać. To kluczowa rzecz do zapamiętania.
Przykład funkcji celu
Uczyńmy to konkretnym na prostym problemie regresji liniowej.
Załóżmy, że prognozuje Pan/Pani ceny domów na podstawie metrażu. Ma Pan/Pani zbiór domów ze znanymi cenami i chce dopasować prostą do danych, minimalizując błąd predykcji. Państwa funkcją celu jest Mean Squared Error (MSE), którego wzór jest już znany.
Wejściami są parametry modelu — nachylenie i wyraz wolny prostej. Wyjściem jest pojedyncza liczba — średni błąd kwadratowy we wszystkich predykcjach. W tym przypadku im niższa, tym lepiej.
Tak może wyglądać przykładowa implementacja w Pythonie:
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 — dobre vs złe dopasowanie
Pierwszy zestaw parametrów daje znacznie niższy MSE, co oznacza lepsze dopasowanie do danych. Dokładnie tego używa optymalizator, aby zdecydować o kierunku ruchu.
Dla wzrokowców proszę spojrzeć na poniższy obraz:

Przykład MSE
Widać oba dopasowania względem danych, a także powierzchnię MSE wzdłuż zakresu wartości nachylenia — czyli samą funkcję celu.
Wykres po lewej pokazuje, jak oba zestawy parametrów dopasowują dane. Wykres po prawej przedstawia powierzchnię MSE względem wartości nachylenia — funkcję celu jako krzywą, z wyraźnym minimum, którego szuka optymalizator. Każdy krok spadku gradientowego przesuwa się wzdłuż tej krzywej w kierunku minimum.
Ograniczenia a funkcje celu
Funkcja celu mówi, co optymalizować. Ograniczenia mówią, co wolno robić.
W większości realnych problemów nie można po prostu bez ograniczeń maksymalizować lub minimalizować. Działa się w ramach limitów, takich jak budżet, okno czasowe czy pojemność fizyczna. Te limity to ograniczenia i definiują zbiór dopuszczalnych rozwiązań, z których może wybierać optymalizator.
Weźmy przykład produkcyjny.
Chce Pan/Pani maksymalizować zysk w dwóch liniach produktowych. Bez ograniczeń odpowiedź brzmi: produkować jak najwięcej. Ale do dyspozycji jest 500 godzin czasu maszyn i 1000 jednostek surowca. To są ograniczenia. Funkcja celu pozostaje ta sama (maksymalizacja zysku), ale optymalizator może szukać tylko w obszarze dozwolonym przez te ograniczenia.
Gdy zmieni się ograniczenia, zmienia się także rozwiązanie optymalne — nawet jeśli funkcja celu pozostaje bez zmian.
Ta struktura funkcji celu z zestawem ograniczeń to fundament optymalizacji z ograniczeniami. Tak działa programowanie liniowe, optymalizacja portfela i wiele rzeczywistych problemów planistycznych.
Podsumowanie
Każdy problem optymalizacyjny — czy trenuje Pan/Pani sieć neuronową, alokuje zasoby, czy dopasowuje model regresji — sprowadza się do jednego: funkcji, którą próbujemy zminimalizować lub zmaksymalizować.
Funkcja celu jest właśnie tą funkcją. Definiuje, co znaczy „lepiej”, kieruje każdą aktualizacją parametrów i determinuje, czego model faktycznie się uczy. Jeśli wybierze ją Pan/Pani właściwie, model rozwiąże Państwa problem. Jeśli wybierze ją Pan/Pani źle, model rozwiąże zupełnie inny problem — często bez oczywistego błędu, który by przed tym ostrzegł.
Wybór odpowiedniej funkcji celu to decyzja projektowa w data science, która kształtuje wszystko, co następuje później. W praktyce warto eksperymentować — dostępnych jest wiele funkcji celu.
Nie wie Pan/Pani, od czego zacząć? Nasze kursy Model Validation in Python oraz Hyperparameter Tuning in Python to świetne miejsca startu dla początkujących i średnio zaawansowanych specjalistów data science.
FAQs
Czym jest funkcja celu?
Funkcja celu to funkcja matematyczna, która mierzy, jak dobre jest rozwiązanie. Podaje się do niej zestaw wejść, takich jak parametry modelu i zmienne decyzyjne, a ona zwraca jedną liczbę. Celem jest zawsze znalezienie takich wejść, które sprawią, że ta liczba będzie możliwie najwyższa lub najniższa.
Jaka jest różnica między funkcją celu a funkcją straty?
Funkcja straty to szczególny rodzaj funkcji celu używany w uczeniu maszynowym do pomiaru błędu predykcji dla pojedynczego przykładu treningowego. Funkcja celu to termin szerszy — może oznaczać dowolną funkcję, którą minimalizujemy lub maksymalizujemy, nie tylko błąd predykcji. W praktyce oba terminy często są używane zamiennie, ale rozróżnienie ma znaczenie przy lekturze prac naukowych.
Gdzie używa się funkcji celu?
Funkcje celu występują w każdym problemie, który obejmuje optymalizację — w uczeniu maszynowym, programowaniu liniowym, alokacji zasobów, finansach, logistyce i wielu innych. W uczeniu maszynowym funkcja celu definiuje, czego model uczy się podczas treningu. Poza ML definiuje cel w każdym problemie optymalizacyjnym z ograniczeniami i bez.
Dlaczego wybór funkcji celu ma znaczenie w uczeniu maszynowym?
Funkcja celu determinuje, co Państwa model faktycznie optymalizuje podczas treningu. Jeśli wybierze Pan/Pani niewłaściwą, model będzie minimalizował niewłaściwą rzecz — i będzie to robił skutecznie, co utrudnia wykrycie problemu. Na przykład użycie MSE w zadaniu klasyfikacji nie tylko da słabe wyniki, ale pewnie słabe wyniki, co jest jeszcze gorsze.
Czy funkcja celu może mieć wiele minimów?
Tak — i to jeden z kluczowych problemów w trenowaniu modeli głębokiego uczenia. Niewypukłe funkcje celu mają wiele minimów lokalnych, więc optymalizator może utknąć w dolinie, która nie jest globalnie najlepsza. Dlatego znaczenie mają inicjalizacja wag, harmonogram współczynnika uczenia i wybór optymalizatora — wpływają na to, czy optymalizator znajdzie ostatecznie dobre rozwiązanie.