Рис. 8.
Нейросети шестьдесят лет назад: американский математик Фрэнк Розенблатт придумал алгоритм под названием «персептрон» (его назвали бы однослойной нейросетью – или, что то же самое, линейной моделью) и построил способную обучаться вычислительную машину Mark I, не похожую на все остальные компьютеры. «Баллы» за каждый признак были реализованы в виде вращающихся стержней-резисторов, каждый из которых в процессе обучения подкручивал свой электромотор: чем сильнее стержень выкручен – тем больше баллов полагается за каждый признакК чему простые и быстрые алгоритмы безнадежно глухи – так это к интонации и стилю. Они не отличают стихов от прозы. Скрытые цитаты и сарказм за пределами их понимания, потому что для простой модели ваша запись – мешок слов (у специалистов по машинному обучению это устоявшийся термин): слова либо есть, либо нет, а в каком порядке идут и что означают вместе, уже неважно. И если вы из чувства возмущения приводите кусок чужой прямой речи, который вас задел, и как угодно его комментируете – вас запросто заблокируют за оскорбительный контент.
Еще простые линейные модели не умеют видеть смысл в комбинациях признаков. Если на «Титанике» выжили все мужчины из второго класса, которые сели на лайнер в Саутгемптоне (потому что, скажем, всех их разместили в удачных каютах рядом со спасательной шлюпкой), то модель выдаст только скромную порцию баллов за Саутгемптон и за второй класс, а более тонких закономерностей не увидит – и ошибется в прогнозе.
Ситуация: врач скорой зашел в дом и, чтобы решить, надо ли везти пациента в больницу, начинает с вопроса «на что жалуемся?». С точки зрения математики это по-прежнему все та же задача про «Титаник»: есть люди, у них много характеристик (медики называют их словом «симптомы»), и в конце нужно ответить «да» или «нет».
Сценарии диалога врача с больным можно нарисовать в форме ветвящегося дерева: каждый следующий вопрос зависит от ответа на предыдущий. Если у пациента болит горло, надо спросить про температуру. Если хватается за сердце – проверить пульс.
Такие ветвящиеся деревья в мире алгоритмов – проверенный способ искать и находить то, что вам нужно, в огромных множествах. В 2007 году появилась интернет-игра «Акинатор», где ее главный персонаж – одноименный джин – предлагал угадать какого угодно персонажа (реального человека, героя мультфильма, историческую личность) за 15–20 вопросов, на которые можно ответить «да», «нет» или «не знаю». «Ваш персонаж существовал в реальности?» «Ваш персонаж женского пола?» «Ваш персонаж старше сорока лет?» «Ваш персонаж умер?» «У вашего персонажа больше одной головы?»
Каждый правильно заданный вопрос сужает поле вариантов – миллионы имен, упомянутых в кино и книгах, – примерно вдвое, следующий – еще вдвое, пока в итоге, на конце одной из ветвей дерева поиска, не остается один наиболее реальный кандидат. На десятом или двадцатом ходу (как повезет) Акинатор выдает ответ: царь обезьян Хануман, Емельян Пугачев, Человек-Паук. Хотя иногда и промахивается – вместо контрреволюционера и живого монгольского бога барона Унгерна предлагает революционера Григория Котовского.
Дерево решений в голове у врача точно так же позволяет проделать путь от общей ситуации к конкретной гипотезе. Подозрение на инфаркт: надо срочно вызывать скорую. Подозрение на ОРЗ: пусть пациент сидит дома и пьет чай под одеялом.
Все просто, когда правильные вопросы уже известны. Но сначала есть только десятки или сотни признаков в случайном порядке: пульс, давление, температура, диаметр зрачка, бледность кожи, громкость кашля, хрипы в груди или их отсутствие – и вопросы нужно научиться задавать в единственно верной последовательности.
Простой выход из положения: созвать консилиум из многих врачей, пусть даже мегаэрудированного доктора Хауса среди них и нет. Каждый врач знает все про три-четыре случайных симптома и делает все выводы только на их основе. Потом врачи голосуют, и консилиум записывает мнение большинства. Если, скажем, шесть из десяти говорят «везти в больницу» – больного везут в больницу. В машинном обучении это называют «ансамбль случайных деревьев».
Но можно опрашивать врачей и по очереди. Спросили первого про сотню пациентов. Второму предъявляем в основном пациентов, на которых ошибся первый, и уточняем его диагнозы. Третьему – тех, на которых ошибся второй. И так далее. Выглядит все так, как будто по поводу каждого нового больного эти врачи тоже голосуют, но их голоса весят по-разному. Примерно так работает «градиентный бустинг на деревьях» – кажется, самый мощный класс алгоритмов после нейросетей.