Что происходит с MAE при дифференцировании?

«Что происходит с MAE при дифференцировании?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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). Это даёт приближённый, но гладкий градиент.