Ответ
Подбор коэффициентов (параметров модели, θ) — это процесс оптимизации, цель которого — минимизировать функцию потерь 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): Самый важный гиперпараметр. Слишком высокий — алгоритм расходится, слишком низкий — учится бесконечно долго.
- Инициализация весов: Случайная инициализация (не нулевая) помогает избежать симметрии в нейронных сетях.