Постановка задачи

Вы когда-нибудь проводили эксперименты по машинному обучению или глубокому обучению? Вам кажется невозможным следить за всеми гиперпараметрами и сравнивать эксперименты друг с другом? Ничего страшного, если вы исследуете только 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 предоставляет множество функций, которые я не рассмотрел. Я предлагаю вам следовать официальной документации, которая хорошо написана и очень интуитивно понятна.