Закажи экспресс-аудит своего дела онлайн всего за 199 ₽
и получи рекомендации по улучшению - Жми сюда !

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

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

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

# Введение

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

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

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

# Визуализация градиентов, функций потерь и эмбеддингов

// Кривые потерь

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

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

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

Красная пунктирная линия отмечает точку начала расхождения: в реальном эксперименте именно с этой точки следует начинать исследование регуляризации или ранней остановки.

import torch import torch.nn as nn import matplotlib.pyplot as plt model = nn.Sequential(nn.Linear(16, 16), nn.Tanh(), nn.Linear(16, 16), nn.Tanh(), nn.Linear(16, 1)) grad_magnitudes = {} def grad_hook(name): def hook(module, grad_input, grad_output): grad_magnitudes[name] = grad_output[0].abs().mean().item() return hook for i, layer in enumerate(model): layer.register_backward_hook(grad_hook(f»Layer {i}»)) output = model(torch.randn(32, 16)) output.mean().backward() plt.bar(grad_magnitudes.keys(), grad_magnitudes.values()) plt.title(«Средняя величина градиента на слой») plt.ylabel(«Средний |градиент|») plt.xticks(rotation=15) plt.tight_layout() plt.show()

Результат выполнения:

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

// Исходные значения величины градиента

Слой 4 (линейный): 0,031250 Слой 3 (Tanh): 0,004646 Слой 2 (линейный): 0,004241 Слой 1 (Tanh): 0,002126 Слой 0 (линейный): 0,001631

Диаграмма читается справа налево: слой 4 представляет собой выходной слой, а слой 0 — первый. Выходной слой получает градиент 0,031, но к моменту достижения слоя 0 это число уменьшается до 0,0016 — примерно в 20 раз меньше.

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

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

// Визуализация градиента

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

Функция `register_backward_hook` в PyTorch позволяет получать тензоры градиентов из любого слоя без изменения цикла обучения. Мы подключаем хук к модулю, который активируется во время каждого обратного прохода, отправляя тензоры градиентов в указанную функцию обратного вызова.

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

Код для этого можно найти здесь .

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

В здоровой нейронной сети мы ищем гистограммы по слоям с примерно одинаковым распределением значений.

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

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

// Встраивания

Когда модель сопоставляет входные данные с изученным представлением, визуализация этого представления позволяет определить, разделяет ли модель данные так, как мы ожидаем. Наиболее распространенный подход заключается в том, чтобы взять эмбеддинги из обученной (или частично обученной) модели, уменьшить их размерность с помощью t-SNE или UMAP и отобразить их на графике с метками классов в виде цветов.

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

# TensorBoard и его альтернативы

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

// TensorBoard

TensorBoard — это стандартная отправная точка. Изначально разработанный для TensorFlow , он работает с PyTorch через torch.utils.tensorboard. Данные можно записывать в лог с помощью объекта SummaryWriter, а результаты можно просматривать во вкладке браузера. Он обрабатывает скалярные значения (функция потерь, точность), гистограммы (распределение весов и градиентов), изображения и проектор встраивания для визуализации многомерных представлений.

Главное ограничение — это его локальность. Для обмена результатами с командой необходимо настроить общее хранилище для файлов журналов или использовать TensorBoard.dev, который имеет ограничения по поддерживаемым функциям.

// Веса и смещения

Weights & Biases (W&B) — это инструмент, который большинство команд, занимающихся машинным обучением, используют для совместной работы или более детального отслеживания.

Настройка выполняется всего двумя строками кода: wandb.init() в начале запуска и wandb.log() внутри цикла обучения. Все данные автоматически синхронизируются с облачной панелью мониторинга, а запуски группируются по проектам, что упрощает сравнение результатов экспериментов.

Ознакомьтесь с приведенным ниже фрагментом кода:

import wandb wandb.init(project=»my-model», config={«lr»: 0.001, «epochs»: 20, «batch_size»: 32}) for epoch in range(wandb.config.epochs): train_loss = 1 / (1 + 0.3 * epoch) # смоделированная val_loss = train_loss + max(0, 0.04 * (epoch — 10)) # смоделированная wandb.log({«epoch»: epoch, «train_loss»: train_loss, «val_loss»: val_loss}) wandb.finish()

После завершения выполнения зарегистрированные метрики можно просмотреть на панели мониторинга W&B вместе с конфигурацией, которая их создала. Сравнение двух запусков с разными параметрами легко осуществить, выбрав их в интерфейсе, без необходимости ручного анализа логов.

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

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

// Священное

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

Что касается визуализации, Sacred работает в паре с такими интерфейсами, как Omniboard или Sacredboard. Это усложняет задачу по сравнению с TensorBoard или W&B, но преимущество заключается в возможности аудита: любой запуск из прошлого можно воспроизвести в точности так, как он был настроен.

// Guild.ai

Guild.ai работает из командной строки и не требует изменения кода обучения. Мы запускаем скрипт обучения через Guild с помощью команды `guild run train.py`, которая записывает все логи, созданные скриптом, а также любые выходные файлы, связывая их с конкретным запуском. Метрики и сравнение результатов доступны через интерфейс командной строки (CLI) Guild или его локальный пользовательский интерфейс.

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

# Использование точек останова и хуков для вычислений в машинном обучении

// Крючки вперед и назад

Система перехвата PyTorch позволяет перехватывать вычисления в любой точке прямого или обратного прохода модели. Функция register_forward_hook прикрепляет обратный вызов к любому слою, и он срабатывает каждый раз, когда этот слой обрабатывает пакет данных. Обратный вызов захватывает входные и выходные тензоры слоя, которые затем можно записывать в лог, проверять на наличие значений NaN или строить графики.

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

Практическое применение — обнаружение значений NaN. Функция перехвата, которая вычисляет tensor.isnan().any() на выходе каждого слоя, немедленно обнаруживает численную нестабильность, предотвращая её распространение и повреждение остальной части обучающей выборки.

Вот минимальный рабочий пример, использующий трехслойную модель с прикрепленным к каждому слою хуком:

import torch import torch.nn as nn model = nn.Sequential(nn.Linear(8, 16), nn.ReLU(), nn.Linear(16, 4)) def nan_hook(layer, input, output): if output.isnan().any(): print(f»[NaN detected] Layer: {layer.__class__.__name__}») else: print(f»[Clean] Layer: {layer.__class__.__name__}, output shape: {tuple(output.shape)}») for layer in model: layer.register_forward_hook(nan_hook) print(«— Normal input —«) model(torch.randn(2, 8)) print(«n— Corrupted input —«) bad_input = torch.randn(2, 8) bad_input[0, 3] = float('nan') модель(bad_input)

Ожидаемый результат выполнения:

— Обычный вход — [Чистый] Слой: Линейный, форма выходных данных: (2, 16) [Чистый] Слой: ReLU, форма выходных данных: (2, 16) [Чистый] Слой: Линейный, форма выходных данных: (2, 4) — Испорченный вход — [Обнаружено NaN] Слой: Линейный [Обнаружено NaN] Слой: ReLU [Обнаружено NaN] Слой: Линейный

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

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

// Точки останова отладчика

Стандартные отладчики Python отлично работают внутри циклов обучения.

Удаление вызова import pdb; pdb.set_trace() в любой момент приостанавливает выполнение и вызывает интерактивную подсказку, которая позволяет изучить формы тензоров, убедиться, что предварительная обработка данных не привела к неожиданным значениям, и вручную пройтись по прямому проходу.

Большинство сред разработки машинного обучения — как VSCode, так и PyCharm — позволяют устанавливать точки останова графически и просматривать тензоры в отдельной панели, предлагая более быструю альтернативу интерфейсу pdb в терминале.

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

# Заключение

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

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

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

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

Встраивание визуализаций показывает, насколько хорошо модель обучается разделению данных. TensorBoard, W&B, Sacred и Guild.ai по-разному обрабатывают логирование и отслеживание, но все они служат одной цели: сделать историю экспериментов доступной для поиска и сравнения, а не разрозненной. Наконец, хуки и отладчики идут еще дальше и позволяют приостанавливать и проверять фактические тензоры, проходящие через сеть на любом слое.

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

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

Источник: www.kdnuggets.com

✅ Найденные теги: Визуальной, Инструменты, новости, Отладки, Процессов, Рабочих

Добавить комментарий

Новости других рубрик

Архив рубрики ~Лента новостей~: Продолжаем уроки диванной антропологии Архив рубрики ~Лента новостей~: SK hynix продемонстрировала решение iHBM для охлаждения стеков памяти HBM Архив рубрики ~Лента новостей~: Индийский фриланс в образовательных целях: стартап Human Archive использует роботов для обучения Архив рубрики ~Лента новостей~: Небольшие модели, большие результаты: Достижение превосходного извлечения намерений посредством декомпозиции Архив рубрики ~Лента новостей~: Как ускорить распознавание объектов нейросетями среди множества классов, не жертвуя памятью и точностью Архив рубрики ~Лента новостей~: OpenAI открывает лабораторию искусственного интеллекта в Сингапуре, поскольку IMDA обновляет структуру искусственного интеллекта Архив рубрики ~Лента новостей~: Колония на Марсе и предупреждения о Grok: пять странных деталей в презентации SpaceX для инвесторов. Архив рубрики ~Лента новостей~: Вашим ИИ-агентам нужен терминал, а не просто база данных векторов.