Receptive Field
Рецептивное поле — это участок входного изображения, способный влиять на один элемент нейронной сети. Как его размер растёт с глубиной, шагом и дилатацией, с примерами кода.
Рецептивное поле элемента сверточной нейронной сети (CNN) — это область входного изображения, влияющая на его значение. Элемент первого сверточного слоя размером 3 × 3 видит участок пикселей 3 × 3, а элементы более глубоких слоев — все большие области, поскольку каждый слой объединяет соседние выходы предыдущего. Рецептивное поле определяет, какой контекст доступен признаку: чтобы распознать автобус целиком, элемент должен видеть весь автобус. Термин пришел из нейронауки, где он обозначает область зрительного поля, активирующую отдельный нейрон.
Как растет рецептивное поле#
Каждый слой добавляет к рецептивному полю (k − 1) × j пикселей, где k — размер ядра, а j, или шаг между элементами, — расстояние во входных пикселях между соседними элементами слоя; оно равно произведению всех предыдущих шагов свертки. Из этого следуют три вывода:
- Комбинация небольших ядер: три слоя 3 × 3 с шагом 1 охватывают участок 7 × 7, как и один слой 7 × 7, но используют 27C² весов вместо 49C² при C каналах. Этот аргумент VGG использовала для построения глубоких последовательностей сверточных слоев 3 × 3.
- Шаг свертки и пулинг: каждый слой с шагом 2 или операция пулинга удваивает расстояние между элементами, поэтому рецептивное поле в последующих слоях растет вдвое быстрее. Так CNN достигают рецептивных полей размером в сотни пикселей, одновременно уменьшая карты признаков.
- Дилатация: дилатированная (атрусная) свертка 3 × 3 с коэффициентом дилатации d размещает элементы ядра на расстоянии d пикселей друг от друга и охватывает 2d + 1 пикселей. Так рецептивное поле расширяется без уменьшения разрешения, что полезно для плотных попиксельных задач, например семантической сегментации.
Эти правила можно проверить, напрямую измерив рецептивное поле: выполнить обратное распространение ошибки от одного выходного значения и посмотреть, какие входные пиксели получают ненулевой градиент.
import torch
from torch import nn
# Three stacked 3x3 convolutions in three configurations: (stride, dilation)
for name, stride, dilation in (("plain", 1, 1), ("strided", 2, 1), ("dilated", 1, 2)):
convs = [nn.Conv2d(1, 1, 3, stride, padding=dilation, dilation=dilation, bias=False) for _ in range(3)]
for conv in convs:
nn.init.ones_(conv.weight) # positive weights, so no input pixel's gradient cancels out
layers = nn.Sequential(*convs)
# Backpropagate from the central output value; input pixels with nonzero gradient form its receptive field
image = torch.zeros(1, 1, 64, 64, requires_grad=True)
output = layers(image)
output[0, 0, output.shape[2] // 2, output.shape[3] // 2].backward()
rows = image.grad[0, 0].sum(dim=1).nonzero()
size = rows.max().item() - rows.min().item() + 1
print(f"{name}: {size}x{size} pixels")Вывод программы: 7 × 7 для обычной последовательности слоев, 15 × 15 для последовательности с шагом свертки, где расстояние между элементами растет с 1 до 2 и затем до 4, и 13 × 13 для последовательности с дилатацией, в которой каждый слой добавляет 4 пикселя.
Теоретическое и эффективное рецептивное поле#
Формула дает теоретическое рецептивное поле — все пиксели, способные повлиять на элемент. Эффективное рецептивное поле показывает, насколько сильно влияет каждый пиксель: его влияние имеет примерно гауссову форму с максимумом в центре и охватывает лишь часть теоретической области. Более крупные ядра расширяют его; в RepLKNet использовались глубинные ядра размером до 31 × 31, обеспечивающие, по заявлению авторов, намного более широкое эффективное рецептивное поле, чем у CNN с небольшими ядрами. В зрительных трансформерах механизм внимания к себе позволяет каждому участку изображения учитывать все остальные уже с первого слоя, поэтому теоретическое рецептивное поле охватывает целое изображение на любой глубине.
Рецептивное поле и связанные понятия#
- Размер ядра: окно, которое одна свертка считывает из своего входа, например 3 × 3. Рецептивное поле — это совокупная область исходного изображения; три последовательных ядра 3 × 3 уже дают поле 7 × 7.
- Карта признаков: выходная сетка слоя. Рецептивное поле описывает область входа, соответствующую одной позиции этой сетки.
- Контекстное окно: количество токенов, которое языковая модель считывает одновременно; аналог рецептивного поля для последовательности токенов.
Рецептивные поля в детекции объектов#
Детекторы предсказывают небольшие объекты по мелким картам признаков, а крупные — по грубым глубоким картам с большими рецептивными полями. Пирамидальная сеть признаков (FPN) переносит контекст глубоких слоев обратно на мелкие карты. Если рецептивное поле меньше объекта, видна лишь его часть, а для маленьких объектов по-прежнему нужен мелкий уровень: на карте с шагом 32 объект размером 20 пикселей занимает меньше одной ячейки сетки. YOLO26 выполняет предсказания по картам с шагом 8, 16 и 32. В конце ее бэкбона расположен блок SPPF, который применяет к карте с шагом 32 максимальный пулинг с окнами, эквивалентными 5 × 5, 9 × 9 и 13 × 13 ячейкам, а затем блок внимания к себе, охватывающий всю эту карту.










