וואלהכביש 6 נחסם? עומסי תנועה חריגים בעקבות רכב שעלה באשESPN🏈 Fantasy Football: Start Bucs, sit Mahomes, more Week 1 decisionsESPN DeportesNo hubo quinto malo para Marlins, agrega otra rayitaRTP DesportoArsenal vence Sunderland e tem dia perfeito na Liga inglesaThe Hollywood ReporterLeaked Report Details Fallout if Paramount Follows Through on California Exit ThreatCollider5 Essential Stephen King Books for BeginnersSouth China Morning PostCeline Dion makes long-awaited return to stage in Parisn-tvTherapeut liebt "Friends"-Star : Jim Curtis spürt mit Jennifer Aniston "echte Freude"Mexico News DailyMND Tutor | Tamales and tomatoesBellaNaijaTaylor Townsend & Kateřina Siniaková Make History With US Open Women’s Doubles TriumphХабрАрхитектура универсального провайдера баз данных на TypeScript без JDBCSRF NewsWegen Sicherheitsbedenken – ChatGPT-Entwickler OpenAI verschiebt Börsengang
The Daily Newsstand · Free, Always
Saturday, September 12, 2026

Я просил ход, который сделал бы человек. Stockfish ответил правильным

Translate

С лета у меня в браузере рядом с доской работает локальный Stockfish и подсказывает стрелкой на лучшем ходу. Люди, которые начали пользоваться и разбирали этим свои партии, выразили одну и ту же претензию, каждый своими словами. Ход верный, но ход непонятный. Я бы так никогда не сыграл — покажи, что сыграл бы я, и объясни, чем это плохо.

Я полез в настройки силы. У движка есть Skill Level, можно урезать глубину, можно ограничить число узлов, можно задать рейтинг и попросить играть слабее. Вечер работы, максимум два.

Пьяный гроссмейстер

Вечера не хватило. Я подбирал уровень так, чтобы движок ошибался примерно как средний игрок, садился играть — и каждый раз получался игрок, которого в природе не встретишь.

Он отдал мне пешку. Просто отдал, я её взял и взамен ничего не отдал. Через два хода он сделал тихий ход королём в угол и спас партию. Я такой ход даже не рассматривал.

Слабый уровень не делает движок глупее. Он всё равно находит лучший ход. Программа просто иногда не даёт ему этот ход сделать. Поэтому в одной партии у него рядом оказываются глупый зевок и ход, который человек почти никогда не сделает.

Человек играет наоборот. Он делает лучшее из того, что увидел. Видит он мало.

Люди зевают по расписанию

Человеческие зевки зачастую предсказуемы, если посмотреть достаточно партий. Коня, который идёт назад, почти никто не рассматривает. Жертву, которая один раз сработала в похожей структуре, тот же игрок предложит ещё пятнадцать раз там, где она не работает. Защиту соперника мы недооцениваем в тех же позициях, где переоцениваем свою атаку.

Механика тут одна. Человек не считает варианты, он узнаёт картинки, и слеп он там, где картинки нет. Две разные ошибки среднего игрока часто оказываются одной и той же ошибкой в схожих позициях, поэтому его и можно учить.

Ослабленный Stockfish зевает по «своему» расписанию. Он бросил ветку раньше, чем в ней проявилась идея, или не дотянулся до глубины, где всё решается. С человеческим расписанием это совпадает случайно.

Maia отвечает на другой вопрос

Вопрос «какой ход здесь выигрывает» и вопрос «как сыграет игрок с рейтингом 1500» — разные задачи. У первой есть правильный ответ. У второй ответ размазан по десятку ходов, и каждому из них можно приписать вероятность.

Модели Maia в CSSLab учили на человеческих партиях, разобранных по рейтинговым диапазонам, а не на самоигре и не на партиях движков. Maia не ищет ход. Она угадывает, что в этой позиции сыграют люди примерно такой силы, и выдаёт вероятность для каждого хода. Самый вероятный ход часто оказывается ошибкой — тем самым взятием на f7.

Итальянская, ход белых. Оранжевая стрелка: слон бьёт на f7. Бирюзовая: тихая рокировка

Итальянская, ход белых. Оранжевая стрелка: слон бьёт на f7. Бирюзовая: тихая рокировка

Итальянская после 1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5, ход белых. Слон на c4 смотрит на f7. Оранжевое — то, что здесь часто делают. Бирюзовое — тихий ход, который находит движок.

Мне такое и требовалось. Если девять игроков из десяти в этой позиции бьют на f7 и получают по голове, то на вопрос «что тут сыграет человек» честно отвечать взятием, а не тихим усилением, которое движок находит на двадцатой глубине. Ход, который угадала Maia, вдобавок легко объяснить словами: вывел фигуру, напал на пешку. Не «единственный ход, удерживающий равенство по причине, до которой вы дойдёте через шесть ходов».

Внутри всё скучно. Одна модель Maia в формате ONNX, локально, на позиции с доски. Она не перебирает варианты и не пытается играть сильнее тех людей, на которых училась.

Stockfish больше не выбирает ход

Показывать в стрелке то, что угадала Maia, без проверки нельзя. Иногда люди этого уровня массово подставляют ладью, иногда позволяют мат в один ход. Человек доверяет стрелке на экране сильно больше, чем следует, и словами «так просто часто играют» его потом не успокоишь.

Stockfish я оставил, но право выбирать у него забрал. Он смотрит на ход, который предложила Maia, и запрещает его, только если после этого хода на доске случается катастрофа. Запрещать любую потерю преимущества нельзя: человек почти всегда играет чуть хуже лучшего, и от затеи ничего не останется.

Теперь про мою ошибку, которую я исправлял очень долго. Сначала после запрета я брал лучший ход движка. Ход правильный, чего его не показать. В итоге на всех уровнях, кроме верхних, стрелка тихо возвращалась к Stockfish. Запрет чаще всего срабатывает в сложных позициях, а в сложных позициях на стрелку и смотрят. Я собрал модель человека и подключил её так, что в самые интересные моменты партии она не работала.

Сейчас работает так.

Кандидаты Maia идут по очереди. Stockfish только запрещает катастрофу. Если запретил всех — запасной ослабленный Stockfish

Кандидаты Maia идут по очереди. Stockfish только запрещает катастрофу. Если запретил всех — запасной ослабленный Stockfish

Кандидаты Maia, самый частый первым. Первый, кто прошёл проверку, идёт в стрелку. Запретил — следующий кандидат Maia. Запретил всех — старая политика на ослабленном Stockfish.

// candidates — ходы Maia, уже отсортированы: самый частый первым
// lines — те же ходы, но с оценкой Stockfish
// bestScore — оценка лучшего хода движка в этой позиции
// maximumLoss — сколько «пешек» можно отдать ради человеческого хода
//   (на слабых уровнях порог шире, на сильных — уже)

for (const candidate of candidates) {
  const line = lines.get(candidate.uciMove);
  if (!line) continue; // Stockfish этот ход не подтвердил — пропускаем

  const loss = bestScore - score(line);
  if (loss <= maximumLoss) {
    return line; // первый допустимый кандидат Maia → в стрелку
  }
  // иначе «слишком дорого»: берём следующего кандидата Maia
}

return verifiedLines[0]; // всех запретили → запасной ход Stockfish

Последняя ступень мне не нравится. Она осталась с самой первой версии и живёт как страховка на редкие позиции, где Maia не предложила ничего допустимого. Человек в такой момент снова получает пьяного гроссмейстера, только теперь я хотя бы вижу, когда это случилось.

Два числа на карточке

Рядом со стрелкой лежит карточка, на ней — оценка Stockfish и пометка, насколько ход типичен для выбранного уровня. Числа расходятся регулярно. Мне это приносили как баг: ход помечен как обычный для уровня, а оценка просела на полторы пешки, что вы сломали.

Карточка: оценка −1.4 и пометка «часто». Числа про разное

Карточка: оценка −1.4 и пометка «часто». Числа про разное

Оценка −1.4 и пометка «часто» в одной карточке. Это не баг.

Ничего не сломано. Оценка говорит про доску, пометка — про людей, которые за доской сидят, и совпадать они не подписывались. Вероятности исходов, которые Maia тоже умеет считать, я в интерфейс не пустил: они описывают статистику человеческих партий, а рядом с оценкой поиска читались бы как второе мнение о том же самом.

Ползунок уровня подписан привычными числами от 800 до 2600. Это ориентир, а не обещание рейтинга: шкалы площадок между собой не совпадают, а модель знает только те диапазоны, где училась. Крайний правый край ползунка я назвал максимальной силой, там считает чистый Stockfish и Maia не участвует вовсе. Кто хочет объективную истину о позиции, должен получить её без подгонки под свой рейтинг.

Fair-play

Стрелка от движка в рейтинговой партии против живого человека — чит, как бы кнопка ни называлась, и площадки это запрещают. Партия с ботом, тренировочная позиция, разбор своей игры после её конца — анализ, для этого схема и сделана. Обходить чужие проверки я не умею и не обещаю. Ход за пользователя расширение не делает. Если интересно не модель, а как подсказка живёт рядом с доской на Chess.com — есть разбор по шагам.

Что остаётся на машине

Собрал я это в своём расширении ChessNavio: стрелка появляется у той доски, на которую человек и так смотрит, а партию по PGN или отдельную позицию по FEN можно разобрать на сайте. Как устроена связка «доска → модель → стрелка» без установки, я разобрал отдельно: как это работает. Живая позиция, кандидаты Maia, главный вариант и оценки никуда не уходят — обе модели считает машина пользователя, и стрелка не зависит от того, жив ли сервер.

Модель в сборке одна, упрощённая Maia в ONNX. Я взял её из открытого репозитория CSSLab maia-platform-frontend, лицензия GPLv3.

Чего я не знаю

Показать ход, который здесь сделал бы человек, и объяснить, чем он плох, я «научился». Помогает ли это играть лучше — не знаю. Вижу два сценария: человек узнаёт свою будущую ошибку до того, как её сделал, или человек повторяет подсказку и уходит с приятным чувством, что понял. Отличить их по тем данным, что у меня есть, я не могу, а придумывать себе цифры не хочу.

«Сыграй хорошо» и «сыграй как человек» — разные просьбы. Слабый Stockfish отвечает только на первую. На вторую пришлось искать другую модель.

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.