Сверточные нейронные сети и автокодировщики, — КиберПедия 

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Сверточные нейронные сети и автокодировщики,

2020-04-03 462
Сверточные нейронные сети и автокодировщики, 0.00 из 5.00 0 оценок
Заказать работу

Или Не верь глазам своим

__________________ TL;DR _____________________________________

Данная глава вводит важнейшие архитектуры сверточных нейронных сетей и автокодировщиков. В ней мы:

• начнем, как обычно, с биологии — со зрительной коры головного мозга;

• подробно рассмотрим, как работают сверточные сети;

• дадим обзор современных сверточных архитектур;

• перейдем к сетям, обучающимся без учителя, — автокодировщикам;

• после теоретического обзора закончим главу практическим сравнением раз­ных типов автокодировщиков (в том числе сверточного) на наборе данных MNIST.


5.1. Зрительная кора головного мозга

...The visual system of the brain has the organization, computational profile, and architecture it has in order to facilitate the organism’s thriving at the four Fs: feeding, fleeing, fighting, and reproduction.

P. 5. Churchland, V. 5. Ramachandran, T.J. Sejnowski. A Critique of Pure Vision [82]

Сверточные нейронные сети (convolutional neural networks, CNN) — это весьма ши­рокий класс архитектур, основная идея которых состоит в том, чтобы переисполь­зовать одни и те же части нейронной сети для работы с разными маленькими, ло­кальными участками входов. Как и многие другие нейронные архитектуры, свер­точные сети известны довольно давно, и в наши дни у них уже нашлось много са­мых разнообразных применений, но основным приложением, ради которого люди когда-то придумали сверточные сети, остается обработка изображений.

И это не случайно: идея сверточных сетей во многом мотивирована исследо­ваниями о зрительной коре головного мозга. Так что в этой главе мы снова де­лаем шаг назад и начинаем с биологии. Конечно, изучение механизмов зрения — это очень большая тема, которой мы можем лишь слегка коснуться; в качестве достаточно популярных и интересных книг рекомендуем две доступные бесплат­но [234, 562], одна из которых — популярное изложение классических исследова­ний по теме от самого Дэвида Хьюбела[LV] [235, 236, 569].

Люди давно задумывались о том, как именно мы видим окружающий мир, как работает зрение. Связь глаз со зрением была, простите за каламбур, очевидной да­же древним[LVI]. Глаз как оптический прибор изучали Леонардо да Винчи, Иоганн Кеплер и многие другие великие физики, отмечавшие его выдающиеся оптические свойства. Впрочем, мнения разнились. Герман Гельмгольц писал так: «Какой пло­хой оптик Господь Бог! Я счел бы себя вправе самым резким образом выразиться о небрежности работы оптика и возвратить ему прибор с протестом, если бы он вздумал продать мне инструмент, обладающий такими недостатками, как челове­ческий глаз». Но все-таки на самом деле способности глаза к аккомодации, то есть изменению фокусного расстояния, и адаптации, то есть способности хорошо ви­деть при разных условиях освещенности, и впрямь потрясающе хороши.

Есть известная цитата Дарвина из «Происхождения видов», которую иногда цитируют так: «В высшей степени абсурдным, откровенно говоря, может показать­ся предположение, что путем естественного отбора мог образоваться глаз со всеми его неподражаемыми изобретениями...». Любопытно, что иногда эту цитату все­рьез приводят креационисты как свидетельство того, будто бы Дарвин «сам по­нимал» ограниченность теории эволюции. Однако цитата буквально тут же про­должается так: «...Разум мне говорит: если можно показать существование много­численных градаций от простого и несовершенного глаза к глазу сложному и со­вершенному, причем каждая ступень полезна для ее обладателя, а это не подле­жит сомнению; если, далее, глаз когда-либо варьировал и вариации наследовались, а это также несомненно; если, наконец, подобные вариации могли оказаться полез­ными животному при переменах в условиях его жизни — в таком случае затруд­нение, возникающее при мысли об образовании сложного и совершенного глаза путем естественного отбора, хотя и непреодолимое для нашего воображения, не может быть признано опровергающим всю теорию». И действительно, последние исследования показывают, что сложные глаза, способные различать формы, обра­зовались у разных животных в процессе эволюции совершенно независимо целых пятьдесят, а то и сто раз; а известная модель Нильссона и Пелгер [393] показа­ла, что эволюция полноценного глаза от первых улавливающих свет клеток могла произойти очень быстро, в течение буквально нескольких тысяч поколений, или нескольких сотен тысяч лет. Но нас, конечно, в этой книге интересует не глаз, а то, что потом происходит с прочитанным с сетчатки изображением.

Зрительный нерв — толстый пучок аксонов ганглионарных клеток, по которо­му информация с сетчатки доходит до мозга, — отмечали еще средневековые ана­томы, и его важность для зрения была очевидной. Зрительный нерв входит в та­ламус, отдел мозга, обрабатывающий информацию от органов чувств, там первич­ная обработка происходит в так называемом латеральном коленчатом теле (lateral geniculate nucleus, LGN), а затем зрительная информация от LGN поступает в соб­ственно зрительную кору (visual cortex).

Все это было известно людям еще в XIX веке, но настоящие исследования зрительной коры и восприятия изображений не могли начаться раньше, чем лю­ди смогли заглянуть на уровень отдельных нейронов, то есть в первой половине XX века. Об исследованиях человеческого зрения и обработки зрительных сигна­лов можно написать отдельную книгу (и таких книг, конечно же, написано нема­ло). Есть масса очень интересных примеров зрительных иллюзий и странных за­болеваний!, но наша цель сейчас куда скромнее: мы попробуем отметить несколь­ко важных черт в устройстве зрительной коры, которым можно найти некоторые

1 Например, в нашем мозге почти наверняка есть особые области и особые пути обработки челове­ческих лиц, отдельные от распознавания всех остальных объектов. Как ученые пришли к этому выводу? условные соответствия в архитектуре современных искусственных нейронных се­тей. Подчеркнем на всякий случай, что речь идет исключительно о том, чтобы «вдохновляться идеями»: реальная работа мозга пока что остается для нас слиш­ком сложной и непонятной, и смоделировать зрительную кору или даже отдельные ее части пока выше сил человеческих.

Зрительная кора, как ни странно, расположена сзади, в затылочной доле голов­ного мозга. Она делится на несколько частей, которые обычно незамысловато на­зываются зрительная зона V1 (visual area one), которую также называют стриар­ной корой или первичной зрительной корой, зрительная зона V2 (visual area two), зрительная зона V3 и т.д., до V6 и V7. Зоны отличаются друг от друга физиоло­гией, архитектурой да и просто обособленным положением в коре, и исследова­тели не сомневаются, что они различаются и по своим функциям. Хотя на самом деле функциональная специализация зон пока что до конца не ясна, понятно, что функции зон зрительной коры становятся постепенно все более и более общими. По нынешним представлениям:

• в зоне V1 выделяются локальные признаки небольших участков считанного с сетчатки изображения; это для нас сейчас самое интересное, и об этом мы подробно поговорим ниже;

• V2 продолжает выделять локальные признаки, слегка обобщая их и добавляя бинокулярное зрение (то есть стереоэффект от двух глаз);

• в зоне V3 распознается цвет, текстуры объектов, появляются первые резуль­таты их сегментации и группировки;

• зона V4 уже начинает распознавать геометрические фигуры и очертания объ­ектов, пока несложных; кроме того, именно здесь наиболее сильна модуляция посредством нашего внимания: активация нейронов в V4 не равномерна по всему полю зрения, а сильно зависит от того, на что мы осознанно или неосо­знанно обращаем внимание;

• зона V5 в основном занимается распознаванием движений, пытаясь понять, куда и с какой скоростью передвигаются в зоне видимости те самые объекты, очертания которых выделились в зоне V4;

• в зоне V6 обобщаются данные о всей картинке, она реагирует на изменения по всему полю зрения (wide-field stimulation) и изменения в картинке вслед­ствие того, что передвигается сам человек;

• иногда также выделяют зону V7, где происходит распознавание сложных объектов, в частности человеческих лиц.

Такая функциональная специализация — это первое замечание о зрительной коре, которое хорошо соответствует тому, что мы обычно видим в глубоких ней­ронных сетях: более высокие уровни нужны для того, чтобы выделять более общие

Очень просто: при определенных повреждениях мозга (например, инсультах) вырабатывается так на­зываемая предметная агнозия, когда человек не может распознавать и правильно) идентифицировать объекты... но с распознаванием лиц у него при этом все в порядке! А распознавание лиц отключается при лицевой агнозии, которая, в свою очередь, совершенно не мешает распознавать другие объекты. признаки, соответствующие абстрактным свойствам входа, а на нижних уровнях признаки более конкретные. В сверточных сетях, разумеется, эффект будет тот же самый. Но есть и другие интересные свойства архитектуры зрительной коры, ко­торые нашли отражение в машинном обучении.

Кроме зон V1-V7, выделяют и другие области, а среди перечисленных иерар­хия не такая уж строгая: есть масса прямых связей, когда, например, нейроны из зоны V1 подаются на вход не только в зону V2, но и напрямую в зону V5; это тоже найдет отражение в сверточных архитектурах.

Кроме того, в отличие от большинства архитектур искусственных нейронных сетей, между нейронами в мозге всегда присутствует очень сильная обратная связь от более высоких уровней к более низким. Например, современные исследования предполагают, что внимание, которое зарождается в зоне V4, потом переходит об­ратно к V2 и VI (там тоже присутствуют сильная модуляция на основе внима­ния!) [19].

В искусственных нейронных сетях тоже вводят подобные механизмы внима­ния, помогающие выбрать, какие именно входы и промежуточные выходы сети сейчас нужно учитывать больше всего — о них мы поговорим в разделе 8.1. Но все-таки именно обратную связь мы, специалисты по машинному обучению, пока не очень умеем «готовить»; придумать математическую модель для того, как мозг с ней управляется — одна из важнейших открытых задач нейробиологии.

Кстати, по современным представлениям выходы нейронов из зоны VI и V2 обрабатываются сразу двумя параллельными путями: вентральный путь из V2 на­правляется к V4 отвечает на вопрос «Что?» (его иногда называют What Pathway), отвечая за распознавание форм и объектов, а дорсальный путь (Where Pathway) от­вечает на вопрос «Где?»[LVII], проходит H3V2 kV5 hV6 и занимается в основном распо­знаванием движений, управлением движением глаз и рук (особенно если речь идет о том, как достать находящийся в поле зрения объект) [544]. Настолько детальной специализацией мы наши искусственные сети снабдить не сможем, но эта идея, во­обще говоря, тоже регулярно используется: часто есть смысл обработать один и тот же вход несколькими разными способами и только потом объединить результаты, скажем, суммированием или конкатенацией. В сверточных сетях так часто делают, когда обрабатывают вход с помощью сразу нескольких размеров фильтров; о филь­трах речь пойдет буквально в следующем разделе.

Но и это еще не все. Из всей зрительной коры наиболее хорошо изучена зона V1, первичная зрительная кора: она ближе всего к собственно входам, достаточно про­сто устроена, и там проще понять, за что «отвечают» отдельные нейроны и как они друг с другом взаимодействуют [71]; именно с зоной V1 были связаны самые гром­кие результаты Хьюбела и Визеля. Оказалось, что зона V1 сама состоит из шести уровней нейронов: входные сигналы приходят из латерального коленчатого тела в четвертый уровень, дальнейшие сигналы выходят из уровней 2 и 3, а обратная связь — из шестого. Нейроны в зоне V1 располагаются не случайно: зона V1 содер­жит полную «карту» полей зрения обоих глаз,.то есть близкие участки сетчатки обрабатываются близкими нейронами в VI. Любопытно, что при этом «картиро­вании» локальная структура переносится очень точно, а вот на глобальном уровне есть серьезные искажения: во-первых, центральный участок поля зрения сильно увеличен (половина всех нейронов отвечают за 2 % поля зрения), во-вторых, есть геометрические искажения, похожие на использование полярных координат: кон­центрические круги и радиальные линии на картинке преобразуются в вертикаль­ные и горизонтальные линии в VI. Это позволяет сохранять инвариантность изоб­ражения при смене нашей позиции и угла зрения. Такие преобразования мы при­менять не будем, но давайте запомним, что каждый нейрон в VI работает с очень маленьким участком изображения (он называется рецептивным полем, receptive field), и между ними сохраняются пространственные взаимосвязи, подобные ис­ходной картинке.

Интересно понять, на что, собственно, реагируют нейроны в VI. Кроме распо­ложения, отраженного в «карте», разные нейроны в VI распознают:

ориентацию, то есть нейрон реагирует, например, на то, что освещенность вдоль диагонали изображения высокая, а по двум другим углам низкая; или на то, что освещенность нижней части изображения выше, чем верхней; та­ким образом нейроны распознают границы изображений (edge detection);

пространственную частоту, то есть то, насколько часто меняется освещен­ность в пределах рецептивного поля нейрона;

направление: в отличие от большинства сетей, которые мы будем рассмат­ривать ниже, человеку интересна не только и не столько статичная картин­ка, сколько происходящие в ней движения; нейроны умеют «запоминать» и сравнивать предыдущие входы с последующими, распознавая таким обра­зом направление не только в пространстве, но и во времени; аналогично рас­познается и временная частота;

различие между глазами: в VI у каждого нейрона два рецептивных поля, для каждого глаза, и хотя большинство нейронов в основном «посвящены» одно­му конкретному глазу (то есть не реагируют на стимулы с другого), некото­рые распознают как раз различия между тем, что видят левый и правый глаз;

цвет, относительно которого нейроны обычно распознают одно из трех основных направлений: красный — зеленый, синий — желтый и черный — белый.

Математическое описание того, как нейроны зрительной коры активируются в зависимости от ориентации [104, 348], оказалось тесно связано с так называ­емыми фильтрами Габора [168] — видом математических преобразований, очень эффективным для выделения границ объектов на изображениях (edge detection). А знаменитый набор признаков для изображений SIFT (scale-invariant feature transform, масштабно-инвариантное преобразование признаков), разработанный Дэвидом Лоу в конце 1990-х годов [334, 335], во многом соответствует тому, как активируются нейроны зрительной коры. Сегодня развитие глубоких сетей при­вело к тому, что сейчас ■ мы получаем примерно те же (только еще лучше работа­ющие) признаки на нижних уровнях сверточных сетей — их примеры мы еще не раз увидим в этой главе.

Рассказ о зоне V1 плавно подводит нас к последнему замечанию: как видно, об­работка изображений в мозге устроена как весьма глубокая нейронная сеть. В част­ности, уже в самых ранних работах Хьюбела и Визеля клетки зрительной коры (а именно зоны VI) подразделялись на простые и сложные. Простые клетки реаги­руют только на участки и полосы света, края стимулов, проходящих в определен­ном месте под определенным углом. А сложные клетки могут, например, реагиро­вать на ориентацию независимо от конкретного положения сигнала. Достигается это тем, что сложные клетки относятся к следующему уровню обработки, получая на вход результат активации простых клеток; поэтому их рецептивное поле обычно немного больше, а выявляемые ими признаки оказываются инвариантными к ме­стоположению сигнала. В частности, клетки, реагирующие на движение сигнала, тоже всегда являются сложными по данной классификации.

И это только начало: в одной только зоне V1 выделяют шесть уровней, а ведь сигнал по ходу движения проходит через сразу несколько зон, начиная с латераль­ного коленчатого тела (в котором, кстати, тоже шесть уровней) и заканчивая высо­коуровневыми зонами V6 и V7. Это тоже нашло отражение в искусственных ней­ронных сетях: сверточные сети для обработки изображений — это самые глубокие из существующих сетей. С помощью идей, которые мы изложим в этой главе, мож­но обучить сеть в несколько десятков и даже сотен уровней!

Но хватит биологии. Начиная со следующего раздела мы переходим собствен­но к изложению идей и математики сверточных сетей. Мы увидим, как с помощью простой идеи переиспользования одних и тех же весов для разных участков вход­ного изображения можно радикально сократить число параметров в сети, ничего не потеряв в выразительности. Сверточные сети — одна из самых популярных архи­тектур современных нейронных сетей, и эта глава — одна из центральных в книге.

5.2. Свертки и сверточные сети

— Теперь, если ты немножко распустишь шнурки, которыми стя­нут мой вьихркй щит, я посмотрю, не удастся ли мне свернуться в шар. Это может оказаться рктьзрио.

Р. Киплинг. Как появились броненосцы

Итак, в предыдущем разделе мы обсудили некоторые особенности архитектуры зрительной коры. Как мы выяснили, именно зрительная кора, а точнее, исследова­ния Хьюбела и Визеля на рубеже 50-60-х годов XX века [235, 569], мотивировали многие идеи, сегодня использующиеся в глубоких архитектурах.


И здесь снова появляется один из лейтмотивов нашей книги, по крайней мере ее исторических экскурсов: идея сверточных сетей появилась по меркам машин­ного обучения очень давно. Можно сказать, что первой настоящей сверточной се­тью, позаимствовавшей для информатики воплощенные природой в зрительной коре идеи, был Neocognitron Кунихико Фукусимы, появившийся в 1979-1980 го­дах [166, 167]1. Впрочем, Фукусима не использовал градиентный спуск и вообще обучение с учителем, а его работы были довольно прочно забыты. Снова сверточ­ные сети в уже вполне современной форме появились только в работах группы Яна ЛеКуна в конце 1980-х годов [18, 188, 205], и с тех пор и до наших дней они вполне успешно применяются для распознавания изображений и многих других задач (см., например, свежие обзоры [438, 522]).

Но что же, собственно, такое в данном случае свертка и какое она имеет от­ношение к нейронным сетям? Чтобы ответить на этот вопрос, давайте сначала от­ступим на шаг назад. Краеугольным камнем всех нейронных сетей являются аф­финные преобразования. В каждом слое полносвязной сети повторяется одна и та же операция: на вход подается вектор, который умножается на матрицу весов, а к результату добавляется вектор свободных членов; только после этого к результа­ту применяется некая нелинейная функция активации. И во всех сетях, которые мы до сих пор строили, такой подход использовался постоянно, независимо от структуры или происхождения данных. Будь то изображения, текст или музыка, мы вновь и вновь применяем аффинное преобразование в каждом слое нашей се­ти, предварительно приведя данные к векторной форме.

Однако многие типы данных имеют свою собственную внутреннюю структуру, которая отлично известна нам заранее. Главный пример такой структуры в этой главе — изображение, которое обычно представляют как массив векторов чисел: если изображение черно-белое, то это просто массив интенсивностей, а если цвет­ное, то массив векторов из трех чисел, обозначающих интенсивности трех основ­ных цветов (красного, зеленого и черного в стандартном RGB, синего, зеленого и красного в трех типах колбочек в человеческом глазе и т. д.). Если же обобщить такую внутреннюю структуру до максимальной все еще полезной нам общности, описание получится такое:

1) исходные данные представляют собой многомерный массив («тензор»);

2) среди размерностей этого массива есть одна или более осей, порядок вдоль которых играет важную роль; например, это может быть расположение пик­селов в изображении, временная шкала для музыкального произведения, по­рядок слов или символов в тексте;

3) другие оси обозначают «каналы», описывающие свойства каждого элемента по предыдущему подмножеству осей; например, три компонента для изобра­жений, два компонента (правый и левый) для стереозвука и т. д.

1 Мы уже вспоминали об этой модели в разделе 3.3, потому что именно в Neocognitron впервые появились перцептроны с функцией активации, похожей на ReLU.

Когда мы обучаем полносвязные нейронные сети, это дополнительное знание о структуре задачи никак не используется. Вспомним пример сети для распозна­вания рукописных цифр, которую мы строили в разделе 3.6: там мы просто пре­вращали изображение размера 28 х 28 пикселов в вектор длины 784 и подавали его на вход. Получалось, что наши аффинные преобразования никак не учитывали структуру картинки, топологию данных!

Но ведь она не просто присутствует, а играет определяющую роль: конечно же, взаимное расположение пикселов в картинке важно для распознавания цифр... По­лучается, что сети приходилось на основе интенсивностей отдельных пикселов вы­учить не только то, какая форма соответствует какой цифре, но заодно и вообще понятие формы, тот факт, что некоторые компоненты входного вектора представ­ляют собой соседние пикселы, а значит, они сильно скоррелированы, и так далее... непростую задачу мы предлагаем нашей несчастной полносвязной сети.

Если мы не будем делать вид, что ничего не знаем о структуре входов (разделе­нии цветовых каналов изображения, порядке нуклеотидов в ДНК и т. д.), а станем ее напрямую использовать, это может существенно помочь нам в обучении нейрон­ных сетей. В этом разделе мы рассмотрим такой подход на примере сверточных слоев для задач компьютерного зрения. Мы обсудим очень важную часть совре­менных глубоких нейронных сетей и снова увидим, как очень простая концепция приводит к фантастическим результатам.

Основная идея сверточной сети состоит в том, что обработка участка изображе­ния очень часто должна происходить независимо от конкретного расположения этого участка. Грубо говоря, если вы хотите узнать на фотографии своего друга Васю, совершенно не важно, на 100 или на 200 пикселов ухо Васи отстоит от лево­го края фотографии. Узнать Васю можно было бы и на сильно обрезанной фото­графии, где нет ничего, кроме его лица; это локальная задача, которую можно ре­шать локальными средствами. Конечно, взаимное расположение объектов играет важную роль, но сначала их нужно в любом случае распознать, и это распознава­ние — локально и независимо от конкретного положения участка с объектом внут­ри большой картинки.

Поэтому сверточная сеть попросту делает это предположение в явном виде: да­вайте покроем вход небольшими окнами (скажем, 5x5 пикселов) и будем выделять признаки в каждом таком окне небольшой нейронной сетью. Причем — и тут клю­чевое соображение — признаки будем выделять в каждом окне одни и те же, то есть маленькая нейронная сеть будет всего одна, входов у нее будет всего 5 х 5 = 25, а из каждой картинки для нее может получиться очень много разных входов.

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

Прежде чем переходить непосредственно к формальным определениям опера­ции свертки, давайте разберемся с понятием канала в изображении. Обычно цвет­ные картинки, подающиеся на вход нейронной сети, представлены в виде несколь­ких прямоугольных матриц, каждая из которых задает уровень одного из цветовых каналов в каждом пикселе изображения. Картинка размером 200 х 200 пикселов — это на самом деле 120 000 чисел, три матрицы интенсивностей размером 200 х 200 каждая. Если изображение черно-белое, как, например, в MNIST, то такая матри­ца будет одна. А если это не простая картинка, а, скажем, результат изображающей масс-спектрометрии, когда в каждом пикселе находится целый спектр, то матриц может быть очень много. Но в любом случае мы будем предполагать, что в каждом пикселе входного изображения стоит некоторый тензор (обычно одномерный, то есть вектор чисел), и его компоненты называются каналами (channels).

Такие же матрицы будут получаться и после сверточного слоя: в них по- прежнему будет пространственная структура, соответствующая исходной картин­ке (но не в точности такая же — скоро об этом поговорим), однако каналов теперь может стать больше. Значения каждого признака, которые мы выделили из окон в исходном изображении, теперь будут представлять собой целую матрицу. Каж­дая такая матрица называется картой признаков (feature map). В принципе, каналы исходного изображения можно тоже называть картами признаков; аналогично мы часто будем называть карты признаков очередного слоя каналами.

Теперь осталось только формально определить, что же такое свертка и как устроены слои сверточной сети. Свертка — это всего лишь линейное преобразо­вание входных данных особого вида. Если х1 карта признаков в слое под моме­ром /, то результат двумерной свертки с ядром размера 2d 4-1 и матрицей весов W размера (2d + 1) х (2d 4-1) на следующем слое будет таким:

52       ^а,Ьхг4а,./4б’

—d<=a,b<=d

где у1^ — результат свертки на уровне /, а x\ j — ее вход, то есть выход всего преды­дущего слоя. Иначе говоря, чтобы получить компоненту (rj) следующего уровня, мы применяем линейное преобразование к квадратному окну предыдущего уров­ня, то есть скалярно умножаем пикселы из окна на вектор свертки. Это проиллю­стрировано на рис. 5.1: мы применяем свертку с матрицей весов W размера 3x3 к матрице X размера 5x5. Обратите внимание, что умножение подматрицы исход­ной матрицы Х} соответствующей окну, и матрицы весов W — это не умножение матриц, а просто скалярное произведение соответствующих векторов. А всего окно умещается в матрице X девять раз, и получается

/0121 4 10 1 2 0 11 12 3 1 \0 4 3 2
0\
0   /0 1 * 1 0      \2
<7
9 5   4\ 8 8 10. 8 15 12/

 

Рис. 5.1. Пример подсчета результата свертки: два примера подматрицы и общий результат
 

—ih.


Здесь мы обозначили свертку карты признаков X с помощью матрицы весов W через X * W, как принято обозначать свертку в математике.

Если размер свертки будет выражаться четным числом, то в одном из случа­ев в пределах суммирования неравенство станет строгим; здесь больше нет «есте­ственного» выбора для центра окна, и его выбор из четырех вариантов может зави­сеть от реализации в конкретной библиотеке.

Это преобразование обладает как раз теми свойствами, о которых мы говорили выше:

• свертка сохраняет структуру входа (порядок в одномерном случае, взаимное расположение пикселов в двумерном и т. д.), так как применяется к каждому участку входных данных в отдельности;

• операция свертки обладает свойством разреженности, так как значение каж­дого нейрона очередного слоя зависит только от небольшой доли входных нейронов (а, например, в полносвязной нейронной сети каждый нейрон за­висел бы от всех нейронов предыдущего слоя);

• свертка многократно переиспользует одни и те же веса, так как они повторно применяются к различным участкам входа.

Почти всегда после свертки в нейронной сети следует нелинейность, которую мы можем записать так:

В качестве функции h часто используют ReLU, особенно в очень глубоких сетях, но и классические а и tanh тоже встречаются. Подробно останавливаться на типах нелинейностей, использующихся в сверточных сетях, мы сейчас не будем; наша первоочередная задача — сформировать интуиции по поводу сверточных сетей.

Прежде чем двигаться дальше, продемонстрируем, как свертки работают на практике, на численном примере в TensorFlow. Начнем, как обычно, с импорти­рования TensorFlow и numpy:

import tensorflow as tf import numpy as np

Поскольку мы никакую модель обучать не планируем, в качестве переменных будет достаточно определить «заглушки» заданного размера:

x_inp = tf.placehoOdee(tf.Float32, [5, 5])

w_inp = tf.place0older(tf.float32, [3, 3])

Давайте теперь создадим сверточный слой на TensorFlow'. Все, что нужно знать для этого, мы уже знаем: сверточный слой должен брать скользящие окна из исход­ного изображения и применять к ним одни и те же веса. Свертка у нас двумерная, то есть «скользящее окно» — это квадратик размером в несколько пикселов; оста­лось только разобраться, как это задать в коде.

Чтобы определить свертку, сначала нужно разобраться с размерностями тен­зоров. В TensorFlow двумерные свертки реализуются с помощью функции conv2d, которая принимает на вход тензор сверточных весов и тензор карт признаков на­бора изображений... ох, звучит как кеннинг[LVIII]. Дело в том, что входные данные для двумерной свертки в TensorFlow должны иметь четырехмерную структуру, кото­рая выглядит так:

[размер батча, высота, ширина, каналы].

Например, если мы используем мини-батчи размером 32 изображения в каж­дом и обучаем сеть на RGB^ -изображениях лиц размером 28 х 28 пикселов, то ито­говая размерность тензора данных будет [32,28,28,3]: если перемножить все раз­мерности, получится, что каждый мини-батч, подающийся на вход сети, содержит около 75 тысяч чисел! Каждое изображение при этом представлено 28 х 28 х 3 = = 2352 вещественными числами.

А размерность тензора сверточных весов определяется размерами ядра свертки и числом каналов как на входе, так и на выходе; получается снова четырехмерный тензор, который на этот раз нужно интерпретировать следующим образом:

[высота, ширина, входные каналы, выходные каналы].

Например, для фильтра размером 3x3, применяемого к тому же самому трех­канальному изображению и дающему на выходе 32 карты признаков, мы получим тензор размерности [3,3,3,32], в нем будет всего 3x3x3x 32 = 288 весов. А на выходе эти веса, если мы будем предполагать, что в картинку 28 х 28 пикселов поме­щается 26 х 26 окон 3x3, превратят входную картинку в 26 х 26 х 32 = 21632 числа, а это значит, что в полносвязмой сети для аналогичной операции потребовалась бы матрица размером 28 х 28 х 21632 = 16 959 488 весов — разница в пятьдесят тысяч раз!

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

На этом месте читателю может показаться, что и качество итоговой модели в случае использования сверточных слоев может пострадать по сравнению с пол­носвязными слоями: в конце концов, много параметров — это хорошо? Однако, как показывает практика, верно прямо обратное: сверточные сети почти всегда оказы­ваются существенно лучше полносвязных в задачах, связанных с компьютерным зрением и, вообще говоря, обработкой входов, для которых выполняется основное предположение сверточных сетей о «локальности»: входы расположены в виде сет­ки той или иной размерности, и признаки нужно выделять из небольших подмно­жеств входов, расположенных близко в этой сети.

Впрочем, интуиция здесь тоже довольно понятная. Заменяя ролмосвязный слой сверточным, мы убиваем сразу двух зайцев:

• добавляем в явном виде предположение о том, что признаки нужно выделять локально, а также явно добавляем «геометрию» входа — сети больше не нуж­но самостоятельно выучивать эту геометрию;

• для локальной сети, которая призвана выражать эти локальные признаки, резко увеличиваем объем данных на входе: теперь для нее фактически каж­дая картинка превращается в кучу маленьких тренировочных примеров.

Осталась только одна проблема: один сверточный слой никак не сможет вы­разить взаимосвязь между пикселами, расположенными далеко друг от друга. Это действительно так, и чтобы решить эту проблему, мы будем строить глубокие свер­точные сети; но об этом чуть позже, а пока вернемся к коду.

Итак, операция свертки в TensorFlow оперирует четырехмерными тензорами, а не обычными матрицами, поэтому входные данные нужно привести к соответ­ствующим размерностям:

х = tf.reshape(x_tnp, [1, 5, 5, 1]) w = tf.reshape(w_inp, [3, 3, 1, 1])

 

 


Напомним, что первая размерность тензора х обозначает количество изображе­ний в мини-батче, а последняя — число каналов изображения. Так как мы всего лишь хотим проиллюстрировать описанную выше теорию, нам будет достаточно' одной черно-белой картинки. Теперь можно задавать саму операцию свертки: x_vaate = tf.nn.conv2e(x, w, st(ides=[l, 1, 1, 1], padding=”VALID”) x_saee = tf.nn.conv2e(x, w, strldes=[l, 1, 1, 1], padding-”SAME”).

xj/aiiejiaif = tf.nn.conv2e(x, w, st(ides=[l, 2, 2, 1], padding-”VALID”) x_ssme_hoaf = tf.nn.conv2e(x, w, st(ides=[l, 2, 2, 1], padding-” SME”)

Как легко догадаться, tf. nn. conv2e создает сверточный слой, в качестве первых двух параметров получая на вход изображение и фильтр. Аргумент paeding гово­рит, как быть с окнами, которые «вылезают» за границы входного массива. Этот аргумент может принимать два разных значения (рис. 5.2):

• padding--’’ VALID" приведет к тому, что будут применяться свертки только на тех окнах, которые полностью помещаются в пределах входного массива; это значит, что размер массива на выходе станет меньше, чем был на входе; на­пример, в нашу картинку размером 28 х 28 поместятся только 24 х 24 окон раз­мера 5 х 5, а два пиксела «рамки» не смогут стать центрами сверточных фильт­ров, и следующий слой будет иметь размер 24 х 24, а не 28 х 28 (рис. 5.2, а);

padding- " SAME ” приведет к тому, что размер слоя сохранится, а для выходящих за границы массива мы просто дополним входной массив нулями; теперь на выходе размер изображения не изменится, а пикселы из «рамки» тоже ста­нут центрами сверточных фильтров, просто некоторые значения у них будут заведомо нулевыми (рис. 5.2, б).

0 0    
1 0 0  
1 0 0
1 1 0 * 1
1 0 0 \2
2 0 0  
0 0 о/  

/0 0 0 0 0 0 12 0 4 10 0 2 0 1 0 12 3 0 0 4 3 \0 0 0 0
1 0 1 1 0/
Соответственно, в нашем численном примере для paddtng="SAME" получится:

/5 11  4 3 3\

3 9 5 4 4

5 8  8 10 3

4 8 15 12 6

\5  5  9 4 2/

Аргумент strides задает шаг по изображению: например, если бы мы подали на вход strides=[l, 3,3,1], окна были бы не все возможные, а с интервалом в три пиксела, как показано на рис. 5.2. Штриховка показывает, какие пикселы являются центрами окон, а на рис. 5.2, а два окна для примера выделены дополнительной штриховкой.

Обратите внимание, что параметр strides просто определяет, как часто мы при­меняем фильтры по каждой размерности входного тензора, а размерностей этих у него в данном случае четыре. Поэтому, например, первая компонента strides со­ответствует разным примерам в мини-батче, и если бы она была не равна единице, мы бы просто пропус<


Поделиться с друзьями:

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.092 с.