Свёртка: скользящее окно, из которого выросли CNN

Размыть фото, найти края, услышать эхо, обучить нейросеть видеть — за всем этим одна операция. Свёртка берёт маленькое окно весов (ядро) и проводит им вдоль сигнала, в каждой точке считая взвешенную сумму соседей. Меняешь веса — меняешь, что именно «видит» окно.

Скользящее взвешенное окно

Свёртка сигнала x с ядром k — это новый сигнал, где значение в точке t есть взвешенная сумма окрестности x под перевёрнутым ядром: (x * k)[t] = \sum_{j} x[t-j]\, k[j]. Минус в индексе как раз и переворачивает ядро. Само ядро задаёт «рецепт смешивания» соседних отсчётов, а его ширина — размер окна (рецептивное поле): сколько соседей участвует в каждом выходном значении.

Одно ядро — один детектор

Сила свёртки в том, что смысл операции целиком сидит в нескольких числах ядра:

  • Сглаживание (равные положительные веса) усредняет соседей — сигнал теряет резкие детали, шум подавляется.
  • Гаусс — то же, но с мягким спадом к краям окна: усреднение выходит мягче.
  • Разность [-1, 0, 1] берёт разность соседей слева и справа — выход велик там, где сигнал быстро меняется. Это детектор краёв.
  • Резкость усиливает центр относительно окрестности — подчёркивает контраст.

Потрогайте свёртку

Сверху — сигнал и бегущее окно ядра (золотые веса); снизу — результат свёртки. Тяните окно вдоль сигнала — за красную пунктирную вертикаль, которая отмечает текущую позицию t, или мышью по нижней панели; есть и ползунок «Позиция окна t». Смотрите, как выход в текущей точке собирается из значений под окном. Рисуйте сам сигнал, двигая его мышью в верхней панели. Переключайте ядро — и наблюдайте, как одна и та же операция то размывает, то выделяет края.

УведомлениеОт ручных ядер к обучаемым

Десятилетиями ядра для зрения подбирали вручную (Собель, Габор, Лаплас). Прорыв свёрточных сетей (CNN) в том, что веса ядер не задаются, а обучаются градиентным спуском: сеть сама находит, какие края, текстуры и формы выделять. Слой CNN — это десятки таких окон, бегущих по картинке параллельно.

СоветСуть

Свёртка кодирует два предположения о данных: локальность (важны соседи, а не весь сигнал сразу) и трансляционная инвариантность (одно и то же ядро работает в любой точке — край есть край, где бы он ни был). Именно поэтому одно маленькое ядро с горсткой весов заменяет полносвязный слой с миллионами параметров и при этом лучше обобщается на изображениях, звуке и временных рядах.

Связи

Наверх