CS231n: свёрточные сети, часть 1 — архитектура и свёрточный слой (перевод конспекта)
Перевод первой половины конспекта Stanford CS231n «Convolutional Neural Networks»: почему обычные сети не масштабируются на изображения, трёхмерные объёмы нейронов, слои CONV/RELU/POOL/FC, локальная связность, глубина, шаг и дополнение нулями, формула размера выхода, разделение параметров, примеры на NumPy, im2col, свёртки 1 × 1 и расширенные свёртки.
Свёрточные нейронные сети (CNN / ConvNets)
Заголовок раздела «Свёрточные нейронные сети (CNN / ConvNets)»Свёрточные нейронные сети очень похожи на обычные нейронные сети из предыдущей главы: они состоят из нейронов с обучаемыми весами и сдвигами. Каждый нейрон получает входы, вычисляет скалярное произведение и, возможно, применяет нелинейность. Вся сеть по-прежнему выражает одну дифференцируемую функцию оценок: от сырых пикселей изображения на одном конце до оценок классов на другом. И у них по-прежнему есть функция потерь (например, SVM или Softmax) на последнем (полносвязном) слое, и все советы и приёмы, которые мы выработали для обучения обычных нейронных сетей, остаются в силе.
Так что же меняется? Архитектуры свёрточных сетей явно предполагают, что на входе изображения, и это позволяет заложить в архитектуру определённые свойства. Благодаря им прямой проход реализуется эффективнее, а число параметров сети резко уменьшается.
Обзор архитектуры
Заголовок раздела «Обзор архитектуры»Напоминание: обычные нейронные сети. Как мы видели в предыдущей главе, нейронная сеть получает вход (один вектор) и преобразует его серией скрытых слоёв. Каждый скрытый слой состоит из набора нейронов, каждый нейрон полностью связан со всеми нейронами предыдущего слоя, а нейроны одного слоя работают совершенно независимо и не имеют общих связей. Последний полносвязный слой называется «выходным», и в задачах классификации он даёт оценки классов.
Обычные нейронные сети плохо масштабируются на целые изображения. В CIFAR-10 изображения размером всего 32 × 32 × 3 (32 в ширину, 32 в высоту, 3 цветовых канала), так что у одного полносвязного нейрона первого скрытого слоя обычной сети было бы 32 · 32 · 3 = 3072 веса. Это число ещё выглядит приемлемым, но ясно, что полносвязная структура не масштабируется на изображения побольше. Например, изображение более солидного размера, 200 × 200 × 3, дало бы нейроны с 200 · 200 · 3 = 120 000 весов. А таких нейронов нам почти наверняка нужно несколько, так что параметры быстро накапливаются! Ясно, что полная связность расточительна, а огромное число параметров быстро привело бы к переобучению.
Трёхмерные объёмы нейронов. Свёрточные сети пользуются тем, что вход состоит из изображений, и ограничивают архитектуру более разумным образом. В частности, в отличие от обычной сети, нейроны слоёв свёрточной сети расположены в трёх измерениях: ширина, высота, глубина. (Слово глубина здесь означает третье измерение объёма активаций, а не глубину всей сети, под которой может пониматься общее число слоёв.) Например, входные изображения CIFAR-10 — входной объём активаций размером 32 × 32 × 3 (ширина, высота, глубина соответственно). Как мы скоро увидим, нейроны слоя будут связаны только с небольшой областью предыдущего слоя, а не со всеми нейронами, как в полносвязной сети. Более того, выходной слой для CIFAR-10 будет иметь размер 1 × 1 × 10: к концу свёрточной архитектуры мы сведём всё изображение к одному вектору оценок классов, расположенному вдоль измерения глубины.
Рисунок (в оригинале). Слева: обычная трёхслойная нейронная сеть. Справа: свёрточная сеть располагает нейроны в трёх измерениях (ширина, высота, глубина), как показано на одном из слоёв. Каждый слой свёрточной сети преобразует трёхмерный входной объём в трёхмерный выходной объём активаций нейронов. В этом примере красный входной слой хранит изображение, так что его ширина и высота — размеры изображения, а глубина равна 3 (каналы красный, зелёный, синий).
Свёрточная сеть состоит из слоёв. У каждого слоя простой интерфейс: он преобразует входной трёхмерный объём в выходной трёхмерный объём некоторой дифференцируемой функцией, у которой могут быть параметры, а могут и не быть.
Слои, из которых строят свёрточные сети
Заголовок раздела «Слои, из которых строят свёрточные сети»Как описано выше, простая свёрточная сеть — последовательность слоёв, и каждый слой преобразует один объём активаций в другой дифференцируемой функцией. Для построения свёрточных архитектур используются три основных типа слоёв: свёрточный слой (Convolutional Layer), слой пулинга (Pooling Layer) и полносвязный слой (Fully-Connected Layer, ровно как в обычных нейронных сетях). Складывая эти слои стопкой, получаем полную архитектуру свёрточной сети.
Пример архитектуры: обзор. Подробности ниже, а пока: простая свёрточная сеть для классификации CIFAR-10 может иметь архитектуру [INPUT – CONV – RELU – POOL – FC]. Подробнее:
- INPUT [32 × 32 × 3] хранит сырые значения пикселей изображения — в данном случае ширина 32, высота 32 и три цветовых канала R, G, B.
- Слой CONV вычисляет выходы нейронов, связанных с локальными областями входа: каждый вычисляет скалярное произведение своих весов и небольшой области входного объёма, с которой связан. Если взять 12 фильтров, может получиться объём [32 × 32 × 12].
- Слой RELU применяет поэлементную функцию активации, например с порогом в нуле. Размер объёма не меняется ([32 × 32 × 12]).
- Слой POOL выполняет понижение разрешения по пространственным измерениям (ширине и высоте), давая, например, объём [16 × 16 × 12].
- Слой FC (полносвязный) вычисляет оценки классов, давая объём размером [1 × 1 × 10], где каждое из 10 чисел — оценка одного из 10 классов CIFAR-10. Как в обычных нейронных сетях и как следует из названия, каждый нейрон этого слоя связан со всеми числами предыдущего объёма.
Так свёрточная сеть слой за слоем преобразует исходное изображение от значений пикселей до итоговых оценок классов. Заметьте, что у одних слоёв есть параметры, а у других нет. В частности, слои CONV и FC выполняют преобразования, зависящие не только от активаций входного объёма, но и от параметров (весов и сдвигов нейронов). А слои RELU и POOL реализуют фиксированную функцию. Параметры слоёв CONV и FC обучаются градиентным спуском, чтобы оценки классов, вычисляемые сетью, согласовывались с метками каждого изображения обучающей выборки.
Итак:
- Архитектура свёрточной сети в простейшем случае — список слоёв, преобразующих объём изображения в выходной объём (например, с оценками классов).
- Типов слоёв немного (CONV, FC, RELU, POOL — безусловно самые популярные).
- Каждый слой принимает входной трёхмерный объём и преобразует его в выходной трёхмерный объём дифференцируемой функцией.
- У слоя могут быть параметры, а могут и не быть (у CONV и FC есть, у RELU и POOL — нет).
- У слоя могут быть дополнительные гиперпараметры, а могут и не быть (у CONV, FC, POOL есть, у RELU — нет).
Рисунок. Активации примера свёрточной архитектуры. Начальный объём хранит сырые пиксели изображения (слева), последний — оценки классов (справа). Каждый объём активаций по ходу обработки показан столбцом. Поскольку трёхмерные объёмы трудно изобразить, срезы каждого объёма разложены по строкам. Последний объём хранит оценки всех классов, но показаны только 5 лучших оценок с подписями. Полное веб-демо — в шапке сайта курса. Показанная архитектура — крошечная сеть VGG, о которой поговорим позже.
Теперь опишем отдельные слои, их гиперпараметры и связность.
Свёрточный слой
Заголовок раздела «Свёрточный слой»Слой Conv — основной строительный блок свёрточной сети, выполняющий большую часть вычислительной работы.
Обзор и интуиция без аналогий с мозгом. Сначала обсудим, что вычисляет слой CONV, без аналогий с мозгом и нейронами. Параметры слоя CONV — набор обучаемых фильтров. Каждый фильтр мал по пространству (по ширине и высоте), но простирается на всю глубину входного объёма. Например, типичный фильтр первого слоя свёрточной сети может иметь размер 5 × 5 × 3 (5 пикселей в ширину и высоту и 3, потому что глубина изображений — 3 цветовых канала). При прямом проходе мы сдвигаем (точнее, сворачиваем) каждый фильтр по ширине и высоте входного объёма и в каждой позиции вычисляем скалярное произведение элементов фильтра и входа. Сдвигая фильтр по ширине и высоте, мы получаем двумерную карту активаций — отклики фильтра в каждой пространственной позиции. Интуитивно сеть выучит фильтры, которые активируются, когда видят какой-то визуальный признак: на первом слое — край определённой ориентации или пятно определённого цвета, а на верхних слоях — в итоге целые узоры вроде сот или колёс. В каждом слое CONV у нас целый набор фильтров (например, 12), и каждый даёт отдельную двумерную карту активаций. Мы складываем эти карты вдоль измерения глубины и получаем выходной объём.
Взгляд с позиций мозга. Если вы любите аналогии с мозгом и нейронами, каждый элемент трёхмерного выходного объёма можно понимать как выход нейрона, который смотрит лишь на небольшую область входа и разделяет параметры со всеми нейронами слева и справа от себя в пространстве (потому что все эти числа получены применением одного и того же фильтра).
Теперь обсудим детали связности нейронов, их расположения в пространстве и схемы разделения параметров.
Локальная связность. Когда входы многомерны, как изображения, связывать нейроны со всеми нейронами предыдущего объёма, как мы видели, непрактично. Вместо этого свяжем каждый нейрон лишь с локальной областью входного объёма. Пространственный размер этой связности — гиперпараметр, называемый рецептивным полем нейрона (это то же самое, что размер фильтра). Протяжённость связности вдоль оси глубины всегда равна глубине входного объёма. Ещё раз подчеркнём эту асимметрию в обращении с пространственными измерениями (шириной и высотой) и измерением глубины: связи локальны в двумерном пространстве (по ширине и высоте), но всегда полны по всей глубине входного объёма.
Пример 1. Пусть входной объём имеет размер [32 × 32 × 3] (например, RGB-изображение CIFAR-10). Если рецептивное поле (размер фильтра) 5 × 5, то у каждого нейрона слоя Conv будут веса к области [5 × 5 × 3] входного объёма, всего 5 · 5 · 3 = 75 весов (плюс 1 параметр сдвига). Протяжённость связности по глубине должна быть 3 — это глубина входного объёма.
Пример 2. Пусть входной объём имеет размер [16 × 16 × 20]. Тогда при рецептивном поле 3 × 3 у каждого нейрона слоя Conv будет 3 · 3 · 20 = 180 связей со входным объёмом. Снова связность локальна в двумерном пространстве (3 × 3), но полна по глубине входа (20).
Рисунок. Слева: пример входного объёма (красный, например изображение CIFAR-10 32 × 32 × 3) и пример объёма нейронов первого свёрточного слоя. Каждый нейрон свёрточного слоя связан со входным объёмом лишь в локальной пространственной области, но на всю глубину (то есть со всеми цветовыми каналами). Вдоль глубины несколько нейронов (в примере 5), и все смотрят на одну и ту же область входа. Линии, соединяющие этот столбец из 5 нейронов, не обозначают веса (эти 5 нейронов не разделяют веса — они относятся к 5 разным фильтрам); они лишь показывают, что нейроны смотрят на одно и то же рецептивное поле: поле общее, веса — разные. Справа: нейроны из главы о нейронных сетях не меняются: они по-прежнему вычисляют скалярное произведение весов на вход и применяют нелинейность, но их связность теперь ограничена локальной пространственной областью.
Пространственное расположение. Мы объяснили, как каждый нейрон слоя Conv связан со входным объёмом, но ещё не обсудили, сколько нейронов в выходном объёме и как они расположены. Размер выходного объёма определяют три гиперпараметра: глубина, шаг (stride) и дополнение нулями (zero-padding):
- Глубина выходного объёма — гиперпараметр, равный числу фильтров, каждый из которых учится искать во входе что-то своё. Например, если первый свёрточный слой получает сырое изображение, разные нейроны вдоль глубины могут активироваться на края разной ориентации или цветовые пятна. Набор нейронов, смотрящих на одну и ту же область входа, будем называть столбцом глубины (depth column; некоторые предпочитают слово волокно, fibre).
- Нужно задать шаг, с которым сдвигается фильтр. При шаге 1 фильтр сдвигается на один пиксель. При шаге 2 (или, нечасто, 3 и больше — на практике это редкость) фильтр «перепрыгивает» по 2 пикселя. Это даёт пространственно меньшие выходные объёмы.
- Как мы скоро увидим, иногда удобно дополнить входной объём нулями по краям. Размер дополнения нулями — гиперпараметр. Приятная черта дополнения нулями в том, что оно позволяет управлять пространственным размером выходных объёмов (чаще всего, как увидим, — чтобы в точности сохранить пространственный размер входа, так что ширина и высота входа и выхода совпадают).
Пространственный размер выходного объёма можно вычислить через размер входного объёма (), размер рецептивного поля нейронов слоя Conv (), шаг () и величину дополнения нулями по краю (). Нетрудно убедиться, что число «умещающихся» нейронов равно . Например, для входа 7 × 7 и фильтра 3 × 3 с шагом 1 и без дополнения получим выход 5 × 5. С шагом 2 — выход 3 × 3. Ещё один графический пример:
Рисунок. Иллюстрация пространственного расположения. В этом примере одно пространственное измерение (ось x), один нейрон с рецептивным полем , размер входа и дополнение нулями . Слева: нейрон сдвигается по входу с шагом , размер выхода . Справа: шаг , размер выхода . Шаг использовать нельзя: он не укладывается аккуратно по объёму. По формуле это видно из того, что не делится на 3. Веса нейрона в этом примере — (показаны справа), сдвиг нулевой. Эти веса общие для всех жёлтых нейронов (см. разделение параметров ниже).
Зачем дополнение нулями. В примере слева размер входа 5 и размер выхода такой же — 5. Так получилось, потому что рецептивные поля размером 3 и мы дополнили нулями на 1. Без дополнения пространственный размер выхода был бы всего 3: столько нейронов «уместилось» бы на исходном входе. В общем случае дополнение при шаге гарантирует, что входной и выходной объёмы имеют одинаковый пространственный размер. Так дополнение нулями используют очень часто; все причины обсудим, когда будем подробнее говорить об архитектурах.
Ограничения на шаг. Ещё раз: гиперпараметры пространственного расположения взаимно ограничены. Например, при размере входа , без дополнения () и с размером фильтра нельзя взять шаг , поскольку — не целое число: нейроны не укладываются по входу аккуратно и симметрично. Такой набор гиперпараметров считается недопустимым, и библиотека свёрточных сетей может выбросить исключение, дополнить остаток нулями, обрезать вход или сделать что-то ещё. Как мы увидим в разделе об архитектурах, подобрать размеры свёрточной сети так, чтобы все размерности «сошлись», бывает настоящей головной болью; дополнение нулями и некоторые правила проектирования сильно её облегчают.
Пример из реальной жизни. Архитектура Крижевского и др., выигравшая соревнование ImageNet в 2012 году, принимала изображения размером [227 × 227 × 3]. Первый свёрточный слой использовал нейроны с рецептивным полем , шагом и без дополнения нулями (). Поскольку , а глубина слоя Conv была , выходной объём слоя имел размер [55 × 55 × 96]. Каждый из 55 · 55 · 96 нейронов этого объёма был связан с областью [11 × 11 × 3] входного объёма. Причём все 96 нейронов каждого столбца глубины связаны с одной и той же областью входа [11 × 11 × 3], но, конечно, с разными весами. Забавная деталь: в самой статье утверждается, что входные изображения были 224 × 224, что наверняка неверно, поскольку — явно не целое число. Это сбило с толку многих в истории свёрточных сетей, и о том, что произошло, известно мало. Моя лучшая догадка — Алекс использовал дополнение нулями ещё на 3 пикселя, не упомянув его в статье.
Разделение параметров. Схема разделения параметров (parameter sharing) применяется в свёрточных слоях, чтобы контролировать число параметров. В примере выше в первом слое Conv 55 · 55 · 96 = 290 400 нейронов, и у каждого 11 · 11 · 3 = 363 веса и 1 сдвиг. Вместе это 290 400 · 364 = 105 705 600 параметров только в первом слое сети. Очевидно, это очень много.
Оказывается, число параметров можно резко сократить, сделав одно разумное предположение: если признак полезно вычислять в некоторой позиции , то его полезно вычислять и в другой позиции . Иначе говоря, назовём один двумерный срез по глубине срезом глубины (depth slice; например, у объёма [55 × 55 × 96] 96 срезов глубины, каждый размером [55 × 55]) и потребуем, чтобы нейроны каждого среза использовали одни и те же веса и сдвиг. С такой схемой у первого слоя Conv в нашем примере будет лишь 96 уникальных наборов весов (по одному на срез), всего 96 · 11 · 11 · 3 = 34 848 уникальных весов, или 34 944 параметра (+96 сдвигов). Иначе говоря, все 55 · 55 нейронов каждого среза глубины теперь используют одни и те же параметры. На практике при обратном распространении каждый нейрон объёма вычисляет градиент по своим весам, но эти градиенты суммируются по каждому срезу глубины, и обновляется только один набор весов на срез.
Если все нейроны одного среза глубины используют один и тот же вектор весов, то прямой проход слоя CONV в каждом срезе можно вычислить как свёртку весов нейрона со входным объёмом (отсюда название: свёрточный слой). Поэтому наборы весов обычно называют фильтром (или ядром, kernel), который сворачивается со входом.
Рисунок. Примеры фильтров, выученных Крижевским и др. Каждый из 96 показанных фильтров имеет размер [11 × 11 × 3], и каждый разделяют 55 · 55 нейронов одного среза глубины. Предположение о разделении параметров вполне разумно: если распознавание горизонтального края важно в одном месте изображения, интуитивно оно полезно и в другом — из-за трансляционно-инвариантной структуры изображений. Поэтому нет нужды заново учиться распознавать горизонтальный край в каждой из 55 · 55 различных позиций выходного объёма слоя Conv.
Иногда предположение о разделении параметров не имеет смысла. Особенно когда входные изображения имеют определённую центрированную структуру, и, например, в разных частях изображения стоит ожидать совершенно разных признаков. Практический пример — центрированные изображения лиц: можно ожидать, что признаки, специфичные для глаз или волос, могут (и должны) выучиваться в разных пространственных позициях. В таком случае схему разделения параметров обычно ослабляют и называют слой просто локально связным слоем (Locally-Connected Layer).
Примеры на NumPy. Чтобы обсуждение стало конкретнее, выразим те же идеи в коде на конкретном примере. Пусть
входной объём — массив numpy X. Тогда:
- Столбец глубины (или волокно) в позиции
(x, y)— это активацииX[x,y,:]. - Срез глубины, или, что то же, карта активаций на глубине
d— это активацииX[:,:,d].
Пример слоя Conv. Пусть входной объём X имеет форму X.shape: (11,11,4). Пусть также дополнения нулями нет
(), размер фильтра , шаг . Тогда пространственный размер выходного объёма ,
то есть ширина и высота равны 4. Карта активаций выходного объёма (назовём его V) будет выглядеть так (в примере
вычислены лишь некоторые элементы):
V[0,0,0] = np.sum(X[:5,:5,:] * W0) + b0V[1,0,0] = np.sum(X[2:7,:5,:] * W0) + b0V[2,0,0] = np.sum(X[4:9,:5,:] * W0) + b0V[3,0,0] = np.sum(X[6:11,:5,:] * W0) + b0
Помните, что в numpy операция * означает поэлементное умножение массивов. Заметьте также, что W0 — вектор весов
этого нейрона, а b0 — сдвиг. Здесь W0 имеет форму W0.shape: (5,5,4), поскольку размер фильтра 5, а глубина
входного объёма 4. В каждой точке мы вычисляем скалярное произведение, как в обычных нейронных сетях. Видно также, что
используются одни и те же веса и сдвиг (из-за разделения параметров), а индексы по ширине растут с шагом 2 (это и есть
шаг). Чтобы построить вторую карту активаций выходного объёма, получим:
V[0,0,1] = np.sum(X[:5,:5,:] * W1) + b1V[1,0,1] = np.sum(X[2:7,:5,:] * W1) + b1V[2,0,1] = np.sum(X[4:9,:5,:] * W1) + b1V[3,0,1] = np.sum(X[6:11,:5,:] * W1) + b1V[0,1,1] = np.sum(X[:5,2:7,:] * W1) + b1(пример движения вдоль y)V[2,3,1] = np.sum(X[4:9,6:11,:] * W1) + b1(или вдоль обоих)
Здесь мы обращаемся ко второму измерению глубины V (индекс 1), потому что вычисляем вторую карту активаций, и теперь
используется другой набор параметров (W1). Для краткости мы опустили остальные операции, которыми слой Conv заполнил
бы прочие части выходного массива V. Кроме того, напомним, что после карт активаций часто поэлементно применяется
функция активации, например ReLU, — здесь она не показана.
Итоги. Слой Conv:
- принимает объём размера ;
- требует четырёх гиперпараметров:
- число фильтров ,
- их пространственный размер ,
- шаг ,
- величина дополнения нулями ;
- выдаёт объём размера , где:
- ,
- (ширина и высота по симметрии вычисляются одинаково),
- ;
- с разделением параметров вводит весов на фильтр, всего весов и сдвигов;
- в выходном объёме -й срез глубины (размера ) — результат «допустимой» (valid) свёртки -го фильтра со входным объёмом с шагом и последующего прибавления -го сдвига.
Распространённая настройка гиперпараметров — . Для этих гиперпараметров есть общепринятые соглашения и эмпирические правила; см. раздел об архитектурах во второй части.
Демо свёртки. В оригинале здесь работающее демо слоя CONV. Поскольку трёхмерные объёмы трудно изобразить, все объёмы (входной — синий, объёмы весов — красные, выходной — зелёный) показаны срезами глубины, сложенными в строки. Входной объём имеет размер , параметры слоя CONV — . То есть у нас два фильтра размера , применяемые с шагом 2. Поэтому пространственный размер выхода . Кроме того, к входному объёму применено дополнение , так что внешняя рамка входа — нули. Визуализация перебирает выходные активации (зелёные) и показывает, что каждый элемент вычисляется поэлементным умножением выделенной части входа (синей) на фильтр (красный), суммированием и прибавлением сдвига.
Реализация через умножение матриц. Операция свёртки по сути вычисляет скалярные произведения фильтров и локальных областей входа. Распространённый способ реализации слоя CONV пользуется этим и формулирует прямой проход свёрточного слоя как одно большое матричное умножение:
- Локальные области входного изображения вытягиваются в столбцы операцией, которую обычно называют im2col.
Например, если вход [227 × 227 × 3] сворачивается с фильтрами 11 × 11 × 3 с шагом 4, мы берём блоки пикселей
[11 × 11 × 3] и вытягиваем каждый в вектор-столбец размера 11 · 11 · 3 = 363. Повторяя это по входу с шагом 4,
получаем позиций и по ширине, и по высоте, то есть выходную матрицу
X_colоперации im2col размера [363 × 3025], где каждый столбец — вытянутое рецептивное поле, а всего их 55 · 55 = 3025. Поскольку рецептивные поля перекрываются, каждое число входного объёма может повторяться в нескольких столбцах. - Веса слоя CONV аналогично вытягиваются в строки. Например, 96 фильтров размера [11 × 11 × 3] дают матрицу
W_rowразмера [96 × 363]. - Результат свёртки теперь равен одному большому матричному умножению
np.dot(W_row, X_col), которое вычисляет скалярное произведение каждого фильтра с каждым рецептивным полем. В нашем примере результат имеет размер [96 × 3025] — выход каждого фильтра в каждой позиции. - Наконец, результат нужно переформировать обратно в правильный выходной размер [55 × 55 × 96].
Минус подхода — он может потреблять много памяти, поскольку некоторые значения входного объёма многократно
дублируются в X_col. Зато можно воспользоваться множеством очень эффективных реализаций умножения матриц (например,
в широко используемом API BLAS). Более того, ту же идею im2col можно применить для
операции пулинга, которую мы обсудим дальше.
Обратное распространение. Обратный проход операции свёртки (и по данным, и по весам) — тоже свёртка (но с пространственно отражёнными фильтрами). Это легко вывести в одномерном случае на игрушечном примере (пока не расписываем).
Свёртка 1 × 1. Кстати, в ряде статей используются свёртки 1 × 1, впервые исследованные в Network in Network. Некоторых поначалу смущают свёртки 1 × 1, особенно тех, кто пришёл из обработки сигналов. Обычно сигналы двумерные, и свёртка 1 × 1 не имеет смысла (это просто поточечное масштабирование). Но в свёрточных сетях это не так: мы работаем с трёхмерными объёмами, и фильтры всегда простираются на всю глубину входного объёма. Например, если вход [32 × 32 × 3], свёртка 1 × 1 фактически вычисляет трёхмерные скалярные произведения (поскольку глубина входа — 3 канала).
Расширенные свёртки (dilated convolutions). Относительно новая идея (см., например,
статью Фишера Ю и Владлена Колтуна) — ввести у слоя CONV ещё один гиперпараметр,
расширение (dilation). До сих пор мы обсуждали только сплошные фильтры. Но можно сделать фильтры с промежутками между
ячейками — это и есть расширение. Например, в одном измерении фильтр w размера 3 вычисляет по входу x следующее:
w[0]*x[0] + w[1]*x[1] + w[2]*x[2]. Это расширение 0. При расширении 1 фильтр вычислит
w[0]*x[0] + w[1]*x[2] + w[2]*x[4]; то есть между применениями промежуток в 1. В некоторых задачах это очень полезно
вместе с обычными (нерасширенными) фильтрами: можно гораздо агрессивнее объединять пространственную информацию со
всего входа меньшим числом слоёв. Например, если сложить два слоя CONV 3 × 3 один на другой, нетрудно убедиться, что
нейроны второго слоя — функция участка входа 5 × 5 (говорят, что эффективное рецептивное поле этих нейронов —
5 × 5). С расширенными свёртками эффективное рецептивное поле растёт гораздо быстрее.
Словарик
Заголовок раздела «Словарик»| EN | RU |
|---|---|
| activation volume, depth | объём активаций, глубина |
| filter, kernel, activation map | фильтр, ядро, карта активаций |
| receptive field, local connectivity | рецептивное поле, локальная связность |
| stride, zero-padding | шаг, дополнение нулями |
| depth column (fibre), depth slice | столбец глубины (волокно), срез глубины |
| parameter sharing, locally-connected layer | разделение параметров, локально связный слой |
| im2col | im2col (вытягивание областей в столбцы) |
| 1x1 convolution, dilated convolution | свёртка 1 × 1, расширенная свёртка |
| effective receptive field | эффективное рецептивное поле |