MaxPooling и AveragePooling

Pooling — это ключевой элемент сверточных нейронных сетей (CNN), предназначенный для снижения размерности признаковых карт и выделения устойчивых характеристик изображения. ConvNetJS предоставляет удобный интерфейс для реализации различных видов pooling-слоев, среди которых наиболее часто используются MaxPooling и AveragePooling.


Основы работы Pooling-слоев

Pooling-слой принимает на вход трехмерный тензор признаков с размерностью (ширина × высота × глубина) и уменьшает его пространственные размеры (ширина × высота), сохраняя глубину. Основная цель:

  • Снижение вычислительной нагрузки;
  • Усиление устойчивости к смещениям и шуму;
  • Сокращение количества параметров при последующих слоях.

В ConvNetJS pooling-слои создаются с помощью конструктора convnetjs.Layer, где указывается тип слоя ('pool') и его параметры.

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

MaxPooling

MaxPooling выбирает максимальное значение из каждого окна размера (sx × sy). Это делает слой чувствительным к наиболее выраженным признакам, игнорируя менее значимые значения.

  • Преимущества:

    • Поддерживает сильные активации признаков.
    • Снижает влияние шумов и мелких вариаций.
    • Часто используется после слоев с ReLU-активацией.

Пример работы:

Если окно 2×2 охватывает значения [1, 3; 2, 0], результат MaxPooling будет 3.

var layer_def = { type:'pool', sx:2, sy:2, stride:2, pooling_type:'max' };
var maxpool_layer = new convnetjs.PoolLayer(layer_def);

После применения MaxPooling к признаковой карте размер (4×4) станет (2×2) при stride = 2.


AveragePooling

AveragePooling вычисляет среднее значение по каждому окну. Этот метод менее агрессивен, чем MaxPooling, так как учитывает все значения признаков, а не только экстремальные.

  • Преимущества:

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

Пример:

Если окно 2×2 содержит [1, 3; 2, 0], результат AveragePooling будет (1+3+2+0)/4 = 1.5.

var layer_def = { type:'pool', sx:2, sy:2, stride:2, pooling_type:'avg' };
var avgpool_layer = new convnetjs.PoolLayer(layer_def);

Настройка параметров Pooling-слоев

  • sx, sy — размер окна (обычно 2 или 3);
  • stride — шаг, определяет, как окно перемещается по карте признаков;
  • pad — нулевой padding для выравнивания размеров;
  • pooling_type'max' для MaxPooling, 'avg' для AveragePooling.

Оптимальный выбор параметров зависит от архитектуры сети:

  • Большой stride и sx уменьшают размер карты быстрее, но могут терять детали;
  • Малый stride сохраняет больше информации, но снижает эффект сжатия.

Применение в ConvNetJS

  1. Сверточная сеть с MaxPooling:
var layer_defs = [];
layer_defs.push({type:'input', sx:32, sy:32, depth:3});
layer_defs.push({type:'conv', sx:5, filters:16, stride:1, pad:2, activation:'relu'});
layer_defs.push({type:'pool', sx:2, sy:2, stride:2, pooling_type:'max'});
  1. Сеть с AveragePooling для сглаживания признаков:
var layer_defs = [];
layer_defs.push({type:'input', sx:28, sy:28, depth:1});
layer_defs.push({type:'conv', sx:3, filters:8, stride:1, pad:1, activation:'relu'});
layer_defs.push({type:'pool', sx:2, sy:2, stride:2, pooling_type:'avg'});

Сравнение MaxPooling и AveragePooling

Параметр MaxPooling AveragePooling
Основная идея Выбирает максимальное значение Вычисляет среднее значение
Влияние на шум Игнорирует мелкие шумы Сглаживает шум
Сохранение признаков Сохраняет сильные локальные активации Сохраняет общие закономерности
Часто используется Классификация, CNN с ReLU Регрессия, предварительная обработка

Внутреннее устройство ConvNetJS PoolLayer

  • forward() — вычисляет выходные активации, применяя выбранный метод pooling к каждому окну.
  • backward() — распространяет градиенты обратно, корректно распределяя их для MaxPooling или AveragePooling.
  • Для MaxPooling хранится индекс максимума для корректного обратного распространения.

Практические советы

  • MaxPooling лучше подходит для задач классификации и распознавания объектов, так как усиливает сильные признаки.
  • AveragePooling полезен при необходимости уменьшения шумов и сохранения общей структуры карты признаков.
  • В ConvNetJS можно комбинировать Max и AveragePooling для разных уровней сети, создавая гибкие архитектуры.

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