Как стать автором
Обновить

Комментарии 15

Спасибо за публикацию — интересно посмотреть на ваши результаты и на то, как прогрессирует ваш алгоритм от статьи к статье.

Есть только один комментарий: если я правильно понимаю, то, что вы называете деревом решений, на самом деле является деревом поиска в пространстве событий, а дерево решений — это другой алгоритм из machine learning.
Рад, что вам понравилось! Да, дерево поиска в пространстве событий — это действительно именно то, что я использовал, спасибо за уточнение. Как я и упомянул, я ещё не до конца разбираюсь в тонкостях, терминах и алгоритмах машинного обучения. Их очень много)

Зачем в заголовок выносить "Al", если ниже по тексту написано, что бот не обучается?
Как то if else на Al не тянут. Имхо, конечно.

Почему вы пишете в «AI» вторую букву как L?

Дурная привычка. Экономлю на шифте.

Ну в первой части статьи была использована нейронная сеть, это просто продолжение истории. И если глянуть определение метода, который (как выяснилось :)) я использовал:
По́иск в простра́нстве состоя́ний (англ. state space search) — группа математических методов, предназначенных для решения задач искусственного интеллекта.
Просто искусственный интеллект — это не только машинное обучение. В данной статье имелся в виду игровой ИИ, а сейчас игровые ИИ почти все rule-based, насколько мне известно.
Насчёт обучаемости, то вы можете сделать как в AlphaGo.
Если не ошибаюсь, они там использовали нейронную сеть для оценки ситуации.
Игра в го — детерминирована, там нет элемента случайности. Да и до Google Deep Mind мне далеко)
А элемент случайности тут роли особо не играет. Там, насколько мне помнится, идея была в том, что полное дерево поиска в го невероятно глубокое, и Deep Mind вместо полного дерева строили Monte Carlo tree search, используя сеть для того, чтобы оценивать, раскрывать узел дерева или нет.
В обзоре про AlphaGo говорили, что там 3 сети. Одну сеть «попроще» они тренировали чтобы предсказывать ход противника для более быстрого прохода по пространству состояний.
github.com/Apache02/node-yann/tree/master/examples/ttt
Посмотрите мой эксперимент на эту тему на Node.js. Сеть используется как оценочная функция. Без обхода пространства состояний (в этой игре можно без этого).
Тренировка проходит через игру против другого бота. Оппонент генератор случайных чисел, вместо оценки ситуации Math.random(), но всегда делает победный ход если это доступно (оценка 1 если это победа). Сеть заставляю увеличить оценку для победного состояния на всех исходах и уменьшить оценку для 2 состояний, когда она проиграла. Лучший результат достигается за 3000 итераций (300000 игр).
Я проверял и другой метод. Противник спрашивает у обучаемой сети оценку своих состояний, добавляет случайное число и 1 если это победа. Как бы имитация того, что сеть играет против себя же, но с шансом выбора альтернативного хода и победным ходом. Улучшений это не дало. (Эти наработки я не выкладывал).

Мои выводы: это работает, сеть учится, но качество игры немного лучше качества игры оппонента, на котором учится. Если оппонент играет хорошо, то сеть может подстроиться играть против него. Если ходы оппонента недостаточно разнообразны, то сеть может плохо играть против ходов, которых не видела. Для выработки идеальной стратегии оппонент должен играть идеально.
Большое спасибо за пример, я обязательно рассмотрю его. Как я уже сказал в статье, я буду экспериментировать с константами и ваш опыт может оказаться полезным.
А не пробовали использовать child_process для распаралеливания построения дерева?
Пробовал, но столкнулся с проблемами с настройкой Socket.io. Да и Heroku всё равно предоставляет лишь одно ядро даже на платных тарифах(
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории