В этой статье я очень кратко представлю сверточные нейронные сети, их две стратегии заполнения и их рецептивное поле (RF). Кроме того, я рассматриваю три возможных стратегии увеличения нашего РФ и их компромиссы. Наконец, мы увидим, как расширение применяется к транспонированным сверткам (я описал их в моем предыдущем посте), и что такое RF в этом случае. Все объясняется для случая 1D, но распространить его на изображения (2D), видео (3D) или даже сигналы более высокой размерности просто, просто симметрично реплицируйте размеры ядра (не каналы, а только измерения времени / пространства).

Сверточные нейронные сети (1D)

Давайте сначала вспомним, что происходит в одномерном сверточном слое с одним нейроном, тремя весами w = [w1, w2, w3] и входным сигналом x = [x1, x2, x3] с одним каналом:

На самом деле мы можем увидеть, как одиночный сверточный нейрон не отличается от нейрона прямой связи, если сопоставить входную длину с количеством соединений ядра (3). Разница с нейроном с прямой связью возникает, когда длина ввода L больше, чем длина ядра N, т.е. L > N :

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

Пока мы уже можем построить два типа сверточных слоев, и оба будут иметь одинаковое понятие рецептивного поля (я очень скоро достигну концепции рецептивного поля!): (1) Ванильные свертки, которые работают, как мы видим на предыдущем рисунке, симметрично относительно центральной точки; и (2) каузальные свертки, которые работают, наблюдая только прошлое, чтобы предсказать настоящее, что я изобразил на следующем рисунке ниже.

Это обрабатывает данные, не заглядывая в будущее ввода, чтобы предсказать результат. Это основная структура знаменитой WaveNet.

Теперь, что такое рецептивное поле нейрона? На самом деле это желтый треугольник, который мы видим на рисунке выше: объем контекста, который нейрон видит на входе, чтобы предсказать его выход . Итак, у одного слоя есть рецептивное поле R = len(w) = N. Но что происходит, когда мы складываем слои? Конечно, становится больше.

Как сделать действительно большие рецептивные поля?

Теперь мы знаем, каково рецептивное поле определенного нейрона внутри сверточной сети. Но обычно после глубокой композиции нам нужно большое поле восприятия. Мы видели, что наложение возможно, но рецептивное поле медленно растет с глубиной с фиксированными маленькими ядрами. Мы можем увеличить RF тремя способами:

  1. Увеличьте размер ядра
  2. Используйте более высокий шаг или объединение
  3. Использование факторов расширения в ядрах

Первый вариант можно увидеть, посмотрев на рисунок выше и изобразив ядро ​​большего размера (например, 5, 7, 11 и т. Д.). Второй вариант изображен на рисунке ниже, где всякий раз, когда мы имеем уменьшение длины сигнала в соотношении out_len/in_len (например, 0.5), принимающее поле существенно увеличивается при фиксированном размере ядра.

На рисунке выше мы видим, что шаг теперь равен 2 вместо 1 (синими стрелками нет перекрытия). Это уже дает нам сигнал, временное разрешение которого уменьшено вдвое, что позволило нам достичь поля восприятия 7 с одним слоем меньше. Это, конечно, очень маленький пример, но представьте экспоненциальное увеличение воспринимающего поля, когда у нас есть 2, 3 или более слоев децимации с коэффициентом 2 (или более). Рост сопоставим с ростом нашего третьего метода - расширенных извилин.

На рисунке ниже показан метод расширения, где расширение означает «вычеркивание» d-1 элементов между двумя весами ядра. Значение d называется фактором расширения. В приведенном ниже случае у нас есть ядро ​​размера 3 и расширения 1 в первом слое. Это гарантирует, что все выборки во входной последовательности будут видны в первых скрытых функциях, и с этого момента будут обрабатываться пустые значения для быстрого увеличения RF. Таким образом, коэффициент расширения второго слоя равен d=2, что уже дает нам виртуальный размер ядра 5 в этом слое, хотя мы оцениваем параметры ядер длиной 3! С расширением d=4 у нас есть виртуальный размер ядра 9, и мы, конечно, можем продолжать увеличивать его на верхних уровнях.

У нас есть эти (2) и (3) механизмы для увеличения нашего рецептивного поля при фиксированном размере параметров из нашей исходной сети, которые были ядрами размера 3. Каков компромисс между этими (2) и (3) методами хотя?

Остерегайтесь памяти и времени обработки

Метод (2) - это прореживание, поэтому каждый прореженный слой будет обрабатываться быстрее (сверточное ядро ​​выполняет меньше шагов с меньшими временными шагами). Однако это будет полезно только тогда, когда вы захотите сжать свои данные для классификации или создать архитектуру, подобную автокодировщику (по крайней мере, обычно). Еще одним преимуществом этого метода является экономия памяти, поскольку меньшее разрешение по времени означает меньшее количество точек данных для хранения в качестве промежуточных активаций карты функций через вашу сеть!

Метод (3) не выполняет прореживание, поэтому вы уважаете временное разрешение сигнала и извлекаете некоторые особенности на каждом этапе, но это происходит за счет более высокого потребления памяти и более низкой скорости. С высокопроизводительными матричными вычислительными модулями, такими как графические процессоры, скорость во многих случаях существенно не снижается (если у нас нет авторегрессивной модели), но память может быть! В любом случае, это идеально подходит для таких моделей, как WaveNet (van den Oord et al. 2016) или параллельная WaveNet (van den Oord et al. 2017).

И последнее, но не менее важное: как выглядит деконволюция, когда мы расширяем ее?

Возможно, некоторые из вас, читатели, заметили возможность использования дилатации в так называемых транспонированных свертках (или деконволюциях). Например, в документации PyTorch ConvTranspose1d есть аргумент расширения:

В моем предыдущем посте я описал, изобразил и проиллюстрировал кодом, что такое деконволюция. Вы увидите, что это обратная свертка (грубо говоря). Что ж, у нас есть интересный факт: мы выбираем, как создается наш фактор повышающей дискретизации. Либо мы используем непрерывный скользящий фильтр с помощью stride > 1 (помните, с шириной ядра kwidth >= stride), либо позволяем окну скользить с stride = 1 и используем коэффициент расширения d > 1 для достижения требуемой выходной интерполяции. На рисунке ниже показаны две возможности. Можно сказать, что в обоих случаях каждое ядро ​​имеет RF 2, так что каждый y сэмпл отвечает за генерацию 2 x сэмплов.

Это хорошая идея - использовать деконволюцию с чередованием? Это зависит от вашего приложения, но у меня нет четкого ответа на этот вопрос (пока)! В чем же здесь главный смысл? Не существует единственного способа добиться эффекта кодера / декодера. Существует множество факторов для разработки сверточной / деконволюционной нейронной сети, так что размерность, которую мы получаем, была желаемой, и чтобы каждый нейрон в самой глубокой части структуры имел доступ к достаточному количеству входного контекста для принятия решений. Эти факторы включают не только ширину ядра и заполнение, но также расширение и шаг.

Резюме

Мы рассмотрели сверточную нейронную сеть, понимая ее как стек сверточных слоев. Мы также вкратце рассмотрели простой трюк с заполнением, который дает нам каузальные сверточные нейронные сети. Затем мы показали определение рецептивного поля (RF) нейрона и то, как мы можем манипулировать параметрами сети, чтобы увеличить его. Доступны три основные стратегии: (1) изменение размера ядра, (2) построение прореживающих структур, таких как чередующиеся свертки (максимальное / среднее объединение также будет работать) и (3) использование расширенных сверток. Мы также видели, как расширение интерпретируется в транспонированных свертках и как они дают нам новые способы достижения коэффициентов интерполяции с помощью стратегии декодирования с чередованием.