Что такое deep learning
Курс о Deep Learning на пальцах
Я все еще не до конца понял, как так получилось, но в прошлом году я слово за слово подписался прочитать курс по Deep Learning и вот, на удивление, прочитал. Обещал — выкладываю!
Курс не претендует на полноту, скорее это способ поиграться руками с основными областями, где deep learning устоялся как практический инструмент, и получить достаточную базу, чтобы свободно читать и понимать современные статьи.
Материалы курса были опробованы на студентах кафедры АФТИ Новосибирского Государственного Университета, поэтому есть шанс, что по ним действительно можно чему-то научиться.
Курс требует:
— Знания математики на уровне первого-второго курса университета: надо знать немного теории вероятностей, линейную алгебру, основы матанализа и анализ функций многих переменных. Если все это прошло мимо вас, вот все нужные курсы от MIT и Harvard. В них типично достаточно пройти первые две секции.
— Умения программировать на питоне.
В хорошем курсе должны быть доступны и лекции, и упражнения, и место, где можно задать по ним вопросы и обсудить. Здесь они собраны с миру по нитке:
— Лекции существуют как записи на Youtube.
— В качестве упражнений можно использовать задания великолепных Стенфордских курсов по DeepLearning (CS231n и CS224n), я ниже напишу какие конкретно.
— Обсуждать и спрашивать можно на ClosedCircles и ODS.ai.
Лекции и упражнения
Упражнение: секции «k-Nearest Neighbor» и «Softmax classifier» отсюда
По специфике задания могут помочь вот эти lecture notes.
Упражнение: секции «Two-Layer Neural Network» отсюда и «Fully-connected Neural Network» отсюда
Упражнение: секции «Convolutional Networks» и «PyTorch on CIFAR-10» отсюда
Упражнение: секция «word2vec» отсюда
Здесь хорошего готового задания я не нашел, но можно реализовать на PyTorch Char-RNN из знаменитого поста Andrej Karpathy и натравить на Шекспира.
Где обсуждать и задавать вопросы
Все вопросы по курсу можно задавать мне лично или обсуждать в кружочке #data на ClosedCircles.com (вот инвайт).
Кроме этого, задания можно обсуждать в канале #class_cs231n на ODS.ai, там помогут. Для этого придется получить туда инвайт самому, отправляйте заявки.
Ну и вообще, звоните-пишите, всегда рад.
Самая приятная секция — благодарности!
Прежде всего, огромное спасибо buriy, с которым мы готовили курс. Спасибо родной кафедре, которая дала вообще такую возможность.
Всем в тусовках на ODS.ai и ClosedCircles, кто помогал в подготовке, отвечал на вопросы, присылал фидбек, напоминал что надо все выложить, итд итп.
Наконец, всем кто следил за стримами на канале, задавал вопросы в реалтайме и вообще создавал ощущение, что я не со стеной разговариваю.
Deep Learning
Deep learning (глубокое обучение) — это вид машинного обучения с использованием многослойных нейронных сетей, которые самообучаются на большом наборе данных.
Основная логика
Искусственный интеллект с глубоким обучением сам находит алгоритм решения исходной задачи, учится на своих ошибках и после каждой итерации обучения дает более точный результат. Deep learning используют в компьютерном зрении (для извлечения информации из изображений), машинном переводе и распознавании человеческой речи на аудиозаписях.
Кратчайшая история
Первые компьютерные модели нейронных сетей появились в 1943 году. Американские ученые Уолтер Питтс и Уоррен Маккалок создали аналог нейронных сетей человеческого мозга и написали алгоритмы для имитации мыслительного процесса. Позднее исследователи изучали алгоритмы работы искусственных нейросетей, но у технологии были ограничения: для полноценной работы в те годы не хватало мощных компьютеров и объемы имеющихся данных были слишком малы.
В 1970-x появились первые графические процессоры – GPU. Компьютеры с этими компонентами обрабатывали графические данные в сотни раз быстрее, так как GPU специально были заточены только для этой задачи. В будущем это помогло нейронным сетям выиграть конкуренцию у других моделей искусственного интеллекта, например, машины опорных векторов, так как для обучения нейросети нужно быстро перемножить большое количество матриц, а GPU с этим справляются лучше всего.
Современный этап развития глубокого обучения наступил в начале 2010-х годов. Этому помогли рост производительности графических процессоров и появление сверточных нейронных сетей, при создании которых вдохновлялись устройством человеческого глаза. В 2012 году применение deep learning позволило снизить долю ошибок при распознавании объектов на изображениях в рамках проекта ImageNet до 16%. Сегодня нейросети справляются с подобными задачами с точностью до 94-99%, что превышает возможности человека.
Сегодня нейросети применяют и для анализа активности в человеческом мозге. В 2020 году исследователи использовали deep learning для поиска отделов височной доли мозга, отвечающих за распознавание образов у человека.
Machine Learning и Deep Learning
Освойте самую востребованную технологию искусственного интеллекта. Дополнительная скидка 5% по промокоду BLOG.
Как устроены многослойные нейронные сети
Функционально нейросети делят на слои — структуры нейронов с общей задачей.
Входной слой получает набор данных. В простейшем случае каждый нейрон отвечает за один параметр. Например, в нейросетях для прогнозирования цен номеров в отеле это будут название отеля, категория номера и дата заезда. Информацию по этим параметрам входной слой отдает на скрытые слои.
Скрытые слои производят вычисления на основе входящих параметров. В глубоком обучении у нейронных сетей несколько скрытых слоев. Это позволяет нейросети находить больше взаимосвязей во входных данных. Связи между нейронами имеют свой вес — долю значимости параметра среди всехданных. Например, в подсчете цен номеров большой вес будет иметь дата заезда, поскольку отели меняют цены в зависимости от спроса в конкретный день.
Выходной слой выводит результат вычислений, например, цены номеров в отелях.
В глубоком обучении используется больше одного скрытого слоя. Такие модели называют глубокими нейронными сетями (deep neural network). Например, в компьютерном зрении используют сверточные нейросети. В архитектуре таких нейросетей используют множество слоев, подбирая их количество под каждую задачу. Чем дальше информация со входного изображения продвигается по нейросети, тем более абстрактные детали находит нейросеть. Например, на первых слоях модель находит палочки и круги, из которых состоит любое изображение, а в конце сеть уже может найти хвосты и уши для распознавания животных на фотографиях.
Как обучают нейросети в deep learning
Глубокая нейросеть тренируется проводить точные вычисления на больших наборах данных. Например, для обучения расчету цен в отелях нужны массивы данных о ценах за предыдущие годы. Нейросеть будет находить закономерности в параметрах и с каждой итерацией будет прогнозировать цены в определенный день точнее.
В deep learning есть два основных способа тренировки нейросети: с учителем и без учителя. В первом случае нейросети задают эталонный результат вычислений. При ответах с ошибкой она перенастраивает свои параметры и проводит вычисления снова, пока ответ не приблизится к эталону. Пример – определение стоимости дома.
При обучении без учителя глубокая нейросеть сама классифицирует входящие данные и вычисляет эталонный результат. Пример – кластеризация пользователей сайта по разным группам.
Data Science с нуля
Освойте машинное и глубокое обучение и научитесь применять их для решения бизнес-задач. Дополнительная скидка 5% по промокоду BLOG.
Где применяется deep learning
Машинный перевод
В технологии нейронного машинного перевода (NMT) нейросети обучают на миллионах примеров пар фрагментов текста и их переводов. Глубокое обучение позволяет модели анализировать контекст употребления слов и грамматику. Один из самых известных примеров — GNMT, нейронный машинный перевод от Google.
Компьютерное зрение
В технологиях компьютерного зрения deep learning помогает распознавать объекты на изображениях. Для этого нейронные сети анализируют области на фото, находя в них закономерности, полученные при обучении. Например, компьютерное зрение используют в поисковиках: алгоритмы Яндекс и Google способны находить похожие на заданные фотографии. Также глубокое обучение применяют для распознавания лиц на камерах видеонаблюдения и для редактирования фотографий.
Синтез и распознавание речи
Благодаря глубокому обучению технологии обработки и синтеза речи стали очень точными. Обучение многослойных нейросетей позволяет компьютеру распознавать голос с учетом речевых особенностей: произношения, акцента, скорости речи, возраста говорящего. В синтезе речи, например, в голосовых помощниках Siri и Алиса, глубокое обучение позволяет объединять записанные фрагменты так, чтобы голос казался естественным.
Освойте востребованную профессию за 13 месяцев. На курсе вы изучите необходимый набор компетенций для уровня Junior.
Что такое deep learning
Что такое deep learning и почему о нем все говорят?
» data-href-next=»https://hightech.fm/2018/04/18/metro» data-id-next=»48892″ data-title-next=»Московские власти начали внедрять в метро и ЖД-станциях систему распознавания лиц»> ;
Что такое deep learning и почему о нем все говорят?
3 октября 2015 года мессенджер Telegram оказался недоступен для части пользователей в России и по всему миру. Причины возникших проблем пока неизвестны.
Читайте «Хайтек» в
Что такое deep learning и почему о нем все говорят?
О чем речь?
С появления термина «глубокое обучение» прошло уже больше 20 лет, но широко заговорили о нем только недавно. Кратко объясняем, почему так получилось, что такое deep learning, чем оно отличается от машинного обучения и почему вам надо об этом знать.
Что это такое?
Глубокое обучение — это ветвь развития машинного обучения, где используется модель, вдохновленная устройством мозга — взаимодействием нейронов.
Сам термин появился еще в 1980-х, но до 2012 года для реализации этой технологии не хватало мощностей и на нее почти никто не обращал внимание. После серии статей известных ученых, публикаций в научных изданиях технология быстро стала популярной и получила внимание крупных медиа, — первым из мировых СМИ об этом написал The New York Times. Одним из поводов для материала стала научная работа специалистов из университетов Торонто Алекса Крижевского, Ильи Сатскевера и Джеффа Хинтона. Они описали и проанализировали результаты конкурса распознавания изображений ImageNet, где с большим отрывом победила их нейросеть, обученная с помощью deep learning, — система определила 85% объектов. С тех пор в конкурсе побеждала только глубокая нейросеть
Погодите, а что такое машинное обучение?
Это подобласть искусственного интеллекта и термин — им описывают методы построения алгоритмов, которые учатся на своем опыте, без написания специальной программы. То есть человеку в этом случае не надо объяснять машине, как решить задачу, она находит ответ сама, из данных, которые ей предоставлены. К примеру, если мы хотим, чтобы алгоритм определял лица, мы должны показать ему десять тысяч разных лиц, отметить, где именно находится лицо, и тогда программа научится определять его самостоятельно.
Обучаться машина может как с помощью учителя, когда он помечает для машины правильные ответы, так и без него. Но результаты лучше при обучении с учителем. Каждый раз, когда происходит обработка данных, система становится точнее.
А глубокое обучение как работает?
Оно имитирует абстрактное мышление человека и умеет обобщать. Например, нейросеть, обученная машинным способом, плохо распознает рукописные буквы — и чтобы она не путалась в различных вариантах написания, все они должны быть в нее загружены.
Глубокое обучение же используется в случае работы с многослойными искусственными нейронными сетями и сможет справиться с этой задачей.
Сергей Николенко, соавтор книги «Глубокое обучение»: «Есть три термина, которые в последнее время часто используют почти взаимозаменяемо: искусственный интеллект, машинное обучение и глубокое обучение. Однако на самом деле это „вложенные“ термины: искусственный интеллект — это всё что угодно, что может помочь компьютеру выполнять человеческие задачи; машинное обучение — это раздел ИИ, в котором программы не просто решают задачи, а обучаются на основе имеющегося у них опыта, а глубокое обучение — это раздел машинного обучения, изучающий глубокие нейронные сети.
Проще говоря: 1. если вы написали программу, играющую в шахматы, — это искусственный интеллект; 2. если она при этом обучается на базе партий гроссмейстеров или играя против самой себя — это машинное обучение; 3. а если обучается у неё при этом не что-нибудь, а глубокая нейронная сеть, — это глубокое обучение».
Как работает глубокое обучение?
Возьмем простой пример — мы покажем нейросети фотографии, на которых изображены мальчик и девочка. На первом слое нейроны реагируют на простые визуальные образы — например перепады яркости. На втором — более сложные: углы, окружности. К третьему слою нейроны способны реагировать на надписи и человеческие лица. К каждому следующему слою определяемые образы будут сложнее. Нейронная сеть сама определяет, какие визуальные элементы ей интересны для решения этой задачи, и ранжирует их по степени важности, чтобы в дальнейшем лучше понимать, что изображено на фотографии.
И что с помощью него уже разработали?
Больше всего проектов с глубоким обучением применяется в распознавании фотографии или аудио, диагностике заболеваний. Например, оно уже используется в переводах Google с изображения: технология Deep Learning позволяет определить, есть ли на картинке буквы, а затем переводит их. Другой проект, который работает с фото, — система распознавания лиц под названием DeepFace. Она умеет распознавать человеческие лица с точностью 97,25% — примерно с той же точностью, что и человек.
В 2016 году Google выпустил WaveNet — систему, которая может имитировать человеческую речь. Для этого компания загрузила в систему миллионы минут записанных голосовых запросов, которые использовались в проекте OK Google, и после изучения, нейросеть смогла сама составить предложения с правильными ударениями, акцентом и без нелогичных пауз.
При этом глубокое обучение может семантически сегментировать изображение или видео — то есть не просто обозначать, что на картинке есть объект, но и идеально выделить его контуры. Эта технология используется в беспилотных автомобилях, которые определяют, есть ли помехи на дороге, разметку и считывают информацию с дорожных знаков, чтобы избежать аварий. Нейросеть также используют в медицине — чтобы определять диабетическую ретинопатию по фотографиям глаз пациентов например. Министерство здравоохранения США уже разрешило использовать эту технологию в государственных клиниках.
А почему глубинное обучение не начали внедрять раньше?
Раньше это было затратно, сложно и долго — нужны были мощные графические процессоры, видеокарты и объемы памяти. Бум глубинного обучения как раз связан с широким распространением графических процессоров, которые ускоряют и удешевляют вычисления, практически неограниченные возможности хранения данных и развитие технологии «больших данных».
Это прорывная технология, она все поменяет?
Об этом сложно сказать точно, мнения разнятся. С одной стороны, Google, Facebook и другие крупные компании уже вложили миллиарды долларов и настроены оптимистично. По их мнению, нейросети с глубинным обучением способны поменять технологическое устройство мира. Один из главных специалистов по машинному обучению — Эндрю Ынг — говорит: «Если человек может выполнить задачу в уме за секунду, скорее всего, в ближайшее время эта задача будет автоматизирована». Ынг называет машинное обучение «новым электричеством» — это техническая революция, и компании, которые ее проигнорируют, очень быстро обнаружат себя безнадежно отставшими от конкурентов.
С другой стороны, есть и скептики: они считают, что глубокое обучение — это модное слово или ребрендинг нейронных сетей. К примеру, старший преподаватель факультета компьютерных наук ВШЭ Сергей Бартунов считает, что этот алгоритм — лишь один из вариантов (и при этом не лучший) обучения нейросети, который быстро подхватили массовые издания и о которых теперь знают все.
Сергей Николенко, соавтор книги «Глубокое обучение»: «История искусственного интеллекта уже знала две „зимы“, когда за волной хайпа и завышенных ожиданий следовало разочарование. Оба раза, кстати, это было связано с нейронными сетями. Сначала в конце 1950-х решили, что перцептрон Розенблатта тут же приведёт к машинному переводу и осознающим себя компьютерам; но, конечно, не получилось из-за ограниченности железа, данных и отсутствия подходящих моделей.
А в конце 1980-х ту же ошибку совершили, когда разобрались, как обучать любые архитектуры нейронных сетей. Показалось, что вот он, золотой ключик, открывающий любые двери. Это уже был не такой уж наивный вывод: действительно, если взять нейронную сеть из конца 1980-х, механически сделать её больше (увеличить число нейронов) и обучить на современных наборах данных и современном „железе“, она будет очень даже неплохо работать! Но ни данных, ни „железа“ в то время не хватало, и революцию глубокого обучения пришлось отложить до конца нулевых годов.
Сейчас мы живём на третьей волне хайпа искусственного интеллекта. Закончится ли она третьей „зимой“ или созданием сильного ИИ — покажет только время».
Вижу, значит существую: обзор Deep Learning в Computer Vision (часть 1)
Компьютерное зрение. Сейчас о нём много говорят, оно много где применяется и внедряется. И как-то давненько на Хабре не выходило обзорных статей по CV, с примерами архитектур и современными задачами. А ведь их очень много, и они правда крутые! Если вам интересно, что сейчас происходит в области Computer Vision не только с точки зрения исследований и статей, но и с точки зрения прикладных задач, то милости прошу под кат. Также статья может стать неплохим введением для тех, кто давно хотел начать разбираться во всём этом, но что-то мешало 😉
Сегодня на Физтехе происходит активная коллаборация «академии» и индустриальных партнёров. В частности, в Физтех-школе Прикладной математики и информатики действуют множество интересных лабораторий от таких компаний, как Сбербанк, Biocad, 1С, Тинькофф, МТС, Huawei.
На написание этой статьи меня вдохновила работа в Лаборатории гибридных интеллектуальных систем, открытой компанией ВкусВилл. У лаборатории амбициозная задача — построить магазин, работающий без касс, в основном при помощи компьютерного зрения. За почти год работы мне довелось поработать над многими задачами зрения, о которых и пойдёт речь в этих двух частях.
Будем двигаться по плану:
Мотивация и что вообще происходит
В 2019 году все говорят про искусственный интеллект, четвёртую промышленную революцию и приближение человечества к сингулярности. Круто, классно, но хочется конкретики. Ведь мы с вами любопытные технари, которые не верят в сказки про ИИ, мы верим в формальную постановку задач, математику и программирование. В этой статье мы поговорим о конкретных кейсах применения того самого современного ИИ — о применении deep learning (а именно — свёрточных нейросетей) в множестве задач компьютерного зрения.
Да, мы будем говорить именно про сетки, иногда упоминая некоторые идеи из «классического» зрения (так будем называть набор методов в зрении, которые использовались до нейросетей, однако это ни в коем случае не значит, что сейчас они не используются).
На мой взгляд, первое действительно интересное применение нейросетей в зрении, которое было освещено в СМИ ещё в 1993 году, это распознавание рукописных цифр, реализованное Яном ЛеКуном. Сейчас он один из главных по ИИ в Facebook AI Research, их команда выпустила уже немало полезных Open Source вещей.
Сегодня же зрение применяется во многих сферах. Приведу лишь несколько ярких примеров:
Беспилотные автомобили Tesla и Яндекса
Игровые приставки: Kinect 2.0 (правда, там ещё используется информация о глубине, то есть RGB-D картинки)
Распознавание по лицу: Apple FaceID (при помощи нескольких датчиков)
Биометрия лица и движений глаз (пример из проекта ФПМИ МФТИ)
Поиск по картинке: Яндекс и Google
Дроны и роботы: получение и обработка информации с помощью зрения
Одометрия: построение карты и планирование при перемещении роботов
Перевод по картинке: Яндекс и Google
Я уже не говорю про многочисленные применения в различных внутренних задачах компаний. Facebook, к примеру, применяет зрение ещё и для того, чтобы фильтровать медиаконтент. В проверке качества/повреждений в промышленности тоже используются методы компьютерного зрения.
Дополненной реальности здесь нужно, на самом деле, уделить отдельное внимание, поскольку она не работает в скором времени это может стать одной из главных областей применения зрения.
Смотивировались. Зарядились. Поехали:
Классификация как стиль жизни
Как я уже говорил, в 90-е годы сетки в зрении выстрелили. Причём выстрелили в конкретной задаче — задаче классификации картинок рукописных цифр (знаменитый датасет MNIST). Исторически сложилось, что именно задача классификации изображений и стала основой при решении почти всех последующих задач в зрении. Рассмотрим конкретный пример:
Представим, что с компьютерным зрением мы пока не знакомы, но знаем machine learning. Изображения — это просто числовые тензоры в памяти компьютера. Формализуем задачу в терминах машинного обучения: объекты — это картинки, их признаки — это значения в пикселях, ответ для каждого из объектов — метка класса (кошка, собака или человек). Это в чистом виде задача классификации.
Можно взять какие-нибудь методы из “классического” зрения или “классического” машинного обучения, то есть не нейросети. В основном эти методы заключаются в выделении на изображениях неких особенностей (особых точек) или локальных регионов, которые будут характеризовать картинку (“мешок визуальных слов”). Обычно всё это сводится к чему-то типа SVM над HOG/SIFT.
Но мы здесь собрались, чтобы поговорить о нейросетях, поэтому не хотим использовать придуманные нами признаки, а хотим, чтобы сеть сделала всё за нас. Наш классификатор будет принимать на вход признаки объекта и возвращать предсказание (метку класса). Здесь в качестве признаков выступают значения интенсивности в пикселях (см. модель картинки в под
спойлером выше). Помним, что картинка — это тензор размера (Height, Width, 3) (если она цветная). Сетке при обучении на вход всё это обычно подаётся не по одной картинке и не целым датасетом, а батчами, т.е. небольшими порциями объектов (например, 64 картинки в батче).
Таким образом, сеть принимает на вход тензор размера (BATCH_SIZE, H, W, 3). Можно “развернуть” каждую картинку в вектор-строку из H*W*3 чисел и работать со значениями в пикселях прямо как с признаками в машинном обучении, обычный Multilayer Perceptron (MLP) так и поступил бы, но это, честно говоря, такой себе бейзлайн, поскольку работа с пикселями как с вектор-строкой никак не учитывает, например, трансляционную инвариантность объектов на картинке. Тот же кот может быть как в середине фото, так и в углу, MLP эту закономерность не выучит.
Значит нужно что-то поумнее, например, операция свёртки. И это уже про современное зрение, про свёрточные нейронные сети:
Поскольку сейчас речь об обучении с учителем, для тренировки нейросети нам нужны несколько компонент:
Если хочется не спеша и с начала узнать про свёртки и свёрточные сети, рекомендую лекцию в Deep Learning School (ФПМИ МФТИ) (на русском) на эту тему, и, конечно же, курс Стэнфорда cs231n (на английском).
Если вкратце, то операция свёртки позволяет находить паттерны на изображениях с учётом их вариативности. Когда обучаем свёрточные нейросети (eng: Convolutional Neural Networks), мы, по сути, находим фильтры свёрток (веса нейронов), которые хорошо описывают изображения, причём столь хорошо, чтобы можно было точно определить по ним класс. Способов построить такую сеть придумали много. Больше, чем вы думаете…
Архитектуры свёрточных нейросетей: 1000 способов достичь одной цели
Да-да, ещё один обзор архитектур. Но здесь я постараюсь сделать его максимально актуальным!
Сначала была LeNet, она помогла Яну ЛеКуну распознавать цифры в 1998 году. Это была первая свёрточная нейросеть для классификации. Её основная фишка была в том, что она в принципе стала использовать convolution и pooling операции.
14 миллионов картинок и 21841 класс (взято с оф. сайта), но для соревнования всё равно обычно выделяют лишь подмножество. ILSVRC тогда стал самым крупным ежегодным соревнованием по классификации изображений. Кстати, недавно придумали, как можно обучить на ImageNet’е за считанные минуты.
Обычно различные обзоры архитектур проливают свет на те, что были первыми на ILSVRC с 2010 до 2016 года, и на некоторые отдельные сети. Чтобы не загромождать рассказ, я поместил их под спойлер ниже, постаравшись подчеркнуть основные идеи:
Год | Статья | Ключевая идея | Вес |
---|---|---|---|
2012 | AlexNet | использовать две свёртки подряд; делить обучение сети на две параллельных ветки | 240 MB |
2013 | ZFNet | размер фильтров, число фильтров в слоях | — |
2013 | Overfeat | один из первых нейросетевых детекторов | — |
2014 | VGG | глубина сети (13-19 слоёв), использование нескольких блоков Conv-Conv-Pool с меньшим размером свёрток (3х3) | 549MB (VGG-19) |
2014 | Inception (v1) (она же GoogLeNet) | 1х1-свёртка (идея из Network-in-Network), auxilary losses (или deep supervision), стекинг выходов нескольких свёрток (Inception-блок) | — |
2015 | ResNet | residual connections, очень большая глубина (152 слоя..) | 98 MB (ResNet-50), 232 MB (ResNet-152) |
Идеи всех этих архитектур (кроме ZFNet, её обычно мало упоминают) в своё время были новым словом в нейросетях для зрения. Однако и после 2015 было ещё очень много важных улучшений, например, Inception-ResNet, Xception, DenseNet, SENet. Ниже я постарался собрать их в одном месте.
Год | Статья | Ключевая идея | Вес |
---|---|---|---|
2015 | Inception v2 и v3 | разложение свёрток в свёртки 1хN и Nx1 | 92 MB |
2016 | Inception v4 и Inception-ResNet | совмещение Inception и ResNet | 215 MB |
2016-17 | ResNeXt | 2 место ILSVRC, использование многих веток ( “обобщённый” Inception-блок) | — |
2017 | Xception | depthwise separable convolution, меньше весит при сравнимой с Inception точности | 88 MB |
2017 | DenseNet | Dense-блок; лёгкая, но точная | 33 MB (DenseNet-121), 80 MB (DenseNet-201) |
2018 | SENet | Squeeze-and-Excitation блок | 46 MB (SENet-Inception), 440 MB (SENet-154) |
Большинство из этих моделей для PyTorch можно найти здесь, а ещё есть вот такая классная штука.
Вы могли заметить, что всё это дело весит довольно много (хотелось бы 20 MB максимум, а то поменьше), в то время как сейчас повсеместно используют мобильные устройства и приобретает популярность IoT, а значит сетки хочется использовать и там.
Авторы многих статей пошли по пути изобретения быстрых архитектур, я собрал их методы под спойлером ниже:
Год | Статья | Ключевая идея | Вес | Пример реализации |
---|---|---|---|---|
2016 | SqueezeNet | FireModule сжатия-разжатия | 0.5 MB | Caffe |
2017 | NASNet | получена нейронным поиском архитектур, это сеть из разряда AutoML | 23 MB | PyTorch |
2017 | ShuffleNet | pointwise group conv, channel shuffle | — | Caffe |
2017 | MobileNet (v1) | depthwise separable convolutions и много других трюков | 16 MB | TensorFlow |
2018 | MobileNet (v2) | рекомендую эту статью на Хабре | 14 MB | Caffe |
2018 | SqueezeNext | см. картиночки в оригинальном репозитории | — | Caffe |
2018 | MnasNet | нейропоиск архитектуры специально под мобильные устройства с помощью RL | TensorFlow | |
2019 | MobileNet (v3) | она вышла, пока я писал статью 🙂 | — | PyTorch |
Цифры во всех таблицах взяты с потолка из репозиториев, из таблицы Keras Applications и из этой статьи.
Вы спросите: “Для чего ты написал про весь этот “зоопарк” моделей? И почему всё же задача классификации? Мы же хотим научить машины видеть, а классификация — лишь какая-то узкая задача..”. Дело в том, что нейросети для детектирования объектов, оценки позы/точек, ре-идентификации и поиска по картинке используют в качестве backbone именно модели для классификации, и уже от них зависит 80% успеха.
Но хочется как-то больше доверять CNN, а то напридумывали чёрных коробок, а что «внутри» — не очевидно. Чтобы лучше понимать механизм функционирования свёрточных сетей, исследователи придумали использовать визуализацию.
Визуализация свёрточных нейросетей: покажи мне страсть
Важным шагом к осознанию того, что происходит внутри свёрточных сетей, стала статья «Visualizing and Understanding Convolutional Networks». В ней авторы предложили несколько способов визуализации того, на что именно (на какие части картинки) реагируют нейроны в разных слоях CNN (рекомендую также посмотреть лекцию Стэнфорда на эту тему). Результаты получились весьма впечатляющие: авторы показали, что первые слои свёрточной сети реагируют на какие-то «низкоуровневые вещи» по типу краёв/углов/линий, а последние слои реагируют уже на целые части изображений (см. картинку ниже), то есть уже несут в себе некоторую семантику.
Далее проект по глубокой визуализации от Cornell University и компании продвинул визуализацию ещё дальше, в то время как знаменитый DeepDream научился искажать в наркоманском интересном стиле (ниже картинка с deepdreamgenerator.com).
В 2017 году вышла очень хорошая статья на Distill, в которой они провели подробный анализ того, что «видит» каждый из слоёв, и совсем недавно (в марте 2019) Google изобрела активационные атласы: своеобразные карты, которые можно строить для каждого слоя сети, что приближает к понимаю общей картины работы CNN.
Если хочется самому поиграться с визуализацией, я бы рекомендовал Lucid и TensorSpace.
Окей, кажется, CNN и правда в некоторой степени можно верить. Нужно научиться использовать это и в других задачах, а не только в классификации. В этом нам помогут извлечение Embedding’ов картинок и Transfer Learning.
Я и сам своего рода хирург: извлекаем фичи из нейросетей
Представим, что есть картинка, и мы хотим найти похожие на неё визуально (так умеет, например, поиск по картинке в Яндекс.Картинки). Раньше (до нейросетей) инженеры для этого извлекали фичи вручную, например, придумывая что-то, что хорошо описывает картинку и позволит её сравнивать с другими. В основном, эти методы (HOG, SIFT) оперируют градиентами картинок, обычно именно эти штуки и называют «классическими» дескрипторами изображений. Особо интересующихся отсылаю к статье и к курсу Антона Конушина (это не реклама, просто курс хороший 🙂
Используя нейросети, мы можем не придумывать самому эти фичи и эвристики, а правильно обучить модель и потом взять за признаки картинки выход одного или нескольких слоёв сети.
Посмотрев на все архитектуры выше поближе, становится понятно, что в CNN для классификации есть два этапа:
1). Feature extractor слои для выделения информативных фич из картинок с помощью свёрточных слоёв
2). Обучение поверх этих фич Fully Connected (FC) слоёв-классификаторов
Embedding’и картинок (фичи) — это как раз про то, что можно брать в качестве информативного описания картинок их признаки после Feature extractor’а свёрточной нейросети (правда их можно по-разному агрегировать). То есть обучили сеть на классификацию, а потом просто берём выход перед классификационными слоями. Эти признаки называют фичами, нейросетевыми дескрипторамиили эмбеддингами картинки (правда обычно эмбеддинги принято в NLP, так как это зрение, я чаще буду говорить фичи). Обычно это какой-то числовой вектор, например, 128 чисел, с которым уже можно работать.
Таким образом, пайплайн решения задачи поиска по картинке может быть устроен просто: прогоняем картинки через CNN, берём признаки с нужных слоёв и сравниваем эти фичи друг с другом у разных картинок. Например, банально считаем Евклидово расстояние этих векторов.
Transfer Learning — широко известная техника эффективного дообучения нейросетей, которые уже обучены на каком-то определённом датасете, под свою задачу. Часто ещё говорят Fine Tuning вместо Transfer Learning, в конспектах Стэнфордского курса cs231n эти понятия разделяют, мол, Transfer Learning — это общая идея, а Fine Tuning — одна из реализаций техники. Нам это в дальнейшем не так важно, главное понимать, что мы просто можем дообучить сеть хорошо предсказывать на новом датасете, стартуя не со случайных весов, а с обученных на каком-нибудь большом по типу ImageNet. Это особенно актуально, когда данных мало, а задачу хочется решить качественно.
Однако просто брать нужные фичи и делать дообучение с датасета на датасет может быть недостаточно, например, для задач поиска похожих лиц/людей/чего-то специфичного. Фотографии одного и того же человека визуально иногда могут быть даже более непохожи, чем фотографии разных людей. Нужно заставить сеть выделять именно те признаки, которые присущи одному человеку/объекту, даже если нам это сделать глазами сложно. Добро пожаловать в мир representation learning.
Держись рядом: representation learning для людей и лиц
Первую задачу обычно называют распознаванием лиц, вторую — ре-идентификацией (сокращённо Reid). Я объединил их в один блок, поскольку в их решениях сегодня используются схожие идеи: для того, чтобы выучивать эффективные эмбеддинги картинок, которые могут справляться и с довольно сложными ситуациями, сегодня используют различные типы лоссов, такие как, например, triplet loss, quadruplet loss, contrastive-center loss, cosine loss.
Ещё есть прекрасные сиамские сети, однако их я, честно, сам не использовал. Кстати, “решает” не только сам лосс, а то, как для него семплировать пары positive’ов и negative’ов, это подчёркивают авторы статьи Sampling matters in deep embedding learning.
Суть всех этих лоссов и сиамских сетей проста — хотим, чтобы картинки одного класса (человека) в латентном пространстве фич (эмбеддингов) были “близко”, а разных классов (людей) — “далеко”. Близость обычно меряется так: берутся эмбеддинги картинок из нейросети (например, вектор из 128 чисел) и либо считаем обычное Евклидово расстояние между этими векторами, либо косинусную близость. Как именно мерить — лучше подбирать на своём датасете/задаче.
Схематично пайплайн решения задач на representation learning выглядит примерно так:
На стадии обучения: обучаем нейросеть либо на классификацию (Softmax + CrossEntropy), либо с помощью специального лосса (Triplet, Contrastive, etc.). Во втором случае ещё нужно правильно подбирать positive’ы и negative’ы в каждом батче
На стадии предсказания: если это был именно какой-то особый лосс по типу триплета, то он на вход принимал уже эмбеддинги — их и берём. Если была классификация, то тут нужно экспериментировать — можно брать фичи с какого-то из свёрточных слоёв, а можно и вероятности после классификатора (да, так делают и это работает). Далее ищем расстояние от пришедшей в тесте картинки до всех картинок из галереи и выдаём метку ближайшей. Расстояние меряем косинусом или Евклидовой метрикой
Реализаций тоже немало: dlib, OpenFace, FaceNet repo, да и на Хабре про это уже давно было рассказано. Кажется, за последнее время добавились только ArcFace и CosFace (пишите в комментарии, если я здесь что-то упустил, буду рад узнать что-то ещё).
Однако сейчас больше мода не на распознавание лиц, а на их генерацию, не так ли?
В свою очередь, в задаче ре-идентификации сейчас бурная активность, статьи выходят каждый месяц, люди пробуют разные подходы, что-то работает уже сейчас, что-то пока ещё не очень.
К слову, в нашей лаборатории Reid — одна из ключевых задач. Статей выходит действительно немало, какие-то из них про новый более эффективный лосс, какие-то только про новый способ добычи negative’ов и positive’ов.
Хороший обзор старых методов по Reid есть в статье 2016 года. Сейчас, как я уже писал выше, применяются два подхода — классификация или representation learning. Однако есть специфика задачи, с ней исследователи борются по-разному, например, авторы Aligned Re-Id предложили специальным образом выравнивать фичи (да, они смогли улучшить сеть с помощью динамического программирования, Карл), в другой статье предложили применить Generative Adversarial Networks (GAN).
Из реализаций хочется обязательно упомянуть OpenReid и TorchReid. Обратите внимание на сам код — на мой взгляд, он написан грамотно с точки зрения архитектуры фреймворка, подробнее здесь. Плюс они оба на PyTorch, и в Readme есть много ссылок на статьи по Person Re-identification, это приятно.
Вообще особый спрос на face- и reid-алгоритмы сейчас в Китае (если вы понимаете, о чём я). Мы на очереди? Кто знает…
Слово про ускорение нейросетей
Мы уже говорили о том, что можно просто придумать легковесную архитектуру. Но как быть, если сеть уже обучена и она крута, а сжать её всё равно нужно? В таком случае может помочь один (или все) из следующих методов:
А что дальше?
Мы обсудили действительно много полезных и прикладных вещей в DL и CV: классификация, архитектуры сетей, визуализация, эмбеддинги. Однако в современном зрении есть ещё и другие важные задачи: детектирование, сегментация, понимание сцены. Если речь про видео, то хочется объекты трекать во времени, распознавать действия и понимать, что на видео происходит. Именно этим вещам и будет посвящена вторая часть обзора.