Как определить производную функции потерь для логлос и MSE?
Что проверяют
Умеете ли вы честно пройти цепное правило, а не выучили готовую формулу градиента. Главная проверка: дойдёте ли вы до производной по логиту и объясните, почему для классификации берут логлосс, а не MSE. Следом часто просят вторую производную или реализацию на NumPy.
Как отвечать
Логлосс для одного объекта, где p = σ(z), а z = w·x + b:
- функция:
L = -(y·log(p) + (1-y)·log(1-p)); - по вероятности:
dL/dp = -y/p + (1-y)/(1-p) = (p-y) / (p·(1-p)); - производная сигмоиды:
dσ/dz = σ(z)·(1-σ(z)) = p·(1-p); - по логиту: множители сокращаются,
dL/dz = p-y. По весамdL/dw = (p-y)·x, для выборкиX^T·(p-y)/N; - вторая производная по логиту:
p·(1-p). Именно пару градиент и гессиан ждут от своей функции потерь XGBoost и LightGBM.
MSE для выборки из N объектов:
- функция:
L = (1/N)·Σ(ŷ-y)^2; - по предсказанию:
dL/dŷ = 2·(ŷ-y)/N; - для линейной модели
ŷ = X·w:∇L = (2/N)·X^T·(X·w-y). Двойку часто убирают, записывая потерю с множителем 1/2.
Дальше выводы. Если поставить MSE поверх сигмоиды, градиент по логиту станет 2·(p-y)·p·(1-p): при уверенной ошибке p близко к 0 или 1, множитель p·(1-p) почти ноль, и модель почти не учится. К тому же такая функция невыпукла по весам. У логлосса градиент по логиту растёт вместе с ошибкой. Для многоклассового случая softmax с кросс-энтропией даёт ту же форму: p-y с one-hot вектором y.
Где спотыкаются
Останавливаются на dL/dp и не протягивают цепочку через сигмоиду. Формула с делением на p·(1-p) выглядит страшно, и кандидат не видит, что она сокращается.
Путают знак: градиент равен p-y, а шаг спуска идёт против градиента. Ошибка в знаке превращает спуск в подъём.
Считают логлосс через log(sigmoid(z)) в лоб. При больших по модулю z получается log(0). На практике берут функцию от логитов, например BCEWithLogitsLoss в PyTorch, или обрезают p небольшим eps.