А что действительно скрывают нейронные сети?
Несколько дней назад на хабре вышла статья Что скрывают нейронные сети?. Она является вольным пересказом английской статьи The Flaw Lurking In Every Deep Neural Net, а та в свою очередь рассказывает об конкретном исследовании некоторых свойств нейронных сетей (Интригующие свойства нейронных сетей).В статье, описывающей исследование, авторы выбрали несколько сенсационный подход к подаче материала и написали текст в духе «в нейронных сетях найдена серьезная проблема» и «мы не можем доверять нейросетям в проблемах, связанных с безопастностью». Ссылку на пост на Хабре среди моих знакомых много кто расшарил, в фейсбуке завязалось сразу несколько дискуссий на эту тему. При этом у меня сложилось впечатление, что за два пересказа часть информации из начального исследования потерялось, плюс возникло много вопросов, связанных с нейронными сетями, которые в изначальном тексте не рассматривались. Мне кажется, что есть потребность подробнее описать, что же делали в исследовании, а заодно попробовать ответить на изначальные вопросы. Формат фейсбука для таких длинных текстов не подходит совсем, так что я решил попробовать оформить свои размышления в пост на Хабре.
Содержание исходной статьиИсходная статья под названием «Интригующие свойства нейронных сетей» написана группой из 7 ученых, трое из которых работает в отделе исследований нейронных сетей в Google. В статье обсуждается два неочевидных свойства нейронных сетей: Считается, что если для конкретного нейрона на глубоком уровне нейронной сети подобрать исходные изображения так, чтобы конкретно этот нейрон был активирован, то выбранные изображения будут обладать каким-либо общим семантическим признаком. Ученые показали, что тоже самое утверждение верно если мы рассмотрим не активацию одного нейрона, а линейную комбинацию выходов нескольких нейронов. Для каждого элемента обучающей выборки нейросети можно подобрать очень похожий на него зрительно пример, который будет классифицироваться неправильно — исследователи это называют слепыми пятнами сети. Давайте попробуем разобраться подробнее, что же эти два свойства значат.Значение конкретных нейронов Первое свойство постараемся разобрать побыстрее.Есть предположение, популярное у фанатов нейронных сетей, которое заключается в том, что нейронная сеть внутри себя разбирает исходные данные на отдельные понятные свойства и на глубоких уровнях нейронной сети каждый нейрон отвечает за некоторое конкретное свойство исходного объекта.
Проверяется это утверждение обычно визуальным просмотром:
Выбирается нейрон в обученной сети. Выбираются изображения из тестовой выборки, которые этот нейрон активируют. Выбранные изображения просматриваются человеком и делается вывод о том, что у всех этих изображений есть некоторое общее свойство. Что сделали исследователи в статье: они вместо того, чтобы рассматривать отдельные нейроны, стали рассматривать линейные комбинации нейронов и искать для изображений, активирующих конкретную комбинацию, общие семантические свойства. У авторов получилось — они из этого делают вывод, что данные о предметной области в нейронной сети хранятся не в конкретных нейронах, а в общей конфигурации сети.Обсуждать серьезно эту часть статьи вообще говоря не очень хочется, потому что она относится скорее к области религии, чем науки.
Первоначальное рассуждение о том, что конкретные нейроны отвечают за конкретные признаки берется из весьма абстрактных рассуждений о том, что нейросеть должна по своей работе напоминать человеческий мозг. Откуда берется утверждение, что выделенные признаки при этом должны быть понятны человеку, я вообще нигде не смог найти. Проверка этого утверждения — очень странное занятие, потому что найти общий признак у небольшой подборки произвольных изображений можно легко, было бы желание. А провести статистически значимую проверку на большом объеме изображений невозможно, так как процесс никак не автоматизируешь. В итоге получили закономерный результат: если можно на одном наборе изображений находить общие признаки, то можно тоже самое делать и на любом другом.
Пример изображений с одинаковым свойством из оригинальной статьи.
Общий вывод в этой части статьи при этом действительно выглядит закономерным — в нейросети знание о предметной области действительно скорее содержится во всей архитектуре нейросети и параметрах ее нейронов, а не в каждом конкретном нейроне в отдельности.
Слепые пятна сети Исследователи провели следующий эксперимент — они задались целью найти неправильно классифицирующиеся сетью объекты, расположенные как можно ближе к объектам обучающей выборки. Для поиска таких авторы разработали специальный алгоритм оптимизации, который отходил от исходной картинки в сторону ухудшения ответов нейросети, до тех пор, пока классификация объекта не ломалась.В результате эксперимента получилось следующее:
Для любого объекта обучающей выборки всегда находится картинка, которую человек глазами не отличает от первой, а нейросеть на ней ломается. Картинки с внесенными дефектами будут плохо распознаваться нейронной сетью, даже если у нее поменять архитектуру или обучить на другом подмножестве обучающей выборки. Собственно, про эти слепые пятна и идут в основном разговоры, так что давайте попробуем ответить на вопросы которые при этом появляются. Но для начала разберем несколько базовых возражений, которые появляются у людей, читающих описание исследования: «В исследовании используются очень простые нейросети, сейчас такими никто не пользуется» — нет, в исследовании использовалось 6 разных типов сетей, от простой однослойной до больших глубоких сетей, все из других известных работ последних 2–3 лет. Не все эксперименты были поставлены на всех типах сетей, но все основные выводы в статье от типа сети не зависят. «Исследователи используют нейронную сеть, которая на вход принимает растровые изображения, а не выделенные на них признаки — это изначально неэффективно» — в статье на самом деле не разу явно не написано, что именно они передают на вход нейронной сети. При этом их нейронные сети показывают хорошее качество на больших базах изображений, поэтому в неэффективности исходной системы их обвинить трудно. «Исследователи взяли очень переученную нейронную сеть — закономерно получили плохие результаты вне обучающей выборке» — нет, результаты которые они приводят показывают, что сети, которые они обучали не были переучены. В частности, в статье есть результат работы сети на исходной выборке с добавленным случайным шумом, на котором нет никакого падения качества. При переобученной системе таких результатов не было бы. «Искажения, которые добавляются к сетям сильно специальные и в реальной жизни встретится не могут» — не совсем так. С одной стороны, эти искажения неслучайны, с другой они меняют картинку очень незначительно, в среднем на порядок меньше чем случайный шум, незаметный для человеческого глаза — в статье есть соответствующие цифры. Так что утверждать, что таких искажений не получить в реальности я бы не стал — вероятность этого мала, но исключать такие возможности нельзя. Что здесь реально новость? То, что у нейросети могут быть слепые пятна рядом с объектами обучающей выборки — это на самом деле не большая новость. Дело в том, что в нейросети никто никогда не обещал локальной точности.Есть методы классификации (к примеру Support Vector Machines), которые в основе своего обучения ставят максимальное отделение объектов обучающей выборки от границ изменения классов. В нейронных сетях никаких требований подобного рода нет, более того в силу сложности нейронных сетей итоговое разделение исходного множества обычно не поддается нормально интерпретации и исследованию. Поэтому то, что в сетях можно найти области локальной нестабильности — это не новость, а подтверждение факта, который и так был достаточно известен.
Что здесь реально новость — это то, что искажения, приводящие к ошибкам, сохраняют свои свойства при переходе к другой архитектуре сетей и при смене обучающей выборки. Это действительно очень неожиданное открытие, и я надеюсь, что авторы в следующих работах найдут ему объяснение.
Действительно ли нейросети это тупик? Нет, нейросети это не тупик. Это очень мощный и сильный инструмент, который решает некоторый набор совершенно конкретных задач.Популярность нейросетей построена в основе на двух идеях:
Теорема сходимости перспетрона Розенблатта — под любую обучающую выборку можно подобрать архитектуру и веса нейронной сети с одним внутренним слоем, такую чтобы обучающая выборка классифицировалась с 100% точностью. Практически все процессы в обучении нейронной сети (в последнее время включая подбор архитектуры) полностью автоматизируются. Поэтому нейросеть — это средство быстро получать приемлемые решения для очень сложных задач распознавания. Ничего другого никто для нейросетей никогда не обещал (хотя было много попыток). Ключевые слова здесь «быстро» и «сложные задачи»: Если вы хотите научится стабильно отличать котиков от собачек на Ютюбе за год работы, то кроме нейросетей у вас сейчас инструментов сопоставимого по качеству и удобству все равно нет — придумывание признаков для более простых классификаторов и их настройка займет гораздо больше времени. Но при этом придется мирится что черный ящик нейросети будет иногда делать странные с точки зрения человека ошибки, которые будет трудно исправить. А если вы хотите распознавать текст или отличать положительные отзывы от отрицательных — возьмите лучше классификатор попроще — у вас будет сильно больше контроля над тем что происходит, хотя возможно получение первых результатов займет некоторое время. Можно ли доверять нейросетям? Основное заключение статьи, обсуждающей оригинальное исследование было: «Пока этого не произойдёт, мы не может полагаться на нейронные сети там, где безопасность критически важна…». Потом еще в отдельных обсуждениях часто всплывал Google Car, по каким-то причинам (видимо из-за места работы авторов и картинки машины в статье).На самом деле нейросетям доверять можно, и для этого есть несколько причин:
Пользователю (а не исследователю) нейросети важно не где конкретно она ошибается, а насколько часто. Поверьте, вам будет абсолютно все равно ваша автоматическая машина не узнала грузовик который был в ее обучающей базе, или тот, который она раньше не видела. Все исследование посвящено поиску ошибок в конкретных областях рядом с обучающей выборкой, при этом общее качество работы нейросетей (и способы его оценки) не ставятся под сомнение. Любая система распознавания никогда не работает на 100%, в ней всегда есть ошибки. Один из первых приниципов, которые узнают в роботехнике — это то что никогда нельзя делать действия на основе одного отдельного показателя датчика — всегда нужно брать плавающее окно значений и выбрасывать оттуда уродцев. Для любой критической системы это тоже верно — в любой реальной задаче всегда идет поток данных, даже если в какой-то момент система дала сбой, соседние данные выправят ситуацию.
Так что к нейросетям в любой критической системе нужно относится как к еще одному виду датчиков, который в целом дает правильные данные, но иногда ошибается и на его ошибки нужно закладываться.
Что важного есть в этой статье? Казалось бы — если никаких великих откровений в статье не нашли, то зачем ее вообще писали? На мой взгляд в статье есть один главный результат — это продуманный способ заметного увеличения качества нейронной сети при обучении. Часто при обучении систем распознавания применяют стандартный трюк, когда для обучения используют кроме оригинальных объектов обучающей выборки еще те же объекты с добавленным шумом.
Авторы статьи показали, что вместо этого можно использовать объекты с искажениями, которые приводят к ошибкам нейронной сети — и таким образом и устранять ошибки на этих искажениях и одновременно повышать качество работы всей сети на тестовой выборке. Это важный результат для работы с нейросетями.
Под конец могу только порекомендовать не читать статьи с «сенсационными» заголовками, а лучше находить первоисточники и читать их — там все гораздо интереснее.