Депсвайз и сепарабельные свёртки

Основные понятия

Депсвайз (Depthwise Convolution) — это разновидность свёртки, которая применяется по каждому каналу входного тензора отдельно, без объединения информации между каналами. Если обычная свёртка работает с входным тензором, суммируя результаты по всем каналам через ядра свёртки, то депсвайз создает отдельное ядро для каждого канала и применяет его к соответствующему каналу.

Преимущество такого подхода заключается в значительном сокращении числа параметров и вычислительной нагрузки. Для входного тензора размером (H W C) и ядра размером (K K) количество параметров при депсвайз свёртке составляет:

[ C K K]

вместо

[ C K K N]

в случае обычной свёртки с (N) выходными каналами.

Сепарабельная свёртка (Separable Convolution) — это комбинация депсвайз свёртки и точечной свёртки (1 ). Сначала входной тензор проходит через депсвайз свёртку для пространственного извлечения признаков по каждому каналу, а затем через точечную свёртку, которая объединяет информацию между каналами. Такой подход позволяет уменьшить количество параметров и ускорить обучение без значительной потери точности.

Создание депсвайз свёртки в TensorFlow.js

TensorFlow.js предоставляет готовый слой tf.layers.depthwiseConv2d. Основные параметры слоя:

  • kernelSize — размер ядра свёртки, может быть числом или массивом [height, width].
  • depthMultiplier — коэффициент увеличения числа каналов после депсвайз свёртки.
  • strides — шаг свёртки по высоте и ширине.
  • padding — способ обработки границ: 'valid' или 'same'.
  • activation — функция активации для выходных значений.
  • useBias — использовать смещение.

Пример инициализации слоя:

const depthwiseLayer = tf.layers.depthwiseConv2d({
  kernelSize: 3,
  depthMultiplier: 1,
  strides: 1,
  padding: 'same',
  activation: 'relu'
});

Входной тензор можно подать как tf.tensor4d с формой [batch, height, width, channels]. Выходной тензор будет иметь размерность [batch, height, width, channels * depthMultiplier].

Сепарабельные свёртки в TensorFlow.js

Сепарабельная свёртка реализована через слой tf.layers.separableConv2d. Этот слой объединяет депсвайз свёртку и точечную свёртку. Основные параметры:

  • filters — количество выходных каналов после точечной свёртки.
  • kernelSize — размер ядра депсвайз свёртки.
  • depthMultiplier — коэффициент для депсвайз части.
  • strides — шаг свёртки.
  • padding'valid' или 'same'.
  • activation — функция активации после объединения каналов.
  • useBias — добавлять ли смещение.

Пример создания слоя:

const separableLayer = tf.layers.separableConv2d({
  filters: 32,
  kernelSize: 3,
  depthMultiplier: 1,
  strides: 1,
  padding: 'same',
  activation: 'relu'
});

При использовании сепарабельной свёртки сначала выполняется глубинная свёртка, которая работает по каждому каналу отдельно, а затем точечная свёртка (1x1), которая комбинирует каналы в новый набор признаков.

Применение в моделях

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

  1. Входной тензор.
  2. Сепарабельная свёртка с небольшой шириной ядра.
  3. Batch Normalization для стабилизации обучения.
  4. ReLU или ReLU6 для нелинейного преобразования.
  5. Опционально: слой Dropout для регуляризации.

Пример в TensorFlow.js:

const model = tf.sequential();

model.add(tf.layers.inputLayer({inputShape: [128, 128, 3]}));

model.add(tf.layers.separableConv2d({
  filters: 64,
  kernelSize: 3,
  strides: 1,
  padding: 'same',
  activation: 'relu'
}));

model.add(tf.layers.batchNormalization());
model.add(tf.layers.maxPooling2d({poolSize: 2, strides: 2}));

Влияние на вычислительную эффективность

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

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

Например, для обычной свёртки с входом (128 ) и ядром (3 ), если требуется 64 выходных канала, число параметров будет:

[ 3 = 18432]

Для сепарабельной свёртки с тем же ядром и depthMultiplier = 1:

[ (3 ) + (1 ) = 288 + 2048 = 2336]

Экономия почти в 8 раз при сохранении сопоставимой выразительной способности модели.

Настройка и оптимизация

  • depthMultiplier контролирует количество каналов после депсвайз свёртки. Значение >1 увеличивает ёмкость модели.
  • padding = ‘same’ сохраняет размер входа, что удобно для построения глубоких моделей без изменения пространственных размеров.
  • strides > 1 уменьшает размер выходного тензора, выполняя роль подвыборки.
  • BatchNormalization после свёртки улучшает сходимость и позволяет использовать более высокие learning rate.
  • Функции активации: ReLU6 часто используется в мобильных сетях для ограничения значений и улучшения стабильности.

Использование этих техник позволяет создавать эффективные и быстрые модели прямо в браузере или Node.js, сохраняя точность и снижая вычислительные затраты.