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

Код, который у меня есть до сих пор, позволяет мне делать следующее:

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

Учитывая все это, какой автоматический тест я могу написать, чтобы убедиться, что алгоритм обучения реализован правильно. Какую функцию (sin, cos, exp, квадратичную и т. Д.) Я должен попытаться аппроксимировать? В каком диапазоне и насколько плотно я должен выполнять выборку данных из этой функции? Какая архитектура должна быть у НС?

В идеале функция должна быть довольно простой для изучения, чтобы тест длился недолго (1-3 секунды), но также достаточно сложен, чтобы обеспечить некоторую степень уверенности в том, что алгоритм реализован правильно.

7
Paul Manta 1 Мар 2015 в 01:22

2 ответа

Лучший ответ

Я занимаюсь чем-то подобным, чтобы получить степень. Вам нужны интеграционные тесты, а не модульные тесты.

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

Создав сеть, вы можете просто попробовать провести обучение. Для начала подойдет проверка простых математических функций. Для более размерных функций вы можете попробовать e.q. функция Rosenbrock. Это очень приятно, ведь вы можете изменить его размерность всего одним параметром. Однако я использовал его только для тестов GA.

Вы также можете протестировать его на реальных наборах данных. Я рекомендую Iris Dataset. Он довольно маленький и его легко освоить. Если тесты пройдут успешно, вы увидите, что ваша сеть действительно работает, а не просто решает математическую функцию. Я лично нахожу это успокаивающим. :)

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

Насколько я помню, я использую 10 скрытых нейронов для набора данных радужки. Примерно за 5 итераций вы сможете легко получить как минимум 95% правильных ответов.

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

7
Andrzej Gis 7 Окт 2018 в 11:29

Компоненты нейронной сети представляют собой отличную возможность для модульного тестирования. Следует помнить о том, «какое поведение, по нашему мнению, должно демонстрировать это программное обеспечение?». Некоторые ключевые моменты для проверки, которые я обсуждаю более подробно в мое сообщение в блоге:

  1. Проверка конечной разности - проверка согласованности операции обратного распространения с функцией компонента - поскольку это должна быть аналитическая производная, она должна соответствовать числовой аппроксимации производной.
  2. Сериализация
  3. Согласованность с эталонной реализацией (если есть) - это полезно, когда вы реализуете одну и ту же функцию несколько раз, например, ускорение графического процессора или свертку на основе БПФ.
  4. Производительность и дополнительные испытания на дымность, если необходимо.

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

3
Andrew Charneski 15 Дек 2017 в 03:48