Как градиентный бустинг учится на ошибках, без формул на доске 🧠
На собеседовании часто говорят: «Градиентный бустинг последовательно исправляет ошибки предыдущих деревьев». Это хорошее начало, но за этой фразой легко спрятать непонимание механики. Главное, что стоит запомнить сразу: таргет второго дерева не равен предсказанию первого дерева. Он показывает, какую поправку нужно внести в это предсказание. В общем случае эта поправка называется антиградиентом функции потерь, то есть направлением, в котором нужно сдвинуть текущий прогноз, чтобы ошибка стала меньше. Именно поэтому бустинг называют градиентным. 💡
🏠 Представим задачу прогноза цены квартиры. У нас есть площадь, район, этаж, год постройки и реальная цена каждой квартиры. Первое дерево обычно очень простое. Например, оно замечает, что квартиры больше 60 квадратных метров в среднем стоят дороже, и выдаёт грубые прогнозы. Для одной квартиры оно предсказало 10 миллионов, хотя настоящая цена была 12 миллионов. Для другой предсказало 8 миллионов вместо 7 миллионов. После первого дерева у нас появляется не только прогноз, но и понимание, где и насколько текущая модель ошибается.
📌 Что становится таргетом второго дерева? Не исходная цена квартиры и не прогноз первого дерева. В простой регрессионной задаче с квадратичной ошибкой это остаток:
таргет второго дерева = факт − прогноз первого дерева
Для квартиры стоимостью 12 млн первое дерево предсказало 10 млн. Значит, таргет второго дерева будет +2 млн. Для квартиры стоимостью 7 млн был прогноз 8 млн, значит таргет будет −1 млн. В этом конкретном случае остаток и есть антиградиент функции потерь. Там, где первое дерево занизило цену, новое дерево учится добавлять значение. Там, где завысило, уменьшать. Каждое новое дерево отвечает не на вопрос «сколько стоит квартира?», а на вопрос «какую поправку нужно добавить к уже сделанному прогнозу?» ⚙️
➕ Как деревья собираются в один прогноз? Их предсказания не конкурируют друг с другом, а складываются в композицию. Если первое дерево для квартиры предсказало 10 млн, а второе выучило поправку +1,5 млн, итоговый прогноз после двух деревьев будет 11,5 млн. Если третье дерево добавит ещё +0,3 млн, итог станет 11,8 млн:
итоговый прогноз = прогноз 1-го дерева + поправка 2-го дерева + поправка 3-го дерева + ...
10 млн + 1,5 млн + 0,3 млн = 11,8 млн
На практике к каждой поправке ещё применяется скорость обучения. Например, при learning_rate = 0.1 вклад второго дерева +1,5 млн добавится не целиком, а как +0,15 млн. Так модель учится осторожнее и меньше рискует слишком точно запомнить обучающие данные. 🛡️
После добавления второго дерева прогноз становится точнее, но ошибки всё ещё остаются. Третье дерево смотрит уже на ошибку суммы первого и второго деревьев и ищет следующую полезную поправку. Возможно, оно замечает, что квартиры на верхних этажах без лифта систематически переоценены. Четвёртое, что год постройки тоже важен. Так постепенно возникает композиция: первое дерево улавливает крупную закономерность, следующие добавляют более тонкие исправления. Деревья обучаются последовательно, а не одновременно, потому что для следующей поправки нужно знать, что уже объяснила текущая сумма всех предыдущих деревьев. 🔍
🧠 Почему здесь появляется слово «градиентный»? В задаче с квадратичной ошибкой антиградиент совпадает с остатком, то есть с разницей между фактом и прогнозом. Но это не универсальное правило. В задачах классификации, например при прогнозе дефолта, модель оптимизирует другую функцию потерь. Тогда таргетом следующего дерева становятся псевдоостатки, то есть антиградиенты этой функции. Формулу можно не помнить. Важно понимать идею: каждое новое дерево строит не новый прогноз с нуля, а поправку к уже собранной модели, которая уменьшает выбранную ошибку.
На собеседовании часто говорят: «Градиентный бустинг последовательно исправляет ошибки предыдущих деревьев». Это хорошее начало, но за этой фразой легко спрятать непонимание механики. Главное, что стоит запомнить сразу: таргет второго дерева не равен предсказанию первого дерева. Он показывает, какую поправку нужно внести в это предсказание. В общем случае эта поправка называется антиградиентом функции потерь, то есть направлением, в котором нужно сдвинуть текущий прогноз, чтобы ошибка стала меньше. Именно поэтому бустинг называют градиентным. 💡
🏠 Представим задачу прогноза цены квартиры. У нас есть площадь, район, этаж, год постройки и реальная цена каждой квартиры. Первое дерево обычно очень простое. Например, оно замечает, что квартиры больше 60 квадратных метров в среднем стоят дороже, и выдаёт грубые прогнозы. Для одной квартиры оно предсказало 10 миллионов, хотя настоящая цена была 12 миллионов. Для другой предсказало 8 миллионов вместо 7 миллионов. После первого дерева у нас появляется не только прогноз, но и понимание, где и насколько текущая модель ошибается.
📌 Что становится таргетом второго дерева? Не исходная цена квартиры и не прогноз первого дерева. В простой регрессионной задаче с квадратичной ошибкой это остаток:
таргет второго дерева = факт − прогноз первого дерева
Для квартиры стоимостью 12 млн первое дерево предсказало 10 млн. Значит, таргет второго дерева будет +2 млн. Для квартиры стоимостью 7 млн был прогноз 8 млн, значит таргет будет −1 млн. В этом конкретном случае остаток и есть антиградиент функции потерь. Там, где первое дерево занизило цену, новое дерево учится добавлять значение. Там, где завысило, уменьшать. Каждое новое дерево отвечает не на вопрос «сколько стоит квартира?», а на вопрос «какую поправку нужно добавить к уже сделанному прогнозу?» ⚙️
➕ Как деревья собираются в один прогноз? Их предсказания не конкурируют друг с другом, а складываются в композицию. Если первое дерево для квартиры предсказало 10 млн, а второе выучило поправку +1,5 млн, итоговый прогноз после двух деревьев будет 11,5 млн. Если третье дерево добавит ещё +0,3 млн, итог станет 11,8 млн:
итоговый прогноз = прогноз 1-го дерева + поправка 2-го дерева + поправка 3-го дерева + ...
10 млн + 1,5 млн + 0,3 млн = 11,8 млн
На практике к каждой поправке ещё применяется скорость обучения. Например, при learning_rate = 0.1 вклад второго дерева +1,5 млн добавится не целиком, а как +0,15 млн. Так модель учится осторожнее и меньше рискует слишком точно запомнить обучающие данные. 🛡️
После добавления второго дерева прогноз становится точнее, но ошибки всё ещё остаются. Третье дерево смотрит уже на ошибку суммы первого и второго деревьев и ищет следующую полезную поправку. Возможно, оно замечает, что квартиры на верхних этажах без лифта систематически переоценены. Четвёртое, что год постройки тоже важен. Так постепенно возникает композиция: первое дерево улавливает крупную закономерность, следующие добавляют более тонкие исправления. Деревья обучаются последовательно, а не одновременно, потому что для следующей поправки нужно знать, что уже объяснила текущая сумма всех предыдущих деревьев. 🔍
🧠 Почему здесь появляется слово «градиентный»? В задаче с квадратичной ошибкой антиградиент совпадает с остатком, то есть с разницей между фактом и прогнозом. Но это не универсальное правило. В задачах классификации, например при прогнозе дефолта, модель оптимизирует другую функцию потерь. Тогда таргетом следующего дерева становятся псевдоостатки, то есть антиградиенты этой функции. Формулу можно не помнить. Важно понимать идею: каждое новое дерево строит не новый прогноз с нуля, а поправку к уже собранной модели, которая уменьшает выбранную ошибку.