как работает приложение акинатор
Почему игра акинатор угадывает всех, кого ей загадываешь.. по абсолютно не конкретным вопросам и ответам?!
«Акинатор» — интернет-игра, разработанная двумя французскими программистами в 2007 году. Игрок должен загадать любого персонажа, а Акинатор — главный персонаж игры, внешне напоминающий джинна, — должен его отгадать. В качестве персонажа могут выступать как реальные личности, так и выдуманные персонажи из любых произведений: фильмов, сказок, компьютерных игр и так далее. Акинатор задаёт 40 вопросов. У него есть две дополнительные попытки (в каждой из которых несколько дополнительных вопросов) на тот случай, если он не смог отгадать загаданного игроком персонажа за отведённые 40 вопросов. Или же, наоборот, он может задать меньше вопросов, если смог отгадать персонажа быстрее.
Принцип работы программы
Акинатор начинает с более общих вопросов, и каждый последующий вопрос носит уточняющий характер. Таким образом, Акинатор фильтрует подходящих и неподходящих персонажей. Акинатор запоминает, как все игроки ответили на тот или иной вопрос при загадывании того или иного персонажа, и таким образом на каждого персонажа создаётся некий реестр о том, как отвечали игроки на вопросы о нём, и если данный игрок ответит на вопросы так же, то Акинатор отгадает загаданного игроком персонажа. Если Акинатор не смог отгадать персонажа, то он предлагает ввести название этого персонажа, после чего запоминает его и все ответы, которые давал данный игрок на вопросы об этом персонаже. И если другой игрок загадает этого же персонажа, то Акинатор сможет уже его отгадать. Таким образом, количество персонажей, известных Акинатору, постоянно увеличивается.
Акинатор и математика
Функциональные требования
Алгоритмы
Если бы не прощение ошибок, добиться желаемого можно было бы довольно просто. Например, можно было бы хранить дерево ответов на вопросы, в котором внутренние вершины соответствовали бы вопросам, а листы — ответам. Процесс игры тогда выглядел бы как спуск от корня к одному из листов. Тем не менее, с прощением ошибок этот алгоритм справляться не будет. Да и вопросы балансировки дерева возникают.
В каком-то смысле дерево — это очень «механистический», «машинный» способ игры, крайне неустойчивый к малейшим неточностям. Нам же нужно играть так, как стал бы играть рациональный человек. Тем, кто более-менее знаком с теорией вероятности, должно быть известно, что у нее существует так называемая Байесовская интерпретация, а также основанный на ней Байесовский подход. В основе этого подхода лежит описание знаний с помощью распределений случайных величин с последующим преобразованием априорных знаний в апостериорные на основе наблюдений при помощи знаменитой формулы Байеса. Более того, такой подход является единственным обобщением классической алгебры логики на случай неопределенности (об этом можно прочитать, например, тут). Это наводит многих ученых на мысль, что Байесовский подход является эталоном рационального мышления. Что же, нам только этого и нужно. Попробуем применить его к нашей задаче.
Байесовская модель
Итак, вспоминаем формулу Байеса: P(A|B) = P(B|A)P(A)/P(B). А теперь словами. Пусть нам нужно оценить вероятность того, что произошло событие A, при условии, что событие B точно произошло (то есть мы его гарантированно пронаблюдали; именно поэтому B часто называют наблюдением). По формуле Байеса эта вероятность пропорциональна произведению двух других. Первая из них, P(B|A), называется правдоподобием и показывает, с какой вероятностью событие B происходит при условии, что произошло A. Второй множитель, P(A), — это так называемая априорная вероятность события A, то есть вероятность, что оно в принципе произойдет (вне зависимости от B). По сути, эта вероятность отражает информацию, которую мы знали об A до того, как узнали о том, что произошло B. В знаменателе формулы также присутствует величина P(B), которая в данном случае просто играет роль нормировочного коэффициента и может быть проигнорирована.
Априорную вероятность P(Ai) можно рассматривать как частный случай P(Ai|B) при k=0. Иначе говоря, это вероятность, что игрок загадал объект i при условии, что вопросов задано не было, и мы вообще ничего не знаем. С одной стороны, можно было бы дать всем объектам равные P(Ai), т.к. это честно. С другой стороны, Барака Обаму наверняка будут загадывать намного чаще, чем Холдена Колфилда. Поэтому при прочих равных (то есть когда мы не можем различить объекты), следует выбирать именно Обаму. Следовательно, естественной оценкой P(Ai) будет отношение числа игр, когда был загадан X, к общему их числу.
Правдоподобие P(B|Ai) тоже получает удобную интерпретацию. Только прежде нужно воспользоваться одним небольшим трюком — предположить условную независимость ответов на вопросы при условии Ai (несколько грубое, но очень удобное для нас упрощение). В переводе на русский это значит, что по предположению вероятность P(B|Ai) может быть записана в виде произведения (по j) вероятностей P(Bj|Ai), где Bj — событие вида «На вопрос Qj был дан ответ Aj». P(Bj|Ai) в этом случае будет отношением числа раз, когда при загаданном объекте i на вопрос Qj был дан ответ Aj к числу раз, когда при загаданном объекте i в принципе был задан вопрос Qj. В целях избежания нулевых и неопределенных вероятностей предлагаю дополнительно считать, что изначально на каждый из вопросов каждый из вариантов ответов был дан по разу. То есть в случае, если вопрос Qj еще ни разу не задавался об объекте i, P(Bj|Ai) будет равно 1/Nj, где Nj — число вариантов ответа на вопрос Qj (я, к слову, использовал для всех вопросов одни и те же 4 варианта ответа: «да», «нет», «не знаю» и «вопрос не имеет смысла»).
Подведем промежуточный итог. Мы нашли простую формулу, которая отображает набор пар вопрос/ответ и некоторую сущность в вероятность, что при данных ответах на вопросы была загадана именно эта сущность. Пересчитав эту вероятность для всех объектов в нашей базе данных после ответа на новый вопрос можно видеть, какие из них больше похожи на загаданный объект на настоящий момент. Более того, обучение нашей модели реализуется довольно просто: нужно просто для каждой сущности в базе хранить информацию о том, какие вопросы про нее задавались и сколько ответов каждого из типов дали пользователи. После каждой игры эту информацию можно обновлять, основываясь на ответах пользователя. Также, для учета «популярности» персоны в базе нужно хранить число раз, которое персона была загадана.
Выбор вопросов, информация и энтропия
Ну что же, осталось только понять, какие вопросы лучше задавать. Естественно, задавать нужно те вопросы, которые дают больше информации. Но разве мы можем как-то эту информацию измерить? Оказывается, что да. Для этого можно воспользоваться понятием информационной энтропии. Если говорить грубо, но понятно, то информационная энтропия — это такая характеристика распределения случайной величины (измеряемая, как и информация, в битах), которая показывает, насколько мы не уверены в том, какое значение эта случайная величина примет. Например, если случайная величина принимает значение 1 с вероятностью 0.99, и значение 0 — с вероятностью 0.01, то энтропия такого распределения будет очень близка к нулю. Если же случайная величина принимает, к примеру, значения 0 и 1 с равными вероятностями 0.5 (орел или решка), то энтропия такой случайной величины будет равна 1 биту (это как раз то количество информации, которое мы должны получить, чтобы устранить неопределенность).
Ладно, давайте выбирать каждый раз тот вопрос, ответ на который сильнее всего уменьшит энтропию распределения P(Ai|B), которое как раз и отвечает за наши знания о том, кого загадал игрок. Тут сразу возникает еще одна проблема: вообще говоря, разные ответы на один и тот же вопрос могут уменьшать энтропию по разному. Что же делать? Предлагается находить тот вопрос, для которого ожидаемое уменьшение энтропии будет максимальным. Ожидаемое уменьшение энтропии показывает, насколько «в среднем» уменьшится энтропия, если мы зададим некоторый вопрос. Чтобы не писать здесь еще несколько абзацев текста, приведу формулу, по которой эту величину можно посчитать. Желающие без труда поймут, почему она имеет такой вид. Итак, нужно каждый раз задавать такой вопрос j, для которого величина H[P(Ai|B, )]P( ) +… + H[P(Ai|B, )]P( ) минимальна. Через H[P] тут обозначена энтропия распределения вероятности P, а через » » — событие «на вопрос Qj дан ответ Ans». Величину P( ) можно легко найти по формуле полной вероятности, просуммировав ее, обусловленную по всем известным объектам. То есть P( ) = sum(i) P( |Ai) P(Ai|B).
Оказывается, что такой подход позволяет очень быстро отбрасывать нерелевантные вопросы, сосредотачиваясь на самом главном. В каком-то смысле этот метод является обобщением метода «деления пополам» в вероятностной постановке. Посмотреть, как все это работает вместе, можно на видео ниже.
Как акинатор угадывает? На чем основан принцип его распознавания?
Sergey Litvinov дал ссылку на исчерпывающее описание общей сути алгоритма.
Если же вы хотели получить ответ простыми словами, то можно ответить так.
Но это уже детали. А общий принцип таков: каждый раз после вашего ответа у Акинатора «в голове» остаётся список персонажей, которые соответствуют вашим ответам. И каждый раз он старается задать вопрос, который вычеркнет наибольшее число вариантов, пока не останется один вариант.
В реальности алгоритм Акинатора гораздо масштабнее и хитрее описанного. Он учитывает разные нюансы, в том числе, насколько я заметил, он учитывает тренды (например, допустим, персонажей из сериалов чаще загадывают после того, как закончилась очередная серия). Если много других людей незадолго перед вами вдруг загадали какого-то персонажа, высока вероятность, что и вы тоже решили его загадать. Он даже подстраивается под ваши личные интересы. Если вы, например, любите задавать вопросы о вымышленных персонажах (как мой племянник), Акинатор будет ожидать этого и в следующий раз.
Может казаться чудом, что Акинатор за 20 вопросов часто умудряется отгадать вашего персонажа, ведь он, вроде, и вопросов никаких особых не задал. Однако математика нам говорит, что если бы на каждом из 20 вопросов удавалось подобрать такой вопрос, чтобы ответ всегда отсеивал половину вариантов (как вопрос «женщина ли она»?), то 20 вопросов было бы достаточно, чтобы правильно отличать больше миллиона разных персонажей. А 40 вопросов было бы достаточно, чтобы отличить свыше триллиона (!) персонажей. Акинатор спроектирован так, чтобы как можно лучше находить нужные вопросы, и у него это весьма хорошо получается.
Все, что вы хотели знать об Акинаторе
Как мне играть с Акинатором?
Чтобы играть с ним, думаю, задумайте персонажа, реального или вымышленного, хорошо его запомните, а затем выберите в меню «играть > персонажи».
Акинатор начнет задавать вам ряд вопросов, на которые вы должны ответить так правдиво, насколько это возможно. После этого ряда вопросов, он ответит вам, кого вы задумали.
В чем секрет Акинатора?
Как я могу загрузить картинку?
В конце игры, когда Акинатор отгадал задуманного вами персонажа, вы можете добавить или предложить картинку для данного персонажа.
Пользователь соглашается не загружать фотографии, которые нельзя использовать бесплатно и без ограничений.
1. Добавить картинку:
Персонаж, которого вы загадывали, не имеет изображения. Если вы хотите добавить картинку, вы должны нажать на кнопку «Отправить изображение» и следовать инструкциям.
2. Предложить картинку:
Персонаж, которого вы загадывали, уже имеет изображение. Если вы хотите предложить новое, вы должны нажать на кнопку «Предложить изображение» и следовать инструкциям.
— Вы должны заявить, что «Вы прочитали и приняли условия предоставления услуг. Загружая это изображение, вы заявляете, что вы имеете право опубликовать его.»
— Новое изображение будет видно только тогда, когда модератор примет и утвердит его (см. статью 4. Модерация).
Как я могу добавить персонажа?
Персонажи, которые могут быть добавлены в базу данных Акинатора, должны быть известными личностями. Пользователю предлагается не добавлять людей, которые не принадлежат к этой категории, в частности, людей, которых пользователь знает лично, даже если эти люди согласны на это.
1. В конце игры, когда Акинатор отгадал персонажа, которого вы задумали, вы можете изменить имя этого персонажа. Вы должны нажать на кнопку «Предложить новое имя». Вам будет предложено ввести новое имя, очень краткое описание (два-три слова), чтобы не перепутать данного персонажа с его однофамильцем и необязательный комментарий, объясняющий, почему вы хотите изменить имя персонажа. Ваше предложение будет учтено лишь после проверки модератором (см. статью 4. Модерация).
2. В конце игры, если Акинатор не отгадал задуманного вами персонажа, вы можете добавить этого персонажа в базу данных Акинатора.
— Если Акинатор находит сходство с другими персонажами из своей базы данных, он даст вам список этих персонажей.
• Если ваш персонаж присутствует лишь один раз в списке, вам просто нужно выбрать его.
• Если ваш персонаж присутствует несколько раз в списке, вы должны нажать на кнопку «Мой персонаж виден несколько раз», а затем выделить все экземпляры данного персонажа в списке.
• Если ваш персонаж отсутствует в списке, вы должны нажать на кнопку «Мой персонаж отсутствует в списке» и ввести его имя и короткое описание.
— Если Акинатор не может найти сходство ни с одним персонажем из его базы данных, вы сможете добавить своего персонажа, введя его имя и короткое описание.
— В любом случае, то, что вы добавили, будет немедленно внесено в базу, но может быть удалено модератором позже (см. статью 4. Модерация).
Как я могу добавить вопрос?
В конце игры, когда Акинатор отгадал персонажа, которого вы задумали, вы можете добавить вопрос, нажав на кнопку «Добавить вопрос». Вы должны будете ввести одно или несколько ключевых слов из вашего вопроса.
— Если Акинатор находит сходство с существующим в его базе данных вопросом, он выдаст вам список вопросов.
1. Если ваш вопрос присутствует в списке, вы должны выбрать его и добавить информацию к нему.
2. Если ваш вопрос отсутствует в списке, вы должны нажать на кнопку «Нажать сюда», чтобы добавить свой вопрос и добавить информацию к нему.
— Если Акинатор не находит сходства с любой из существующих в его базе данных вопросом, вы сможете добавить свой вопрос и добавить информацию к нему.
— Все предлагаемые вопросы будет добавлены в базу лишь после утверждения их модератором (см. статью 4. Модерация).
Как играть в акинатор
Содержание статьи
Об игре
Играть в «Акинатор» онлайн возможно на сайте: http:/ru.akinator.com. В игре установлены лимиты, джин отгадывает 5 персонажей в день.
Для удобства пользователей авторы игры разработали мобильное приложение «Акинатор», которое доступно для бесплатного скачивания в Google Play или App Story. В приложении лимит не установлен, чтобы узнать ответ джина придется посмотреть рекламный ролик.
В мобильной версии сайта функционал игры отличается от сайта для компьютера. Пользователи могут играть в «Акинатор» на сайте бесплатно и без регистрации.
Главный герой игры джин по имени Акинатор любит отгадывать персонажей, которых задумывают пользователи. Прежде чем начать игру стоит подумать над образом персонажа, запомнить особенности внешности. Загадывать нужно вымышленного персонажа или известную личность, героя мультфильма или сказки.
В процессе игры «Акинатор» задает вопросы о персонаже, которого загадал пользователь. На них нужно отвечать честно. «Акинатор» подбирает ответ, анализируя данные известных героев и популярных актеров, певцов из базы сайта. Данные загружаются в базу пользователями игры.
Начало игры
Для начала игры нажать кнопку «играть». В полной версии сайта «Акинатор» предлагает пользователю указать возраст игрока. В мобильной версии такой функции нет, пользователю предлагается активировать детский фильтр. Дело в том, что джин задает вопросы о персонаже в зависимости от возраста пользователя. Для ребенка необходимо активировать детский фильтр, иначе джин задаст ребенку вопрос из категории 18+.
Некоторые вопросы заставляют пользователя задуматься. Не все знают, что такое Eddsworld, но это слово присутствует в вопросе джина о герое мультфильма Дисней. Вопросы не последовательны и не связаны друг с другом. Не стоит относиться к вопросам джина слишком серьезно, это просто игра. В большинстве случаев, джин отгадывает персонажа.
Как обыграть «Акинатор»
«Акинатор» не всегда отгадывает героев книг и компьютерных игр. Гарри Поттера, Остапа Сулеймана Берта Мария Бендер Бей джин угадает без труда, стоит загадывать менее популярных героев. Певцов Александра Маршала и Валерия Леонтьева «Акинатор» отгадывает с третьего раза. На некоторые вопросы лучше отвечать «я не знаю», «возможно частично», «скорее нет не совсем».
В конце игры «Акинатор» предложит вариант ответа, пользователь нажимает кнопку «да» или «нет». В случае отрицательного ответа появится список героев, из него выбирается правильный ответ или в список добавляется новый персонаж.
Если джин с первого раза не отгадал, игра продолжается. «Акинатору» дается три попытки, чтобы угадать героя. Джин продолжает задавать вопросы. Пользователю, обыгравшему джина в онлайн-игре, бонусы не начисляются. Результат возможно опубликовать в Twitеr или Facebook.