Чрезмерная подгонка: обычная история ленивых сетей

Обучение глубокой нейронной сети, которая может хорошо обобщаться на новые данные, является сложной задачей. Модель со слишком малой емкостью не может изучить проблему, тогда как модель со слишком большой емкостью может изучить ее слишком хорошо и чрезмерно соответствовать набору обучающих данных. В обоих случаях получается модель, которая плохо обобщается. Как упоминала IBM

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

Стандартный слой свертки включает параметры input * output * width * height, где ширина и высота - это ширина и высота фильтра. Для входного канала 10 и выхода 20 с фильтром 7 * 7 это будет иметь 9820 параметров. Наличие такого количества параметров увеличивает вероятность переобучения.

Свертка по глубине была введена как способ уменьшить количество параметров сверточной сети и, следовательно, решить проблему чрезмерной подгонки. Оставшаяся часть статьи разделена на следующие категории: Сначала я проиллюстрирую, как работает обычная свертка. Затем обсуждается концепция глубинной свертки. И, наконец, мы обобщаем эту концепцию на разделительную свертку по глубине.

Обычная свертка

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

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

Вот практический пример слоя свертки по глубине:

И количество параметров и форм каждого слоя показано ниже:

Свертка по глубине

Свертка по глубине - это тип свертки, при котором мы применяем один сверточный фильтр для каждого входного канала. Этот тип сверток сохраняет каждый канал отдельно. Подводя итог этапам, мы:

  1. Разделите вход и фильтр на каналы
  2. Сверните каждый вход с помощью соответствующего фильтра
  3. Сложите свернутые выходные данные вместе

В слое «Свертка по глубине» параметры остаются такими же, в то время как эта свертка дает вам три выходных канала только с одним трехканальным фильтром. В то время как вам потребуются три трехканальных фильтра, если вы будете использовать обычную свертку.

В качестве конкретного примера предположим, что входной слой имеет размер 7 * 7 * 3 (высота * ширина * каналы), а размер фильтра - 3 * 3 * 3. После 2D-свертки с одним фильтром выходной слой имеет вид размером 5 * 5 * 1 (всего с 1 каналом). Обычно между двумя слоями нейронной сети применяется несколько фильтров. Допустим, у нас 128 фильтров. После применения этих 128 2D сверток у нас есть 128 выходных карт размером 5 * 5 * 1. Затем мы складываем эти карты в один слой размером 5 * 5 * 128. Таким образом мы трансформируем входной слой (7 * 7 * 3) в выходной слой (5 * 5 * 128). Как видно, в этом типе свертки пространственные размеры, то есть высота и ширина, уменьшены, а глубина увеличена. Напротив, давайте применим к входному слою свертку по глубине. Вместо использования одного фильтра размером 3 * 3 * 3 в 2D Convolution мы использовали 3 ядра по отдельности. Каждый фильтр имеет размер 3 * 3 * 1. Каждое ядро ​​сворачивает с 1 каналом входного слоя (только 1 канал, не все каналы!). Каждая такая свертка обеспечивает карту характеристик размером 5 * 5 * 1. Затем мы складываем эти карты характеристик вместе, чтобы создать изображение 5 * 5 * 3. После этого у нас есть результат с размером 5 * 5 * 3. Теперь мы сжимаем пространственные размеры, но глубина все еще та же, что и раньше.

Вот практический пример слоя свертки по глубине:

Как видите, в Свертке по глубине больше нет параметра, указывающего количество фильтров. Количество параметров и форм каждого слоя показано ниже:

На рисунке выше вы можете увидеть, насколько уменьшилось количество параметров по сравнению с обычной сверткой!

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

Общее количество выходных каналов свертки по глубине будет равно num_filters * depth_multiplier.

Разделимая свертка по глубине

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

Вы можете разделить размер матрицы по высоте и ширине на два вектора. Таким образом, вы можете представить матрицу 3 * 3 из 9 значений только с двумя векторами 3 * 1, то есть только с 6 значениями. Та же идея, примененная для отделения измерения глубины от горизонтального (ширина * высота), дает нам разделительную свертку по глубине, где мы выполняем свертку по глубине, а после этого мы используем фильтр 1 * 1 для покрытия измерения глубины.

Следует отметить, насколько параметры уменьшаются этой сверткой для вывода того же количества каналов. Для создания одного канала нам нужно 3 * 3 * 3 параметра для выполнения свертки по глубине и 1 * 3 параметра для выполнения дальнейшей свертки по глубине. Но если нам нужно 3 выходных канала, нам нужны только три фильтра глубины 1 * 3, дающие нам всего 36 (= 27 +9) параметров, тогда как для того же количества выходных каналов в обычной свертке нам нужны три фильтра 3 * 3 * 3, дающие нам всего 81 параметр.

Вот практический пример слоя с разделительной сверткой по глубине:

И количество параметров и форм каждого слоя показано ниже:

Разделимая свертка по глубине также предоставляет параметр depth_multiplier, как показано ниже:

Примечание: обратите внимание на то, что количество параметров разделяемых слоев по сравнению со случаем, когда depth_multiplier было равно 1. Как и прежде, общее количество выходных каналов разделяемой свертки по глубине будет равно num_filters * depth_multiplier.