А.Г. То есть вы определяли себя игроком хуже, чем ваш партнёр?
Б.М. Нет, не так: плохие показания кубиков мы ожидали с большей вероятностью, чем хорошие показания кубиков. В общем, это, наверное, естественно – когда мы идём гулять, совершенно ничего не зная про прогноз погоды, то, наверное, зонтик всё-таки стоит брать. Здесь фактически то же самое.
И уже на этом мы подбирали разные виды этих функций риска. Уже здесь мы почти вплотную приблизились к «Джели-фишу». Если мы сейчас у него выигрываем (ещё раз повторяю, на нашем российском варианте нард) где-то 55 процентов, может, чуть побольше, тогда мы проигрывали столько же. Но это уже было хорошо. Выигрываем на убывающих функциях риска. Убывающих – это означает, что мы хоть немного, да пессимисты.
Следующий шаг, про который я никак не начну говорить, такой. Всё-таки бывают ситуации, когда надо быть оптимистами, редко, но бывают. А, может быть, не очень редко. Что это такое? Это когда мы сильно проигрываем. То есть когда положение заведомо не в нашу пользу, всё равно нам проигрывать. Здесь нет варианта проиграть слишком много. (Немножко отвлекаясь, в бэкгеммоне есть разные варианты проигрыша, но, как правило, об этом в конкретной позиции речь не идёт.) Если идёт речь о том, чтобы проиграть либо одно очко, либо, может быть, всё-таки выиграть, нам надо строить оптимистическую функцию риска, которая бы учитывала вероятность выпадения нам хороших показаний кубиков. Тогда эти вероятности надо сильно увеличить. Почему? Русская пословица есть – утопающий хватается за соломинку.
А.Г. Речь идёт о стратегии игры?
Б.М. Да, конечно. Но откуда известно, как мы стоим – хорошо или плохо? Например, по той же самой статической оценке позиции, во-вторых, по динамической оценке позиции, взятой с какой-нибудь простой функции риска. Вот это всё приводит к динамическому выбору функции риска. Примерно выбрав, как мы стоим, выигрыш, проигрыш или в серединке, мы за счёт этого динамически строим функцию риска. Например, когда априорно позиция примерно равна, эта функция риска действительно немножко убывает. То есть она похожа на линейную функцию, константу, которая от минус единицы до плюс единицы убудет, начиная со значения единицы, примерно до одной второй. Примерно такая функция риска, убывающая, немножко пессимистическая, соответствует тому, что – пойдёт дождик или не пойдёт дождик – зонтик мы возьмём.
Если же мы заведомо проигрываем, функция риска сильно возрастает. Если же мы выигрываем очень сильно, то мы должны быть сверхпессимистами и очень плохие прогнозы предполагать с гораздо большими вероятностями. И функция риска будет становиться функцией сверхпессимиста. И в зависимости от такого предварительного подсчёта, предварительной генерации, мы и строим динамическую функцию риска.
Поскольку я постоянно делаю шаги в другие задачи дискретной оптимизации, то я здесь сделаю ещё один. Например, некоторые программы-эксперты высчитывают время, оставшееся до получения хорошего ответа (не обязательно оптимального, но близкого к оптимальному) в какой-нибудь задаче дискретной оптимизации, например, в той же самой пресловутой «задаче коммивояжёра» или в минимизации конечных автоматов – тоже одна из моих любимых задач. И разные программы-эксперты оценивают: если в среднем эти программы дают время вычисления, которое очень высоко, гораздо больше, чем если мы пойдём по другой ветке вычислений, то мы здесь применим какую-то оптимистическую функцию риска. Если время будет, наоборот, слишком маленькое, то пессимистическую. Это всё имеет выход в другие задачи дискретной оптимизации.
А.Г. Это то, что у игрока называется интуицией во время игры.
Б.М. Да. Это второй шаг – он самый главный. Первым шагом было введение функции риска, вторым – динамической функции риска. Есть и третий шаг, который тоже может быть важен, хотя менее важен, чем второй. Это применение несколько раз подряд этих функций риска, потому что после первого применения мы немножко уточняем оценку позиции. А раз немножко уточняем оценку позиции, то можем немножко более определённо сказать – мы пессимисты или оптимисты. А в следующий раз мы ещё более определённо будем говорить, ещё раз и ещё раз.
Казалось бы, что это очень долгие вычисления, но нет – по сравнению со всем остальным объёмом вычисления, связанного с получением статических оценок позиции, с организацией перебора и так далее. Это неоднократное применение функции риска, динамическая функция риска, фактически совершенно не занимает времени, то есть там какие-то доли процента – даже, кажется, мы и не считали, какие именно доли процента. Даёт ли этот третий шаг большой выигрыш по сравнению только со вторым? Я затрудняюсь сказать, но раз без каких бы то ни было усилий мы можем получить какое-то преимущество, то, наверное, даёт.
Дело в том, что у меня описаны примеры именно конкретных реализаций, статистических оценок позиций, когда это должно дать преимущество, должно дать плюсы. Но насколько часто эти примеры проявляются в нардах – я сказать затрудняюсь.
А.Г. Вы сами у своей программы выигрываете?
Б.М. Проигрываю. Это, кстати, интересный вопрос, хорошо, что он возник, было бы плохо, если бы он не возник. Я в нардах специалист, но, конечно, условно говоря, не гроссмейстер. Хотя, может быть, моя квалификация в нардах и выше, чем была моя квалификация в шахматах, когда я ещё играл – кандидат в мастера. Вот здесь интересный момент – почему я проигрываю? Я всё-таки человек, и поддаюсь иногда азарту, хотя, конечно, в казино не хожу и только в дурном сне могу представить, что я в казино пойду. Там от меня ничего не зависит, там просто фишки, как выпадут, так и выпадут. А здесь от меня зависит, от моего интеллекта.
И всё-таки я азарту поддаюсь. Например, если я два хода назад стоял хорошо, на выигрыш, но что-то случилось, плохо кубики упали, и я начал стоять плохо. Я просто по инерции продолжаю у себя в мозгу применять пессимистическую функцию риска, оценивая позицию, чего, конечно, делать не надо. Программа же быстрее переключается и быстрее понимает, что всё не так хорошо происходит, как есть на самом деле, и программа переключается, например, от пессимистической к оптимистической функции риска, переключается гораздо быстрее чем я.
А.Р. Тут, наверное, стоит ещё заметить, что программа, в которой реализованы эти алгоритмы, но в которой не подобраны числовые коэффициенты (когда переключаться на какую стратегию, как, собственно, статично оценивать позицию, хорошая она или плохая), эта программа не является рабочей. Чтобы она заработала, необходимо её обучить. Обучение программы происходит, когда она играет сама с собой, тогда происходит, собственно, подгонка параметров таким образом, чтобы максимально улучшить качество игры, максимально повысить вероятность выигрыша.
Но здесь возникает уже другой вопрос – каким образом её учить? Если в играх сама с собой, то, наверное, это будет немного необъективно, так как в данном случае отношения не транзитивны: если программа выиграла у другой программы, а другая у третьей, то не обязательно, что первая выиграет у третьей. И выбор системы обучения – тоже очень интересная проблема. И, собственно, если её грамотно решить, то можно действительно надеяться на то, что получится продукт, который в 2004 году станет играть на должном уровне.
А.Г. То есть эту проблему вы ещё не решили?
Б.М. Решаем… всё-таки можно даже сказать, что решили. Здесь мы касаемся темы, о которой ещё сегодня не говорили. Это не нейросети, их мы очень мало применяем здесь. А это так называемые генетические алгоритмы. В научной литературе им посвящено гораздо меньше публикаций, чем нейросетям. Мне кажется – незаслуженно. Потому что и то, и другое – это альтернативный подход к эвристическому программированию. Чистые математики объясняют это так, что нейросети – это математически объяснимо, может быть математически доказано, а генетические алгоритмы – якобы нет. И приводят ссылки на работу Колмогорова-Арнольда, работу 50-х годов – но мне кажется, что для практического программирования эта работа представляет весьма малый интерес. И то, и другое, это разные альтернативы, разные подходы к эвристическому программированию. Наша «функция риска» – это тоже подход. Просто надо всё применять в разумных примерах, в разумных количествах.
Вот здесь возникает именно задача самообучения набора коэффициентов, среди которых, кроме всего прочего, коэффициенты самообучения функций риска, не только коэффициенты для оценки позиций, но и коэффициенты функций риска. Мне, по крайней мере, неизвестно хороших публикаций (чуть ли вообще никаких) про самообучение этих наборов коэффициентов. Есть, либо есть стандартный подход генетических алгоритмов, в котором тоже много не совсем правильного, либо просто, как в упомянутых книжках Вельского с компанией, сказано: «Было произведено самообучение». Было, хорошо было произведено, раз программа хорошая, раз, отставая в 70-х годах от американцев по технике, на той же самой технике «Каисса», победила. Значит, было хорошо самообучение произведено, но как оно было произведено, никакой теории по этому поводу не было.