Специалист по Computer Science Виктор Лемпицкий об обучении нейронных сетей, распознавании образов и принципах работы приложения Prisma
Сверточные нейросети — это определенный тип нейросетей, который произвел революцию в компьютерном зрении и распознавании образов. Также его используют для распознавания речи, обработки аудиосигналов, обработки временных рядов, для анализа смысла текстов и в последнее время даже для игры в Го, для обыгрывания мастеров этой игры. Можно сказать, что на данный момент это самая успешная модель, самая успешная инновация в рамках того, что называют глубоким или глубинным обучением.
Сверточная нейросеть — это такой особый вид нейросетей прямого распространения, и под прямым распространением понимается то, что переменные нейроны в этой сети разбиты на группы, называемые слоями. И когда такая слоистая нейронная сеть применяется к данным, то активация слоев — значение этих переменных — подсчитывается последовательно: сначала значение активации первого слоя, потом значение активации второго слоя, и так до последнего слоя. Активация последнего слоя и служит выходами нейронной сети, и в этой нейросети есть много параметров, в каждом слое есть какие-то свои параметры, которые определяют, как активация следующего слоя зависит от активации предыдущего слоя. И что еще важно, активации внутри одного слоя могут подсчитываться параллельно, одновременно, они друг от друга не зависят, и это приводит к тому, что такие нейросети можно очень удобно и эффективно обсчитывать на современных процессорах, в том числе на графических сопроцессорах.
Обучение нейросети, то есть настройка ее параметров, происходит на большом количестве обучающих данных следующим образом: для каждого обучающего примера мы знаем, что мы хотели бы получить на выходе. Мы берем текущее состояние нейросети, применяем такую нейросеть к конкретному обучающему примеру, смотрим, что получилось на выходе и как отличается от того, что мы хотели бы увидеть. Дальше путем концептуально несложных математических манипуляций, называющихся методом обратного распространения ошибки, мы можем понять, как именно нам нужно модифицировать параметры каждого слоя, чтобы на выходе стало получаться что-то более похожее на то, что мы хотим увидеть. И вот нейросеть поочередно смотрит на отдельные примеры или чаще на наборы примеров одновременно, чтобы увеличить правильность вычислений, и, глядя на эти отдельные примеры или пакеты примеров, она постепенно подстраивает свои параметры и добивается того, что на обучающих примерах она начинает предсказывать то, что нам нужно.
Особенность сверточной нейросети заключается в том, что в ней нейроны первых уровней упорядочены в особую структуру, а именно: на первых слоях нейроны разбиты на изображения определенного размера (их еще иногда называют картами), и разные карты внутри одного слоя соответствуют нейронам разного типа, которые реагируют на разные особенности изображений. И вычисления активации следующего слоя в сверточных нейросетях бывают двух основных типов. В первом типе вычислений активация нейронов следующего уровня вычисляется как линейная комбинация активаций нейронов предыдущего уровня, причем веса этих линейных активаций зависят только от взаимного положений нейронов, типов нейронов, но не зависят от положения данного нейрона внутри карты.
Во втором типе вычислений активация нейронов на следующем уровне просто повторяет активацию нейронов на предыдущем уровне, но изображение становится меньшего размера за счет того, что активация рядом расположенных нейронов заменяется на их максимум или их среднее — так называемая процедура пулинга. Подобная дополнительная структура делает сверточные нейросети очень подходящими для работы с изображениями. Она, например, гарантирует, что если два изображения различаются маленьким сдвигом, то нейросеть на выходе получит очень похожий результат. Для обычных, несверточных нейросетей это, вообще говоря, неверно. Кроме того, в сверточных нейросетях количество параметров невелико относительно количества нейронов. Вообще говоря, в абсолютных числах это может быть очень большое число, миллионы и десятки миллионов в современных сверточных нейросетях. Но обычные нейросети для того же количества нейронов имели бы сотни миллиардов параметров, и набрать обучающих множеств для обучения такого количества параметров мы бы никогда не смогли, а сверточные нейросети с таким количеством нейронов могут обучаться по существующим выборкам, именно это делает их такими успешными.
Сверточные нейросети имеют интересную историю. Они были разработаны в конце 1980-х — начале 1990-х годов франко-американским ученым Яном Лекуном и его коллегами из Bell Labs. И уже тогда их сверточные нейросети работали очень-очень хорошо, лучше, чем все другие методы, но для очень маленьких изображений, скажем 28*28 пикселей. Для таких изображений они, например, могли разобрать, какой рукописный символ такие изображения содержат. Но в компьютерном зрении обычно есть интерес к тому, чтобы понимать и распознавать изображения, которые имеют гораздо больший размер. И следующие 20 лет, до конца 2000-х, сверточные нейросети не могли сравниться с более стандартными ненейросетевыми методами.
Все изменилось в начале 2010-х годов, когда, во-первых, появились очень большие обучающие выборки, а во-вторых, появилось хорошее подходящее вычислительное оборудование, прежде всего графические сопроцессоры, которые фирма Nvidia создавала не для искусственного интеллекта, а чтобы геймеры могли играть в максимально красивые компьютерные игры. И в-третьих, сюда добавился еще инженерный талант группы из Университета Торонто. И когда все это объединилось, исследователи из Торонто смогли натренировать первую большую сверточную нейросеть, которая на порядки превосходила сети Лекуна. И совершенно внезапно для большинства исследователей (я хорошо помню этот день на конференции в 2012 году) выяснилось, что в самой стандартной задаче компьютерного зрения — задаче классификации, когда надо просто взять и по фотографии сказать, к какому классу принадлежит объект на этой фотографии, — такая сверточная нейросеть работает гораздо лучше, чем все другие методы, которые наше сообщество очень упорно разрабатывало в течение нескольких лет.
А дальше произошел взрыв интереса к сверточным нейросетям, и за несколько лет в задачах классификации изображений сверточные нейросети добились точности, сравнимой с точностью, достигаемой человеческим мозгом, и я бы даже сказал, что на данный момент они существенно превосходят человеческий мозг. Когда вам надо распознавать изображение, принадлежащее нескольким тысячам классов, человеческий мозг обычно не может удержать названия этих тысяч классов в памяти, а сверточная нейросеть может помнить все эти классы. Из года в год прогресс достигается во многом за счет того, что нейросеть становится все глубже и глубже, то есть содержит все больше и больше слоев, о которых я говорил. И если первая большая нейросеть из группы Торонто содержала чуть более десятка слоев, то в 2016 году самая глубокая нейросеть, которая выигрывала в нескольких соревнованиях, содержит больше 150 слоев.
По ходу дела выяснилось, что любую задачу, связанную с распознаванием образов в компьютерном зрении, сверточные нейросети могут решать более успешно, чем предшествующие методы. Это касается не только задачи классификации, но и задачи обнаружения небольших объектов на фото или видео, задачи распознавания лиц, задачи определения положения, позы человека на фотографии — во всех таких задачах сверточные нейросети стали добиваться результатов, которые раньше были невозможны. Более того, выяснилось, что сверточные нейросети могут очень успешно применяться в обратной задаче, когда вам нужно не обработать, а синтезировать изображение или обработать его каким-то специальным образом, например стилизовать его, как в нашумевших приложениях вроде Prisma.
Скажем, сейчас в нашей группе мы разрабатываем систему, которая берет произвольное сообщение, произвольный набор бит и кодирует видеоизображение так, что дальше эту информацию, эти биты можно из этого изображения считать, то есть получается такой qr-код, но, в отличие от qr-кода, мы можем сделать его стилизованным и более красивым. Или, скажем, другая разработка нашей группы заключается в том, что сверточная нейросеть берет фотографию или видео человека и изменяет направление взгляда человека на этом фото или видео. Это нужно, например, в системах видеоконференции, чтобы люди во время разговора по Skype могли бы смотреть друг другу в глаза.
Когда исследователи стали изучать свойства сверточных нейросетей, выяснилось много всего интересного. Самое главное, наверное, заключается в том, что самые большие сверточные нейросети, обученные для одних задач распознавания образов, можно модифицировать, приспособить для родственных задач распознавания образов, слегка или совсем слегка их доучив. Причем под «совсем слегка» понимается и то, что такое обучение не требует много времени и что такое дообучение не требует большого количества новых обучающих данных (это, может быть, еще более важно). За счет этого в интернете стали появляться так называемые зоопарки сверточных нейронных сетей, откуда исследователи могут скачать предобученную в течение многих дней или недель и очень хорошо работающую сверточную нейронную сеть определенного типа и доучить такую сеть для частных задач, которые их интересуют.
Еще выяснилось, что большие сверточные нейронные сети могут подсчитывать компактные дескрипторы изображений, то есть векторы не очень большой размерности, которые описывают, что именно изображение содержит. Сравнивая такие векторы, можно находить изображения, которые содержат похожие предметы или один и тот же предмет, и такое свойство очень полезно в системах поиска по очень большим архивам изображений. Еще исследователи стали смотреть, чему соответствуют индивидуальные нейроны сверточной нейросети, от чего они активируются, возбуждаются, и выяснилась очень интересная вещь. Оказалось, что абстрактность, высокоуровневость нейронов нарастает от слоя к слою, то есть, скажем, нейроны второго слоя могут активироваться, например, от темных полос определенной толщины, идущих под определенным углом на светлом фоне. На четвертом слое определенный тип нейронов может активироваться от округлых блестящих предметов, а, скажем, на седьмом слое определенный тип нейронов может активироваться в тех местах, где на изображении есть человеческое лицо или вид автомобиля спереди.
При этом лица и марки автомобиля могут варьироваться, а нейроны все равно будут активироваться, и ничто в процедуре обучения в явном виде не предполагает, что возникнет такая иерархия, возникнет такое постепенное нарастание абстрактности и высокоуровневости нейронов, и до конца не понятно, почему это возникает. То есть такое объяснение, что если такое возникнет, то нейросеть будет работать очень хорошо, и она действительно работает очень хорошо, а математического объяснения этого эффекта у нас нет. И математическое объяснение такого ошеломляющего успеха сверточных нейросетей находится в зачаточном состоянии, и здесь в ближайшие годы намечается большой прогресс.