Обучение модели глубокого обучения — очень трудоемкая работа, и нет ничего более разочаровывающего, чем проводить дни обучения с плохими результатами. Отсюда и перевод этой статьи:Checklist for debugging neural networks, надеюсь, это вдохновит вас на поиск проблем в модели как можно скорее. Оригинальный адрес:к data science.com/checklist-post…, слегка порезанный. Нажмите, чтобы прочитать исходный текст, чтобы перейти к этой статье, вам нужно перевернуть стену!
Код машинного обучения, как известно, сложно отлаживать. даже простоНейронная сеть с прямой связью, вам также часто приходится принимать решения, связанные с архитектурой сети, инициализацией значения веса и оптимизацией сети — все это может привести к скрытым ошибкам в коде машинного обучения.
Как написал Чейз Робертс в замечательной статье о «Как проводить модульное тестирование кода машинного обучения” написал, что его разочарование было вызвано распространенными ловушками:
- Код никогда не падает, не выдает исключение и даже не тормозит.
- Сеть продолжает обучаться, и потери все еще уменьшаются.
- Он сходится через несколько часов, но результаты ужасны.
Что же тогда делать?
Эта статья предоставит основу, которая поможет вам отлаживать нейронные сети:
- Начните с простого
- Подтвердите потерю модели
- Проверьте промежуточные выходы и соединения
- Диагностические параметры
- отслеживать свою работу
Не стесняйтесь переходить к определенному разделу или читать следующие по порядку! Обратите внимание: мы не рассматриваем предварительную обработку данных или выбор алгоритма конкретной модели. На эти темы есть много хороших интернет-ресурсов (например, почитайте "Выбор правильного алгоритма машинного обучения»).
1. Начните с простого
Нейронные сети со сложной архитектурой с планировщиками регуляризации и скорости обучения будет труднее отлаживать, чем простые сети. Этот первый пункт может быть немного оппортунистическим, так как он не имеет ничего общего с отладкой вашей уже установленной сети, но все же настоятельно рекомендуется!
Начните с простого:
- Сначала создайте более простую модель
- Обучите модель на одной точке данных
Создайте более простую модель
В качестве отправной точки создайте небольшую сеть с одним скрытым слоем и убедитесь, что все работает, а затем постепенно усложняйте модель, проверяя правильность каждого аспекта структуры модели (слои, параметры и т. д.).
Обучите модель на одной точке данных
В качестве быстрой проверки вы можете использовать один или два набора точек обучающих данных, чтобы убедиться, что модель не подходит. Нейронная сеть должна немедленно переобучиться со 100% точностью обучения и точностью проверки, сравнимой с вашей моделью случайного угадывания. Если модель не может соответствовать этим точкам данных, то либо набор данных слишком мал, либо имеется ошибка.
Даже если вы убедились, что модель работает, попробуйте потренироваться в течение одной (или нескольких) эпох до фактического обучения.
2. Подтвердите потерю модели
Потеря модели является основным способом оценки производительности модели, и модель устанавливает важные параметры в процессе оценки, поэтому вам необходимо убедиться, что:
- Потеря подходит для текущей задачи (используйте категориальную кросс-энтропийную потерю для задач с несколькими классификациями или используйте фокальную потерю для проблем с дисбалансом классов)
- функция потерьВсе они измеряются с правильным коэффициентом масштабирования. Если вы используете в своей сети несколько типов потерь, таких как MSE, Adversarial, L1,потеря функции, затем убедитесь, что все потери правильно масштабированы по одному и тому же масштабу.
Также важно отметить первоначальный убыток. Если ваша модель началась со случайного угадывания, убедитесь, что первоначальный убыток близок к вашему ожидаемому убытку. существуетСтэнфордский курс CS231n, Андрей Карпатский предлагает следующее:
Найдите правильную потерю по соображениям производительности. При инициализации с небольшими параметрами обязательно получите ожидаемый убыток. Лучше сначала просто проверить потерю данных (поэтому установите силу регуляризации на ноль). Например, для CIFAR-10 с классификатором Softmax мы ожидаем, что первоначальные потери составят 2,302, поскольку мы ожидаем, что вероятность распространения будет равна 0,1 для каждого класса (поскольку существует 10 классов), а потери Softmax представляют собой отрицательный логарифм правильная вероятность класса, поэтому: -ln (0,1) = 2,302.
В примере с бинарной классификацией вы просто выполняете аналогичные вычисления для каждого класса. Скажем, ваши данные — это 20% 0 категории и 80% 1 категории. Ожидаемый первоначальный убыток составит -0,2ln(0,5)-0,8ln(0,5) = 0,693147. Если ваш первоначальный убыток намного больше 1, это может указывать на то, что веса нейронной сети не сбалансированы (то есть плохо инициализированы) или что ваши данные не регуляризованы.
3. Проверьте промежуточные выходы и соединения.
Для отладки нейронной сети часто бывает полезно понять динамику внутри нейронной сети, а также то, что играют различные промежуточные слои и как эти слои связаны. Вы можете столкнуться со следующими ошибками:
- Формула обновления градиента неверна
- Обновление веса не применяется
- исчезающие или взрывающиеся градиенты
Если ваше значение градиента равно нулю, это, вероятно, означает, что скорость обучения в оптимизаторе слишком мала, или вы столкнулись с ошибкой № 1 выше: неверный алгоритм обновления градиента.
В дополнение к просмотру абсолютного значения обновлений градиента обязательно отслеживайте величины активации, веса и обновления для каждого слоя. Например, величина обновления параметров (веса и смещения) должна быть 1-e3.
Существует явление, называемое «мертвым ReLU» или «проблемой исчезающего градиента», когда нейроны ReLU будут выводить ноль после изучения большого отрицательного члена смещения для своих весов. Эти нейроны никогда больше не сработают ни в одной точке данных.
Вы можете использовать проверку градиента для проверки этих ошибок путем численной аппроксимации градиента. Если он близок к рассчитанному градиенту, реализация обратного распространения верна. Чтобы реализовать проверку градиента, используйтездесьиздесьОзнакомьтесь с этими отличными ресурсами в CS231 и Эндрю Нг по этому вопросу.Связанные курсы.
Файзан Шейх пишет о трех основных способах визуализации нейронных сетей:
- Предварительный подход — простой способ показать нам общую структуру обученной модели. Эти методы включают распечатку форм или фильтров отдельных слоев нейронной сети и параметров каждого слоя.
- Методы, основанные на активации. В этих методах мы расшифровываем активацию одного нейрона или группы нейронов, чтобы получить интуитивное представление о том, что они делают.
- Методы на основе градиента. Эти методы, как правило, вычисляют прямые и обратные градиенты при обучении модели.
Существует множество полезных инструментов для визуализации активаций и соединений отдельных слоев, таких какConXиTensorboard.
Пример визуализации динамического рендеринга с использованием ConX
используя данные изображения? Эрик Риппель опубликовал отличную статью"Визуализация частичных сверточных нейронных сетей с помощью Keras и Cats".
4. Диагностические параметры
Нейронные сети имеют большое количество параметров, которые взаимодействуют друг с другом, что затрудняет оптимизацию. Обратите внимание, что это область активных исследований, поэтому приведенные ниже предложения являются лишь отправной точкой.
- размер партии(технически называется мини-пакетом) — вы хотите, чтобы пакет был достаточно большим, чтобы точно оценить градиент ошибки, но достаточно маленьким, чтобы мини-пакетный стохастический градиентный спуск (SGD) мог упорядочить сеть. Небольшие размеры пакетов позволят процессу обучения быстро сойтись, но это может произойти за счет повышенного шума и может привести к трудностям оптимизации. бумага"On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima"объясняет, почему это происходит:
На практике было замечено, что качество модели, измеряемое способностью к обобщению, снижается при использовании больших партий. Мы исследуем причины такого снижения обобщения в режимах с большими партиями и предоставляем данные, подтверждающие мнение о том, что методы с большими партиями имеют тенденцию сходиться к локальным минимумам обучающей и тестовой функций — хорошо известно, что локальные минимумы приводят к худшему обобщению. Напротив, мини-пакетные методы последовательно сходятся к планарной минимизации, и наши эксперименты подтверждают распространенное мнение, что это происходит из-за собственного шума в оценках градиента.
- скорость обучения- Слишком низкая скорость обучения вызовет медленную сходимость или риск застревания в локальных минимумах, в то время как слишком большая скорость обучения приведет к расхождению оптимизации из-за риска пропуска более глубоких, но более узких частей потерь функция. Вы можете рассмотреть возможность планирования скорости обучения, чтобы уменьшить скорость обучения в процессе обучения. В курсе CS231n много оРазличные методы реализации отжига скорости обучения.
Фреймворки машинного обучения, такие как Keras, Tensorflow, PyTorch, MXNet, теперь имеют документацию или примеры использования планировщиков/декрементов скорости обучения:
Keras - Доступно в RAS.IO/callbacks/#…
Tensorflow - woohoo.tensorflow.org/API_docs/friends…
PyTorch - py torch.org/docs/stable…
-
Отсечение градиента- Это обрежет градиент параметра с максимальной или максимальной нормой во время обратного распространения. Это используется для устранения любых взрывающихся градиентов, с которыми вы могли столкнуться в ошибке № 3 выше.
-
пакетная нормализация- Пакетная нормализация используется для нормализации входных данных каждого слоя для решения проблемы внутреннего ковариатного сдвига. Если вы используете и отсев, и пакетную нормализацию, обязательно прочитайте пункт об отсеве ниже.
Статья от Дишанка Бансала"Pitfalls of Batch Norm in TensorFlow and Sanity Checks for Training Networks" — отличный ресурс для распространенных ошибок при пакетной нормализации.
-
Стохастический градиентный спуск (SGD)— Есть несколько SGD, которые используют импульс, адаптивную скорость обучения и обновления Нестерова, но не предлагают значительных преимуществ в эффективности обучения или обобщении (см. отличную статью Себастьяна Рудера «Обзор алгоритмов оптимизации градиентного спуска'и этот забавный эксперимент'СГД > Адам?'). Рекомендуемые стартовые варианты: Адам или обычный SGD с импульсом Нестерова.
-
Регуляризация- Регуляризация имеет решающее значение для построения обобщенных моделей, поскольку она добавляет штрафы за сложность модели или экстремальные значения параметров. Это значительно снижает дисперсию модели, но существенно не увеличивает ее смещение. Как учили в курсе CS231n:
Как правило, функция потерь представляет собой сумму потерь данных и потерь регуляризации (например, штраф L2 для весов). Одна опасность, о которой следует помнить, заключается в том, что потеря регуляризации может превзойти потерю данных, и в этом случае градиенты будут в основном исходить от регуляризации (обычно с более простыми выражениями градиента). Это может маскировать неправильную реализацию градиента потери данных.
Чтобы проверить это, вы должны отключить регуляризацию и самостоятельно проверить градиент потери данных.
- Dropout- Dropout — это еще один метод регуляризации сети для предотвращения переобучения. Выпадение достигается только за счет сохранения активаций нейронов с некоторой вероятностью p (гиперпараметр) во время обучения и установки ее на ноль в противном случае. В результате сеть должна использовать разное подмножество параметров в каждой обучающей партии, что уменьшает вариацию конкретных параметров и предотвращает доминирование определенных параметров.
Важное примечание: если вы используете и отсев, и пакетную норму, будьте осторожны с порядком этих операций или даже используйте их вместе. Это все еще активная область исследований, но вы можете увидеть последние обсуждения:
От пользователя StackoverflowMiloMinderBinder: «Отсев означает полную блокировку информации от определенных нейронов, чтобы гарантировать, что нейроны не адаптируются друг к другу. Таким образом, пакетная нормализация должна происходить после отсева, иначе вы пропускаете информацию через статистику нормализации».
через arXiv: Понимание несоответствия между отсевом и пакетной нормализацией посредством преобразования дисперсии (Сян Ли, Шуо Чен, Сяолинь Ху, Цзянь Ян) - «Теоретически мы обнаружили, что отсев изменяет специфическую нейронную дисперсию мета. Однако BN сохранит накопленную статистическую дисперсию. на протяжении всего процесса обучения на этапе тестирования.Несогласованность этой дисперсии (мы назвали эту схему «сдвигом дисперсии») приводит к нестабильному числовому поведению в выводе, когда в «Когда Dropout применялся до BN» это приводило к большему количеству неправильных прогнозов.
5. Отслеживайте свою работу
Легко упустить из виду важность документирования ваших экспериментов, пока вы не забудете скорость обучения или используемые веса классов. Благодаря лучшему отслеживанию вы можете легко просмотреть и воспроизвести предыдущие эксперименты, чтобы уменьшить дублирование усилий (т. е. столкнуться с одними и теми же ошибками).
Однако ручная запись информации может быть затруднена и масштабироваться до нескольких экспериментов.рисунокComet.mlТакие инструменты могут помочь автоматизировать отслеживание наборов данных, изменений кода, истории экспериментов и производственных моделей.(Это включает ключевую информацию о модели, такую как гиперпараметры, показатели производительности модели и сведения о среде).
Ваша нейронная сеть очень чувствительна к небольшим изменениям данных, параметров и даже версий пакетов, что приводит к снижению производительности модели, которое может накапливаться. Отслеживание вашей работы — это первый шаг к стандартизации вашей среды и рабочего процесса моделирования.
Быстрый обзор
Мы надеемся, что этот пост послужит надежной отправной точкой для отладки нейронных сетей. Подводя итог его ключевым моментам, вам следует:
- Начните с простого- Сначала создайте более простую модель, а затем протестируйте ее, обучив несколько точек данных.
- Подтвердить потерю модели- Убедитесь, что вы используете правильный убыток и проверьте первоначальный убыток
- Проверьте промежуточные выходы и соединения- Используйте проверку градиента и визуализацию, чтобы убедиться, что слои правильно подключены и что градиенты обновляются должным образом.
- Диагностические параметры- От SGD до скорости обучения, определите правильную комбинацию (или найдите неправильную комбинацию) ?
- отслеживать свою работу- Отслеживайте свой экспериментальный прогресс и ключевые артефакты моделирования в качестве эталона