21 мая 2019 г.

Что такое свертки?

Прежде чем мы ответим на это, давайте сначала поймем одну вещь. Компьютеры - тупые существа. Они не знают, что означают слова, например, кошка или собака. Они не знают, как выглядят вещи, например, кошка или собака. Все, что они понимают, это цифры (ну… немного не так, но для нашего случая работает).

Фильтры можно рассматривать как набор ядер.

Но что такое ядра?

Представьте, что вы находитесь на съемочной площадке любимого телешоу. Возьмем пока «Игру престолов», но подойдет любой сериал. Ядро — это каждый отдельный актер, писатель, оператор и т. д. в этом сериале.

ядерки сидят за столом, пытаясь определить ход сезона

А так как компьютеры не понимают ничего, кроме чисел, ядра для нас — это просто числа. Каждое ядро ​​представляет собой матрицу чисел. Теперь, если эпизод «Игры престолов» аналогичен нейронной сети, пытающейся отличить кошку от собаки, ядра — это отдельные действующие лица, которые помогли ей принять решение.

В случае сверточных нейронных сетей (CNN) ядра ведут себя как извлекатели признаков извлекатели признаков. Извлечение определенных функций из данных и передача их на следующий уровень, что в конечном итоге помогает принять решение.

Думая о ядрах как об экстракторах функций, мы переходим к каналам. Каналы теперь можно рассматривать как пакеты функций. «Сумка» содержит тот же набор функций.

Цветное изображение обычно имеет три канала — красный, зеленый и синий (изображение RGB). Красный канал содержит аналогичный набор характеристик изображения, который описывает его «красноту». То же самое для зеленого и синего каналов.

В случае с «Игрой престолов» каналы можно рассматривать как отдел — звуковой отдел можно рассматривать как канал, точно так же отдел видео и маркетинга могут быть другими каналами.

Теперь мы подошли к сверткам.

рис. 1: пример двумерной свертки ядра 3x3x1 на данных 5x5x1

В свертке мы берем ядро ​​​​размера (ширина, высота, канал), например. 3x3x1 и перемещаем его по нашим данным, выполняя поэлементное умножение той части ввода, на которой он находится в данный момент, и суммируя результаты, чтобы получить выходной элемент.

На изображении выше ядро ​​3x3x1 сворачивает входные данные 5x5x1. Это также известно как 2D Convolution.

Примечание. Количество каналов в ядре должно совпадать с количеством каналов во входных данных. Теперь, исходя из количества используемых нами ядер, определяются каналы выходных данных. например если наши входные данные имеют размер 7x71, наше ядро ​​должно иметь 1 канал, например 3x3x1. Теперь, если мы используем 32 таких ядра, размер выходных данных будет примерно 5x5x32 (у него будет 32 канала). Если мы хотим продолжить свертку, мы должны использовать ядра с 32 каналами, например 3 x 3 x 32.

рис. 3: свертка 4 ядер формы 3x3x3 для данных размером 5x5x3 для получения выходных данных формы 3x3x4

Почему бы нам не использовать ядра четной формы, такие как 2x2, 4x4, 6x6?

Когда у нас есть ядро, такое как 3x3 или 5x5, ядро ​​располагается поверх пикселя и имеет симметричный вид на соседние пиксели. Есть центральный элемент и симметрия вокруг него.

рис. 3: свертка с ядром 2x2 имеет несимметричный вид пикселей под ним.

Мы полностью теряем эту симметрию, если это любое ядро ​​четной формы. Ядро не знает, какие локальные особенности пикселя оно извлекает. Если мы делаем что-то вроде определения границ, то должен быть центральный элемент, у которого есть что-то слева и что-то справа — желательно с равномерным сходством. Если его нет, это приводит к искажению вывода ядра. Вот почему мы избегаем использования таких ядер, как 2x2, 4x4, 6x6 и т. д.

Почему мы обычно используем ядра 3x3, а не 1x1, 5x5, 7x7 и т. д.?

В сверточной нейронной сети мы обычно думаем о ядрах как об экстракторах признаков. Когда мы используем ядро ​​1x1, «вид» ядра очень ограничен — это будет просто элемент прямо под ядром. Из рис.1. выше мы видим, что когда мы используем ядро ​​​​3x3, «вид» ядра, когда оно находится над пикселем, на 9 пикселей ниже его. Мы видим больше данных, это помогает нам извлекать лучшие функции.

Если это ядро ​​1x1, оно ведет себя как функция идентификации, которая бесполезна для нас при извлечении признаков.

Следующее ядро ​​нечетной формы — 3x3 (выше мы обсуждали, почему мы не используем ядра четной формы).

Ядро 3x3 отлично ведет себя как экстрактор признаков. Он имеет центральный элемент и симметрию вокруг него. Он охватывает достаточно области, чтобы иметь знание местности, полезное для извлечения признаков, так что это работает для нас.

5x5, 7x7 и другие также имеют симметрию вокруг пикселей, но при свертывании у них больше параметров, чем при свертывании с ядром 3x3, поэтому чем больше мы уходим от 3x3, тем менее вычислительно эффективным он становится. Локальная область, которую он покрывает, также больше, чем мы хотим, чтобы она была при извлечении признаков. 3x3 дает нам хороший охват пикселей.

Еще одно преимущество использования ядер 3x3 заключается в том, что мы можем получить тот же эффект, что и любое ядро ​​необычной формы с ядром 3x3. Например, мы можем использовать два ядра 3x3, чтобы получить тот же эффект, что и при использовании ядра 5x5 (без отступов и с шагом 1).

Под аффектом мы подразумеваем рецептивное поле или «видение», о котором мы упоминали ранее. Использование 2 ядер 3x3 дает нам то же самое глобальное рецептивное поле, что и использование 1 ядра 5x5, и все же использование 3x3 в этом случае более эффективно с точки зрения вычислений!

Из-за всех этих преимуществ графические процессоры, такие как NVIDIA, также оптимизировали свертки на ядрах размером 3x3. Во многих документах, таких как документ Resnet, в коде содержится ядро ​​7x7, но при оптимизации производительности таких сетей ядра 7x7 преобразуются в 3 ядра 3x3.

Поэтому мы придерживаемся использования ядер 3x3, когда хотим извлечь функции.

Примечание. Мы используем свертки 1 x 1 в наших сетях, но не используем их для извлечения признаков. Обычно они используются для увеличения/уменьшения количества каналов. Мы можем использовать 3x3 для изменения количества каналов, но это также ведет себя как обычная свертка, поэтому также меняются значения пикселей. 1 x 1, будучи отображением идентичности, не выполняет обычную свертку, поэтому это идеальное ядро, когда мы просто хотим изменить количество каналов.

Первоначально опубликовано на https://dhruvkaran.com.