Курсовая работа. Глубокое обучение
Скачать 4.97 Mb.
|
156 Глава 5. Сверточная нейронная сеть каждое наблюдение было представлено 784 признаками, содержащими яркость или темноту каждого пикселя. В каждом случае, масштабируя данные, мы смогли построить модель, которая достаточно точно предсказывала результат для этого набора данных. Во всех случаях модель нейронной сети с одним скрытым слоем работала лучше, чем модель без этого скрытого слоя. Почему? Одна из причин заключается в том, что нейронная сеть может изучать нелинейные отношения между входом и выходом. Также в машинном обучении для эффективного предсказания нам часто нужны линейные комбинации наших исходных функций. Предположим, что значения пикселей для цифры из набора MNIST составляют от x 1 до x 784 . Например, когда x 1 имеет яркость выше среднего, x 139 ниже среднего и x 237 тоже ниже средне- го, на изображении, скорее всего, нарисована цифра 9. Есть много таких комбинаций, каждая из которых положительно или отрицательно влияет на вероятность того, что нарисована та или иная цифра. Нейронные сети могут автоматически обнаруживать комбинации этих «важных» призна- ков в процессе обучения. Изначально этот процесс начинается с создания случайных комбинаций исходных элементов путем умножения на слу- чайную весовую матрицу. В процессе обучения нейронная сеть учится находить полезные комбинации и игнорировать бесполезные. Процесс этого отбора важных комбинаций называется обучением представлени- ям, и это главная причина успеха нейронных сетей в разных областях. Результат показан на рис. 5.1. n признаков Входной слой Скрытый слой 0 0. 0 0 ≈ √ n – n комбинация W ν β Act B (Активация) всех n оригинальных функций Рис. 5.1. Нейронные сети, которые мы видели до сих пор, получают n признаков, а затем отбирают из них полезные комбинации Надо ли вводить что-то новое для работы с изображениями? Ответ «да» основан на том, что на изображениях интересные «комбинации призна- Нейронные сети и обучение представлениям 157 ков» (пикселей) обычно берутся из пикселей, расположенных близко друг к другу. Маловероятно, что полезная комбинация получится из 9 случайно выбранных пикселей, в отличие от участка пикселей 3 × 3. Это важный факт: порядок элементов имеет значение, поскольку это соседние пиксели на изображении, тогда как в данных о ценах на жилье порядок элементов не имеет значения. Как это реализовать? Архитектура для данных изображений Мы так же будем генерировать комбинации признаков, и каждая из них должна представлять собой комбинацию пикселей из небольшого пря- моугольного пятна во входном изображении (рис. 5.2). Входное изображение Скрытый слой n входных пикселей ≈ n – n 2 «комбинаций небольших Новая стратегия для данных изображений участков исходных признаков» Рис. 5.2. С помощью данных изображения мы можем определить каждый признак как функцию небольшого фрагмента данных и, таким образом, определить от n до n 2 выходных нейронов Если нейронная сеть изучает комбинации всех входных пикселей во входном изображении, она получается неэффективной, поскольку в этом случае игнорируется принцип, описанный в предыдущем разделе: боль- шинство интересных комбинации функций на изображениях располага- ется на небольших участках. Однако раньше было несложно рассчитать новые признаки, которые представляли собой комбинации всех входных признаков: если бы у нас было f входных признаков и мы хотим вычис- лить n новых признаков, нужно просто умножить ndarray , содержащий наши входные объекты, на матрицу f × n. А как вычислить сразу много комбинаций пикселей из локальных фрагментов входного изображения? Ответ — операция свертки. 158 Глава 5. Сверточная нейронная сеть Операция свертки Прежде чем мы опишем операцию свертки, давайте проясним, что под- разумевается под «признаками, представляющими собой комбинацию пикселей из некоторого участка изображения». Допустим, у нас есть входное изображение I размером 5 × 5: Предположим, мы хотим вычислить новый признак из участка 3 × 3 пикселя в середине. Аналогично определению старых признаков в уже рассмотренных нейронных сетях мы определим новый признак, который является функцией этого участка 3 × 3. Для этого определим множество весов 3 × 3, W: Затем мы просто возьмем скалярное произведение W на соответствующую часть I, чтобы получить на выходе значение признака, который обозначим как o 33 (o означает «выход», а цифры означают координаты центра): Это значение будет обрабатываться так же, как и рассмотренные ранее признаки: к нему может быть добавлено смещение, а затем значение проходит через функцию активации, в результате получится «нейрон», или «выученный признак», который будет передаваться на последующие уровни сети. То есть наши признаки — это функция некоторого участка изображения. Как интерпретировать такие признаки? Оказывается, что рассчитанные таким образом признаки позволяют понять, присутствует ли в данном Нейронные сети и обучение представлениям 159 месте изображения визуальный шаблон, определяемый весами. Из теории компьютерного зрения давно известно, что массивы чисел 3 × 3 или 5 × 5 могут играть роль «детекторов шаблонов», если взять их скалярное произ- ведение со значениями пикселей в каждой зоне изображения. Например, скалярное произведение следующего массива чисел 3 × 3: с заданным участком входного изображения позволит определить, есть ли в этом месте изображения край. Известны и другие подобные матрицы, позволяющие определять наличие углов, вертикальных или горизон- тальных линий и т. д. 1 Теперь предположим, что мы использовали один и тот же набор весов W, чтобы найти в каждом месте входного изображения некоторый шаблон. Чтобы «примерить» набор W ко всему изображению, надо взять скалярное произведение W на пиксели в каждом месте изображения. В итоге мы получим новое изображение O, размером практически идентичное исход- ному изображению (размер может немного отличаться в зависимости от того, как делать расчет по краям). Это изображение O будет своего рода «картой признаков», на которой показано расположение шаблона W во входном изображении. Именно этот процесс происходит в сверточных нейронных сетях и называется сверткой, а результатом свертки является карта признаков. Изложенный принцип лежит в основе работы CNN. Прежде чем мы смо- жем организовать полноценную работу, как в предыдущих главах, нужно будет (буквально) добавить новое измерение. Операция многоканальной свертки Сверточные нейронные сети отличаются от обычных нейронных сетей тем, что генерируют на порядок больше признаков, а каждый признак является функцией небольшого фрагмента входного изображения. Те- перь конкретнее: при наличии n входных пикселей только что описанная 1 ru.qwe.wiki/wiki/Kernel_(image_processing) 160 Глава 5. Сверточная нейронная сеть операция свертки создаст n выходных объектов, по одному для каждого местоположения шаблона во входном изображении. Но на самом деле в сверточном слое происходит нечто посложнее: мы создаем f наборов из n признаков, каждый с соответствующим (изначально случайным) набором весов, определяющим визуальный шаблон. Найденный на изображении шаблон будет зафиксирован на карте объектов. Эти карты создаются с помощью операций свертки (рис. 5.3). Входное изображение n входных пикселей / нейронов n выходных пикселей / нейронов Карта признаков W 11 W 12 W 13 W 21 W 22 W 23 W 31 W 32 W 33 Весь этот процесс повторяется t раз, то есть создается t карт признаков, что эквивалентно n × t выходным нейронам. Каждая карта признаков формируется одним набором весов. Рис. 5.3. Для входного изображения с n пикселями мы определяем f карт объектов, каждая из которых имеет примерно такой же размер, что и исходное изображение. Всего получается n × f выходных нейронов, каждый из которых является функцией небольшого участка исходного изображения С принципами разобрались, но давайте добавим ясности. Каждый «на- бор признаков», построенный определенным набором весов, называется картой объектов. В контексте сверточного слоя число карт объектов на- зывается количеством каналов слоя, поэтому эта операция называется многоканальной сверткой. Кроме того, f наборов весов W i называются сверточными фильтрами 1 Слои свертки Теперь, когда мы изучили операцию многоканальной свертки, пора по- думать о том, как вставить эту операцию в слой нейронной сети. Ранее 1 А также ядрами. Слои свертки 161 слои наших нейронных сетей были относительно просты: мы подавали им на вход двумерные объекты ndarray и получали такие же на выходе. Но в сверточных сетях у нас на выходе будет 3D-матрица, размерность которой будет число каналов (как у «карт объектов») × высота изобра- жения × ширина изображения. Возникает вопрос: как передать ndarray вперед в другой сверточный слой, чтобы создать «глубокую сверточную» нейронную сеть? Мы знаем, как выполнить операцию свертки изображения с одним каналом и нашими фильтрами. А как выполнить многоканальную свертку с несколькими каналами на входе, когда два сверточных слоя будут соединены вместе? Понимание этого является ключом к пониманию глубоких сверточных нейронных сетей. Рассмотрим, что происходит в нейронной сети с полносвязными слоями: в первом скрытом слое у нас, например, h 1 признаков, которые являются комбинациями всех исходных признаков из входного слоя. В следующем слое объекты представляют собой комбинации всех объектов предыдущего уровня, так что у нас может быть h 2 «признаков от признаков». Чтобы создать следующий слой из h 2 признаков, мы используем веса h 1 × h 2 , чтобы представить, что каждый из объектов h 2 является функцией каждого из объектов h 1 в предыдущем слое. Аналогичный процесс происходит в первом слое сверточной нейронной сети: сначала мы преобразуем входное изображение в m 1 карт признаков с помощью m 1 сверточных фильтров. Карта показывает, присутствует ли каждый из m 1 шаблонов, описанных весами, в каждом месте входного изо- бражения. Поскольку разные слои полносвязной нейронной сети могут содержать разное количество нейронов, следующий слой сверточной нейронной сети может содержать m 2 признаков. Чтобы сеть могла пони- мать шаблоны, она ищет в определенном месте изображения «шаблоны шаблонов» — сочетания визуальных шаблонов из предыдущего уровня. Если выходной сигнал сверточного слоя представляет собой трехмерную матрицу формы m 2 каналов × высоту изображения × ширину изображения, то каждое конкретное местоположение на изображении на одной из карт характеристик m 2 представляет собой линейную комбинацию свертки m 1 различных фильтров для этого же положения в каждой из соответствую- щих карт объектов m 1 из предыдущего уровня. Каждое местоположение в каждой из m 2 карт представляет собой комбинацию визуальных харак- теристик m 1 , уже изученных в предыдущем сверточном слое. 162 Глава 5. Сверточная нейронная сеть Реализация Когда мы поняли, как соединяются два многоканальных сверточных слоя, мы сможем реализовать операцию: аналогично тому, как требует- ся h 1 × h 2 весов для связи слоев с h 1 и h 2 нейронами, нам нужно m 1 × m 2 сверточных фильтров для соединения сверточного слоя с m 1 каналами со слоем с m 2 каналами. Зная это, можно задать размеры ndarrays , которые будут составлять вход, выход и параметры операции многоканальной свертки: 1. Форма входных данных: x Размер пакета. x Входные каналы. x Высота изображения. x Ширина изображения. 2. Форма выходных данных: x Размер пакета. x Число выходных каналов. x Высота изображения. x Ширина изображения. 3. Сами сверточные фильтры будут иметь форму: x Входные каналы. x Выходные каналы. x Высота фильтра. x Ширина фильтра. Порядок измерений в разных библиотеках может отличаться, но сами измерения одни и те же. Во время реализации операции свертки нам все это понадобится. Слои свертки 163 Различия между сверточными и полносвязными слоями В начале главы мы обсудили различия между сверточными и полно- связными слоями на высоком уровне. На рис. 5.4 мы снова привели это сравнение. Сверточный слой Полносвязный слой n in нейроны нейроны n out нейроны ( ) 0 0.. 0 0 0 0.. 0 0 W 11 W 12 W 13 W 21 W 22 W 23 W 31 W 32 W 33 Весовая матрица размерности n in × n out W 11 W 12 W 13 W 21 W 22 W 23 W 31 W 32 W 33 f in карта признаков/ f in × высота изображения × × ширина изображения нейроны ( ) f out карта признаков/ f out × высота изображения × × ширина изображения f in × f out фильтры/ядра Рис. 5.4. Сравнение сверточных и полносвязных слоев Еще одно отличие между этими типами слоев заключается в механизме интерпретации отдельных нейронов: y В полносвязном слое каждый нейрон обнаруживает, присутствует ли конкретная комбинация признаков, изученных предыдущим слоем, в текущем наблюдении. y В сверточном слое каждый нейрон обнаруживает, присутствует ли конкретная комбинация визуальных шаблонов, изученных предыдущим слоем, в данном месте входного изображения. Перед реализацией самой сети надо решить еще один вопрос: как исполь- зовать для создания прогнозов пространственные ndarrays , которые мы получаем в качестве выходных данных. 164 Глава 5. Сверточная нейронная сеть Создание прогнозов с помощью сверточных слоев: flatten-слой Мы рассмотрели, как сверточные слои изучают признаки, показывающие наличие шаблона на изображении, а затем сохраняют эти объекты на карты объектов. Как использовать слои карт для составления прогнозов? При использовании полносвязных нейронных сетей для определения того, к какому из 10 классов принадлежит изображение (см. предыдущую главу), нужно было убедиться, что последний слой имеет размерность 10; затем нужно передать эти 10 чисел в функцию перекрестно-энтропийной потери softmax , чтобы превратить прогноз в вероятности. Теперь нужно выяснить, что мы можем сделать в случае сверточного слоя, где у нас есть трехмерный ndarray для наблюдения формы m каналов × высоту изображения × ширину изображения. Напомним, что каждый нейрон показывает, присутствует ли конкретная комбинация визуальных шаблонов (или шаблонов шаблонов) в данном месте на изображении. Это ничем не отличается от признаков, которые мы бы получили с помощью полносвязной нейронной сети: первый полносвязный слой будет представлять признаки отдельных пикселей, второй — признаки этих признаков и т. д. В полносвязном варианте мы бы обрабатывали каждый «признак признаков», который сеть выучила как один нейрон и который будет использоваться в качестве входных данных для прогнозирования того, к какому классу принадлежит изображение. Оказывается, то же самое можно сделать и со сверточными нейрон- ными сетями — мы рассматриваем m карт объектов как m × высоту изображения × ширину изображения нейронов и используем операцию flatten, чтобы сжать эти три измерения (количество каналов, высоту изображения и ширину изображения) в одномерный вектор, после чего можем использовать простое матричное умножение для составления окончательного прогноза. Работает это так: каждый отдельный нейрон тут делает примерно то же, что и нейроны в полносвязном слое, то есть говорит, присутствует ли данный визуальный признак (или комбинация признаков) в заданном месте в изображения. Такой нейрон можно считать последним слоем нейронной сети 1 1 Вот почему важно понимать, что свертка создает m карт фильтров и m × высота × × ширина изображения отдельных нейронов. Как и в случае с нейронными сетя- ми, ключевым моментом является одновременное хранение нескольких уровней интерпретации в уме и видение связи между ними. Слои свертки 165 Позже в этой главе мы реализуем flatten-слой. Но прежде чем углубиться в детали реализации, давайте поговорим о другом виде слоя, таком же важном для сверточных сетей. Пулинговый слой Пулинговые слои тоже часто используются в сверточных нейронных сетях. Они снижают разрешение карты признаков, созданной операцией свертки. Чаще всего используется размер пула, равный 2, то есть каждая область 2 × 2 каждой карты признаков приводится либо к максимально- му, либо к среднему значению для этой области. Тогда для изображения n × n все изображение сведется к размеру . Это показано на рис. 5.5. 5 1 0 6 3 5 5 6 9 0 3 2 4 7 0 7 5 6 9 7 5 1 0 6 3 5 5 6 9 0 3 2 4 7 0 7 3.5 4.25 5 3 Макс. значение Среднее значение Рис. 5.5. Иллюстрация пулинга по максимальному и среднему для изображения размером 4 × 4. Каждый участок 2 × 2 приводится к среднему или максимальному значению для этого участка Основным преимуществом пулинга является понижение дискретизации изображения, чтобы оно содержало в четыре раза меньше пикселей, чем на предыдущем уровне, то есть объем вычислений, необходимых для об- у чения сети, снижается в 4 раза. Более того, в сети можно использовать несколько уровней пулинга, как делалось во многих архитектурах на заре CNN. Недостатком пулинга является то, что из изображения с пониженной дискретизацией можно извлечь только одну четвертую часть информации. Однако сети с пулингом хорошо себя показали в тестах по распознаванию изображений, и это наводит на мысль, что потеря информации была не столь значительна по сравнению с увеличением скорости вычислений. Многие решили, что это трюк, который не стоит использовать, даже если он сработал. Как писал Джеффри Хинтон на Reddit AMA в 2014 году: |