Модуль 2. Линейная регрессия и градиентный спуск
Цель модуля: собрать первую модель с параметрами — прямую y = w·x + b, подобранную из данных градиентным спуском. После модуля вы понимаете, откуда берётся «обучение», как learning rate управляет сходимостью и почему этот же цикл работает и для линейной регрессии из двенадцати точек, и для миллиардных нейросетей.
Перед началом: модуль 1 (типы задач, признаки и таргет). Инструменты: песочница сайта, сниппет ниже. Трудоёмкость: ~1.5 ч (чтение 45 мин · сниппет и практика 35 мин).
🔥 «Сколько обращений будет в понедельник?»
Руководитель поддержки просит прогноз нагрузки на неделю вперёд: какую команду ставить в дежурство. У вас есть 12 недель истории — своевременность выросла с тех пор, и цифры растут. Дата-сайентиста в команде нет, ML-опыт нулевой, но задача явно простая: нужно провести по точкам «неделя → число обращений» прямую и продолжить её.
Это буквально линейная регрессия — модель из одного-двух параметров. Но как «подобрать» прямую по данным не на глаз? Оказывается, у задачи есть критерий качества (среднеквадратичная ошибка) и универсальный алгоритм подбора (градиентный спуск), который через пару модулей перерастёт в обучение бустинга, а в соседнем курсе — в дообучение LLM. Три числа и цикл из четырёх строк — вся суть.
📖 2.1. Модель и критерий: прямая и MSE
Модель: y = w·x + b, где x — признак (номер недели), y — таргет (число обращений), w и b — параметры, которые подбирает обучение. Модель ошибается: для каждой точки есть промах eᵢ = yᵢ − (w·xᵢ + b). Из промахов строят критерий качества — среднеквадратичную ошибку:
textMSE(w, b) = среднее (yᵢ − (w·xᵢ + b))²
Почему именно квадрат: знаки не компенсируются (промах −5 не «гасит» +5), большие промахи штрафуются сильнее (одна грубая ошибка хуже двух мелких), а функция гладкая — у неё есть градиент (о нём дальше). MSE — критерий регрессии номер один; в модуле 7 сверим его с MAE и поймём, когда MSE неправ (выбросы).
Хорошая новость: для прямой с одним признаком существует точное решение формулами (нормальное уравнение) — сниппет его и печатает как w* и b*. Плохая: при сотнях признаков формулы становятся в вычислительном смысле хуже итераций. Поэтому разберём градиентный спуск — он масштабируется на любые модели и станет главным инструментом всего курса.
📖 2.2. Градиентный спуск: катись вниз по ошибке
Аналогия: вы стоите на склоне MSE в тумане, видите только уклон под ногами. План спуска — четыре строки, которые повторяются до сходимости:
- Предсказать — посчитать ŷ = w·x + b по каждой точке.
- Оценить ошибку — MSE по всей выборке.
- Посчитать градиент — производные ошибки по каждому параметру: «в какую сторону и насколько круто».
- Шаг против градиента — сдвинуть оба параметра на
learning rate × градиент.
Learning rate (lr) — размер шага: маленький ползёт верно, но медленно; большой бодро, но рискует перелететь яму и разлететься. Числа — в сниппете.
Запустите linear-regression-gd.py. Данные: 12 точек на y ≈ 2x + 1 с шумом;
сниппет сначала печатает аналитический оптимум (w* ≈ 1.979, b* ≈ 0.894), а
затем три прогона спуска. Прочитайте вывод как таблицу:
- lr = 0.02 — сходится к оптимуму за ~120 шагов: MSE с 6.23 уходит к 0.0790. «Ползёт верно, но медленно».
- lr = 0.1 — тот же оптимум за 31 шаг. «Рабочая скорость».
- lr = 0.5 — вообще добирается за 11 шагов. «Быстро, но кто быстрее?»
- lr = 0.9 — расходимость: MSE растёт 237 → 9 075 → 348 031 → 13 346 615. Шаг больше «ширины ямы» на склоне MSE — и спуск превращается в разгон вверх.
Проверьте руками в практике: граница проходит где-то между 0.6 и 0.7 — lr = 0.6 ещё сходится, lr = 0.7 уже разлетается. Критическое значение задаётся кривизной ошибки (то есть данными), а не прихотью: это физика ландшафта, а не настройка.
📖 2.3. Недообучение, переобучение и лишние признаки
Прямая — намеренно простая модель. Добавим к признаку x его же степени (x², x³, …) — модель станет гибче и сможет рисовать кривые. Слишком гибкая модель на маленьких данных повторяет шум: переобучение. Это тот самый эффект, который вы видели в сниппете модуля 7 курса «Дообучение LLM» — U-кривая val-ошибки. Здесь он появляется в первом, самом наглядном виде:
- Недообучение — модель слишком простая: плоха и на train, и на val.
- Хороший баланс — сложность соответствует объёму данных.
- Переобучение — на train почти идеально, на val плохо: модель запомнила шум. Лечится данными, регуляризацией и ранней остановкой по val.
Практическое правило для табличного ML: начинайте с простой модели, замерьте честную ошибку на val (модуль 11), и только потом усложняйте. Усложнение без замера с обеих сторон — не улучшение, а надежда.
📖 2.4. Компромиссы
- Learning rate: большой vs маленький. Большой — быстро, но расходимость; маленький — надёжно, но можно не сойтись за разумное число шагов. Дефолт подбирают по кривой ошибки, а не по интуиции.
- Градиентный спуск vs точные формулы. Формулы точны, но требуют обращения матриц и «знают» только линейные модели; спуск приблизителен, зато масштабируется на всё — от линейной регрессии до нейросетей.
- MSE vs MAE. MSE чувствительна к выбросам (штраф квадратичный) — для чистых данных это сила, для шумных с выбросами — слабость (модуль 7).
- Больше признаков vs переобучение. Каждый новый признак — плюс гибкость и риск; правило «признак должен быть известен в момент предсказания» старше всех остальных (модуль 8).
- Один признак vs несколько. Недельная история — это одна ось; в проде осей будут десятки, и все окажутся в одних формулах, которые мы разберём ниже как «модель по-прежнему прямая, только в многомерном пространстве».
💻 Практика
- (15 мин) Сниппет. Запустите
linear-regression-gd.py. Сверьте итоговые w и b при lr = 0.1 с w* и b* из шапки вывода — сошлось? Объясните, почему при lr = 0.02 те же значения пришли позже. - (10 мин) Найди границу. Меняя lr в сниппете (0.55, 0.6, 0.65, 0.7), найдите порог расходимости на ваших числах. Сформулируйте правило: как понять, что шаг слишком большой, по кривой MSE.
- (15 мин) Свой прогноз. Для задачи из крючка (12 недель истории) выпишите: что x, что y, что покажет w и b, какие признаки добавите (праздники? релизы?) и как проверите модель — какой кусок истории отдадите на val. Почему нельзя проверять на тех же неделях, где учились?
- (10 мин) Модель по-другому. Посчитайте ту же прямую нормальным уравнением на бумаге для трёх точек (0,1), (1,3), (2,4). Сравните с тем, что дал бы мысленный спуск с lr = 0.1 за один шаг. Оба подхода — один оптимум.
🧩 Quiz "Проверь себя"
✅ Итоги модуля
- Объяснить модель y = w·x + b и критерий MSE своими словами.
- Провести цикл спуска по шагам: предсказание, ошибка, градиент, шаг.
- Показать на сниппете сходимость при lr = 0.1 и расходимость при 0.9.
- Найти экспериментально критический lr между 0.6 и 0.7.
- Объяснить переобучение на примере лишних степеней признака.
- Сформулировать правило «признак известен в момент предсказания».
🔗 Мостик к Модулю 3
Прямая предсказывает число. Но большинство продуктовых вопросов — не «сколько будет», а «случится или нет»: клиент уйдёт, тикет срочный, платёж подозрительный. Число превращается в решение через вероятность и порог — логистическая регрессия. Одна и та же механика спуска, но выход уже не градусы, а вероятность класса.