Этот блог-пост основан на опубликованной статье в KDD 2023. Вы можете получить доступ к публикации и коду для получения более подробной информации.

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

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

Чтобы достичь наилучшей производительности, нам нужно выполнить поиск по набору всех возможных конвейеров, также известному как пространство поиска. Однако его размерность велика из-за почти безграничного выбора дизайна. Рассмотрим конвейер, как показано выше, с четырьмя этапами, каждый из которых имеет только 2 возможных алгоритма с одним бинарным гиперпараметром. Эта небольшая установка создаст пространство поиска размерности, но оно экспоненциально растет по мере того, как рассматриваются более гибкие конвейеры. Что, если мы выполним поиск по пространству вложений, которое лучше отражает сходство между конвейерами? Наш метод DeepPipe создает это пространство для встраивания и выполняет в нем конвейерный поиск!

Мы хотим создать сеть, которая берет конвейер x в исходном пространстве с высоким уровнем и проецирует его в пространство вложения ϕ(x), где аналогичные трубопроводы находятся близко друг к другу. Как мы можем построить такую ​​сеть? Мы можем построить его двумя способами: используя предположения и предварительные знания о проблеме, также известные как индуктивные предубеждения, или используя метаданные.

Встраивание сети с помощью индуктивных смещений

Какие индуктивные предубеждения относительно конвейеров мы можем закодировать в архитектуре? Распространенным априорным предположением является то, что если два конвейера имеют схожие компоненты, т. е. один и тот же алгоритм масштабирования или оценки признаков, то их следует считать похожими. Хороший рецепт реализации этого предположения в сетевой архитектуре — использование отдельных сетей меньшего размера для каждого этапа. Во-первых, возьмите сеть прямой связи, чтобы отдельно встроить гиперпараметры каждого алгоритма, и введите объединение этих вложений гиперпараметров во вторую сеть прямой связи. Все это при условии, что на каждом этапе активен только один алгоритм. Набор уровней, состоящий из сетей, включающих гиперпараметры, называется уровнями кодировщика, а последняя часть архитектуры формируется уровнями агрегации.

Встраивание сети через метаобучение

Хотя наши предположения вполне обоснованы, использование метаданных производительности конвейера в аналогичных задачах [1] может дать дополнительную информацию. Как мы можем использовать эти метаданные о производительности в похожих задачах? Во-первых, мы хотим узнать метрику подобия, чтобы похожие пайплайны лежали ближе в пространстве встраивания. Для этой цели мы используем метод, предусмотренный для глубокого обучения ядра [2] (DKL) и гауссовых процессов, который также использовался для оптимизации гиперпараметров отдельных алгоритмов [3]. В частности, мы используем производительность (например, точность проверки) для изучения ядра k(xi,xj)∈[0,1], который выводит высокое значение, если конвейеры xi,x jподобны. Но как мы можем узнать, похожи ли два конвейера, учитывая метаданные? Два конвейера должны быть похожи, если они одинаково работают в одних и тех же задачах! Учитывая, что у нас есть T задач, мы получаем параметры сети и гауссовского процесса γ,θ, максимизируя предельное правдоподобие метаданных. Для каждой задачи t он применяет матрицу ядра к оцененным конвейерам K и производительности конвейера как y.

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

Оптимизация конвейера с помощью DeepPipe

Создав сеть встраивания, мы можем использовать ее для исследования пространства встраивания и поиска высокопроизводительных конвейеров для новой задачи. Процедура выполняет байесовскую оптимизацию 4 с использованием сети встраивания и гауссовского процесса, также называемого гауссовским процессом глубокого ядра. Детальное объяснение процесса выходит за рамки, но мы изобразим ниже интуицию процесса. Вначале мы наблюдаем реальную производительность некоторых случайных конвейеров. Используя Deep Kernel, мы прогнозируем производительность ненаблюдаемых конвейеров и выявляем области (потенциально) высокопроизводительных конвейеров (красные и зеленые конвейеры). Однако нам также необходимо сбалансировать неопределенность в наших прогнозах, поскольку они могут быть неверными для трубопроводов, расположенных далеко от наблюдаемых (красный цвет), в то время как у нас больше уверенности в производительности определенных трубопроводов (зеленый цвет).

Установка и использование

Вы можете попробовать DeepPipe для оптимизации конвейеров Scikit-Learn, установив наш API. Более подробную информацию об экспериментах можно найти в нашей кодовой базе.

conda create -n deeppipe_env python==3.9
pip install deeppipe_api

Вот пример того, как оптимизировать конвейеры scikit-learn для задачи OpenML.

from deeppipe_api.deeppipe import load_data, openml, DeepPipe

task_id = 37
task = openml.tasks.get_task(task_id)
X_train, X_test, y_train, y_test = load_data(task, fold=0)
deep_pipe = DeepPipe(n_iters = 50,  #bo iterations
                    time_limit = 3600 #in seconds
                    )
deep_pipe.fit(X_train, y_train)
y_pred = deep_pipe.predict(X_test)

#Test
score = deep_pipe.score(X_test, y_test)
print("Test acc.:", score)

#print best pipeline
print(deep_pipe.model)

Краткое содержание

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

Рекомендации

[1] В этом контексте задача — это проблема машинного обучения и набор данных. Например, предсказание класса в наборе данных Iris или бинарная классификация в наборе данных Titanic — это две разные задачи.

[2] Глубокое изучение ядра

[3] ФСБО

[4] Сообщение в блоге о байесовской оптимизации