В прошлый раз мы прикладывали детектор к одному окошку. Теперь проведём его по всей картинке. Один и тот же маленький шаблон, скользящий по полю, — это и есть свёртка. Весов у неё мало не потому, что картинка мала, а потому, что признак ищется всюду одним и тем же ядром.

Один шаблон на всё поле

В прошлом уроке детектор края смотрел в крошечное окно — рецептивное поле. Но признак «граница под углом» встречается в изображении повсюду, и держать отдельный детектор для каждой точки было бы расточительно. Свёртка решает это одним приёмом: берём одно ядро и прикладываем его во всех положениях, сдвигая окно по всему полю. Там, где под окном оказался нужный признак, отклик велик; где нет — мал. Так из одного маленького шаблона получается целая карта откликов.

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

Размер выходной карты

Проведём ядро k×kk\times k по входу размера nn, сдвигая его с шагом ss и добавив по краям рамку толщиной pp. Сколько положений поместится? Ответ даёт формула размера выхода:

nout=n+2pks+1.n_{\text{out}}=\left\lfloor\frac{n+2p-k}{s}\right\rfloor+1.

Разберём на числах для ядра k=3k=3 и входа n=32n=32. С рамкой p=1p=1 и шагом s=1s=1 выходит ровно 3232 — размер сохраняется. Без рамки (p=0p=0) карта сжимается до 3030: крайние пиксели ядру некуда пристроиться. А с шагом s=2s=2 ядро прыгает через клетку, и карта усыхает вдвое, до 1616.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Три схемы сетки: с дополнением p равно 1 и шагом 1 выход 32 сохраняется, без дополнения выход 30 и края теряются, с шагом 2 выход 16 и карта вдвое меньше; сверху формула размера выхода
Рис. 28.1. Размер выхода: рамка и шаг

Слева направо: рамка сохраняет размер; без рамки теряются края; шаг 22 прореживает карту вдвое. Красное окно — ядро, штриховка — дополнение (рамка), пунктир — следующее положение ядра при шаге 22.

Дополнение и шаг

Рамка (дополнение) и шаг — два рычага, которыми управляют размером и поведением у краёв. Чем заполнить рамку? Проще всего нулями, но ноль за краем — это выдумка: на спутниковом снимке за границей кадра не океан и не пустота, а неизвестность. Нулевая рамка создаёт у края искусственный контраст. Часто честнее повторить или отразить крайние пиксели.

Здесь кроется и подсказка о том, зачем вообще нужна рамка. Без неё каждая свёртка чуть подъедает изображение с краёв: после десятка слоёв от картинки 32×3232\times32 осталось бы жалкое ядрышко в центре, а вся периферия была бы съедена. Рамка p=(k1)/2p=(k-1)/2 ровно компенсирует это подъедание и позволяет складывать свёртки в глубину, не теряя размер.

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

Несколько каналов

Цветная картинка — это не одна таблица яркостей, а три: красный, зелёный и синий каналы. Ядро свёртки охватывает все входные каналы разом. Для входа из трёх каналов одно ядро 3×33\times3 хранит уже 333=273\cdot3\cdot3=27 весов и одно смещение и сводит три канала в один отклик.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
RGB-фотография, её три цветовых канала по отдельности, стрелка к одной карте признаков; подпись: одно ядро 3 на 3 на 3 сводит три входных канала в один отклик
Рис. 28.2. Ядро охватывает все каналы

Слева цветное фото и его три канала. Одно ядро 3×3×33\times3\times3 прикладывается ко всем трём сразу и выдаёт одну карту признаков (справа). Чтобы получить много карт, заводят много таких ядер.

Чтобы слой выдавал CoutC_{\text{out}} карт признаков из CinC_{\text{in}} входных каналов, число весов складывается по простому правилу:

Nparam=Cout(khkwCin+1).N_{\text{param}}=C_{\text{out}}\big(k_h k_w C_{\text{in}}+1\big).

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

Важно, что сами эти ядра никто не задаёт вручную. В обученной сети веса каждого фильтра настраиваются градиентным спуском под задачу: сеть сама решает, какие края, пятна и переходы цвета ей полезны. Мы для наглядности берём готовый детектор края, но в реальной модели на его месте — обучаемый детектор, и удивительным образом первые обученные ядра почти всегда оказываются похожими на края и полоски Габора из прошлого урока.

Параметры не зависят от картинки

Малое число весов — главный козырь свёртки. Полносвязный нейрон на изображении 1000×1000×31000\times1000\times3 хранил бы три миллиона весов; наш слой из 1616 ядер — четыреста сорок восемь, и это число не растёт с размером картинки. Разделение весов (одно ядро всюду) даёт и экономию, и устойчивость к сдвигу разом.

Но экономия параметров не означает экономии вычислений — это разные величины, которые легко спутать. Те же 448448 весов на входе 32×3232\times32 дают уже около четырёхсот тысяч умножений: каждый вес прикладывается в каждом из тысячи положений, да ещё по всем каналам. На снимке высокого разрешения счёт идёт на миллиарды операций при всё тех же сотнях весов. Память под модель мала, а вот времени на проход она может требовать много — и цена этих умножений во многом решает, какую сеть вообще удастся обучить.

Эквивариантность к сдвигу

У разделения весов есть красивое следствие. Сдвиньте изображение — и карта откликов сдвинется точно так же, ведь то же ядро встретит тот же признак, только в новом месте. На языке формул, для сдвига TΔT_\Delta:

K(TΔI)=TΔ(KI).K*(T_\Delta I)=T_\Delta(K*I).

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

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Четыре панели: вход и вход, сдвинутый на 60 пикселей; под ними две карты откликов детектора края, вторая сдвинута ровно на те же 60 пикселей, что отмечено зелёной линией
Рис. 28.3. Сдвинь вход — карта сдвинется так же

Вверху — фотография и она же, сдвинутая на 6060 пикселей. Внизу — их карты откликов: вторая сдвинута ровно на те же 6060 пикселей. Свёртка не привязана к месту, поэтому признак и его отклик путешествуют вместе.

На реальных данных: от спутника до лица

Свёртка одинаково работает на любых изображениях. Наборы вроде EuroSAT — спутниковые снимки Sentinel-2, размеченные по типу землепользования, — обрабатывают ровно теми же ядрами, что и портрет: детектор края не спрашивает, лес под ним или лицо. Мы уже прогнали ядро по обычной фотографии и увидели, как из трёх цветовых каналов рождается карта краёв, а сдвиг снимка сдвигает и её. На спутниковом снимке те же фильтры выделяли бы дороги, кромки полей, береговые линии.

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

Ещё одна тонкость — масштаб. Ядро 3×33\times3 на снимке высокого разрешения охватывает пару метров земли, а на грубом — целый квартал. Один и тот же фильтр «видит» разные вещи в зависимости от того, сколько метров приходится на пиксель. Поэтому у спутниковых моделей разрешение снимка — такой же параметр задачи, как и архитектура сети.

Русская линия: пиксель как отсчёт

Прежде чем свернуть изображение, его надо превратить в сетку чисел — пиксели. Как часто нужно брать отсчёты, чтобы ничего не потерять? Ответ дал в 19331933 году советский инженер Владимир Котельников в своей теореме отсчётов: сигнал полностью восстановим по замерам, если брать их вдвое чаще самой высокой частоты в сигнале. Реже — и мелкие детали склеятся в ложные узоры (тот самый муар на фотографии решётки).

Пиксельная сетка изображения — это и есть отсчёты Котельникова по двум осям. Его теорема говорит, какое разрешение нужно, чтобы свёртка работала с настоящей картинкой, а не с её искажённой тенью. Так теория связи 19301930-х годов легла в фундамент компьютерного зрения.

Тот же закон отсчётов объясняет, почему шаг свёртки нельзя задирать без оглядки. Прореживая карту слишком грубо, мы берём отсчёты реже, чем требует теорема, и мелкий узор превращается в ложный — возникает наложение спектров, алиасинг. Оттого перед сильным уменьшением изображение сперва слегка размывают, срезая слишком высокие частоты, которым всё равно негде уместиться. Инженерная осторожность здесь — прямое следствие математики Котельникова.

Лаборатория свёртки

Размер ядра, шаг и дополнение вживую

Загружается живая иллюстрация…

Порядок опытов. Слева — вход, справа — карта откликов свёртки. Крутите три рычага и следите за размером выходной карты на табло: увеличьте ядро — карта сожмётся; поднимите дополнение — вернётся к размеру входа; поставьте шаг 22 — усохнет вдвое. Табло тут же подставляет ваши числа в формулу nout=(n+2pk)/s+1n_{\text{out}}=\lfloor(n+2p-k)/s\rfloor+1 и показывает число весов ядра. Убедитесь, что оно зависит только от размера ядра, но не от размера картинки.

Сборка: одно ядро, скользящее по полю

Свёртка — это один маленький шаблон, приложенный во всех положениях изображения. Размер выходной карты задаёт формула (n+2pk)/s+1\lfloor(n+2p-k)/s\rfloor+1: дополнение спасает края, шаг прореживает карту. Ядро охватывает все входные каналы разом, а число его весов — Cout(k2Cin+1)C_{\text{out}}(k^2C_{\text{in}}+1) — не зависит от размера картинки, оттого свёртка так экономна. Разделение весов дарит и эквивариантность: сдвинь вход — карта сдвинется следом. Мы проверили это на реальном фото и связали пиксельную сетку с теоремой отсчётов Котельникова. Но карта откликов пока эквивариантна, а не инвариантна, и признаки в ней ещё сырые. Как сделать ответ независимым от положения и как складывать свёртки в глубокую сеть — об этом следующие уроки про пулинг и свёрточные архитектуры.

Задачи