Как компьютеры научились потрясающе хорошо распознавать изображения |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2019-06-10 10:28 Знаковая научная работа от 2012 года преобразовала область программного распознавания изображений Сегодня я могу, допустим, открыть Google Photos, написать «пляж», и увидеть кучу своих фотографий с различных пляжей, которые я посетил за последнее десятилетие. И я никогда не подписывал свои фотографии – Google распознаёт на них пляжи на основе их содержания. Эта, казалось бы, скучная особенность основывается на технологии под названием «глубокая свёрточная нейросеть», позволяющая программам понимать изображения при помощи сложного способа, недоступного технологиям предыдущих поколений. В последние годы исследователи обнаружили, что точность ПО становится лучше по мере того, как они создают всё более глубокие нейросети (НС) и обучают их на всё более крупных наборах данных. Это создало ненасытную потребность в вычислительных мощностях, и обогатило производителей GPU, таких, как Nvidia и AMD. В Google несколько лет назад разработали собственные специальные чипы для НС, а другие компании пытаются угнаться за ней. В Tesla, к примеру, Андрея Карпати, эксперта по глубокому обучению, назначили главой проекта Autopilot. Теперь автопроизводитель разрабатывает собственный чип для ускорения работы НС в будущих версиях автопилота. Или взять Apple: в чипах A11 и A12, центральных для последних iPhone, есть "нейронный процессор" Neural Engine, ускоряющий работу НС и позволяющий приложениям для распознавания изображений и голоса работать лучше. Эксперты, опрошенные мною для этой статьи, отслеживают начало бума глубинного обучения до определённой работы: AlexNet, названной так в честь главного автора, Алекса Крижевского. «Я считаю, что 2012-й стал знаковым годом, когда вышла работа AlexNet», — сказал Шон Герриш, эксперт по МО и автор книги "Как умные машины думают". До 2012 года глубокие нейросети (ГНС) были чем-то вроде захолустья в мире МО. Но потом Крижевский и его коллеги из университета Торонто подали заявку на престижное соревнование по распознаванию изображений, и она кардинально превосходило по точности всё, что было разработано до неё. Почти мгновенно ГНС стали лидирующей технологией в распознавании изображений. Другие исследователи, использовавшие эту технологию, вскоре продемонстрировали дальнейшие улучшения точности распознавания. В данной статье мы углубимся в глубокое обучение. Я объясню, что такое НС, как их обучают, и почему они требуют таких вычислительных ресурсов. А потом я объясню, почему определённый вид НС – глубокие свёрточные сети – так хорошо понимают изображения. Не беспокойтесь, картинок будет много. Простой пример с одним нейроном Понятие «нейросеть» может казаться вам туманным, поэтому начнём с простого примера. Допустим, вы хотите, чтобы НС решила, надо ли машине ехать, на основе зелёного, жёлтого и красного сигналов светофора. НС может решить эту задачу при помощи одного нейрона. Нейрон получает входные данные (1 – горит, 0 – не горит), умножает на соответствующий вес, и складывает все значения весов. Потом нейрон добавляет смещение, определяющее пороговое значение для «активации» нейрона. В данном случае, если выход положителен, мы считаем, что нейрон активировался – и наоборот. Нейрон эквивалентен неравенству «зелёный – красный – 0,5 > 0». Если оно оказывается истинным – то есть, зелёный горит, а красный не горит – тогда машина должна ехать.В реальных НС искусственные нейроны делают ещё один шаг. Просуммировав взвешенный ввод и добавив смещение, нейрон применяет нелинейную функцию активации. Часто используется сигмоида, S-образная функция, всегда выдающая значение от 0 до 1. Использование функции активации не изменит результат нашей простой модели светофора (просто нам нужно будет использовать пороговое значение 0,5, а не 0). Но нелинейность функций активации необходима для того, чтобы НС могли моделировать более сложные функции. Без функции активации каждая сколь угодно сложная НС сводится к линейной комбинации входных данных. А линейная функция не может моделировать сложные явления реального мира. Нелинейная функция активации позволяет НС аппроксимировать любую математическую функцию. Пример сети Конечно, существует множество способов аппроксимации функции. НС выделяются тем, что мы знаем, как «обучать» их, используя немного алгебры, кучу данных и море вычислительных мощностей. Вместо того, чтобы программисту напрямую разрабатывать НС для определённой задачи, мы можем создать ПО, начинающее с достаточно общей НС, изучающее кучу размеченных примеров, а потом изменяющее НС так, что она выдаст правильную метку для как можно большего количества примеров. Расчёт на то, что итоговая НС обобщит данные и будет выдавать правильные метки для примеров, которых раньше не было в базе. Каждый из 10 нейронов справа должен «срабатывать» на свою цифру: верхний должен включаться, когда на вход подаётся рукописный 0 (и только в этом случае), второй – когда сеть видит рукописную 1 (и только её), и так далее. Каждый нейрон воспринимает входные данные от каждого нейрона предыдущего слоя. Так что каждому из 15 нейронов в середине поступает 784 входных значения. У каждого из этих 15 нейронов есть параметр веса для каждого из 784 входных значений. Это значит, что только у этого слоя есть 15*784=11 760 весовых параметров. Сходным образом выходной слой содержит 10 нейронов, каждый из которых принимает входные данные от всех 15 нейронов среднего слоя, что добавляет ещё 15*10=150 весовых параметров. Кроме этого, у сети есть 25 переменных смещения – по одной у каждого из 25 нейронов. Обучение нейросети Цель тренировки – подстроить эти 11 935 параметров для максимизации вероятности того, что нужный выходной нейрон – и только он – активируется, когда сети дадут изображение рукописной цифры. Мы можем сделать это при помощи известного набора изображений MNIST, где есть 60 000 размеченных изображений разрешения 28х28 пикселей. 160 из 60 000 изображений из набора MNISTНильсен демонстрирует, как обучить сеть, используя 74 строчки обычного кода на python – без всяких библиотек для МО. Обучение начинается с выбора случайных значений для каждого из этих 11 935 параметров, весов и смещений. Затем программа перебирает примеры изображений, проходя два этапа с каждым из них:
Пример. Допустим, сеть получила следующую картинку: Если она хорошо откалибрована, тогда вывод «7» должен стремиться к 1, а другие девять выводов должны стремиться к 0. Но, допустим, что вместо этого сеть на выходе «0» даёт величину 0,8. Это слишком много! Обучающий алгоритм изменяет входные веса нейрона, отвечающего за «0», чтобы он стал ближе к 0 в следующий раз при обработке этого изображения. Для этого алгоритм обратного распространения вычисляет градиент ошибки для каждого входного веса. Это мера того, как изменится выходная ошибка для заданного изменения входного веса. Потом алгоритм использует градиент, чтобы решить, насколько менять каждый входной вес – чем больше градиент, тем сильнее изменение. Иначе говоря, обучающий процесс «обучает» нейроны выходного слоя обращать меньше внимания на те входы (нейроны в среднем слое), которые подталкивают их к неправильному ответу, и больше – на те входы, которые подталкивают в нужном направлении. Алгоритм повторяет этот шаг для всех остальных выходных нейронов. Он уменьшает веса входных данных для нейронов «1», «2», «3», «4», «5», «6», «8» и «9» (но не «7»), чтобы понизить значение этих выходных нейронов. Чем выше выходное значение, тем больше градиент выходной ошибки по отношению к входному весу – и тем сильнее уменьшится его вес. И наоборот, алгоритм увеличивает веса входных данных для выхода «7», что заставить нейрон выдавать более высокое значение в следующий раз, когда ему дадут это изображение. Опять-таки, входы с более крупными значениями сильнее увеличат веса, что заставит выходной нейрон «7» уделять больше внимания этим входам в следующие разы. Затем алгоритм должен выполнить те же расчёты для среднего слоя: изменить каждый входной вес в том направлении, которое уменьшит ошибки сети – опять-таки, приближая выход «7» ближе к 1, а остальные – к 0. Но У каждого среднего нейрона есть связь со всеми 10 выходными, что осложняет дело в двух аспектах. Во-первых, градиент ошибки для каждого среднего нейрона зависит не только от входного значения, но и от градиентов ошибки в следующем слое. Алгоритм называется обратным распространением потому, что градиенты ошибок более поздних слоёв сети распространяются в обратном направлении и используются для расчёта градиентов в более ранних слоях. Также каждый средний нейрон является входом для всех десяти выходных. Поэтому обучающему алгоритму приходится подсчитывать градиент ошибки, отражающий то, как изменение определённого входного веса влияет на среднюю ошибку по всем выходам. Обратное распространение – это алгоритм карабканья на холм: каждый его проход приближает выходные значения к правильным для заданного изображения, но лишь на немного. Чем больше примеров просматривает алгоритм, тем выше на холм взбирается он, по направлению к оптимальному набору параметров, правильно классифицирующих максимальное количество тренировочных примеров. Для достижения высокой точности требуются тысячи примеров, и алгоритму может понадобиться пройти циклом по каждому изображению в этом наборе десятки раз до того, как его эффективность перестанет расти. Нильсен показывает, как реализовать эти 74 строчки на python. Удивительно, что натренированная при помощи такой простой программы сеть способна распознать более 95% рукописных чисел из базы MNIST. С дополнительными улучшениями простая двухслойная сеть способна распознать более 98% цифр. Прорыв AlexNet Вы могли подумать, что развитие темы обратного распространения должно было пройти в 1980-х, и породить быстрый прогресс в МО на основе НС – но этого не произошло. В 1990-х и начале 2000-х кое-кто работал над этой технологией, но интерес к НС не набирал оборотов до начала 2010-х. «Ошибки» AlexNet тоже впечатляют. Она отметила фото с далматинцем, стоящим за кучкой вишен, как «далматинец», хотя официальной меткой была «вишня». AlexNet распознала, что на фото есть какая-то ягода – среди первых пяти вариантов были «виноград» и «бузина» – просто не распознала именно вишню. К фото мадагаскарского лемура, сидящего на дереве, AlexNet привела список небольших млекопитающих, живущих на деревьях. Думаю, что многие люди (включая и меня) поставили бы тут неправильную подпись. Качество работы было впечатляющим, и демонстрировало, что ПО способно распознавать обычные объекты в широком спектре их ориентаций и окружения. ГНС быстро стали самой популярной техникой для распознавания изображений, и с тех пор мир МО не отказывался от неё. «На волне успеха в 2012 году метода, основанного на ГО, большая часть участников соревнования 2013 года перешла на глубокие свёрточные нейросети», — писали спонсоры ImageNet. В следующие годы эта тенденция сохранялась, и впоследствии победители работали на основе базовых технологий, впервые применённых командой AlexNet. К 2017 году соперники, используя более глубокие НС, серьёзно снизили процент ошибок до показателя менее трёх. Учитывая сложность задачи, компьютеры в какой-то мере научились решать её лучше многих людей. Процент ошибок в классификации изображений в разные годы Свёрточные сети: концепция Технически, AlexNet была свёрточной НС. В данном разделе я объясню, что делает свёрточная нейросеть (СНС), и почему эта технология стала критически важной для современных алгоритмов распознавания образов. Как свёрточные сети работали в AlexNet В свёрточных сетях такие «трафареты» известны, как детекторы признаков, а изучаемая ими область – рецептивным полем. Реальные детекторы признаков работают с гораздо меньшими полями, чем квадрат со стороной в 28 пикселей. В AlexNet детекторы признаков в первом свёрточном слое работали с рецептивным полем размером 11х11 пикселей. В последующих слоях рецептивные поля были шириной в 3-5 единиц. Цветное изображение обычно представляется в виде пиксельной карты с тремя числами для каждого пикселя: значение красного, зелёного и синего. Первый слой AlexNet берёт это представление и превращает его в представление, использующее 96 чисел. Каждый «пиксель» в этом изображении имеет 96 значений, по одному на каждый детектор признаков. В этом примере первое из 96 значений отмечает, совпадает ли какая-то точка изображения с таким узором: Второе значение отмечает, совпадает ли какая-то точка изображения с таким узором: Третье значение отмечает, совпадает ли какая-то точка изображения с таким узором: И так далее ещё для 93 детекторов признаков в первом слое AlexNet. Первый слой выдаёт новое представление изображения, где каждый пиксель – это вектор в 96 измерениях (позже я объясню, что это представление уменьшается в 4 раза). Таков первый слой AlexNet. Затем идут ещё четыре свёрточных слоя, каждый из которых принимает на вход выход предыдущего. Как мы увидели, первый слой обнаруживает базовые закономерности, типа горизонтальных и вертикальных линий, переходов от светлого к тёмному и кривых. Второй уровень использует их как строительный блок распознавания чуть более сложных форм. К примеру, у второго слоя мог бы быть детектор признаков, находящий кружочки при помощи комбинации выходов детекторов признаков первого слоя, находящих кривые. Третий слой находит ещё более сложные формы, комбинируя признаки со второго слоя. Четвёртый и пятый находят ещё более сложные закономерности. Исследователи Мэтью Зейлер и Роб Фергус опубликовали в 2014 году прекрасную работу, где приводятся весьма полезные способы визуализации закономерностей, распознаваемых пятислойной нейросетью, похожей на ImageNet. В следующем слайдшоу, взятом из их работы, у каждой картинки, кроме первой, есть две половины. Справа вы увидите примеры миниатюр, сильно активировавших определённый детектор признаков. Они собраны по девять – и каждая группа соответствует своему детектору. Слева – карта, где показано какие именно пиксели в этой миниатюре наиболее ответственны за совпадение. Особенно хорошо это видно на пятом слое, поскольку там есть детекторы признаков, сильно реагирующие на собак, логотипы, колёса и так далее. Первый слой – простые закономерности и формы Второй слой – начинают проявляться мелкие структуры Детекторы признаков на третьем слое могут распознавать более сложные фигуры, типа колёс автомобилей, сот и даже силуэты людей Четвёртый слой способен различать сложные формы, типа морд собак или ног птиц Пятый слой может распознавать очень сложные формы Просматривая изображения, вы можете видеть, как каждый последующий слой способен распознавать всё более сложные закономерности. Первый слой распознаёт простые узоры, не похожие ни на что. Второй распознаёт текстуры и простые формы. К третьему слою становятся видны узнаваемые формы типа колёс и красно-оранжевых сфер (помидоры, божьи коровки, что-то ещё). У первого слоя сторона рецептивного поля равна 11, а у более поздних – от трёх до пяти. Но помните, более поздние слои распознают карты признаков, сгенерированные более ранними слоями, поэтому каждый их «пиксель» обозначает несколько пикселей оригинальной картинки. Поэтому рецептивное поле каждого слоя включает в себя более крупную часть первого изображения, чем предыдущие слои. Это часть причин того, что миниатюры в более поздних слоях выглядят сложнее, чем в ранних. Пятый, последний слой сети способен распознавать впечатляюще большой спектр элементов. К примеру, посмотрите на это изображение, выбранное мною из правого верхнего угла изображения, соответствующего пятому слою: Девять картинок справа могут не быть похожими друг на друга. Но если взглянуть на девять тепловых карт слева, вы увидите, что этот детектор признаков не концентрируется на объекты на переднем плане фоток. Вместо этого он концентрируется на траве на фоне каждой из них! Очевидно, детектор травы полезен, если одной из категорий, которую вы пытаетесь определить, будет «трава», однако это может быть полезным и для многих других категорий. После пяти свёрточных слоёв у AlexNet есть три слоя, связанных полностью, как у нашей сети для распознавания рукописного текста. Эти слои рассматривают каждую из карт признаков, выдаваемых пятью свёрточными слоями, пытаясь отнести изображение к одной из 1000 возможных категорий. Так что если на фоне есть трава, то с большой вероятностью на изображении будет дикое животное. С другой стороны, если на фоне есть трава, это с меньшей вероятностью будет изображение мебели в доме. Эти и другие детекторы признаков пятого слоя дают кучу информации о вероятном содержании фото. Последние слои сети синтезируют эту информацию для выдачи подкреплённой фактами догадки о том, что в целом изображено на картинке. Что отличает свёрточные слои: общие входные веса Мы видели, что детекторы признаков у свёрточных слоёв демонстрируют впечатляющее распознавание образов, однако пока что я не объяснял, как реально работают свёрточные сети. Люди быстро поняли всю мощь глубоких свёрточных сетей Работа AlexNet стала сенсацией в академическом сообществе МО, однако её важность быстро поняли и в IT-индустрии. Особенно сильно ею заинтересовалась Google. Вычислительный бум глубокого обучения Открытие того факта, что более глубокие сети и более объёмные наборы данных могут улучшать производительность НС создало ненасытную жажду всё больших вычислительных мощностей. Одной из основных составляющих успеха AlexNet была идея о том, что в обучении НС используются матричные операции, которые можно эффективно выполнять на хорошо параллелизуемых графических процессорах. Почему глубокие нейросети сложно понять Я объяснил, как работают нейросети, но не объяснил, почему они работают так хорошо. Довольно непонятно, как именно необъятное количество матричных вычислений позволяет компьютерной системе отличать ягуара от гепарда, а бузину от смородины. Второе фото Создатель изображения взял чью-то фотографию и перевернул глаза и рот вверх ногами. Картинка кажется относительно нормальной, когда вы смотрите на неё в перевёрнутом виде, поскольку человеческая зрительная система привыкла видеть глаза и рты в таком положении. Но если посмотреть на картинку в правильной ориентации, сразу видно, что лицо странно искажено.Это говорит о том, что человеческая зрительная система основывается на таких же грубых техниках распознавания закономерностей, что и НС. Если мы смотрим на что-то, что почти всегда видно в одной ориентации – глаза человека – мы гораздо лучше можем распознавать это в его нормальной ориентации. НС хорошо распознают изображения, используя весь имеющийся на них контекст. К примеру, машины обычно ездят по дорогам. Платья обычно надеты на тело женщины или висят в шкафу. Самолёты обычно сняты на фоне неба или рулят по взлётной полосе. Никто специально не обучает НС этим корреляциям, но при достаточном количестве размеченных примеров сеть может сама их выучивать. В 2015 году исследователи из Google попытались лучше понять НС, «запуская их задом наперёд». Вместо того, чтобы использовать картинки для обучения НС, они использовали обученные НС для изменения картинок. К примеру, они начинали с изображения, содержащего случайный шум, а потом постепенно изменяли его, чтобы оно сильно активировало один из выходных нейронов НС – по сути, просили НС «нарисовать» одну из категорий, которую её учили распознавать. В одном интересном случае они заставили НС сгенерировать картинки, активирующие НС, обученную распознавать гантели. «Тут, конечно, присутствуют гантели, но ни одно изображение гантелей не кажется полной без наличия на ней мускулистого качка, поднимающего их», — писали исследователи из Google. На первый взгляд это выглядит странно, но на деле не так уж сильно отличается от того, что делают люди. Если мы видим на картинке небольшой или размытый объект, мы ищем подсказку в его окружении, чтобы понять, что там может происходить. Люди, очевидно, рассуждают о картинках по-другому, пользуясь сложным концептуальным пониманием окружающего мира. Но в итоге ГНС хорошо распознают картинки, потому что пользуются всеми преимуществами всего изображённого на них контекста, и это не сильно отличается от того, как это делают люди. Источник: habr.com Комментарии: |
|