Как подбираются коэффициенты (веса) в моделях машинного обучения?

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

Ответ

Подбор коэффициентов (параметров модели, θ) — это процесс оптимизации, цель которого — минимизировать функцию потерь L(θ). Основные методы:

1. Аналитическое решение (для линейных моделей):

  • Метод наименьших квадратов (OLS): Для линейной регрессии без регуляризации оптимальные веса находятся по формуле: θ = (XᵀX)⁻¹Xᵀy.
  • Плюсы: Точное, быстрое решение за одну операцию.
  • Минусы: Вычислительно тяжело для очень больших матриц (O(n³)), не работает для моделей, где функция потерь не квадратичная (логистическая регрессия) или есть регуляризация.

2. Итеративные методы на основе градиента (наиболее распространены):

  • Градиентный спуск (Gradient Descent): На каждом шаге параметры обновляются в направлении, противоположном градиенту функции потерь.
    def gradient_descent(X, y, lr=0.01, epochs=1000):
    n = X.shape[0]
    theta = np.zeros(X.shape[1]) # Инициализируем веса нулями
    for epoch in range(epochs):
        # Предсказание и ошибка
        y_pred = X.dot(theta)
        error = y_pred - y
        # Градиент = производная MSE по theta
        gradient = (2/n) * X.T.dot(error)
        # Обновление весов
        theta -= lr * gradient
    return theta
  • Стохастический градиентный спуск (SGD): Обновляет веса на каждом отдельном примере или мини-батче. Быстрее и позволяет выходить из локальных минимумов.
  • Продвинутые оптимизаторы (Adam, RMSprop): Используют адаптивную скорость обучения и учитывают моменты градиента, что ускоряет сходимость. Именно их применяют в нейронных сетях.

3. Методы, специфичные для моделей:

  • Для линейных моделей с L1/L2 регуляризацией (Lasso/Ridge): Используют координатный спуск или преобразуют задачу.
  • Для деревьев решений (в бустинге): Коэффициенты (значения в листьях) подбираются не градиентным спуском, а путем прямого решения задачи оптимизации на каждом разбиении (например, вычисляется оптимальное значение листа, минимизирующее потери).

Ключевые практические моменты:

  • Масштабирование признаков: Перед градиентным спуском обязательно нужно масштабировать признаки (например, с помощью StandardScaler), иначе сходимость будет очень медленной.
  • Скорость обучения (learning rate): Самый важный гиперпараметр. Слишком высокий — алгоритм расходится, слишком низкий — учится бесконечно долго.
  • Инициализация весов: Случайная инициализация (не нулевая) помогает избежать симметрии в нейронных сетях.