Мы в Яндексе уже много лет занимаемся анализом изображений. Модерируем изображения, которые загружают пользователи или рекламодатели, в Яндекс.Переводчике распознаем текст, в Яндекс.Такси делаем биометрическое распознавание лиц водителей и т.д.
Особый случай — Яндекс Картинки. Возможность поиска по изображению в Яндексе появилась лет 6 назад и с тех пор прогрессирует. Когда-то можно было найти картинку только похожую по цвету, и я, наверное, мог тогда убедительно рассказывать, почему поиск семантически близких изображений невозможен. Но прошли годы, развились нейронные сети, появился поиск по семантике. Поисковый запрос далеко не всегда можно выразить текстом — например, когда мы не знаем, что за объект перед нами, или когда хотим найти одежду или мебель «в таком же духе».
Ускорить мыслительный процесс
Как это работает? Изображение передается на сервер, наша большая нейронная сеть его обрабатывает — распознает какие-то семантические признаки, подписывает их короткими фразами, находит копии похожих изображений, классифицирует и т.д. В результате формируется ответ.
Самые медленные процессы — отправка изображения на сервер и обработка его нейронной сетью. В первом случае все зависит не от нас, а от связи. А над вторым мы активно работаем — используем процессоры FPGA в сотрудничестве с Intel вместо классических ЦПУ. FPGA — программируемые процессоры, на которых очень хорошо работают нейронные сети. Мы примерно в 10 раз ускорили основную тяжелую нейронную сеть и сократили время ответа почти на секунду, что очень много.
Дискриминатор против генератора
За всю историю кино и телевидения накопилось множество памятных видео, но они не соответствуют стандартам качества современных съемок. Для улучшения качества видео (и изображений) мы обучаем нейронную сеть, которая называется DeepHD. Обучение ведется, как и в случае с другими нейронками, на примерах: мы берем большую картинку, делаем ее уменьшенную копию, а DeepHD должна восстановить оригинал.
Арбитром выступает еще одна нейронная сеть, дискриминатор, которая получает большую картинку и пытается угадать, была ли она перед этим сжата, а потом восстановлена. Если дискриминатор ошибается, ему эта картинка подаётся как пример: «Тебя обманули, это не настоящая большая картинка». А если дискриминатор угадывает, поступает сигнал нейросети-генератору: «Тебя раскусили, старайся лучше».
Так две сети соревнуются друг с другом. Эта схема под названием «состязающиеся созидательные сети» — одно из самых ярких научных открытий в машинном обучении за последние несколько лет.
Подавить шум и запретить «творчество»
При обучении на изображениях мы столкнулись с проблемой: генерирующая сеть начинает додумывать что-то свое. Картинки меняются до неузнаваемости, и дискриминатор не может понять, это оригинальное изображение или восстановленное. Чтобы сдержать творческие порывы генератора, мы добавляем второго арбитра — классифицирующую нейронную сеть, задача которой — определить, поменялось ли содержание изображения. Она уже предобучена и умеет распознавать изображения 10 тыс. классов. Теперь у генератора две задачи — обмануть дискриминатор и сделать так, чтобы классификатор считал, что большая картинка семантически соответствует маленькой.
В стерильных условиях все работает отлично, но картинки, с которыми мы имеем дело в интернете, сильно зашумлены, и нейронная сеть, увеличивая четкость изображения, увеличивает и шумы тоже. Эту проблему решает еще одна нейросеть, ее задача — подавить шумы. Она работает сама по себе, без арбитра, просто сравнивая картинки пиксель за пикселем: разница должна быть минимальной, а изображения — чистыми.
От картинок к видео
Применяя этот подход к обработке видео, мы столкнулись с новыми вызовами. Человеческое зрение устроено так, что, когда мы видим последовательность нечетких кадров, мозг как бы автоматически ее улучшает — общая картинка кажется чёткой. Теперь мы соревнуемся не только с некачественным исходником, но и с человеческим мозгом. Кроме того, нам нужно улучшать не только уже записанное видео, но и то, что идет в реальном времени, например телепередачи.
Для этого мы ускорили нашу основную тяжелую нейронную сеть и на созданных ею примерах обучили вторую, облегченную (ей ставили задачу максимально быстро воспроизвести всю цепочку, которую делает тяжелая нейронка, постаравшись максимально сохранить качество). В итоге наша легкая сеть немного проигрывает тяжёлой по качеству получаемого изображения, но раз в десять выигрывает по производительности. Используя видеокарту Nvidia Tesla N100, мы можем в режиме реального времени делать картинку HD-качества.