[МУЗЫКА] Здравствуйте. Мы начинаем изучение 9-ой недели нашего курса. В прошлый раз, на прошлой неделе мы подробно обсудили идею бэггинга, где строится много немножко разных моделей, и они усредняются. Мы говорили о плюсах и минусах, а сейчас переходим к изучению другого подхода к построению композиции — к бустингу. Мы обсудим, что такое градиентный бустинг, один из основных на сегодняшний день подходов в этом варианте, и как он применяется к решающим деревьям. Вроде бы небольшой план, но на самом деле это довольно сложный в плане объяснения и понимания подход, поэтому мі уделим ему очень много времени. Итак, напомню про бэггинг. В бэггинге мы строим много базовых моделей, которые имеют одинаковую структуру, на при этом обучаются с некоторым элементом случайности. Например, они строятся на разных подвыборках объектов, или, может быть, вносим какую-то еще случайность вроде рандомизации по признакам в каждой вершине дерева,как в случайном лесе. Ну, думаю, вы помните, как это было устроено. И мы обсудили важную концепцию разложения ошибки на смещение и разброс. Мы обсуждали, что ошибка модели, ошибка метода обучения даже, складывается из трех компонент, на одну из которых, на шум, повлиять нельзя, — это свойство задач и свойство данных. А на две повлиять можно выбором того, какие модели мы строим, — это смещение и разброс. Смещение показывает, насколько модель сильна, насколько она в состоянии подогнаться под нашу задачу, а разброс показывает, насколько модель устойчива к изменениям в данных. Если модель может сильно поменяться при небольшом изменении обучающей выборки, то разброс будет большой. А если мы как-то меняем обучающую выборку, генерируем ее заново из того же распределения, например, а модель меняется не сильно, то разброс будет маленький, как в случае с линейными моделями. И мы обсудили, что бєггинг не меняет смещение базовых моделей, то есть если базовые модели, отдельные модели, в композиции были сильно смещенными, то композиция тоже будет сильно смещенной. И наоборот, если базовые модели сильные, мощные, могут подстроиться под сложную выборку, то и композиция будет такой же. А разброс, как мы осуждали, уменьшается в бэггинге в N раз, но с поправкой связь, на ковариацию между моделями. Если модели очень похожи друг на друга, то разброс почти не уменьшится. Если модели независимы, то есть по тому, как ошибается одна модель, нельзя предсказать, где ошибется другая модель, то разброс будет уменьшаться сильно. Вот такая схема. В итоге, посмотрев на эти факты про смещение и разброс, мы поняли, что в качестве базовых моделей нужно брать глубокие решающие деревья, потому что у них будет низкое смещение, и дальше мы устраивали процесс их обучения так, чтобы разброс уменьшался посильнее. Мы вносили случайность в обучение деревьев и так далее. Ну и покажу, напомню некоторые картинки, которые мы с вами уже видели. Вот так устроено отдельное дерево, довольно глубокое, на такой несложной регрессии. Одна синяя кривая — это одно дерево, и видно, что они в среднем угадывают закономерность, но при этом довольно сильно могут меняться в зависимости от того, на каких объектах мы обучаемся. А вот так выглядит эта же картинка для бэггинга. Здесь одна кривая — это один случайный лес, построенный как раз с помощью вот этого усреднения разных моделей, ну и видно, что разброс куда меньше. Действительно, смещение такое же, хорошо в среднем описывается закономерность, но при этом модели отдельніе куда больше похожи друг на друга. Что плохого в таком подходе? Ну тут, наверное, две очевидных проблемы. Проблема первая. Если так выйдет, что базовая модель все-таки смещена, например, мы можем решить, что мы строим глубокие решающие деревья, но при этом данных у нас не очень много, и мы не можем построить дерево, которое использует все признаки. А задача может быть такой, что нам нужно использовать все признаки в одной модели, чтобы качество получилось высоким. Так вот. Если базовая модель оказалась смещенной, то и вся композиция будет смещенной, а такой может случиться даже если мы используем глубокие решающие деревья. Ну а вторая проблема куда более приземленная. Базовые модели в бэггинге — это обычно, как я уже не раз сказал на этом слайде, — глубокие решающие деревья. Их долго обучать, поскольку в каждой вершине нам нужно перебрать все доступные предикаты, и таких вершин будет много в глубоком дереве. Долго применять. Опять же, если дерево глубокое, нужно пройти, проверить предикаты, дойти до какого-то листа, и в конце концов, дорого хранить. Если дерево большое, у него много предикатов, много параметров, их нужно держать в памяти, а это тоже требует ресурсов. В общем, бэггинг хорош, это универсальный метод, как мы обсуждали, у него почти нет гиперпараметров, но все-таки он довольно трудозатратный. Ну и может получиться, что бэггинг не в состоянии исправить проблемы одной базовой модели, если она уже смещенная. В бустинге предлагается все делать иначе. Давайте мы решим, что будем использовать простые базовые модели, скажем, неглубокие решающие деревья, деревья глубины там три или четыре, может быть, или два, или даже один, но строить композицию будем последовательно и жадно. Что это означает? Допустим, мы уже построили N моделей, мы их зафиксируем, и менять больше не будем. А N плюс первую модель построим так, чтобы ее добавление в композицию как можно сильнее уменьшило ошибку. То есть, по сути, мы будем строить каждую следующую модель так, чтобы она корректировала ошибку уже построенной композиции. Идея хорошая. Давайте попробуем это в какие-то формулы перевести. Вид композиции будет почти такой же как в бэггинге. Саму композицию из N модели будем обозначать как aN(x), N означает количество базовых моделей, и она будет устроена как сумма bn до одного bN bn(x), где bn-ое — это n-ая базовая модель. В бэггинге было то же самое, только мы еще делили на N, мы там усредняли выходы этих моделей, а здесь это будет просто сумма. Итак, для первой модели, наверное, все понятно, Когда мы строим первую модель в композиции, мы еще не думаем про собственно саму композицию, мы строим модель, как можем. То есть, просто минимизируем функционал ошибки на обучающей выборке. Это типичная задача машинного обучения, с которой мы на раз сталкивались, и понимаем, как ее решать с помощью самых разных классов моделей. Дерево тоже можно обучить на эту задачу. Итак, допустим, вы построили первую модель, давайте даже считать, что мы построили N-1 модель, будем действовать по индукции, как говорят математики. Уже построили N-1 модель, и у нас композиция aN-1. Тогда задача обучения N-ой базовой модели будет выглядеть вот так. Давайте посмотрим внимательно. Мы суммируем по всем объектам, считаем функцию потерь между yi, правильным ответом на i объекте и суммой уже построенной композиции aN-1(xi) и новой модели bN(xi). При этом, как я говорил, мы строим жадно. Это означает, что на этом шаге мы считаем все модели с 1-ой до N-1 фиксированными, мы в них больше не вносим никаких корректировок, и все, что мы делаем все, что мы обучаем, — это N-ая базовая модель. bn(x). Вот в этой задаче есть некоторая трудность, которая заключается вот в этом выделенном красном слагаемом, а точнее аргументе. В принципе, если бы мы в качестве bN-ого брали какие-то дифференцируемые модели, например, линейную модель, то в чем проблема? Есть функционал, можно посчитать производные его по параметрам bn-ого, считаем, делаем градиентный спуск. Там было бы все просто. Но вот с деревьями не очень понятно, что делать. Если мы берем в качестве bn-ого решающее дерево, то получается, что там нужно как-то разбивать каждую вершину в этом дереве так, чтобы после этого разбиения это дерево в качестве добавки к уже построенной композиции уменьшало ошибку. Но ведь все, что мы умеем делать, — это считать энтропию, скажем, или еще какие-то меры хаотичности, как мы их называли. И не очень понятно, как в них учесть, что это не отдельное дерево, а это просто добавка к каким-то еще моделям. Это сложно. И вот поэтому здесь нам придется сейчас крепко задуматься о том, как эту задачу свести к другой, более подходящей, более простой для решающих деревьев. Этим мы и будем заниматься всю нашу 9-ю неделю. Итак, мы обсудили проблему бэггинга и решили, что будем пробовать другой подход, — бустинг, в котором модели обучаются последовательно и так, чтобы каждая следующая была хорошей корректировкой к уже предыдущим. Ну и это не просто, получается довольно сложная задача, и в следующих видео мы будем выяснять, как эту задачу упростить. [МУЗЫКА]