Введение в случайный поиск

Подбор гиперпараметров в Python

Alex Scriven

Data Scientist

Что вы уже знаете

 

Очень похоже на поиск по сетке:

  • Задайте оценщик, настраиваемые гиперпараметры и диапазон значений для каждого из них.
  • Схема кросс-валидации и метрика качества задаются так же

 

НО вместо этого мы случайно выбираем ячейки сетки.

Подбор гиперпараметров в Python

Почему это работает?

Bengio & Bergstra (2012):

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

Две основные причины:

  1. Не все гиперпараметры одинаково важны
  2. Небольшой трюк из теории вероятностей
Подбор гиперпараметров в Python

Трюк из теории вероятностей

Поиск по сетке:

Сетка 10x10 различных моделей

Сколько моделей нужно обучить, чтобы с вероятностью 95% попасть в одну из зелёных ячеек?

Лучшие модели:

Сетка 10x10 различных моделей

Подбор гиперпараметров в Python

Трюк из теории вероятностей

 

При равномерном случайном выборе комбинаций гиперпараметров рассмотрим вероятность того, что мы промахнёмся на каждой итерации — и убедимся, насколько это маловероятно

  • Итерация 1 = вероятность успеха 0,05 и (1 - 0,05) — промаха

    • Итерация 2 = (1-0,05) x (1-0,05) — промах оба раза
      • Итерация 3 = (1-0,05) x (1-0,05) x (1-0,05) — снова промах
  • При n итерациях вероятность промаха на каждой из них равна (1-0,05)^n.

Подбор гиперпараметров в Python

Трюк из теории вероятностей

 

Итак, сколько итераций нужно, чтобы с высокой вероятностью (95%) попасть в нужную область?

  • Вероятность полного промаха равна (1-0,05)^n.
  • Значит, вероятность попадания равна (1 − вероятность промаха), то есть (1-(1-0,05)^n)
  • Из неравенства 1-(1-0,05)^n >= 0,95 получаем n >= 59
Подбор гиперпараметров в Python

Трюк из теории вероятностей

 

Что это означает на практике?

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

Важные замечания

 

Важно помнить:

  1. Максимум ограничен заданной сеткой!

  2. Для честного сравнения со сеточным поиском используйте одинаковый «бюджет» на обучение моделей

Подбор гиперпараметров в Python

Формирование случайной выборки гиперпараметров

Можно вручную сформировать случайную выборку комбинаций гиперпараметров:

# Set some hyperparameter lists
learn_rate_list = np.linspace(0.001,2,150)
min_samples_leaf_list = list(range(1,51))
# Create list of combinations
from itertools import product
combinations_list = [list(x) for x in 
                    product(learn_rate_list, min_samples_leaf_list)]
# Select 100 models from our larger set
random_combinations_index = np.random.choice(
                            range(0,len(combinations_list)), 100, 
                            replace=False)
combinations_random_chosen = [combinations_list[x] for x in 
                            random_combinations_index]
Подбор гиперпараметров в Python

Визуализация случайного поиска

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

График покрытия случайного поиска

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

Подбор гиперпараметров в Python

Давайте потренируемся!

Подбор гиперпараметров в Python

Preparing Video For Download...