Постановка задачи
Вы когда-нибудь проводили эксперименты по машинному обучению или глубокому обучению? Вам кажется невозможным следить за всеми гиперпараметрами и сравнивать эксперименты друг с другом? Ничего страшного, если вы исследуете только 2–3 варианта моделей. Что делать, если есть 100+ вариантов? Это другая история. Как член группы инженеров-исследователей ИИ в Wisesight, мы проводим от десяти до сотен экспериментов с машинным обучением. Итак, чтобы эффективно общаться и сотрудничать с другими членами команды, мы используем Weights & Biases, который представляет собой структуру регистрации данных, созданную для отслеживания проекта ML.
Что такое веса и отклонения
Weights & Biases (WandB) – это пакет Python для специалистов по машинному обучению, который позволяет отслеживать эксперименты машинного обучения в режиме реального времени, визуализировать и сотрудничать с командой через панель управления, управление версиями набора данных и модели с помощью артефакта, визуализация и изучение набора данных с помощью таблиц, и проводить эксперименты по оптимизации гиперпараметров с помощью проверок. Кроме того, этот инструмент обеспечивает простую интеграцию со многими популярными платформами глубокого обучения. Для получения дополнительной информации, пожалуйста, посетите его официальный сайт: Weights & Biases.
Цель этого блога
В этом блоге я собираюсь показать вам, как использовать журнал experiment для отслеживания экспериментов ML и проверок для провести оптимизацию гиперпараметров с помощью Pytorch, моей любимой среды глубокого обучения. Хватит болтать, давайте займемся кодированием.
Настройка
Прежде всего, вам необходимо зарегистрироваться. Затем выполните следующие действия.
# Step 1: Install WandB pip install wandb # Step 2: Login wandb login # Step 3: Paste the API-key # You can get this API-key from setting menu in WandB website.
Давайте запачкаем руки!!
Вы можете выполнить все шаги с помощью этого блокнота Google Colab.
Загрузка набора данных
В этом уроке я собираюсь использовать сверточную нейронную сеть (CNN) для классификации изображений из наборов данных CIFAR-10. Это простая задача, но хороший пример демонстрации WandB.
Сначала я создам экземпляр torchvision.transforms
и использую этот процессор для преобразования изображений в torch.tensor
и нормализую каждый канал со средним значением и стандартным отклонением, равным 0,5.
Создание нашей сети
Я не буду вдаваться в детали архитектуры модели. Вкратце, я буду использовать CNN и полносвязные слои для кодирования изображения, которое будет классифицировано. Модель реализована, как показано ниже.
# Model Architecture >>> CifarClassifier( (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1)) (max_pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1)) (linear1): Linear(in_features=400, out_features=120, bias=True) (linear2): Linear(in_features=120, out_features=128, bias=True) (linear3): Linear(in_features=128, out_features=10, bias=True) (flatten): Flatten(start_dim=1, end_dim=-1) (cross_entropy_loss): CrossEntropyLoss() )
Обучение моделей
Это самая важная часть. Перед обучением модели необходимо создать экземпляр WandB с помощью wandb.init()
.
После этого мы можем зарегистрировать любое значение, которое захотим, используя wandb.log()
. Подробнее об этом методе можно узнать по этой Ссылке. В этом эксперименте мы будем регистрировать train_f1_score
test_f1_score
для каждой эпохи обучения. Для этого класс Trainer
реализуется, как показано ниже.
Теперь давайте проведем несколько экспериментов с использованием этого скрипта. Единственный гиперпараметр, который я собираюсь изменить, это config.num_train_epochs
. Давайте посмотрим, как это значение влияет на производительность модели.
Визуализируйте эксперименты
Пока модель в настоящее время обучается, мы можем проверить зарегистрированные значения в режиме реального времени, щелкнув ссылку Выполнить при запуске цикла обучения.
Кроме того, мы можем сравнить несколько экспериментов в одном проекте. В этом проекте я хочу увидеть влияние num_train_epochs
на test_f1_score
, который меня интересует. Чтобы просмотреть сравнение, нажмите Ссылка на проект, чтобы просмотреть все эксперименты, которые проводились под одним и тем же названием проекта.
Сравнивая эти эксперименты, мы можем подтвердить, что увеличение num_train_epochs
ухудшает производительность модели.
Раньше мы вручную настраивали только «один» гиперпараметр — num_train_epochs
. На самом деле мы хотели бы настроить каждый гиперпараметр одновременно. Представьте, если вам придется делать это вручную. Все выйдет из-под контроля очень быстро, верно? К счастью, WandB предоставляет функцию под названием sweeps, которая помогает нам автоматически настраивать гиперпараметры всего несколькими строками кода. Продолжим это в следующем разделе.
Оптимизация гиперпараметров
Чтобы провести зачистку, мы должны сообщить агенту зачисткиКАК,используя конфигурацию зачистки. Формат Dict
разверток следующий:
sweep_config = { "method": <type_of_search>, # sweep method "metric": { "name": <interest_metric>, # name of the value to optimize "goal": <maximize/minimize>, # specify minimize or maximize } "parameters": <hyperparams_space> }
Конфиг может быть в json
или ymal
или Dict
. Для более подробной информации посетите это
Прежде всего, давайте создадим экземпляр sweep_config
. В этом уроке я собираюсь подметать random
и хочу максимизировать test_f1_score
.
Затем давайте перечислим наши гиперпараметры, которые мы хотим настроить, и создадим пространство поиска гиперпараметров, из которого мы хотим, чтобы агент очистки получал значения.
Из предыдущего эксперимента мы обнаружили, что увеличение num_train_epochs
ухудшает работу нашей модели. В этом hyperparams_space
мы собираемся ограничить его только 15. После этого добавим этот hyperparams_space
к другому ключу sweep_config
. Собрав все вместе, мы получаем это.
После того, как мы получили sweep_config
, теперь мы можем создать экземпляр развертки, используя
Теперь давайте реализуем функцию вызова агентом для оптимизации гиперпараметров. Я назову эту функцию start_sweep
.
Чтобы начать развертку, выполните следующую команду
После завершения sweeps
вы можете перейти на страницу своего проекта на сайте Weights & Biases и перейти в меню Sweeps, чтобы просмотреть результат подметания.
Теперь наша модель больше не черный ящик, теперь мы можем понять, как изменение гиперпараметров влияет на производительность модели, и найти лучший из них, который подходит для нашего приложения.
Дальнейшее чтение
Weights & Biases предоставляет множество функций, которые я не рассмотрел. Я предлагаю вам следовать официальной документации, которая хорошо написана и очень интуитивно понятна.