Контекст: я программист с некоторым (наполовину забытым) опытом в области статистики из университетских курсов. Недавно я наткнулся на http://akinator.com и провел некоторое время, пытаясь заставить его потерпеть неудачу. А кто не был? :)
Я решил выяснить, как это может работать. После поиска в Google и прочтения соответствующих сообщений в блоге и добавления некоторых моих (ограниченных) знаний в результирующий микс, я придумаю следующую модель (я уверен, что я буду использовать неправильную запись, пожалуйста, не убивайте меня за это):
Есть Предметы (S) и Вопросы (Q). Цель предсказателя состоит в том, чтобы выбрать субъект S, который имеет наибольшую апостериорную вероятность быть тем субъектом, о котором думает пользователь, с учетом вопросов и ответов, собранных до сих пор.
Пусть игра G будет набором вопросов и ответов: .
Тогда предиктор ищет .
Приоритет для предметов ( ) может быть просто числом угаданных предметов, деленным на общее количество игр.
Предполагая, что все ответы независимы, мы могли бы вычислить вероятность субъекта S для игры G следующим образом:
Мы могли бы вычислить если бы мы отслеживали, какие вопросы и ответы были даны, когда использовались, хотя и по данной теме:
Теперь определяет распределение вероятностей по субъектам, и когда нам нужно выбрать следующий вопрос, мы должны выбрать тот, для которого ожидаемое изменение энтропии этого распределения является максимальным:
Я пытался реализовать это, и это работает. Но, очевидно, что по мере увеличения числа субъектов производительность снижается из-за необходимости пересчитывать после каждого хода и вычислять обновленное распределение для выбор вопроса.P ( S | G ∨ { q j , a } )
Я подозреваю, что я просто выбрал неправильную модель, будучи ограниченным пределами моих знаний. Или, может быть, есть ошибка в математике. Пожалуйста, просветите меня: с чем я должен ознакомиться, или как изменить предиктор, чтобы он мог справиться с миллионами субъектов и тысячами вопросов?
источник
Ответы:
Эта игра похожа на 20 вопросов на http://20q.net , которые, как сообщает создатель, основаны на нейронной сети. Вот один из способов структурирования такой сети, подобный нейронной сети, описанной в векторах описания концепции и игре из 20 вопросов .
Вы бы
0/1
представляетno/yes
ответ. Первоначально установлено значение0.5
Единицы ввода для вопросов, на которые даны ответы, устанавливаются в 0 или 1, и предполагается, что нейронная сеть была обучена, чтобы выходные единицы измерения выходили в значения, близкие к 1, для вопросов, которые дали ответ «Да» с учетом набора существующих ответов.
На каждом этапе вы выбираете вопрос, в котором
NN
наименее уверены, т. Е. Соответствующая единица вывода близка0.5
, задаете вопрос и устанавливаете соответствующий блок ввода в ответ. На последнем этапе вы выбираете единицу вывода из списка «последний вопрос» со значением, наиболее близким к1
.Каждая игра из 20 вопросов дает 20 точек данных, которые можно использовать для обновления
NN
весов с помощью обратного распространения, т. Е. Вы обновляете весы, чтобы выходные данные текущей нейронной сети соответствовали истинному ответу, учитывая все предыдущие заданные вопросы.источник
Я не думаю, что это действительно проблема классификации. 20 вопросов часто называют проблемой сжатия . Это на самом деле лучше соответствует последней части вашего вопроса, где вы говорите об энтропии.
См. Главу 5.7 ( книги Google )
Cover, TM and Joy, AT (2006) Элементы теории информации
а также кодирование Хаффмана . Эта статья, которую я нашел на arXiv, также может быть интересна.
Гилл, Дж. Т. и Ву, В. (2010) «Двадцать вопросов, на которые игра всегда заканчивается, да» http://arxiv.org/abs/1002.4907
Для простоты предположим, что да / нет вопросов (тогда как akinator.com позволяет, может быть, не знаю). Предположим, что каждый возможный субъект (который знает akinator.com) может быть уникально идентифицирован последовательностью вопросов и ответов «да / нет» - по сути, двоичным вектором.
Заданные вопросы (и их ответы) определяют рекурсивное разбиение пространства предметов. Это разбиение также соответствует древовидной структуре. Внутренние вершины дерева соответствуют вопросам, а листья соответствуют предметам. Глубина листьев - это количество вопросов, необходимых для однозначной идентификации предмета. Вы можете (тривиально) идентифицировать каждый известный предмет, задавая все возможные вопросы. Это не интересно, потому что есть потенциально сотни вопросов.
Связь с кодированием Хаффмана заключается в том, что он дает оптимальный (при определенной вероятностной модели) способ построения дерева таким образом, чтобы средняя глубина была (почти) минимальной. Другими словами, он говорит вам, как организовать последовательность вопросов (построить дерево) так, чтобы количество вопросов, которые вам нужно было задать, в среднем было небольшим. Он использует жадный подход.
Конечно, для akinator.com есть нечто большее, чем эта, но основная идея состоит в том, что вы можете рассматривать проблему с точки зрения дерева и пытаться минимизировать среднюю глубину его листьев.
источник