Пулинг слои

Пулинг слои (pooling layers) являются неотъемлемой частью сверточных нейронных сетей, обеспечивая снижение размерности признаковых карт и повышение устойчивости модели к смещениям, поворотам и шуму в изображениях. В библиотеке ConvNetJS пулинг реализуется через объекты класса Vol и специализированные слои PoolLayer.

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

  • Сократить количество параметров сети;
  • Уменьшить вычислительные затраты;
  • Предотвратить переобучение за счет регуляризации.

Типы пулинга

ConvNetJS поддерживает несколько основных типов пулинга:

  1. Max-pooling Наиболее часто используемый тип. Из каждой области размером sx × sy выбирается максимальное значение. Это позволяет выделять самые выраженные признаки, сохраняя их важность при уменьшении размера карты.

  2. Average-pooling Рассчитывается среднее значение по каждой области sx × sy. Используется реже, подходит для задач, где важна средняя активность признаков, а не только их максимальное проявление.

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


Создание пулинг слоя в ConvNetJS

Слой пулинга создается с помощью объекта конфигурации, передаваемого в конструктор Layer:

var layer_def = {};
layer_def.type = 'pool';
layer_def.sx = 2;       // размер окна по ширине
layer_def.sy = 2;       // размер окна по высоте
layer_def.stride = 2;   // шаг окна
layer_def.pad = 0;      // нулевая подкладка
var poolLayer = new convnetjs.PoolLayer(layer_def);

Ключевые параметры:

  • sx и sy — размеры окна пулинга.
  • stride — шаг перемещения окна по входной карте.
  • pad — добавление нулей по краям карты (позволяет сохранить размерность при необходимости).

Важной особенностью ConvNetJS является то, что выбор типа пулинга по умолчанию — max-pooling, но можно явно указать method: 'avg' для среднего пулинга.


Forward pass

Пулинг слой обрабатывает входной тензор Vol и формирует выходной тензор меньшей размерности. Алгоритм max-pooling можно описать следующим образом:

  1. Проходим по входной карте с шагом stride.
  2. В каждой области размером sx × sy выбираем максимальное значение.
  3. Записываем результат в соответствующую позицию выходного тензора.

Пример кода для forward pass:

var inputVol = new convnetjs.Vol(4, 4, 1); // вход 4x4x1
inputVol.w = [
    1, 2, 3, 0,
    4, 5, 6, 1,
    7, 8, 9, 2,
    0, 1, 2, 3
];

poolLayer.forward(inputVol);

console.log(poolLayer.out.w); // выводит уменьшенную карту

Результат — карта размером 2x2x1, содержащая максимальные значения из каждой области 2×2.


Backward pass

Для обратного распространения градиентов используется запоминание позиции максимального элемента на этапе forward pass. Градиенты передаются только на те элементы, которые участвовали в max-пooling:

poolLayer.backward(dout);

Если используется average-pooling, градиенты распределяются равномерно по всем элементам области пулинга.


Советы по использованию

  • Выбор окна и шага: Чаще всего sx = sy = 2 и stride = 2, что уменьшает размер карты в 4 раза. Более крупные окна сокращают размерность сильнее, но могут терять детали.

  • Сочетание с padding: Padding обычно не используется в пулинге, но может быть полезен, если нужно сохранить размеры карты при определенных архитектурах.

  • Регуляризация: Пулинг сам по себе снижает вероятность переобучения за счет уменьшения числа параметров и пространственной агрегации.

  • Слои подряд: В сложных сетях несколько слоев пулинга подряд создают иерархию признаков: от мелких деталей к глобальным объектам.


Примеры архитектур с пулингом

Классическая схема:

  1. conv -> relu -> pool
  2. conv -> relu -> pool
  3. fc -> softmax

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

Сетка с average-pooling: Иногда используется в сетях для сегментации и анализа текстур, где важны средние значения признаков, а не экстремальные.


Визуализация работы пулинга

Для анализа работы сети удобно выводить карты признаков до и после пулинга. Max-pooling наглядно показывает, какие области акцентированы сетью, а average-pooling — распределение активности. ConvNetJS позволяет легко получать .w у тензора Vol и визуализировать его через canvas или консоль.


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