Black-Box Optimization Challenge, Или Как Подбирать Гиперпараметры Для Моделей

Всем привет! В этом посте я расскажу, как наша команда приняла участие и заняла третье место в Black-Box Optimization Challenge — соревновании по автоматическому выбору параметров для моделей машинного обучения.

Особенность конкурса в том, что алгоритм не знает, какая модель машинного обучения используется, какую задачу она решает и за что отвечает каждый из оптимизируемых параметров.

Звучит как соревнование, в котором нельзя придумать ничего лучше случайного поиска, но существует целый класс алгоритмов для таких задач, о которых мы поговорим под катом.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Меня зовут Никита Сазанович, я студент 2 курса магистратуры» Программирование и анализ данных "в питерской ВШ?.

Три месяца я и моя команда из JetBrains Research участвовали в конкурсе Black-Box Optimization (BBO) и заняли третье место.

В состав команды входили я, Юрий Белоусов и Анастасия Никольская, которые также учатся на степень магистра и руководитель нашей лаборатории Алексей Шпильман Наше решение строит разбиение пространства параметров и оптимизирует некоторую его часть с помощью байесовской оптимизации.

О конкурсе, нашем решении и связанных с ним концепциях мы поговорим в статье.



Что такое ББО

Каждый разработчик, вероятно, сталкивался с концепцией «черного ящика» либо в контексте тестирования «черного ящика», либо в контексте программного обеспечения с закрытым исходным кодом, либо в чем-то еще.

Все эти моменты объединяет то, что в абстракции черного ящика наблюдаются только входные и выходные данные, а сама структура системы представляет собой «черный ящик»:

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Например, при тестировании методом «черного ящика» тесты обычно пишут те, кто не участвовал в написании тестируемого кода и не знает его структуру.

Эти тестировщики руководствуются общими принципами тестирования функциональности программы (граничные случаи для входа, категоризация всех тестовых случаев), не делая никаких предположений о том, как программа может быть реализована.

По аналогии, оптимизация черного ящика должна оптимизировать какую-то модель или вообще функцию.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, который имеет несколько входов

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, и можно наблюдать выходной результат. Что это за модель, для какой задачи мы наблюдаем результат и каковы абстрактные параметры?

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, Мы не знаем.

Например, для линейной регрессии

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

К

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

мы можем определить два параметра: наклон

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

и сдвиг

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

И как функция

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

мы рассчитаем среднеквадратическую ошибку в нашем наборе данных

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

если предположить, что модель выглядит так

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Затем, зная, что модель имеет два реальных параметра, алгоритм оптимизации BBO должен выбрать оптимальный наклон и сдвиг в нашем наборе данных.

Конечно, линейная регрессия имеет оптимальное решение в закрытой форме, и нам не нужно оптимизировать таким образом.

Кроме того, даже если мы решим оптимизировать параметры линейной регрессии, а не находить их в закрытой форме, почему бы нам не использовать градиенты среднеквадратичной ошибки? И это резонный вопрос, ведь если у нас есть возможность находить градиенты для каждого параметра, мы можем оптимизировать классическими методами.

Поэтому BBO в основном используется в тех случаях, когда невозможно вычислить градиент функции потерь по параметрам.

Обычно эти параметры являются гиперпараметрами алгоритмов машинного обучения.

Например, для метода k-ближайших соседей гиперпараметры — это количество рассматриваемых соседей.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

и степень расстояния

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, который используется для определения близости.



конкурс ВВО

Разобравшись, почему и что такое BBO, поговорим о конкуренции.

Black-Box Optimization Challenge был организован разработчиками из таких компаний, как Твиттер , СигОпт , Валохай , Фейсбук и состоялось в рамках конференции НейрИПС 2020 .

Вся информация о конкурсе находится по адресу: https://bbochallenge.com .

Постановка задачи заключалась в следующем.

Проверочный код предлагает какую-то модель машинного обучения, выбирает набор данных и метрику, с помощью которой он будет оценивать наборы гиперпараметров.

Для согласованности, если большее значение метрики соответствует лучшему результату (например, метрика точности), проверочный код вернет отрицание ее значения, так что задачей всегда является минимизация.

На старте вашему алгоритму предоставляется информация о количестве параметров и ограничениях на каждый из них вида

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

— действительное число в диапазоне [0,01, 100],

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

целое число в диапазоне [1, 4], а

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

принимает категориальные значения из набора ['linear', 'poly', 'rbf', 'sigmoid'].

Если вы обучаете данную модель на выбранном наборе данных с предложенными вами параметрами, ваш алгоритм должен предлагать несколько наборов этих параметров, для которых проверочный код будет возвращать значения метрик.

Более того, ваш алгоритм должен предлагать не один, а восемь наборов на каждой итерации, после чего он выдает результаты.

И количество таких итераций (загадал желание -> получил результат -> .

) ограничено 16. То есть всего ваш алгоритм может предложить 128 конфигураций.

Код проверки выставляет вам оценку в зависимости от того, насколько вам удалось уменьшить значение метрики, используя один из предложенных наборов.

Для лучшего понимания давайте посмотрим, как происходит это взаимодействие для решения задачи оптимизации точности классификации рукописных цифр ( описание набора данных ) Древо решений.

В дереве решений выделено шесть параметров, которые описаны в классе sklearn Дерево РешенияКлассификатор :



  • Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    означает максимальную глубину дерева (целое число от 1 до 15);


  • Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    означает минимальное количество в процентах от всех выборок для дальнейшего рассмотрения разбиений данной вершины (действительное число от 0,01 до 0,99);


  • Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    означает минимальное количество в процентах от всех образцов, которое должно быть в любом листе (действительное число от 0,01 до 0,49);


  • Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    означает минимальный вес, который должен быть в любом из листьев (действительное число от 0,01 до 0,49);


  • Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    означает максимальный процент от общего количества признаков, которые мы будем учитывать для одного раздела (действительное число от 0,01 до 0,99);


  • Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    стоит за минимальным уменьшением примеси (числа, используемого для выбора расщеплений) в нашем дереве (действительное число от 0,0 до 0,5).

Рассмотрим несколько итераций взаимодействия (все действительные числа представлены с точностью до 3 знаков после запятой):
  • в __init__ алгоритм получает информацию о 6 параметрах, их типах и диапазонах значений;
  • в первом предложении алгоритм предлагает наборы (значения параметров в порядке представления выше) [5, 0.112, 0.011, 0.010, 0.204, 0.250], [13, 0.144, 0.052, 0.017, 0.011, 0.362], [4, 0.046, 0.077, 0.013, 0.079, 0.075], [8, 0.014, 0.204, 0.072, 0.036, 0.237], [9, 0.985, 0.065, 0.067, 0.015, 0.122], [13, 0.379, 0.142, 0.266, 0.097, 0.313], [15, 0.015, 0.088, 0.142, 0.143, 0.438], [14, 0.461, 0.020, 0.030, 0.613, 0.204];
  • при первом вызове наблюдения получает результаты [-0.107, -0.107, -0.107, -0.107, -0.107, -0.107, -0.107, -0.107];
  • в последнем предложении алгоритм предлагает наборы [9, 0.066, 0.013, 0.031, 0.915, 0.000], [8, 0.024, 0.012, 0.019, 0.909, 0.010], [9, 0.185, 0.020, 0.025, 0.925, 0.005], [15, 0.322, 0.014, 0.024, 0.962, 0.001], [10, 0.048, 0.018, 0.011, 0.939, 0.015], [12, 0.082, 0.017, 0.021, 0.935, 0.006], [7, 0.045, 0.015, 0.027, 0.954, 0.009], [12, 0.060, 0.014, 0.017, 0.921, 0.011];
  • и получает результаты в режиме наблюдения [-0.740, -0.757, -0.614, -0.476, -0.738, -0.747, -0.750, -0.766];
  • В результате код тестирования дает алгоритму оценку 109,78492, которая получается из минимума полученной метрики и ограничений, установленных авторами этого теста.

Обратите внимание, что результаты, которые получает алгоритм, являются отрицанием точности классификации, поскольку любой тест ставит задачу минимизации.

В первой итерации наши предложения достигают точности ~10%, что примерно эквивалентно случайной классификации 10 цифр.

Но на последней итерации точность гораздо выше и достигает 76%.

Вы как участник должны реализовать следующее интерфейс .

Он состоит из описанных выше методов инициализации (__init__), предложения наборов параметров (suggest) и обработки результатов (observe).



Как решить ББО

Одним из самых основных вариантов решения этой проблемы является использование случайного поиска.

Этот метод был базовым, с которым сравнивались все предложенные решения.

Для задачи с двумя параметрами множества, рассматриваемые этим методом, могут выглядеть так:

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Методика довольно проста: мы знаем, сколько параметров и какие значения они принимают. В __init__ мы запоминаем параметры и их диапазоны.

На каждой итерации предложения мы выбираем 8 наборов из диапазонов и предлагаем их.

Обработка результатов нас не интересует, поэтому мы оставляем поле Observe пустым.

Представлена реализация этого метода.

Здесь .

Понятно, что метод далек от оптимального, поскольку мы не учитываем результаты.

Более того, алгоритм может предложить все наши 128 наборов в неоптимальном регионе, и мы никогда не будем пробовать наборы из других регионов.

Однако это уже способ выбора гиперпараметров, а не обучение модели только на первых заданных значениях.

Тем не менее, многие люди связывают поиск гиперпараметров с поиском по сетке.

И это правильное решение проблемы BBO. Поиск по сетке реализован во многих библиотеках.

И, наверное, этому следуют все, кто задумывается об оптимизации гиперпараметров для своей модели.

Вы выбираете для себя параметры, значения которых, по вашему мнению, больше всего влияют на вашу модель, предполагаете для них разумный диапазон и отмечаете в нем несколько значений.

Взяв все возможные комбинации значений этих параметров, вы получите сетку или сетку поиска.

Например, если у вас есть два гиперпараметра и вы определяете три значения для параметра 1 и три значения для параметра 2, вы получите следующую сетку:

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Обучая модель на каждой такой комбинации, вы оставляете лучший результат. В случае с нашим интерфейсом соревнований, в __init__ нам нужно сгенерировать такую сетку на основе описания параметров, а в предложить нам нужно предложить еще не исследованные комбинации.

Метод наблюдения снова остается пустым.

Как использовать результаты, возвращаемые алгоритму? Ведь понятно, что если мы сами последовательно подбираем гиперпараметры, то мы опираемся на результаты.

Давайте попробуем два набора

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

И

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

и на съемочной площадке

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

точность нашей классификации

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

и на съемочной площадке

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Мы небезразличны к таким результатам.

Вероятно, мы больше не будем пытаться обучать нашу модель на параметрах, близких к

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, но мы попробуем что-то близкое к

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Самый популярный способ учета результатов — байесовская оптимизация.

Оптимизация происходит из предположения об исходном распределении значений (априорное), а по мере получения дополнительных результатов перестраивается (апостериорное).

При использовании байесовской оптимизации в BBO чаще всего прибегают к гауссовым процессам.

О них мы поговорим дальше.



Гауссовы процессы

Разберемся в работе гауссовских процессов на примере задачи максимизации функции одной переменной.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Чтобы оптимизировать эту функцию, мы построим суррогатную модель.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, что будет аппроксимировать истинную функцию

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Наша суррогатная модель будет описываться гауссовским процессом.

Ценности

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

будет соответствовать значениям

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

в эти моменты

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, результаты которого нам известны.

Значения в других точках

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

наша модель будет представлять распределения, потому что мы не знаем их наверняка.

При использовании гауссова процесса эти распределения будут нормальными.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Средние оценки

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

и дисперсия

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

получаются из определения гауссовского процесса, который задается значениями в определенных точках и ковариационной матрицей с выбранным ядром.

Более подробно о технике гауссова процесса и нахождении

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

И

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Вы можете прочитать, например, в Википедия .

Нам будет важно использовать его для оптимизации.

Давайте теперь рассмотрим его применение к задаче максимизации функции одной переменной.

После получения отправных точек и построения первой суррогатной модели у нас будет что-то похожее на:

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Здесь пунктирная линия показывает истинную функцию

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, и Solid — оценки среднего значения суррогатной модели

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

На синем фоне можно увидеть оценку отклонения значения от среднего.

Чтобы оптимизировать функцию, нам нужно решить, как мы будем выбирать следующую точку.

Эту стратегию обычно называют функцией приобретения.

Есть много способов выбрать эту функцию.

Наиболее популярными являются вероятность улучшения (PI) и ожидаемое улучшение (EI).

Оба они рассчитываются с использованием текущего оптимума и оценки среднего значения и дисперсии в определенной точке.

На рисунке в качестве следующей точки выбираем точку с максимальной функцией сбора (на рисунке показана зеленым цветом) и предлагаем ее.

Получив результат, мы видим следующее:

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Добавляется новое наблюдение, и максимум функции сбора данных перемещается в другую точку, которую мы затем запрашиваем:

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Оптимизация продолжается таким образом до тех пор, пока мы не достигнем предела итераций или пока наши улучшения не станут незначительными.

Гауссов процесс также обобщается на несколько переменных.

В случае с БВО нам необходимо провести только не максимизацию, а минимизацию, к которой легко перейти.

В результате имеем следующий алгоритм.

В __init__ мы запоминаем наше пространство и преобразуем все переменные в реальные значения.

Далее мы отбираем (используя, например, Выборка латинского гиперкуба ) наборы инициализации для первых нескольких итераций.

При первых звонках на предложение мы предлагаем для инициализации свои подготовленные наборы.

При вызове Observe мы всегда просто сохраняем пары.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

И в дальнейшем предлагаем поступить следующим образом:

  1. Строим гауссов процесс на основе существующих наблюдений

    Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    .

  2. Мы отбираем определенное количество кандидатов

    Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    (в нашем решении

    Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    , Где

    Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    — количество оптимизируемых параметров).

  3. С помощью построенного гауссова процесса вычисляем оценки средних и дисперсий значений кандидатов.

  4. Мы вычисляем функцию приобретения в этих

    Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

    кандидатов и выберите 8 с наибольшими значениями.

  5. Мы возвращаем эти точки в качестве предложений проверяющему коду.

Этот подход уже является надежной основой для задач, в которых нет явных ограничений на количество параметров и/или общее количество итераций.



Наш подход

Поскольку у конкурентов все же было ограничение на количество итераций, и оно было равно 16, что довольно мало, мы решили упростить работу по байесовской оптимизации.

В качестве подхода байесовской оптимизации мы использовали алгоритм TuRBO, который является небольшим ответвлением классических гауссовских процессов.

Основное отличие состоит в том, что оптимизация выполняется в доверительной области (отсюда и название «Байесовская оптимизация доверительной области»).

Кому интересно, можете прочитать оригинальная статья или код от организаторов конкурса.

Важной частью нашего решения было построение разбиения пространства гиперпараметров.

Идея состоит в том, что если мы каким-то образом ограничим все пространство допустимых значений, то байесовской модели будет легче получить хорошие результаты за такое небольшое количество итераций.

В примере с методом k-ближайших соседей, если мы с помощью какого-то метода обучения поймем, что хорошее решение находится в подпространстве, где

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

И

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, то, имея меньше места (а иногда и больше измерений), наша байесовская модель будет более точной.

Вот как работает этот обучаемый метод. Каждые 4 итерации (то есть не более 4 раз, так как всего итераций у нас 16) мы перестраиваем разбиение всего пространства параметров.

Перестроим раздел на итерации

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

(от 1 до

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

), и у нас есть набор наблюдений

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

который состоит из запрошенных нами баллов и результатов

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, .

,

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, Где

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Мы рекурсивно делим текущий набор наблюдений на левое и правое поддеревья.

Разделение выглядит следующим образом:

  1. Мы используем метод k-средних, чтобы разделить наши наблюдения на 2 кластера на основе значения метрики, которую мы пытаемся минимизировать.

    Под 1-м кластером мы подразумеваем точки с меньшим средним значением метрики, а под 2-м кластером – с большим.

  2. Используя эти метки кластера, мы обучаем модель SVM, которая будет классифицировать точки в кластер 1 или 2. Мы знаем метки текущих точек и обучаем модель на них.

  3. Поскольку модель не всегда может идеально аппроксимировать метки, наша модель SVM может классифицировать существующие точки иначе, чем назначенные им кластеры.

    Поэтому для каждой точки мы пересчитываем ее кластер относительно SVM, и все точки с прогнозом 1 отправляются в левое поддерево, а все точки с прогнозом 2 — вправо.

Мы продолжаем этот процесс рекурсивно, пока не достигнем максимальной глубины.



Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, или количество точек в какой-то вершине станет недостаточным для инициализации байесовской модели в будущем.

Выполняя этот метод, мы получаем дерево, листья которого содержат некоторые наборы точек, а вершины с дочерними элементами содержат модели SVM (критерии разделения).

Учитывая некоторую случайную точку, мы можем однозначно связать ее с областью нашего дерева, пройдя по этому дереву от корня к листу.

Что более важно в этом разделе, так это то, что если мы хотим оптимизировать нашу функцию, то все листья в левом поддереве будут «более перспективными» в этом отношении, чем листья в правом поддереве (поскольку мы отправили влево точки, которые соответствовал кластеру с меньшим средним значением метрики).

Затем, после построения такого разбиения, мы выбираем область, соответствующую крайнему левому листу, и проводим там байесовскую оптимизацию до следующей перестройки.

Например, рассмотрим такой раздел и работу TuRBO для модели SVM, которая имела выделено три параметра: коэффициент регуляризации

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

, параметр ядра

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

и эпсилон для критерия остановки

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

.

Три параметра образуют трехмерное пространство.

После разделения пространства можно выделить две области: точки, лежащие на крайнем левом листе (зеленые) и все остальные (красные).

Вот как это выглядит:

Black-Box Optimization Challenge, или как подбирать гиперпараметры для моделей

Здесь темно-зеленым отмечена доверительная область TuRBO, и именно в ней строится гауссов процесс.

Черным цветом обозначены 8 точек, которые наш алгоритм вернет из предложения в рассматриваемой итерации.



Заключение

Все остальные технические подробности нашего решения можно найти в наша статья .

И код был опубликован на GitHub .

В этой статье мы рассказали об оптимизации черного ящика, конкурсах по этой теме, общих подходах к решениям и особенностях нашего алгоритма, занявшего третье место в этом конкурсе.

Если вы хотите попробовать такие алгоритмы, вам очень поможет исходный код от авторов конкурса.

Вы можете запустить базовые решения, следуя инструкциям в этот репозиторий .

Теги: #Машинное обучение #Алгоритмы #Образовательный процесс в ИТ #машинное обучение #оптимизация #черный ящик #ВШ? #конкурсы по машинному обучению #Санкт-Петербург.

Петербургская башня

Вместе с данным постом часто просматривают: