Поиск ошибок в архитектуре

ConvNetJS — это библиотека на JavaScript для построения и обучения нейронных сетей, специализирующаяся на сверточных сетях. Она обеспечивает инструменты для создания сетевой архитектуры, инициализации параметров, прямого распространения сигналов (forward propagation), обратного распространения ошибки (backpropagation) и оптимизации весов.

Ключевые компоненты:

  • Vol — основной объект для хранения входных данных, весов и градиентов.
  • Layer — базовый класс для всех типов слоев. Каждый слой реализует методы forward и backward.
  • Net — контейнер для последовательности слоев и управления обучением.
  • Trainer — объект, отвечающий за процесс обучения: вычисление потерь и обновление весов по выбранному алгоритму оптимизации.

Структура архитектуры

Архитектура сети определяется как последовательность слоев. Слои могут быть следующих типов:

  • InputLayer — начальный слой, задающий форму входного тензора.
  • FullyConnLayer — полносвязный слой с возможностью применения функций активации.
  • ConvLayer — сверточный слой с ядрами заданного размера, stride и padding.
  • PoolLayer — слой подвыборки (max pooling), сокращающий размерность признаков.
  • SoftmaxLayer — выходной слой для классификации с вероятностной интерпретацией.

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

Ошибки при построении архитектуры

1. Несоответствие размеров входов и выходов слоев

Наиболее частая проблема возникает, когда выход одного слоя не совпадает по размерности с входом следующего. ConvNetJS не всегда сообщает точное место ошибки, поэтому необходимо вручную проверять форму Vol после каждого слоя:

console.log(layer.out_sx, layer.out_sy, layer.out_depth);

2. Неправильная конфигурация параметров сверточного слоя

Сверточные слои требуют аккуратного задания следующих параметров:

  • filter_size — размер ядра
  • stride — шаг свертки
  • pad — добавление нулей по краям

Ошибки в этих параметрах приводят к неожиданному сокращению размерности или к невозможности соединения с последующими слоями.

3. Неправильный выбор функции активации

Некорректное использование активации может привести к исчезающим или взрывающимся градиентам. Например, использование tanh после relu может ограничивать диапазон градиентов. ConvNetJS позволяет задавать активацию в конструкторе слоя:

var fc = new convnetjs.FullyConnLayer({num_neurons: 100, activation: 'relu'});

4. Ошибки при работе с батчами

ConvNetJS работает с Vol объектов, представляющих как отдельные примеры, так и батчи. Использование несогласованных размеров батча вызывает ошибки на этапе forward и backward. Размер батча должен быть одинаковым для всех входных слоев и соответствовать ожиданиям Trainer.

Поиск ошибок через пошаговое тестирование

Пошаговая проверка слоев:

  1. Создать сеть с минимальным количеством слоев.
  2. Пропустить тестовый тензор через каждый слой по очереди.
  3. Проверить формы выходных тензоров.
  4. Добавлять слои по одному и повторять проверку.

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

Логирование градиентов

При обучении можно проверить корректность обратного распространения, выводя градиенты весов:

console.log(layer.filters[0].dw);

Если градиенты слишком малы или слишком велики, это указывает на неправильную инициализацию весов или некорректную функцию активации.

Инструменты визуализации и отладки

ConvNetJS включает встроенный веб-интерфейс для визуализации весов и активаций:

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

Регулярная визуализация облегчает обнаружение ошибок в архитектуре, особенно при сложных сверточных сетях.

Рекомендации по устойчивой архитектуре

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

Работа с нестандартными слоями

ConvNetJS позволяет создавать собственные слои, наследуя Layer и реализуя методы forward и backward. Ошибки чаще всего возникают в:

  • Неправильном вычислении градиентов.
  • Нарушении согласованности форм Vol.
  • Использовании глобальных переменных внутри слоя.

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