Как мы получили реалистичные лица с новых ракурсов с помощью нейросетей

What’s in the Box?

Начнем с того, что сфокусируемся на том, что же на самом деле из себя представляет CLIP. Если говорить прямо, то CLIP не является одной нейронной сетью. Можно сказать, что CLIP является фреймворком тренировки двух нейронных сетей.

Фреймворком не в том смысле, в котором PyTrorch и TensorFlow, а в том, в котором говорят, например, про GANы. Как многие из нас знают, GAN представляет из себя, по крайней мере, две нейронных сети (генератор и дискриминатор), которые тренируются в определенном режиме. Затем чаще всего используется именно одна сеть — генератор. А вторая играла важную, но все же вспомогательную роль (относительно самой задачи) на этапе тренировки. Для генератора и дискриминатора могут использоваться разные архитектуры. Именно режим обучения этих двух нейронных сетей мы и называем фреймворком GAN, а не сами нейронные сети, выбранные для решения генеративной или дискриминативной задачи. Подобная аналогия уместна и в нашем случае. CLIP — это не столько нейросеть, сколько режим тренировки и требования к выбору нейросетей для совместного обучения.

CLIP — есть поэлементное cosine similarity текстовых и визуальных репрезентаций

Для начала нам нужно выбрать две архитектуры нейронных сетей для того, чтобы объединить их в гибрид или нейрохимеру под названием CLIP. Одна сеть должна принимать изображение, и готовить на основе него некую векторную репрезентацию, вторая — должна съедать текст, и готовить уже на основании него некую векторную репрезентацию той же размерности, что и правая сеть. Так как подобрать две нейронные сети из разных областей (CV и NLP), обладающих одной и той же размерностью выходных фич, будет нереально, то стоит добавить еще слой к каждой из архитектур, который подготовит репрезентацию одинаковой размерности. Будем называть эти слои линейными преобразованиями для согласования размерностей.

Популярным выбором фича-экстрактора для изображений, пока еще2 являются сверточные сети. Авторы берут различные архитектуры ResNet не из-за их точности (она по сегодняшним меркам не самая лучшая), а из-за популярности и распространенности ResNet’ов, их количества benchmark этой архитектуры на разных датасетах. Но опять же, в качестве фича-экстрактора изображений, может выступать и другая архитектура. Авторы советуют для этой цели использовать ResNet или Vision Transformer2.

С выбором фича-экстрактора для текста тоже все понятно. Это же OpenAI. Тут к гадалке не ходи, точно будет GPT. Как и изображения, проходящие через сверточную нейронную сеть предстают перед последним решающим линейным слоем в виде вектора фич (или векторной репрезентации), так и текст, пройдя через внутренности трансформера или безвременно ушедших рекуррентных сетей, тоже будет представлен в виде некой векторной репрезентации. Авторы советуют для этой цели использовать CBOW или Text Transformer.

Картина. Дарт Вейдер убивает своего сына

Основная идея CLIP — создание единого векторного пространства для текстовых и визуальных репрезентаций!Ведь нам совершенно не важно, показали ли нам эту картинку, прочитали ли мы текст «Картина. Дарт Вейдер убивает своего сына», или мы услышали это предложение от кого-то

Скорее всего, мы все представим нечто похожее.Именно в этом и есть идея CLIP — построить мост между изображением и текстом!

Требования к тем, кто решил пройти курсы data science онлайн

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

  • Настойчивость, усидчивость, трудолюбие;
  • Внимательность, скрупулезность и точность;
  • Способность доводить начатые дела до конца невзирая на негативные промежуточные результаты;
  • Аналитический склад ума;
  • Наличие бизнес-интуиции.

Что касается профессиональных навыков и знаний, то нужно сделать акцент на таких моментах:

  • Знание математики (в идеале, математический анализ, теория вероятности, статистика);
  • Знание английского языка;
  • Минимальные знания азов программирования;
  • Владение определенными инструментами статистического типа;
  • Основное знание отрасли, экономики, знание законов активного развития бизнеса;
  • Основным и базовым навыком специалиста можно назвать организацию систем хранения массивов данных и администрирование, организация их дальнейшего использования.

Что еще умеет DALL-E?

Конечно, пока DALL-E кажется просто игрушкой, пусть и с серьезным научным значением. Но у нее большое будущее. Пожалуй, впервые появилась технология, где результаты ограничены не алгоритмом, а лишь нашим воображением.

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

Например, DALL-E может создавать художественные иллюстрации с очень тонким контролем над их содержимым. Нарисовать можно практически все, смотрите:

Текстовый запрос: капибара на закате.

Текстовый запрос: капибара ночью

Текстовый запрос: капибара в кожаной куртке играет на гитаре

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

Как уже упоминалось, вы можете попробовать все это сами – примеры опубликованы в блоге OpenAI. К сожалению, пока в свободном доступе можно лишь выбирать из фиксированных наборов вариантов заданий, а не вводить произвольный текст, да и результаты не всегда идеальны.

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

Уже сейчас DALL-E может фактически изобретать новые вещи. Например, в видео выше есть пример с зелеными треугольными часами.

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

Гостиная с картиной, на которой изображен Сиднейский оперный театр

Текстовый запрос: кожаное кресло в виде пончика

Текстовый запрос: манекен в джинсах и красном поло

Сложно даже представить себе все, что позволит сделать эта нейросеть в недалеком будущем, когда мы сможем получить обученные модели. Пока в тестовом режиме DALL-E пробовали применять для дизайна одежды и интерьеров.

Когда заработки на Форекс были большими

Многие трейдеры, охватывающие прогонами тестов всю историю валютных торгов, с начала 90-х до настоящего момента, часто замечают падение производительности стратегий на отрезках 2001-2008 и 2013 годов. Они связывают выход из строя торговых систем с экономическими кризисами, но это лишь одна из причин, причем далеко не самая важная.

Рынок Форекс девяностых годов буквально «раздавал» деньги первым участникам торгов, установившим торговые терминалы, подключившись к сети Интернет, и использующим достаточно простые тактики, описанные в книгах трейдеров восьмидесятых. Заработку не мешали даже временные лаги, баги платформ, большие спреды, низкая скорость подключения ко Всемирной Паутине.

Борьба за пинг и низкие комиссии брокеров началась в 2001 году, когда на рынке стали массово появляться роботы и скальперские стратегии, изменившие форму трендов. Развитие робототехники заставило маркет мейкеров больше полагаться на анализ потока ордеров клиентов, «охотиться за стопами», применять различные уловки, управляя толпой с помощью автоматизированных стратегий.

Трейдеры ответили тем же: торговые платформы XXI века стали анализировать потоки ордеров фьючерсов и Открытый Интерес опционов, объемы торгов сопоставлялись со свечным анализом (VSA), на рынке «прописались» программисты и математики, создавшие множество разнообразных советников.

В 2008 году стратегии вышли за пределы булевой математики: рынок стал осваивать нелинейные индикаторы и эконометрику, которые уже было невозможно «повторить» в стандартных торговых терминалах. Негласные рейтинги брокеров Форекс зафиксировали в этот момент падение результативности у клиентов.

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

Где и как применяют системы распознавания лиц

Для идентификации человека используют нейросети, умеющие считывать и анализировать черты лица, а затем сверять их с базой. Самая известная технология распознавания лиц — Face ID на iPhone.

Подобные системы используют:

Производители смартфонов — для защиты персональных данных и их недоступности в случае кражи.

Полиция и спецслужбы — для поиска преступников, доказывания преступлений и их предотвращения.

Аэропорты и погранслужбы — для автоматизированного контроля электронных паспортов.

Больницы и дома престарелых — для отслеживания и оценки состояния пациентов.

Общепиты, банки и ретейл — для идентификации, предотвращения мошенничества, анализа поведения покупателей; для открытия счёта и получения кредита.

Школы и университеты — для контроля за учениками и студентами во время экзаменов.

Маркетинговые и рекламные компании — для повышения качества обслуживания клиентов и запуска персонализированной рекламы.

Автомобильные компании — для замены ключей от машины.

Фото: rfranca / Shutterstock

В 2020 году объём мирового рынка распознавания лиц оценивался в 3,86 млрд долларов и, как ожидает исследовательская компания Grand View Research, будет увеличиваться со среднегодовым темпом роста 15,4% с 2021 по 2028 год. Согласно отчёту Global Market Insights, к 2026 году объём рынка должен превысить 12 млрд долларов.

Самые масштабные разработки в области распознавания лиц принадлежат Google, Apple, Facebook, Amazon и Microsoft. Например, Facebook с 2010 года начал автоматически отмечать людей на фотографиях с помощью встроенного инструмента, а Apple внедрила распознавание лиц в iPhone.

Технология активно используется и за пределами IT-сектора. Так, авиакомпания British Airways с 2017 года применяет систему распознавания лиц, чтобы ускорить процедуру посадки на рейс, идентифицировать пассажиров, вылетающих рейсами из США.

В России есть четыре крупных игрока в этой сфере: NtechLab, VisionLabs, Sensemaking Lab и Группа ЦРТ. NtechLab известна как разработчик приложения FindFace, которое использовали для поиска людей во «ВКонтакте» по фото. Позже компания выступила подрядчиком для внедрения камер с распознаванием лиц в Москве и других регионах России.

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

LET’S ENHANCE

Нейросеть, которая поможет улучшить качество изображений.

Бывало ли у вас такое, что понравилась картинка и очень хочется залить её в свой профиль или на сайт, а она ужасно плохого качества? Эту проблему решили опытные разработчики из Украины! Теперь больше не нужно мучиться из-за ужасных фотографий и картинок низкого разрешения, только шикарные сгенерированные с нуля High Resolution изображения! Генеративная нейросеть способна увеличивать до 512 мегапикселей, улучшая разрешение и чёткость изображений.

Сервис платный, но при регистрации у вас будет возможность протестировать его до 5 раз!

Лайфхак! Привязки к ip у сервиса нет, следовательно, вы можете постоянно регистрироваться на нём для получения дополнительных 5 бесплатных увеличений изображения.

Шикарный инструмент, в котором нейросеть сама определяет и вырезает необходимые объекты всего за 5 секунд. Если нужно что-то вырезать, а времени мало — REMOVE.BG в помощь!

Программа работает как в онлайн режиме, так и имеет программное обеспечение. Работает на Windows / Mac / Linux.

Также команда, разработавшая данный инструмент, предусмотрела плагин для самого популярного редактора фотографий Adobe Photoshop.

Сервис условно бесплатный. В бесплатной версии имеется возможность вырезать объекты, сохраняя один раз изображение с оригинальным разрешением, а далее png с разрешением не более 500×500 пикселей.

Лайфхак! Привязки к ip у сервиса нет, следовательно, вы можете постоянно регистрироваться на нём для получения 1 бесплатного сохранения полноформатного, вырезанного объекта.

Ну как же без мемов

FACE APP, REFLECT, DOUBLICAT

Самые популярные сервисы для изменения внешности и возраста. Хотите повеселить коллег или родственников? Велком!

Style Loss

И вот мы добрались до самого интересного: а как же нам передать стиль? Что такое стиль? Очевидно, что стиль — это не то что мы оптимизировали в Content Loss’е, ведь там содержится много информации о пространственных положениях фичей. Так что первое, что нужно сделать, — это каким-либо способом убрать эту информацию из представлений, полученных на каждом слое.

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

Тогда Style Loss вводится следующим образом, где s — это некоторое изображение со стилем:

Попробуем для Винсента? Получим в принципе что-то ожидаемое — шум в стиле Ван Гога, информация о пространственном расположении фичей полностью потеряна.

А что если вместо стилевого изображения поставить фотографию? Получится уже знакомые фичи, знакомые цвета, но пространственное положение полностью потеряно.

Наверняка вы задались вопросом о том, а почему мы вычисляем именно матрицу ковариации, а не что то другое? Ведь существует много способов того, как агрегировать признаки так, чтобы потерялись пространственные координаты. Это действительно вопрос открытый, и если взять что-то очень простое, то результат изменится не драматически. Давайте проверим это, будем вычислять не матрицу ковариации, а просто среднее значение каждой плашки.

Добавим немного математики.

В качестве активационной функции нейрона может выступать любая функция, существующая на всем отрезке значений, получающихся на выходе нейрона и входных данных. Для нашего примера мы возьмем сигмоиду. Она существует на отрезке от минус бесконечности до бесконечности, плавно меняется от 0 до 1 и имеет значение 0,5 в точке 0. Идеальный кандидат. Выглядит она следующим образом:

Таким образом наш нейрон сможет принимать любую сумму значений всех входящих сигналов и на выходе будет выдавать значение от 0 до 1. Это хорошо подходит для принятия бинарных решений, и мы условимся, что если число на выходе нейросети > 0.5, мы будем расценивать его как истину, иначе — как ложь.

Итак, давайте рассмотрим пример с топологией сети рассмотренной выше. У нас есть три входных нейрона со значениями ИСТИНА, ЛОЖЬ и ИСТИНА соответственно, два нейрона в среднем слое нейросети (эти слои также называют скрытыми), и один выходной нейрон, который сообщит нам о решении, принятом нейросетью. Так как наша сеть еще не обучена, поэтому значения весов на входах нейронов мы возьмем случайными в диапазоне от -0,5 до 0,5. 

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

1 * 0,43 + 0 * 0,18 + 1 * -0,21 = 0,22

Передав это значение в активационную функцию, мы получим значение, которое наш нейрон передаст далее по сети в следующий слой.

sigmoid(0,22) = 1 / (1 + e^-0,22) = 0,55

Аналогичные операции произведём для второго нейрона скрытого слоя и получим значение 0,60.

И, наконец, повторим эти операции для единственного нейрона в выходном слое нашей нейросети и получим значение 0,60, что мы условились считать как истину.

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

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

error = 0.60 — 0 = 0.60

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

Таким образом наша дельта весов будет равна

delta = 0.60 * (1 — 0.60) = 0.24

Новый вес для входа нейрона рассчитывается по формуле

weight = weight — output * delta * learning rate

Где weight — текущий вес, output — значение на выходе предыдущего нейрона, delta — дельта весов, которую мы рассчитали ранее и learning rate — значение, подбираемое экспериментально, от которого зависит скорость обучения нейросети. Если оно будет слишком маленьким — нейросеть будет более чувствительна к деталям, но будет обучаться слишком медленно и наоборот. Для примера возьмем learning rate равным 0,3. Итак новый вес для первого входа выходного нейрона будет равен:

w = 0,22 — 0,55 * 0,24 * 0,3 = 0,18

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

w = 0.47 — 0.60 * 0.24 * 0.3 = 0.43

Итак, мы скорректировали веса для входов выходного нейрона, но чтобы рассчитать остальные, нам нужно знать ошибку для каждого из нейронов нашей нейросети. Это делается не так очевидно как для выходного нейрона, но тоже довольно просто. Чтобы получить ошибку каждого нейрона нам нужно новый вес нейронной связи умножить на дельту. Таким образом ошибка первого нейрона скрытого слоя равна:

error = 0.18 * 0.24 = 0.04

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

AutoDraw

Графический редактор от Google помогает создавать хорошие иллюстрации тем, кто не умеет рисовать. Сервис был представлен в рамках проекта AI Experiments, открытого осенью 2016 года.

Внешне нейросеть похожа на простой графический редактор. В сервисе можно:

  • выбрать три формата изображения – одно горизонтальное и два вертикальных;
  • просто рисовать, как карандашом в Paint;
  • создавать фигуры – круги, треугольники и четырехугольники;
  • писать текст любым из 14 шрифтов, выбирать размер букв от 8 до 96;
  • заливать цветом фигуры, изображения, фон, менять цвета любых элементов;
  • перемещать и масштабировать объекты на рисунке.

Самая главная функция сервиса – создание опрятных и красивых рисунков на основе каракулей. Достаточно приблизительно нарисовать объект, и сеть покажет сверху небольшие иконки изображений. Кликните на любую, чтобы каракули превратились в осмысленный рисунок.

Панель управления элементами рисунка расположена слева сбоку, предложенные иллюстрации – сверху

С помощью нейросети легко создавать простейшие рисунки. Идеально для тех, кто выбрал минимализм в оформлении, например, социальных сетей – за 1-2 секунды можно создать уникальную простую иллюстрацию к посту.

Как-то так, например, можно проиллюстрировать публикацию о космосе. Или доработать набросок с помощью других нейросетей

Если будете работать с AutoDraw, учтите, что у нейросети своеобразное восприятие каракулей. Иногда она не может определить, что изображено, и предлагает неподходящие иллюстрации.

Оценят, «зайдёт» ли картинка

Раньше
З: А давайте поменяем это изображение на портрет нашего директора?
Д: Знаете, портрет — это скучно… Так уже никто не делает.
З: Ну, а мы сделаем. Тем более, директор хочет.
Д: Я-то сделаю, но подписываться под этим не буду.

Сейчас
З: А давайте поменяем картинку на портрет нашего директора?
Д: Смотрите, я меняю картинку, а программа говорит, что привлекательность фото близка к нулю. А наша картинка будет оставлять хорошее впечатление и запомнится надолго.
З: Хорошо, я передам директору. Думаю, он согласится.

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

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

Система Everypixel работает как поисковик по изображениям на основе имеющейся картинки. Вы скажете: «Это давно умеет Google». Однако программа имеет возможность определять степень привлекательности изображения. А если вы ещё и немного SEO-шник, система автоматически проставит ключевые слова к картинке.

LaMem

В свою очередь, алгоритм LaMem (ex-MemNet) от MIT определяет, какие изображения, постеры и рекламные буклеты запомнят надолго, а какие — забудут почти сразу же.

FaceHero

Это приложение доступно только для устройств Apple. С его помощью можно создавать реалистичные 3D-бюсты, основываясь лишь на одной фотографии. Разработкой приложения занимается компания itSeez3D. 

Сейчас программа может выполнять следующие функции:

  • создавать и анимировать 3D-аватары с простыми действиями
  • ставить готовый бюст на поверхность предметов с помощью AR-технологий
  • создавать стикеры для мессенджеров

Вы можете создать 3D-модель на основе простой фотографии или снимка камеры. Однако рекомендуется брать фото с хорошим освещением для повышения качества результата. 

Так выглядит аватар для Киану Ривза, полученный с одной фотографии из Google

Демонстрационные программы

В качестве демонстрационных примеров приведены три программы, показывающие возможности предложенных компонентов.

Программа Recognition используя компонент TNeuralNetHopf , реализует нейронную сеть Хопфилда. Программа решает задачу распознавания образов. На вход сети подается некий образ, возможно искаженный или неполный и нейронная сеть восстанавливает образ, т.е. относит предъявляемый образ к одному из хранимых сетью образов, либо в случае неудачи, выдает новый образ, иногда называемый «химерой».

Программа XOR_Problem, реализует функцию «исключающее или», которая является стандартным тестом, после знаменитой работы Минского и Пейперта «Перцептроны». В основе программы лежит компонент TNeuralNetBP.

Как готовили материалы для создания AR

Наша идея заключалась в том, чтобы картина Карлы Босх “Франшхук, Южная Африка” — перевоплощалась в фотореалистичный пейзаж.

”Франшхук, Южная Африка” — Карла Босх

Сначала определили все элементы, присутствующие на оригинальной картине, затем отобрали палитру по этим элементам.

Поверх оригинала прорисовали все участки. Для удобства делали это в Figma, а затем экспортировали в векторе (.svg), чтоб однозначно точно не было никаких других промежуточных цветов из-за, которые могут образоваться при сглаживание на границах участков (Aliasing)

Это, кстати, крайне важно, чтобы на карте сегментации не присутствовали никакие другие цвета кроме тех, что указаны в палитре у GauGAN

Карта сегментация для картины

На основе карты сегментации, мы сгенерировали 9 разных пейзажей, которые потом через анимации и шейдеры стилизовали в Unity под скан-переход от оригинала к сгенерированным фотореалистичным пейзажам.

Сгенерированные в GauGAN пейзажи на основе подготовленной карты сегментации

Фрагмент скан-перехода, сделанного в Unity

EbSynth

Как и в прошлом году, мы решили полноценно оживить некоторые картины, используя нейронную сеть Ebsynth. Лучше всего для наших задач она подходит для работы с персонажами, их крупными планами.

Картина “В дурном настроении” — Ганк Пасуай — обработанная в Ebsyth

Мы записывали видео, где девушка смотрела в кадр видеокамеры (в той же позе, что и на картине, чтобы облегчить задачу по сведению кадра в будущем). Она моргала, поворачивала голову, в целом жила своей жизнью

Важно, чтобы движения были максимально плавными и мягкими, тогда финальное видео получится действительно живым. Затем, через Photoshop мы накладывали нарисованную девушку на лицо реальной девушки и таким образом готовили референс для алгоритма

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

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

Первая проба обработки видео, наложив картину в качестве референса. Выскочило несколько неприятных искажений лица.

Затем нужно запустить процедуру расчета, она может занять существенную часть времени, в зависимости от того, какая у вас установлена видеокарта на компьютере. В результате мы получим “ожившее” изображение референса и он будет делать все то, что происходило на видео. Лучшее описание для этого: “Как будто картина из Гарри Поттера”.

Видео туториал от разработчика EbSynth

EbSynth это очень удобный инструмент. Он показывает, как нейронные сети помогают художникам достигать небывалого результата за короткое время. Это решение активно развивается. По сравнению с прошлогодней версией, в новой EbSynth представили удобный и понятный GUI интерфейс. На официальном сайте можно найти видео, где просто и быстро расскажут как им пользоваться и этого будет достаточно, чтобы создать свою собственную “ожившую” картину.

Обучаем нейронную сеть

Для обратного распространения ошибки нам потребуется знать значения входов, выходов и значения производных функции активации сети на каждом из слоёв, поэтому создадим структуру LayerT, в которой будет 3 вектора: x — вход слоя, z — выход слоя, df — производная функции активации. Также для каждого слоя потребуются векторы дельт, поэтому добавим в наш класс ещё и их. С учётом вышесказанного наш класс станет выглядеть так:

class Network {
    struct LayerT {
        public Vector x; // вход слоя
        public Vector z; // активированный выход слоя
        public Vector df; // производная функции активации слоя
    }

    Matrix[] weights; // матрицы весов слоя
    LayerT[] L; // значения на каждом слое
    Vector[] deltas; // дельты ошибки на каждом слое

    int layersN; // число слоёв

    public Network(int[] sizes) {
        Random random = new Random(DateTime.Now.Millisecond); // создаём генератор случайных чисел

        layersN = sizes.Length - 1; // запоминаем число слоёв

        weights = new Matrix; // создаём массив матриц весовых коэффициентов
        L = new LayerT; // создаём массив значений на каждом слое
        deltas = new Vector; // создаём массив для дельт

        for (int k = 1; k  0 ? y : 0;
                //L.df = y > 0 ? 1 : 0;
            }
        }

        return L.z; // возвращаем результат
    }
}

Обратное распространение ошибки

Перейдём к обратному распространению ошибки. В качестве функции оценки сети E(W) возьмём среднее квадратичное отклонение: . Чтобы найти значение ошибки E, нам нужно найти сумму квадратов разности значений вектора, который выдала сеть в качестве ответа, и вектора, который мы ожидаем увидеть при обучении. Также нам потребуется найти дельту для каждого слоя, причём для последнего слоя она будет равна вектору разности полученного и ожидаемого векторов, умноженному (покомпонентно) на вектор значений производных последнего слоя: , где — выход последнего слоя сети, — ожидаемый вектор сети, — вектор значений производной функции активации последнего слоя.

Теперь, зная дельту последнего слоя, мы можем найти дельты всех предыдущих слоёв. Для этого нужно умножить транспонированную матрицы текущего слоя на дельту текущего слоя и затем умножить полученный вектор на вектор производных функции активации предыдущего слоя: .

Что ж, давайте реализуем это в коде:

Виды ИНС

Мы разобрались со структурой искусственного нейрона. Искусственные нейронные сети состоят из совокупности искусственных нейронов. Возникает логичный вопрос – а как располагать/соединять друг с другом эти самые искусственные нейроны?

Как правило, в большинстве нейронных сетей есть так называемый входной слой, который выполняет только одну задачу – распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений.

На этом схожесть заканчивается и начинаются различия…

Однослойные нейронные сети

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

Выглядит однослойная нейронная сеть следующим образом:

На этой картинке входной слой обозначен кружками (он не считается за слой нейронной сети), а справа расположен слой обычных нейронов.

Нейроны соединены друг с другом стрелками. Над стрелками расположены веса соответствующих связей (весовые коэффициенты).

Многослойные нейронные сети

Такие сети, помимо входного и выходного слоев нейронов, характеризуются еще и скрытым слоем (слоями). Понять их расположение просто – эти слои находятся между входным и выходным слоями.

Такая структура нейронных сетей копирует многослойную структуру определенных отделов мозга.

Название скрытый слой получил неслучайно. Дело в том, что только относительно недавно были разработаны методы обучения нейронов скрытого слоя. До этого обходились только однослойными нейросетями.

Многослойные нейронные сети обладают гораздо большими возможностями, чем однослойные.

Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.

Сети прямого распространения

Можно заметить одну очень интересную деталь на картинках нейросетей в примерах выше.

Во всех примерах стрелки строго идут слева направо, то есть сигнал в таких сетях идет строго от входного слоя к выходному.

Сети прямого распространения (Feedforward neural network) (feedforward сети) — искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.

Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.

Однако никто не запрещает сигналу идти и в обратную сторону.

Сети с обратными связями

В сетях такого типа сигнал может идти и в обратную сторону. В чем преимущество?

Дело в том, что в сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах.

А в сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).

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

Movavi

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

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

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

Очень часто программу используют для публикаций в Instagram и Facebook. 

Скриншот из описания программы: так выглядят восстановленные фотографии

Fontjoy

Тот самый момент, когда нейросети добрались и до типографики. Как всё начиналось? Создатель Джек Киао обучил нейронную сеть классифицировать шрифты. Потом Джек составил карту шрифтов с помощью нейронки. В результате появился Fontjoy, который подбирает сочетания шрифтов при помощи этого обучаемого алгоритма.

Как это работает?

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

Content Loss

Как уже было упомянуто, каждый слой нейронной сети производит трехмерный тензор некоторой размерности.

Обозначим выход i-ого слоя от входной как . Тогда если мы будем минимизировать взвешенную сумму невязок между входным изображением и некоторым изображением, к которому мы стремимся c, то получится ровно то, что нужно. Наверное.

Для экспериментов с этой статьей можно использовать этот волшебный ноутбук, там происходят вычисления (как на ГПУ, так и на ЦПУ). ГПУ используется для вычисления фич нейросети и значения функции стоимости. Theano выдает функцию, которая умеет вычислять градиент целевой функции eval_grad по входному изображению x. Затем это все подается в lbfgs и запускается итеративный процесс.

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

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

  • потерялись цвета — это результат того, что в конкретном примере использовался только слой conv4_2 (или, другими словами, вес w при нем был ненулевой, а для остальных слоев нулевой); как вы помните, именно ранние слои содержат информацию о цветах и градиентных переходах, а поздние содержат информацию о более крупных деталях, что мы и наблюдаем — цвета потеряны, а контент нет;
  • некоторые дома «поехали», т.е. прямые линии слегка искривились — это потому что чем более глубокий слой, тем меньше информации о пространственном положении фичи в нем содержится (результат применения сверток и пулингов).

Добавление ранних слоев сразу исправляет ситуацию с цветами.

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