Как учатся и работают нейросети: Deep Learning и решение творческих задач

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

Что из себя представляет сегодняшний искусственный интеллект

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

Слишком сложно? Сейчас попробуем проще. Допустим, можно проводить обучение с учителем: показывать образцы каких-то входных данных и правильных ответов к ним и на этих примерах обучать ее (то есть подстраивать модель таким образом, чтобы она выдавала хорошие правильные релевантные ответы). 

К примеру, мы хотим отобразить изображение или видео в какую-то абстрактную информацию – это называется задачей компьютерного зрения. Допустим, есть какая-то картинка, и нам нужно понять, что на ней изображено. Сначала нужно перевести ее в нечто абстрактное. Кстати, когда есть задача распознать текст, то его тоже сначала переводят в абстрактную информацию. То же самое со звуком: когда диктор рассказывает новости, а нужно понять, что именно (то есть требуется перевести звук в текст) – все это решается с помощью технологии Deep Learning (глубинного обучения).

Глубинное обучение – это часть методов МО, которые подбирают представление данных. Так, наблюдение может быть представлено большим числом способов, таких как вектор интенсивности значений на пиксель, или (в более абстрактной форме) как множество примитивов, областей определенной формы. Если применяется ГО, то автоматическим становится процесс выбора и настройки определенных признаков. Deep Learning обучает признаки без участия учителя или привлекает его к какой-то определенной работе, применяя алгоритмы и иерархическое извлечение признаков.

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

Итак, что же собой представляет нейронная сеть? Это ориентированный граф, состоящий из нейронов, в каждом из которых стоят какие-то числа, а у нас есть некоторый входной вектор и некоторый выходной вектор (информация). При этом один нейрон работает так: на каждом срезе между нейроном написан вес, с которым распространяется информация И далее все эти так называемые "входные нейроны", которые входят в наш центральный нейрон с какими-то весами, складываются между собой. При этом учитываются векторы смещения, применяется линейность и выдается на выход. На первый раз это может показаться что-то сложное, но на самом деле это достаточно простая операция, состоящая из линейной и нелинейной части. Собственно, потом из этих нейронов и строится сеть, которая уже способна решать какие-то сложные задачи. При этом сети могут быть многослойными – нейроны группируются в слои и информация распространяется от слоя к слою. В общем, это и есть промежуточное представление, которое еще называется "признаками". 

Как применять нейросети для решения задач 

Здесь за основу следует взять какую-то простую задачу: к примеру, классификацию некоторого объекта. Допусим, вы хотите классифицировать людей по каким-то трем признакам, и вы эти три признака как-то в числах выразили. Получается вектор из трех значений. По этому принципу строится нейронная сеть с тремя входными нейронами. И, например, мы хотим сделать классификацию на два класса. Например, оранжевый и фиолетовый. И мы таким образом строим нейронную сеть с двумя выходными нейронами, которую уже обучили (подробнее о процессе обучения мы расскажем). И на выходе мы трактуем эти нейроны как вероятность принадлежности к тому и другому классу. То есть выход нейронной сети – это и есть определение принадлежности к классу. Допустим, 80 процентов вероятности, что это класс номер 1, и 20 процентов – что это класс номер 2. И таким образом мы решили нашу задачу – это пример прямого распространения информации, то есть вывод нейронной сети. 

Так как же обучать нейронные сети? В самом начале мы рассмотрели пример обучения с "учителем": когда у нас есть обучающая выборка, состоящая из пар объектов и каких-то правильных ответов к нему (то есть то, что мы хотим на выходе получить), то мы эту выборку подаем на процесс обучения. Здесь цель – найти такие параметры системы или модели, чтобы она давала те ответы, которые нам известны. В этом случае мы имеем право надеяться, что на новых примерах, которые она не видела в период обучения, тоже будут результаты в виде хороших, правильных и релевантных ответов. Если все это строго записать, то мы выписываем некоторую ошибку Е, которая представляет собой определенное расстояние от ответов правильных до ответов полученных. И с помощью нашей сети решаем задачу оптимизации, то есть поиск параметров W, которые способны минимизировать ошибку нашего предсказания. 

Фото: AP/ТАСС/Ahn Young-joon

Как минимизировать ошибку предсказания

Еще до изобретения всяких нейронных сетей эту задачу решала просто классическая задача математической оптимизации или минимизации – в данном случае минимизации ошибки. Классические способы: есть какая-то зависимость, ошибка Е от каких-то наших параметров, и мы хотим найти минимум, на каких из них ошибка минимальна. И в случае градиентного спуска, мы, например, если находимся в какой-то точке и движемся в сторону антиградиентов , то вектор показывает, куда у нас функция убывает. И мы движемся в этом направлении. И если там все хорошо, то дальше мы "сваливаемся" в минимум. В случае нейронных сетей все немного сложнее, но некоторые модификации градиентного способа там тоже работают. Например, мы показываем системе образцы один за другим. У нас есть Z – наш объект, и D – правильный ответ к нему. Пропускаем все это через нашу нейронную сеть под параметрами WD и получаем какое-то предсказание в заданных весах. Потом смотрим, насколько мы ошиблись: предсказание минус правильный ответ. Затем используем полученную ошибку для вычисления того самого градиента, которые скажет, как нам поправить наши веса, чтобы в следующий раз получить более точное предсказание. Вот так операционно и происходит обучение для простых задач. 

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

Компьютерное зрение – это отображение картинок в какое-то тематическое описание, то есть распознавание смысла, семантики, что именно изображено. Например, та же самая классификация – по картинке дать метку – предполагает вопрос: "что это?" и ответ: "кот". Более сложная задача – это фиксирование объекта, когда нужно сказать не только, что изображено, но и где на картинке это изображено, то есть сделать так называемую фотолизацию. Еще более сложная задача – семантическая сегментация: это когда вам дана картинка, и вы хотите буквально каждый пиксель проклассифицировать, что есть что (к примеру: где небо, трава и т.д), то есть провести сегментацию – понять к какому классу принадлежит каждый сегмент.

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

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

Но с приходом машинного обучения в компьютерное зрение все изменилось. К примеру, излекать признаки научились с помощью "свертки". Поясняем, для тех, кто не в курсе: допустим, есть картинка, и есть так называемое ядро свертки – и нам нужно понять, где на картинке оно находится (где-то она в большей степени находится, где-то в меньшей). Для этого мы можем "пробежаться" по картинке и там, где это ядро находится, записать выходной массив – высокое какое-то значение. Если массива нет, то значение темное. На выходе у нас получается некоторая карта признаков, то есть каждая точка в выходном массиве говорит, есть ли определенный объект, который мы ищем, здесь, у нас на картинке. Это и есть операция "свертывание", и оно тоже вычисляется как некоторое линейное преобразование очень похожее на то, какое у нас было в нейронных сетях. Поэтому-то и идея была в том, чтобы снять свертывание и поставить этот процесс как специальный слой нейронной сети. Благодаря таких нехитрым (но сложным) вещам мы смогли получить сверточную нейронную сеть.

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

Но радоваться рано: такой архитектуры все еще недостаточно, потому что здесь только выделены какие-то границы на изображении, однако все равно до сих пор непонятно, какая это структура, как ее дальше подать на простой нейронной сети и что-то получить. Вот тут приходит время Deep Learning – то самое количество слоев и число уровней и признаков. Выделяются уже не просто признаки, а их иерархия. То есть сначала были пиксели, и с их с помощью них выделялись какие-то границы. Теперь уже требуется брать комбинации этих границ и смотреть фрагменты объектов. И чем дальше в этом направлении продвигаться, тем более абстрактные вещи попадают под анализ. 

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

Сверточные, полносвязные слои и готовая нейронная сеть

Если про сверточные слои было не совсем понятно, то поясним подробнее: ведь именно они повсеместно используются в компьютерном зрении. Допустим, есть у нас входная картинка – один канал, и мы ее сворачиваем с помощью свертков, ядер, фильтров и получаем в виде набора признаков. Причем выстраивать композицию нужно нелинейно, так как если использовать линейный способ, то по итогам сеть ничего не будет делать. Если имеется уже какой-то второй или третий слой, то на входе должна быть карта признаков, а для каждой пары входной и выходной карты есть свое ядро. При этом следует помнить про еще один немаловажный слой – понижение размерности. Смысл его в том, что информацию каким-то образом нужно сжать, подведя к "сырой" картинке и метке "кот" – так как коты бывают разные, еще они изображены в разных позах – и вся информация нам не нужна, по дороге к результату все время требуется ее отфильтровывать. А вот фильтрация происходит за счет понижения размерности. Система во время "учебы" сформирует все свои обучаемые параметры, чтобы к моменту понижения размерности она оставила работу в требуемом количестве пикселей. Если она этого не сделает, то на выходе мы получим плохое качество распознавания, то есть "высокую ошибку", а как раз ее стараются исключить с помощью метода минимизации.

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

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

Где применяют подобное 

 

Фото: ТАСС/DPA

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

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

И третий пример – это автопилот. Сейчас ими кто только не занимается: это делают и крупные компании-производители автомобилей, и какие-то IT-компании проводят исследования и создают софт для всего этого. 

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

Где это применяется? Ну, опять же отображение текста в слово в случае "умной" клавиатуры, которая подсказывает вам верное слово, которое вы хотите напечатать. Или отзывы к фильму – классификация на положительные и отрицательные – на входе текст, а на выходе абстрактная информация. Машинный перевод – это отображение текста в текст – последовательность. Где еще есть последовательность, так это в звуке, в нашей речи. Здесь даже можно применить  некоторую композицию реккурентных нейронных сетей, которые обрабатывают последовательность, и эту информацию распространяют во времени и пространстве и сверточных нейронных сетей, которые хороши для улавливания маленьких паттернов сигнала как в картинках, так и в звуке – все месте это дает нам распознавание речи. Если пойти еще дальше и вспомнить, что у нас было компьютерное зрение, и мы делали классификацию изображений, то есть по картинке мы давали одно какое-то абстрактное понятие, что это кот, а на выходе мы такможем получить целое текстовое описание на русском языке – сочетание сверточной и реккурентной сети. 

От распознавания к синтезу

Все, о чем речь шла до этого – это было распознавание, то есть отображение какого-то высокоуровневого сигнала, либо картины, либо звуков, то есть извлечение семантики. А теперь поговорим о синтезе. Ну вот хотя бы на примере человека. Чем отличается творчество от восприятия? Восприятие – здесь есть какой-то сигнал из внешнего мира (визуальный, звуковой и т.д.), и человек его с помощью собственных каких-то интерфейсов воспринимает, анализирует и уже в мозге интерпретирует. В обратную сторону это работает, когда мы хотим что-то синтезировать или создать что-то, и у нас есть некоторый концепт или идея. Ну и опять же надо все это разворачивать, с помощью собственных интерфейсов синтезировать, и так человек может картину нарисовать или музыкальное произведение сочинить – то есть это проход в обратную сторону. Если теперь рассмотреть все это с с точки зрения искусственного интеллекта, то у нас есть то же самое на входе и на выходе. Теперь синтезом и распознаванием занимается ИИ.

Первый такой пример – это когда есть картинка, из нее извлекаются признаки, как и с помощью нашей замечательной нейронной сети, которая делает это лучше всего на сегодняшний день. А сейчас есть другая картинка, и из нее тоже извлекаются признаки. Если  некоторым образом еще немного "подшаманить" на выходе, то получатся текстурные признаки. Если все это дело объединить, и из полученных признаков попробовать нарисовать другую картину, то в конечном итоге происходит перенос стиля. Все приложения, которые делают стилизацию изображения – с одной картинки крадут стиль, с другой – контент, и на выходе получают стилизованное изображение. Почему это работает? Дело в том, что с помощью сверточной нейронной сети получается особым способом извлекать те самые признаки, которые хранят вот эту высокоуровневую, семантическую, компонентную информацию, используя которую все можно развернуть назад, например, с помощью оптимизационного подхода - когда выбранная картинка варьируется таким образом, чтобы ее признаки соответствовали желаемым, которые и стояла задача получить. 

Состязательные сети 

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

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

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

И не стоит забывать про такую вещь, как обучение с подкреплением, которая тоже очень часто "всплывает" в различного рода заголовках, когда "Искусственный интеллект обыграл чемпиона мира в боулинг". Это практически то же самое, что мы рассматривали до этого – обучение с учителем, когда у нас есть входная информация и правильный ответ к ней. Только здесь все чуть-чуть по-другому, в том смысле, что на выходе – наши очки, наша награда, но которую мы получим только в конце. Здесь выбирается оптимальный алгоритм, стратегия, и то, как мы должны действовать в нашей реальности. Но если в шахматы компьютер уже давно обыграл человека, то в боулинг совсем недавно. 

Фото: ТАСС/YAY

Вывод. Почему это все работает

Кроме алгоритма, есть еще две немаловажные составляющие – это доступные объемы данных для обучения и ускорение за счет какого-то синтезированного железа. Основная проблема со всеми этими нейронными сетями и алгоритмами состоит в том, что их все же нужно загрузить данными, то есть нужно очень много раз показать схему: "вот такой вход – вот такой выход, правильный ответ". Пока что это далеко до возможностей человека. Человеку нужно лишь один раз показать какой-то объект, чтобы он понял, что это такое. А нейронной сети объект нужно показать несколько раз со всех сторон, чтобы она все-таки научилась обобщать базы данных, где миллион классов, картинок, среди которых и коты, и собаки и еще неизвестно что.

На большом объеме данных сеть хорошо работает, но будущем приходится упрощать задачу. Сначала мы показали сети всю базу данных, а потом обучаем на более конкретных файлах, например, на "котах сибирской породы". Здесь нужно всю большую сеть с нуля обучать, и это будет сложно. Первые сверточные слои, из которых извлекаются какие-то признаки – их можно взять уже при обученной сети. Несмотря на то, что в какой-то конкретной задаче может быть мало данных, используется большой потенциал  фотосета, на котором сеть предобучается. А затем для ускорения появляется специализированное "железо" под эти конкретные задачи. Нейронные сети внутри себя содержат очень много хорошо параллелизуемых операций, например, матричное умножение или свертка – это вещи, которые можно быстро считать в параллель. Если раньше нейронные сети обучались неделями, то сейчас на этот тратятся часы.

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

Текст подготовила Наталья Чунина по материалам лекции Дмитрия Коробченко на мероприятии Geek Picnic.

Актуально по теме