Ответ
MAE (Mean Absolute Error) не является гладкой функцией из-за использования модуля разности. Её производная (градиент) в точке, где разность между предсказанием и истинным значением равна нулю, не определена (имеет разрыв). Это создаёт проблемы для градиентных методов оптимизации, таких как SGD.
Почему это проблема? Градиент MAE равен знаку ошибки (sign(y_pred - y_true)), который в нуле совершает скачок от -1 к +1. Это может привести к нестабильности и замедлению сходимости, когда обновления параметров колеблются около оптимума.
Пример градиента MAE в NumPy:
import numpy as np
def mae_gradient(y_true, y_pred):
"""Возвращает градиент MAE по предсказаниям (y_pred)."""
# np.sign возвращает -1 для отрицательных значений, 0 для нуля, 1 для положительных.
# Именно ноль (точка недифференцируемости) вызывает сложности.
return np.sign(y_pred - y_true) / len(y_true)
Практические решения:
- Использовать Huber Loss, которая ведёт себя как MAE при больших ошибках, но как MSE (гладкая) вблизи нуля, что обеспечивает определённый градиент.
- Применить сглаживание MAE, добавив очень маленький параметр
epsilon(например,1e-8) внутрь квадратного корня:sqrt((y_pred - y_true)^2 + epsilon). Это даёт приближённый, но гладкий градиент.