Наконец-то пройти все курсы Deeplearning.ai в марте! Я очень рекомендую это!
Если вы уже знаете основы, вам могут быть интересны курсы 4 и 5, которые показывают много интересных случаев в CNN и RNN. Хотя я думаю, что 1 и 2 лучше структурированы, чем другие, что дает мне больше понимания нейронной сети.
Я загрузил задание всех курсов глубокого обучения на свой GitHub. Вы можете найти задание для CNN здесь. Надеюсь, это может помочь вам, когда вы боретесь. Для нового курса вам действительно нужно больше терпения, чтобы бороться с грейдером. Не спрашивайте меня, откуда я это знаю… ›_‹
Конспект первого курса я закончил в своем предыдущем посте:
1. Сигмовидная и мелкая NN.
2. Прямое и обратное распространение,
3. Регуляризация
Я буду продолжать работать над остальными. Поскольку в последнее время я использую CNN на работе, давайте сначала пройдемся по CNN. Любая обратная связь абсолютно приветствуется! И, пожалуйста, поправьте меня, если я сделаю какую-то ошибку.
Говоря о CNN, обычно первое, что приходит на ум, — это применение изображений. Хотя на самом деле CNN можно более широко применять к разным данным, которые соответствуют определенному предположению. какое предположение? Потом узнаешь.
Возможности CNN
CNN отличается от традиционной нейронной сети в трех областях:
- разреженное взаимодействие (соединение)
- совместное использование параметров
- эквивариантное представление.
На самом деле третья функция больше похожа на результат первых двух функций. Давайте пройдемся по ним один за другим.
Разреженное взаимодействие, в отличие от полностью подключенной нейронной сети, для слоя свертки каждый выход подключен только к ограниченным входам, как указано выше. Для скрытого слоя, который принимает m нейронов в качестве входных данных и n нейронов в качестве выходных, полносвязный скрытый слой имеет матрицу весов размером m*n для вычисления каждого вывода. Когда m очень большое, вес может быть огромной матрицей. При разреженном соединении к каждому выходу подключается только k вход, что приводит к уменьшению масштаба вычислений с O(m*n) до O(k*n ). И уменьшение использования памяти с m*n до k*n.
Совместное использование параметров дает больше информации, если рассматривать его вместе с разреженным подключением. Поскольку разреженное соединение создает сегментацию данных. Например, x1, x5 являются независимыми на приведенном выше графике из-за разреженного соединения. Однако при совместном использовании параметров одна и та же весовая матрица используется во всех позициях, что приводит к скрытой связи. Кроме того, он может дополнительно уменьшить размер матрицы весов с k*n до k . Особенно при работе с изображениями переход от k*n к k может значительно улучшить использование памяти.
Эквивариантное представление является результатом совместного использования параметров. Поскольку одна и та же весовая матрица используется в разных позициях на входе. Таким образом, выход инвариантен к параллельному движению. Скажем, g представляет параллельный сдвиг, а f — функция свертки, тогда f( g(x) ) = g( f(x)) . Эта функция может быть очень полезна, когда нас интересует только наличие функции, а не ее положение. Но, с другой стороны, это может быть большой недостаток CNN в том, что он плохо определяет позицию.
Компоненты CNN
Учитывая вышеперечисленные 3 функции, давайте поговорим о том, как реализовать CNN.
(1). Ядро
Ядро, или так называемый фильтр, — это весовая матрица в CNN. Он реализует поэлементное вычисление по входной матрице и выводит сумму. Ядро обычно имеет размер, который намного меньше исходного ввода, поэтому мы можем воспользоваться уменьшением памяти.
Ниже приведен 2D-ввод слоя свертки. Это может быть изображение в оттенках серого или многомерный временной ряд.
Когда входными данными является трехмерное измерение, мы называем третье измерение Канал (объем). Наиболее распространенным случаем является ввод изображения RGB, где каждый канал представляет собой двумерную матрицу, представляющую один цвет. Увидеть ниже:
Пожалуйста, имейте в виду, что ядро всегда имеет то же количество каналов, что и вход! Поэтому это приводит к уменьшению размерности во всех измерениях (если вы не используете ядро 1 * 1). И у нас может быть несколько ядер для захвата разных функций. Как и ниже, у нас есть 2 ядра (фильтра), каждое имеет размерность (3,3,3).
Таблица измерений ядра
- Входное измерение ( n_w, n_h, n_channel ). Когда n_channel = 1, это двумерный ввод.
- Измерение ядра ( n_k, n_k, n_channel ). Ядро не всегда квадратное, может быть ( n_k1, n_k2, n_channel )
- Выходное измерение (n_w - n_k + 1, n_h - n_k + 1, 1)
- Когда у нас есть n разных ядер, размерность вывода будет (n_w -n_k + 1, n_h -n_k + 1, n)
(2). Шагать
Как мы упоминали ранее, одним из ключевых преимуществ CNN является ускорение вычислений за счет уменьшения размерности. Можем ли мы быть более агрессивными в этом вопросе?!
Да, мы можем использовать Stride! По сути, шаг — это перемещение ядра по вводу, оно пропускает определенный ввод на определенную длину. Мы можем легко сказать, как работает шаг, по сравнению ниже:
Спасибо vdumoulin за такую прекрасную анимацию. Вы можете найти больше на его GitHub
Stride может еще больше ускорить вычисления, но при этом будет потеряна часть информации на выходе. Мы можем рассматривать это как выходную субдискретизацию.
(3). Отступ
И ядро, и шаг функционируют как техника уменьшения размера. Таким образом, для каждого слоя свертки выходной размер всегда будет меньше входного. Однако, если мы хотим построить глубокую сверточную сеть, мы не хотим, чтобы размер входных данных уменьшался слишком быстро. Маленькое ядро может частично решить эту проблему. Но для того, чтобы сохранить определенную размерность, нам нужно нулевое заполнение. В основном это добавляет ноль к вашему вводу, как показано ниже:
Существует несколько типов набивки, которые часто используются:
- Допустимое заполнение: вообще без заполнения, вывод = ввод - (K - 1)
- То же заполнение: сохранить тот же размер, вывод = ввод
- Полное заполнение: каждый ввод посещается k раз, вывод = ввод + (k -1)
Подводя итог, мы используем s для обозначения шага, а p обозначает заполнение. n — размер ввода, k — размер ядра (для простоты и ядро, и ввод квадратные). Тогда выходной размер будет следующим:
этаж((n+2*p-k)/s)+ 1
(4). Объединение
Я помню, в последней статье CNN автор говорит: я не могу объяснить, почему я добавляю объединяющий слой, но хорошая структура CNN всегда имеет объединяющий слой.
Объединение функционирует как метод уменьшения размерности. Но в отличие от ядра, которое уменьшает все размеры, пулинг сохраняет размер канала нетронутым. Следовательно, это может еще больше ускорить вычисления.
В основном объединение выводит определенную статистику для определенного числа входных данных. Это вводит более сильную функцию, чем эквивариантное представление — инвариантное представление.
В основном используемый пул — это максимальный и средний пул. И L2 есть, и средневзвешенное, и т.д.
3. Структура CNN
(1). Интуиция CNN
В книге «Глубокое обучение» автор дает очень интересное представление. Он рассматривает свертки и пулы как бесконечно сильное априорное распределение. Распределение указывает на то, что все скрытые единицы имеют одинаковый вес, полученный из определенного количества входных данных, и имеют параллельный инвариантный признак.
Согласно байесовской статистике априорное распределение является субъективным предпочтением модели, основанным на опыте. И чем сильнее априорное распределение, тем большее влияние оно окажет на оптимальную модель. Поэтому, прежде чем использовать CNN, мы должны убедиться, что наши данные соответствуют приведенному выше предположению.
(2). классическая структура
Классическая нейронная сеть свертки имеет слой свертки, слой нелинейной активации и слой объединения. Для глубокой NN мы можем объединить несколько слоев свертки. как ниже
Вышеприведенный сюжет взят из Руководства для начинающих по пониманию сверточных нейронных сетей Адита Дешпанде, одного из моих любимых блоггеров по машинному обучению.
Интересная часть глубокой CNN заключается в том, что глубокий скрытый слой может получать больше информации от ввода, чем поверхностный слой, а это означает, что, хотя прямая связь разрежена, более глубокий скрытый нейрон все еще может получать почти все функции от ввода.
(3). Продолжение следует
Узнавая все больше и больше о нейронной сети, я постепенно понимаю, что нейронная сеть более гибкая, чем я думал. Это как LEGO, свертка, объединение — это просто разные базовые инструменты с разными допущениями. Вам нужно проанализировать свои данные и выбрать инструменты, которые соответствуют вашим предположениям, и попытаться комбинировать их, чтобы шаг за шагом повышать производительность.
Ссылка
1 Винсент Дюмулен, Франческо Визин — Руководство по сверточной арифметике для глубокого обучения (BibTeX)
2 Штольня Дешпанде — Руководство для начинающих по пониманию сверточных нейронных сетей
3 Ян Гудфеллоу, Йошуа Бенджио, Аарон Конрвилл — Глубокое обучение
Первоначально опубликовано на www.zybuluo.com.