Blog

  • Всё течёт — и кое-что даже доказывается: неделимые потоки

    Всё течёт — и кое-что даже доказывается: неделимые потоки

    Введение

    Пост про гипотезу Диница — Гарга — Гёманса я закончил словами “А что ещё дальше, коллеги?..”. Сегодня могу отчитаться, что было дальше: три недели, три препринта, один merged pull request от внешнего контрибьютора и мои первые сабмиты на VibeMathed.

    Если коротко, то из твита Дмитрия Рыбина выросла целая исследовательская программа. Сначала мы с моделями опускали планку снизу:

    А потом произошёл поворот, ради которого я и пишу этот пост:

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

    Здесь, правда, речь уже не про один гигачад-промпт “you should do a breakthrough”. Это была долгая совместная работа с LLM, с десятками промптов, неудачных попыток, провалившихся экспериментов и так далее. Ошибки тоже регулярно встречались, хотя честно скажу, что хоть я и проверил всё, что происходит в финальном тексте, но лично я не нашёл ни одной дырки — все ошибки, которые были в доказательствах, находились на этапе перекрёстной проверки другими LLM.

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

    Напоминание: гипотеза и треугольник

    Кратко напомню постановку задачи; подробности есть в прошлом посте.

    Рассмотрим ориентированный граф с источником s, терминалами t_1,\ldots,t_k и заказами d_1,\ldots,d_k; на дугах могут быть неотрицательные цены c_a. Дан дробный поток \mathbf{x}, который можно делить по путям как угодно. Мы хотим получить неделимый поток \mathbf{y}: один путь на терминал, так что весь заказ идёт целиком по этому пути. Теорема Диница — Гарга — Гёманса (1999) говорит, что всегда можно добиться на каждой дуге выполнения условия

        \[y_a\le x_a+d_{\max},\qquad d_{\max}=\max_i d_i,\]

    а гипотеза Гёманса утверждала, что одновременно можно сохранить и цену, \mathbf{c}^\top\mathbf{y}\le\mathbf{c}^\top\mathbf{x}.

    22 июля 2026 года GPT 5.6 Pro по запросу Дмитрия Рыбина построила контрпример с семью вершинами: любой неделимый поток, укладывающийся в добавку d_{\max}, имеет здесь цену минимум 60 при дробной цене 58.

    Семивершинный контрпример к гипотезе Диница — Гарга — Гёманса: дробный поток стоимости 58

    Мы подробно обсуждали этот пример в прошлом посте. Внутренний механизм этого контрпримера — треугольник попарных конфликтов: три “бесплатных” пути, любые два из которых вместе перегружают какую-то дугу. Дробный поток набирает по бесплатным путям суммарную массу \tfrac{16}{15}>1, а неделимый может позволить себе не больше одного бесплатного выбора.

    Треугольник конфликтов бесплатных путей в контрпримере

    В том же посте мы видели, что параметрическое семейство на той же схеме из 7 вершин доводит нижнюю оценку до любого \alpha<\tfrac 98: если разрешать перегрузку y_a\le x_a+\alpha\, d_{\max} и требовать сохранения цены, то должно выполняться \alpha\ge \tfrac 98. Сверху же для планарных графов известна константа 2 (Traub, Vargas Koch, Zenklusen, 2023). Так что в начале пути у нас был зазор между \tfrac 98 и 2 для планарных графов, а для произвольных верхней оценки не было вовсе.

    Первый естественный вопрос: может быть, тот же треугольник, но с другими числами, даст больше \tfrac 98?

    Это была как раз первая теорема всей серии: \tfrac 98точная верхняя граница для всего шаблона “у каждого из трёх терминалов есть дешёвый и дорогой путь, конфликты попарные”. Ни для каких заказов, долей и цен константу выше \tfrac 98 на этом механизме не получить. Значит, для более сильной нижней оценки нужен структурно новый пример.

    Хребты и терминалы с парой выходов

    Новый пример нашёлся в виде, который потом оказался центральным для всей истории. Берём ориентированную цепочку v_0\to v_1\to\cdots\to v_5 (“хребет” графа) и в каждый терминал отправляем ровно два выхода с хребта: ранний и поздний. Вот пример такого графа:

    Значит, к любому терминалу из v_0 ровно два пути; назовём их “ранний” (красный на картинке выше) и “поздний” (синий). Переключение терминала i с раннего пути на поздний добавляет d_i на дугах хребта, которые лежат в интервале [l_i,r_i], и получается, что вся комбинаторика такого примера описывается семейством интервалов:

    Хребтовая цепочка с ранними и поздними выходами и четырьмя пересекающимися интервалами

    Контрпример из части I был основан на четырёх терминалах с интервалами [0,2], [0,4], [1,4], [2,3]:

    Оптимизация по заказам и долям даёт нижнюю оценку

        \[C\;\ge\;\frac{299-41\sqrt{41}}{32}\;=\;1.13974707\ldots\;>\;\frac98=1.125,\]

    причём с точным алгебраическим сертификатом. Есть и целочисленное подсемейство с константами 182359/160000-1/n, так что всё можно реализовать и на рациональных данных (в целом это и так очевидно). И важно, что конструкция здесь планарная, так что зазор для планарных графов сузился до [1.1397\ldots,\,2].

    Важная техническая деталь: у каждого терминала в этих конструкциях ровно два простых пути, так что верификацию можно вести буквально полным перебором, и проверяющая программа не может ничего пропустить или забыть. Ту же константу независимо и раньше получил Matthew Protti (23 July 2026); тогда я об этом не знал, но потом во введении Части III расставил все известные мне ссылки.

    Число (299-41\sqrt{41})/32 больше 9/8, но это не всё, что о нём можно сказать; оно ещё вернётся в этой истории с совершенно другой стороны.

    Часть II. Семнадцать терминалов с общим ребром

    Естественным продолжением этой работы было бы попробовать обобщить и продолжить действие такого же механизма с попарными переключениями и системами интервалов.

    И действительно, обобщить удалось: в Part II мы предъявляем пример, в котором уже сразу 17 терминалов, поздние пути которых все проходят через одно общее ребро.

    На этом графе, конечно, чёрт ногу сломит (и очевидно, что он не планарный), но вот соответствующая ему система интервалов со всеми числами. На картинке ниже d — это спрос, а f — доля дробного потока, которая отправляется на поздний путь; во всех случаях ранний выход к терминалу i стоит \tfrac 1{d_i}, а поздний выход бесплатный:

    Оптимизация (уже довольно нетривиальная) дала рекорд

        \[C\;\ge\;1.282494797984843521\ldots\]

    Заметим здесь одну закономерность, к которой вернёмся позже: во всех рекордных примерах заказы попарно не делят друг друга и лежат в узкой полосе, внутри одного “двойного окна” [n,2n], то есть никакое значение не превосходит удвоенного другого. Все семнадцать заказов в рекордном примере укладываются в одно двойное окно. Это не совпадение, и мы ниже объясним, почему так.

    В Части II появились и первые верхние оценки: на классе таких вот конструкций (два пути на терминал, пересекающиеся по одному ребру интервалы) метод не может дать оценку больше 3/2. Это, конечно, верхняя оценка только на очень конкретный класс графов, то есть ограничение метода, а не какая-то интересная теорема сама по себе.

    Потом случилось очень крутое событие, которое меня изрядно вдохновило продолжать. Я выложил репозиторий с сертификатами и верификаторами, и Альфредо де ла Фуэнте (Alfredo De la Fuente) прислал pull request: транспонировать правые концы двух интервалов и переоптимизировать заказы. Его сертификат прошёл все наши проверки, и текущий рекорд теперь community-contributed:

        \[C\;\ge\;\frac{160325086265636045340018727271}{125000000000000000000000000000}\;=\;1.28260069012508836\ldots\]

    Мне очень понравилось, что задача вызвала интерес у сообщества. На Vibemathed мой пост с этими результатами тоже получил довольно много по меркам этого сайта комментариев. В частности, конечно, меня ткнули носом в том, что Matthew Protti был первым с оценкой, близкой к \tfrac98.)

    Лестница рекордов по числу терминалов k выглядела так: k=4: 1.13975, k=5: 1.16798, k=6: 11-4\sqrt6, k=7: 13/2-2\sqrt7, k=8: \approx1.2148, k=17: 1.2826.

    Запомните и её — к ней мы тоже вернёмся.

    А нельзя ли чего-нибудь доказать?

    К этому моменту у константы C было уже довольно много нижних оценок и удручающе мало верхних. Хуже того: для общих графов и произвольных заказов было неизвестно, существует ли вообще конечная константа C, то есть неизвестно, конечна ли она в принципе. С этого вопроса и началась Часть III.

    Вспомним, почему в гипотезу Гёманса верили: доли дробного потока по путям выглядят как вероятности, и независимый выбор путей даёт в среднем и нужные нагрузки, и нужную цену. Контрпример показал, что независимое округление разваливается. Но сам вероятностный язык можно было использовать и дальше.

    Вот главный принцип, на котором стоит вся Часть III: раскладываем ошибку на множители, сохраняя среднее. Иначе говоря, мы ищем не один поток (маршрутизацию, routing), а распределение на потоках, у которого

    • математическое ожидание нагрузок равно дробному потоку \mathbf{x} в точности, на каждой дуге, и при этом
    • каждый атом распределения заключён в “ящике”: \mathbf{Y}\le\mathbf{x}+CD\mathbf{1} почти наверное.
    Точное среднее маршрутизаций внутри ограничивающей коробки

    Если такое распределение есть, то сохранение цены получается автоматически: средняя цена равна \mathbf{c}^\top\mathbf{x}, значит, какой-то атом стоит не дороже. После этого цены рёбер вообще исчезают из задачи, и остаётся чистая “геометрия” (ну, не настоящая геометрия, конечно): какого размера нужен “ящик”, чтобы \mathbf{x} смог стать точным средним целых маршрутизаций?

    Это нехитрая интуиция, и так люди уже думали о потоках. Первым интересным (и, насколько я могу судить, новым) результатом Части III стало то, что это не просто удобный приём, а приём достаточный. Для любого класса графов, замкнутого относительно удаления дуг (а это все естественные классы: планарные, последовательно-параллельные, деревья…), выполняется равенство: оптимальная константа сохранения цены в точности равна минимальному радиусу ящика для точных средних.

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

    Дальше мы использовали тот же вероятностный язык в двух направлениях: изучали арифметику значений заказов и геометрию взаимодействия путей.

    Арифметика: делимость бесплатно, несравнимость нет

    В этой науке есть классический результат Skutella (2002): если заказы образуют цепочку делимости (каждый делит следующий), гипотеза Гёманса верна как есть, с константой 1. На языке точных средних это “локальный закон”: внутри цепочки делимости мы можем явно построить нужное распределение.

    Часть III превращает это в общий принцип факторизации:

    • разобьём множество значений заказов на цепочки делимости,
    • построим распределение в каждой цепочке независимо,
    • перемножим полученные распределения.

    При этом точные средние складываются, радиусы складываются, и каждая цепочка платит один раз своим максимумом. И получается, что

        \[C\;\le\;\frac{\text{sum of divisibility chain maxima}}{D},\]

    где D — максимальное значение одного заказа, а оптимальное покрытие цепочками считается за полиномиальное время через паросочетание максимального веса.

    Если быть точным, то результат говорит, что ключевым объектом для нас является разбиение \mathcal{P} мультимножества заказов (множества терминалов) на цепочки делимости B. Мы сможем построить нужный “ящик” радиуса

        \[S(\mathcal{P})=\sum_{B\in \mathcal{P}}\max_{i\in B}d_i,\]

    то есть любой дробный поток \mathbf{x} будет выпуклой комбинацией “опорных маршрутизаций” (support routings) \mathbf{y} с точно совпадающим средним и радиусом S(\mathcal{P}):

        \[|\mathbf{y}-\mathbf{x}|\le S(\mathcal{P})\mathbf{1}.\]

    Например, можно разбить заказы на множества по значениям, т.е. если \mathcal{V}=\{d_i\} именно как множество, без повторов, и если R=\sum_{v\in\mathcal{V}}v, то

        \[\textbf{x}\in\mathrm{conv}\bigl\{\textbf{y}:\ \textbf{y}\text{ is a support routing},\ |\textbf{y}-\textbf{x}|\le R\textbf{1}\bigr\},\]

    а значит, в частности, аддитивная константа на этом примере не превышает \frac RD (константу ещё на максимальное значение заказа нужно разделить).

    Рассмотрим маленький пример: пусть у нас заказы \{6,3,2\}. Наивная сумма даёт C\le(6+3+2)/6=11/6, но 3\mid 6, поэтому покрытие \{6,3\},\{2\} стоит (6+2)/6, и C\le 4/3. Добавление значения 1 ничего не меняет — единица прицепится к любой цепочке бесплатно. А вот для попарно несравнимых \{6,5,4\} никакое покрытие не побьёт простую сумму.

    Именно поэтому в контрпримерах всё время появляются попарно не делящие друг друга заказы в узкой полосе. Теперь это не эмпирическое наблюдение, а теорема о том, где метод работает, а где не очень.

    Немедленные следствия:

    • если значений всего два, d < D, то C\le 1+d/D\le2 (это константа Морелла — Скутеллы, теперь доказанная для всех примеров с двумя значениями);
    • если в каждой диадической полосе (2^{-(j+1)}D,2^{-j}D] не больше одного значения, то C\le 2 (достаточно их все просуммировать как 1+\frac12+\frac14+\frac18+\ldots);
    • если в примере конечное множество значений, то у него будет конечная константа.

    Последнее утверждение, конечно, не означает глобальной конечной константы, но все наши контрпримеры в Частях I–II использовали не больше девяти различных значений, так что для всех них можно теперь какую-то общую верхнюю оценку получить (не очень интересную).

    Давайте разберём ещё чуть более содержательный пример, чтобы увидеть, как это суммирование оценок работает. Вот он:

    Здесь терминал t_1 (спрос d_1=6) использует общую дугу с весом \tfrac 13, терминал t_2 (спрос d_2=5) с весом \tfrac 12, так что нагрузка получается x_e=6\cdot\frac13+5\cdot\frac12=\frac92.

    В этом примере четыре целочисленных маршрутизации; назовём их 00, 01, 10, 11: первый бит показывает, идёт ли через e путь в t_1, а второй — в t_2. И если рассмотреть веса как независимые вероятности, то получатся вероятности как на картинке и ожидание

        \[\mathbb{E}Y_a = \frac16\cdot 6 + \frac13\cdot 5 + \frac16\cdot 11 = \frac 92,\]

    то есть при таком разложении сохраняется точное среднее. А радиусы просто складываются и получается 6+5=11.

    На этом месте хочется, конечно, сказать: а давайте округлим значения заказов вверх до какого-то общего значения или одной цепочки делимостей, разложим увеличенный поток, а потом восстановим изначальные результаты. Но так не работает (это тоже один из результатов): общее разложение не будет знать, какой путь ведёт к какому терминалу, а это будет необходимо для восстановления; не буду вдаваться в детали, но про это у нас тоже есть небольшой раздел.

    А вот округление вниз работает, если срезанная часть заказа сначала удаляется из самых дорогих путей. Здесь тоже вдаваться в детали не буду, но, в общем, получается целое семейство оценок, параметризованное основанием b и глубиной сетки m. Две первые его точки давно известны — это оценки Скутеллы

        \[\mathbf{y}\le2\,\mathbf{x}+D\,\mathbf{1},\qquad \mathbf{y}\le\sqrt2\,\mathbf{x}+\Bigl(1+\tfrac1{\sqrt2}\Bigr)D\,\mathbf{1},\]

    а дальше кривая продолжается на все m, с пределом в чистом сдвиге и полезным следствием для потоков ограниченной нагрузки:

    Семейство shifted-chain оценок и следствие для ограниченной нагрузки

    Вся задача свелась к одному окну [n,2n]

    Самый концептуальный результат на этом арифметическом пути — редукция слияния (merger reduction). Определим “оконную константу” K^\ast: наилучшую аддитивную ошибку точного среднего для примеров, все заказы которых лежат в одном “двойном окне” вида [n, 2n]. Тогда мы доказали, что

        \[C_{\mathrm{opt}}\;\le\;K^\ast\;\le\;2\,C_{\mathrm{opt}}.\]

    Иными словами, универсальная конечная константа существует тогда и только тогда, когда конечна K^\ast, и вся общность задачи по сути свелась к вопросу об одном окне значений [n,2n].

    Например, все заказы рекорда с k=17 сами лежат в одной такой полосе (\frac12, 1], и более точное рассуждение о выпуклых оболочках показывает, что этот пример даёт

        \[K^\ast\;\ge\;2\,C_{17}\;=\;2.565201380250176725\ldots\]

    То есть слить одно окно “почти бесплатно” (с K<2.565) невозможно — нижние оценки бьют и по этой цели. Полный точный профиль рекордного потока (все пятнадцать сегментов его релаксированной границы) мы тоже посчитали и выложили:

    Точная граница relaxed-merger для 17-терминального потока

    Геометрия: пары бесплатны, первый враг — треугольник

    Теперь вторая ось частичных результатов. На арифметической оси мы ограничивали значения заказов, а граф и взаимодействие путей оставляли произвольными; здесь всё наоборот: заказы любые, но ограничена геометрия взаимодействия путей. Отправная точка — общее свойство всех наших контрпримеров: в них к каждому терминалу ведут ровно два простых пути. Назовём такие примеры двухпутевыми (two-path instances) и посмотрим, во что превращается задача.

    Когда путей ровно два, маршрутизация — это просто вектор битов \mathbf{z}\in\{0,1\}^k: z_i=1, если терминал i идёт по одному из своих путей (назовём его “поздним”, P^1_i), и z_i=0, если по другому (“раннему”, P^0_i). Дробный поток превращается в набор долей f_i\in[0,1]: с какой “вероятностью” терминал i выбирает поздний путь. А весь граф сворачивается в матрицу разностей маршрутов g: положим g_{ai}=+1, если дуга a лежит только на позднем пути терминала i, g_{ai}=-1, если только на раннем, и g_{ai}=0, если она лежит на обоих или ни на одном. Смысл этой матрицы в том, что ошибка любой маршрутизации на любой дуге записывается одной формулой:

        \[Y_a-x_a=\sum_i d_ig_{ai}(z_i-f_i).\]

    В хребтовых примерах матрица выглядит совсем наглядно: в строке дуги хребта +1 стоят напротив интервалов, которые её накрывают. Переключение такого терминала на поздний путь добавляет на этой дуге d_i; строка раннего частного выхода терминала i — одинокая -1, позднего — одинокая +1. В произвольных направленных ациклических графах знаки внутри одной строки могут смешиваться.

    Число ненулевых элементов строки назовём её арностью: это число терминалов, чьё переключение вообще затрагивает данную дугу.

    На этом этапе граф можно выбросить, и остаётся чистая комбинаторная задача: по знаковым строкам, заказам и долям найти распределение на булевом кубе, у которого маргиналы в точности равны f_i (это и даёт точное среднее), а ошибки всех строк на всех атомах не превосходят CD. Интуитивно чем меньше арности строк, тем легче; строки арности 1 тривиальны: их ошибка d_i(z_i-f_i) никогда не превосходит D по модулю.

    Но есть и неприятный сюрприз: на абстрактном уровне уже пары, то есть строки арности 2, могут стоить больше D. Пример из статьи: два терминала с единичными заказами, доли (f_1,f_2)=(3/5,4/5) и две строки со знаками (+,+) и (+,-). У первой строки состояние 00 имеет ошибку -7/5, так что радиус 1 требует p_{00}=0; у второй за ящик вылезает состояние 10 с ошибкой 6/5, то есть нужно ещё и p_{10}=0. Вместе с маргиналами это несовместно: обозначив t=p_{11}, получаем p_{00}=t-2/5 и p_{10}=3/5-t, и первое условие требует t=2/5, а второе — t=3/5. Лучший достижимый радиус здесь 6/5.

    Столько же, 6/5, даёт и “нечётная дыра” — цикл длины пять из всюду положительных парных строк, главный подозреваемый ещё со времён абстрактного анализа Части I. Если бы такие знаковые узоры реализовывались потоками, ни о какой “бесплатности пар” речи бы не шло.

    Первая структурная теорема Части III: они не реализуются. Начнём с самого простого случая: у двухпутевого потока для любой пары терминалов \{i,j\} произведение знаков g_{ai}g_{aj} одинаково на всех дугах, где оба сомножителя ненулевые. Доказательство — симпатичная графовая склейка, которую я здесь не буду объяснять в деталях:

    На самом деле верно гораздо больше: вся матрица g (после удаления нулевых строк) — это сетевая матрица (network matrix), матрица знаковых инциденций путей в некотором дереве, и в частности она вполне унимодулярна. Идея доказательства: в носителе двухпутевого потока в каждую вершину можно прийти из источника не более чем двумя способами — третий способ немедленно дал бы третий путь какому-нибудь терминалу. Вершины, достижимые одним способом, образуют дерево, а компоненты, достижимые двумя, — это общие “хвосты” пар путей, которые в разности всё равно сокращаются. После некоторых преобразований разность путей каждого терминала превращается в обычный путь между двумя листьями одного общего дерева, а матрицы путей в дереве — это и есть сетевые матрицы.

    Отсюда сразу получается и общее правило чётности: если несколько парных строк образуют “чистый цикл” длины n, произведение всех их знаков обязано равняться (-1)^n, иначе нашёлся бы минор с определителем \pm2. Цикл из примера выше и всюду положительный 5-цикл это правило нарушают.

    Теперь можно собрать положительный результат — обещанную бесплатность пар. Пусть все строки имеют арность не выше 2. Посмотрим на одну парную строку, для определённости со знаками (+,+), и на четыре угла булева квадрата. Смешанные углы хороши всегда: скажем, в угле 10 ошибка равна d_i(1-f_i)-d_jf_j и по модулю не превосходит D. Плохим может оказаться только угол 11 (сверху) или угол 00 (снизу), причём не оба сразу: их ошибки различаются ровно на d_i+d_j\le2D.

    Числовой пример из статьи: единичные заказы, доли (1/5,1/5); ошибки в состояниях 00,10,01,11 равны -2/5, 3/5, 3/5, 8/5, и плох только угол 11. Плохой угол отрезается одним целочисленным неравенством — здесь z_i+z_j\le1, — дробная точка ему удовлетворяет, и хорошие вершины дают готовую смесь с точным средним:

        \[(1/5,\,1/5)\;=\;\tfrac35\,(0,0)+\tfrac15\,(1,0)+\tfrac15\,(0,1).\]

    Осталось проделать это одновременно по всем строкам: пересечём единичный куб со всеми неравенствами, отрезающими плохие углы. Нормали этих неравенств — строки самой матрицы g (с точностью до знака), правые части целые, и вполне унимодулярность гарантирует, что получившийся многогранник целочисленный. Значит, точка долей (f_i) раскладывается в выпуклую комбинацию его булевых вершин, и каждая такая вершина обходит все запрещённые углы всех строк сразу. Итого получается теорема.

    Теорема. У двухпутевого примера, все строки которого имеют арность не выше 2, точный радиус равен ровно D — при любой цикличности взаимодействий.

    В обозначениях, которые пригодятся ниже: локальная константа арности два E(2)=1. Меньше единицы не бывает уже на одном терминале: если доля одного из путей стремится к нулю, любая смесь с точным средним обязана давать этому пути его положительную массу, и перегрузка соответствующего атома стремится к D.

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

    Итак, первый настоящий враг — строки арности 3. И минимальный живой пример нам давно знаком — “тернарное ядро”, тот самый треугольник: хребет из трёх дуг и три интервала [0,1], [0,2], [1,2], дающие строки 110, 111, 011:

    Тернарное ядро взаимодействий со строками 110, 111 и 011

    И здесь Часть III доказывает точное значение: локальная константа тройного ядра равна ровно 9/8. Не “не меньше”, как в контрпримере, а ровно: верхняя оценка теперь тоже есть, с явным экстремальным семейством решений. Треугольник Рыбина оказался не случайной находкой, а точным локальным экстремумом общей теории.

    Дальше — четыре колонки. Существует ровно пять максимальных носителей взаимодействия четырёх терминалов (с точностью до перестановок; эта классификация тоже нетривиальная и тоже доказывается в статье):

    Пять нормальных форм взаимодействия четырёх терминалов

    Форма 0 — это интервальное ядро Части I, и её точная локальная константа равна

        \[E(4)\;=\;\frac{299-41\sqrt{41}}{32},\]

    в точности константе нашего контрпримера; остальные четыре формы дают ровно 9/8. Доказательство верхней границы для E(4) — самое тяжёлое место статьи: 2015 граничных клеток, закрытых вручную выписанными покрытиями, проекциями и одним аргументом типа Хелли, без численных переборов (численный поиск использовался только чтобы найти граничные клетки, ни одно его решение в доказательство не входит).

    Его мы, конечно, пропустим, зато теперь можно показать всю лестницу целиком:

    Лестница доказанных локальных констант и рекордных значений

    Синие квадраты — теоремы с точными оценками: E(2)=1, E(3)=9/8, E(4)=(299-41\sqrt{41})/32. Оранжевые кружки — рекорды из Части II, которые мы теперь считаем гипотетическими следующими ступенями той же лестницы. Пунктир — гипотеза Части II о супремуме 4/3 для этого класса. Первые две нетривиальные ступени лестницы совпали с константами контрпримеров: нижние оценки Частей I–II, найденные задолго до всей этой теории, оказались точными значениями экстремальных задач, о существовании которых мы тогда не подозревали. По-моему, это крутой сюжетный поворот.

    Раскраски, Property B и первый ответ для неограниченного класса

    Локальные ядра — это хорошо, но что делать с глобальной системой, где троек много и они переплетены? Здесь помогает классическая комбинаторика.

    Строки взаимодействия арности \le2 бесплатны (один D-ящик). Значит, для системы с арностью \le3 достаточно раскрасить терминалы в два цвета так, чтобы ни одна тройная строка не стала одноцветной: внутри каждого цвета арность упадёт до двух, каждый цвет заплатит один D-ящик, итого 2D.

    Свойство “гиперграф двураскрашиваем без одноцветных рёбер” — это классическое Property B (в честь Бернштейна, название Миллера, 1937).

    В общем случае Property B может не выполняться. Минимальный трёхмерный контрпример — плоскость Фано, семь точек и семь прямых.

    Но есть и другой факт: плоскость Фано не реализуется путями в дереве. Инцидентности семи путей и семи рёбер дерева не могут образовать Фано — после стягивания всё упирается в диаметр-3 и двойную звезду, и одна прямая должна была бы лежать во всех семи тройках. Классическое препятствие исключается самой геометрией деревьев.

    А положительная сторона доказывается через рёберные раскраски: пути в дереве с нагрузкой не выше \Delta на ребро можно правильно раскрасить в \lfloor3\Delta/2\rfloor цветов (это теорема Притчарда — Ротвосса, в основании которой лежит теорема Шеннона о рёберной раскраске мультиграфов). Для \Delta=3 берём четыре цвета и сливаем их в два блока \{1,2\} и \{3,4\}: три пути на одном ребре имеют три разных цвета, значит, ни одна тройка не окажется в одном блоке. Итого:

    Теорема. Если арность взаимодействия не превышает 3, то радиус не превышает 2D.

    У нас получилась первая конечная константа для класса, в котором не ограничено ничего, кроме локальной арности: ни число терминалов, ни цикличность, ни значения заказов. Для произвольной арности m тот же приём даёт \lceil\lfloor3m/2\rfloor/2\rceil\cdot D.

    Классы графов и новый планарный рекорд

    Теперь можно свести результаты о классах графов в единую таблицу:

    • исходящие деревья: C=0 (всё тривиально маршрутизируется);
    • двухслойные “хабы” (источник — склады — клиенты): C=1, это известный результат; а мы ещё подпёрли его нижней границей 1-1/m, которую получили из классического семейства “m+1 работ”;
    • последовательно-параллельные графы (series-parallel): C\le1 (Almoghrabi, Skutella, Warode, 2026);
    • внешнепланарные двухвыходные интервальные хребты: C=1 ровно, и константа 1 здесь достигается уже одним терминалом.

    А для планарных графов мы подняли нижнюю оценку. Построили новый интервальный пример с шестью терминалами, полным перебором 64 маршрутизаций, точной смесью из семи атомов и сертификатом планарности через систему вращений:

    У него

        \[C_{\text{planar}}\;\ge\;\frac{58676765987259}{50000000000000}\;=\;1.17353531974518,\]

    и мы знаем классическую верхнюю оценку 2. Забавно, что дальше по лестнице рекордов планарность немедленно заканчивается: уже пятитерминальная рекордная геометрия непланарна.

    Как проверяли и как шёл процесс

    Стандарт проверки во всех работах был один и тот же: каждое числовое утверждение проверяется в точной рациональной арифметике программой, которая пересобирает пример из списка дуг: заново находит все простые пути поиском в глубину, заново перечисляет маршрутизации, заново решает задачи линейного программирования. У каждого сертификата есть вторая, независимо написанная реализация проверки. Финальные доказательства классов и локальных констант все solver-free, то есть численный поиск разрешён только на стадии открытия новых примеров, и ни одно решение солвера не входит в доказательство как посылка. Все 37 новых сертификатов Части III лежат в репозитории, и приложение статьи объясняет по пунктам, что именно проверяет каждый файл.

    И об ошибках, потому что они тоже были, и это нормально. За время проекта adversarial-проверки (вторая модель против первой, кампания против теоретика) поймали довольно много ошибок, в том числе “тождество” C=1+\Delta, которое при внимательном взгляде оказалось одним и тем же неравенством, записанным дважды; красивое “следствие” про нечётные дыры, опровергнутое затем теоремой о сетевых матрицах; целое доказательство через округление вверх, и много чего другого.

    В общем, доказательства от LLM безусловно нужно проверять, но конкретно в этом исследовании оказалось достаточно проверять их другой LLM: Claude ловил ошибки GPT и наоборот, и после пары таких раундов я уже никаких ошибок больше не находил (но всё равно искал! это важно!).

    Теперь о процессе, потому что вопрос “как вы работаете с моделями” мне задают чаще, чем вопросы о потоках.

    Работали три модели в разных ролях. GPT 5.6 Sol гоняла экспериментальные “кампании”: я (вместе с Claude) писал подробный бриф — какие гипотезы проверить, какие сертификаты сгенерировать, в каком формате отчитаться, — а Sol возвращалась с результатами, часто неожиданными. Claude Fable 5 и Claude Opus 5 занимались теорией, проверкой и текстом: верифицировали каждый раунд, доказывали, что доказывается вручную, ловили ошибки (свои, мои и чужие) и собирали статью.

    Таких циклов “кампания — верификация — теория — новый бриф” было примерно восемь. Ключевые идеи — точные средние, сетевые матрицы, редукция к окну, четырёхцветное слияние — в основном предлагали модели; я выбирал направления, закрывал тупиковые ветви исследований, лично перепроверил и переписал все доказательства и, разумеется, несу ответственность за все оставшиеся ошибки.

    В отличие от истории Рыбина, это не был one-shot tour de force; это был именно длинный совместный проект, и, кстати, чертовски интересный! Присоединяйтесь!

    Что осталось открытым

    Честный список самого важного.

    • Существует ли конечная универсальная C? Главный вопрос стоит как стоял, но теперь он эквивалентен конечности оконной константы K^\ast, и известно, что K^\ast\ge2.5652.
    • Гипотеза 4/3: лестница рекордов двухпутевого класса, кажется, стремится к 4/3; доказать (или опровергнуть) сходимость — самая близкая открытая цель.
    • Глобальная арность 3: локально 9/8, глобально доказано 2D; правда где-то между.
    • Планарные графы: теперь C\in [1.17353\ldots,\,2], и обе границы выглядят улучшаемыми.
    • E(5) и дальше: совпадут ли следующие ступени лестницы рекордов с точными локальными константами, как это случилось с E(3) и E(4)?

    Заключение

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

    В постах про двойное покрытие циклами, якобиан и Диница — Гарга — Гёманса я писал про молниеносные результаты: одна гипотеза — один промпт — один документ. Этот пост — про другой, более прозаический и наверняка куда более массовый жанр: LLM как полноценные соавторы в долгом проекте, с разделением ролей, взаимной проверкой и накоплением результатов.

    А что дальше, коллеги?

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • 35MM и 7th Sector: игры Сергея Носкова

    35MM и 7th Sector: игры Сергея Носкова

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

    В результате же обе игры выглядят как продукт целой студии. Не “неплохо для инди”, а действительно хорошо, твёрдый AA. Постсоветский постапокалипсис в 35MM и постсоветский киберпанк в 7th Sector сделаны так, что часто хочется останавливаться и разглядывать детали кадров. Обе игры я прошёл с удовольствием, и обе рекомендую (хотя у обеих есть и свои проблемы).

    Кто такой Сергей Носков

    Носков — москвич, по образованию психолог, в геймдев попал случайно: “в 2012 году случайно наткнулся на игровой движок Unity, с которого и началось моё погружение в мир геймдева“. Тем же летом он выпустил дебютную игру “Свет”. У неё есть The Light Remake, и его было бы логично здесь тоже обсудить, но оказалось, что я в него уже играл много лет назад и почти ничего не помню, так что и перепроходить не хотелось, и рассказать нечего.

    Дальше были игры, о которых мы сегодня говорим, а вершиной пока стала Hail to the Rainbow, которую он делал больше пяти лет и которая вышла осенью 2025-го (в неё я пока не играл, но собираюсь).

    О том, почему он работает в одиночку, Сергей говорит так: “Я должен всецело понимать, что в [проекте] происходит и как он устроен. Только тогда я смогу полностью его контролировать и ни от кого не зависеть”. В качестве ориентиров он называет Half-Life 2, Blade Runner и работы Саймона Столенхага, и это действительно именно тот стиль.

    35MM: двое идут через мёртвую Россию

    35MM вышла в 2016 году и делалась примерно два года. Это этакий road trip от первого лица: двое мужчин идут пешком через постапокалиптическую Россию, из точки А в точку Б.

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

    Но главное в 35MM — не апокалипсис, а двое идущих. Один из них молчаливый фотограф с плёночным аппаратом (отсюда и название), второй — разговорчивый Петрович, который у костра рассказывает, как всё начиналось. Это очень простой приём, но он здесь работает отлично: вся история подаётся через двух уставших мужиков, которые идут по грунтовке и разговаривают.

    И интонация здесь верная. 35MM не про выживание, не про монстров и (почти) не про экшен. Она про то, как выглядит опустевшая страна: заброшенные деревни с покосившимися избами, разграбленная районная больница с табличкой “Ординаторская”, часовня со свечкой и иконой, дрезина на заросшей узкоколейке, советская мозаика с солнцем на стене трансформаторной будки. Иногда попадаются живые люди — например, старик, который зовёт переночевать и напоить чаем с малиновым вареньем. Кстати, катсцен здесь много, и сделаны они тоже очень атмосферно.

    К концу дорога приводит в метро и в большой заброшенный город — панельки, проросшие деревьями дворы, брошенная скорая, пустой Дворец культуры… Выглядит всё это прекрасно.

    А вот с финалом, на мой вкус, вышло не очень. Игра долго и терпеливо строит человеческую историю про двух путников, а в конце сваливается в конспирологию и обрывается на скомканном твисте. Но всё равно worldbuilding первоклассный, и послевкусие остаётся очень хорошее.

    7th Sector: вы — искра в проводах

    7th Sector вышла в 2019-м и устроена совершенно иначе. Это двумерный сайд-скроллер с головоломками, а играете вы за… электрическую искру. Буквально: маленький разряд, который бегает по проводам, перепрыгивает между контактами, залезает в телевизоры, вентиляторы, счётчики и рубильники и таким образом двигается по городу. Получается и необычно, и стильно, и красиво.

    Мир игры — постсоветский киберпанк, город Новоград, “город дружбы народов”, как гласит плакат. Хрущёвки с неоновыми иероглифами, ЭЛТ-телевизоры с помехами, граммофон рядом с цифровым терминалом, ламповые радиоприёмники, объявления о пропавших людях, огромная статуя человека в шляпе и плаще над городом, поезд на эстакаде в розовом неоне. Смесь позднего СССР и Blade Runner тут доведена до полного правдоподобия, и это опять тот самый узнаваемый стиль Сергея Носкова.

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

    Головоломки в целом приятные: переключить питание в нужном порядке, не перегрузив линию; провести робота через тир с мишенями; собрать код по подсказкам в окружении; разобраться, куда ведёт какой кабель. Ничего запредельно сложного, но думать приходится, и решения обычно радуют.

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

    А сюжет здесь подан почти без слов, через окружение, экраны и сцены на заднем плане, и это типичный мрачный киберпанк. Тут есть и корпорации, и эксперименты над людьми, и ряды тел в капсулах, и несмколько концовок. Честно скажу, я разобрался в происходящем не полностью, но атмосфера от этого не страдает — скорее наоборот.

    Картинка и баги

    Что объединяет обе игры, кроме автора, так это картинка. Носков очень интересно работает со светом и туманом: почти в каждом кадре есть яркий источник света, глубина, дымка и продуманная композиция. В 35MM это серое небо и лучи сквозь деревья; в 7th Sector — синий разряд в темноте и розовый неон в дожде. Для игр, сделанных одним человеком, это невероятно круто, да и не только для них.

    Что тоже объединяет обе игры — баги всё-таки полностью победить не удалось. Например, у меня в обеих время от времени отказывали кнопки: нажимаешь, а ничего не происходит, и лечится это только перезапуском. Впрочем, лечится, ничего фатального не встречал.

    Заключение

    35MM и 7th Sector — очень разные игры: первая скорее про историю и интонацию, вторая — про механику и головоломки. Но обе стоят потраченного времени, и обе оставляют одно и то же ощущение: это авторские вещи, у которых есть свой голос. Примерно такой:

    Если выбирать одну, я бы советовал 35MM — она человечнее и сильнее цепляет, несмотря на слитый финал. Если хочется головоломок и не хочется читать записки — тогда 7th Sector, только будьте готовы к тому, что пара задач вас утомит. А вообще обе короткие, обе стоят копейки, так что лучше обе.

    Снимаю шляпу перед Сергеем Носковым, и теперь обязательно попробую и Hail to the Rainbow.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Tiny Bookshop: книжная лавка на колёсах

    Tiny Bookshop: книжная лавка на колёсах

    Tiny Bookshop — уютный симулятор книжного продавца, в котором маленькая лавка помещается в прицепе, море всегда где-то неподалёку, а суть геймплея в том, чтобы понять, какую книгу на самом деле хочет покупатель. Большинство книг здесь настоящие, и их действительно надо рекомендовать по содержанию.

    Книжный магазин на колёсах

    В Tiny Bookshop мы приезжаем в приморский городок Bookstonbury-by-the Sea с лавкой на колёсах и довольно скромным запасом книг. Постоянного помещения у магазина нет, зато каждый день можно выбрать новую стоянку: сегодня торговать на набережной, завтра отправиться на блошиный рынок, а потом встать поближе к рыбному рынку или другому людному месту.

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

    После открытия уже суетиться не нужно, это cozy-игра. Покупатели подходят к полкам, листают книги, иногда решаются на покупку, а иногда уходят. Можно переставлять запасы и следить, какие жанры заканчиваются, но Tiny Bookshop ни разу не tycoon и не превращает торговлю в управление складом. Денег обычно хочется больше, чем есть, но никакого особого недостатка тоже нету. Маленький уютный бизнес для души.

    Газета постепенно знакомит с городом, объявления позволяют пополнить ассортимент и отыскать забавные предметы для лавки, а новые места немного меняют состав покупателей и спрос. Есть украшения для прицепа, которые дают свои баффы. В результате игра получается достаточно разнообразной, и в ней есть ощущение прогресса.

    Почти настоящие рекомендации

    Главная находка Tiny Bookshop — настоящие книги. На полках стоят Агата Кристи, Стейнбек, Достоевский и десятки других вполне реальных авторов; у изданий есть обложки, жанры и короткие описания. Уже само по себе приятно торговать не условными “детективами легендарной редкости”, а книгами, которые читал или о которых хотя бы слышал.

    Но особенно хорошо это работает в рекомендациях. Время от времени покупатель не берёт книгу сам, а формулирует запрос. Кто-то хочет криминальный роман, действие которого происходит в узнаваемом реальном месте, и для ориентира вспоминает “Смерть на Ниле”. Другому нужен хоррор с захватывающим сюжетом. Третий любит научную фантастику, но не переносит юмор. После этого нужно перебрать ассортимент и предложить подходящий вариант.

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

    Конечно, настоящую работу книгопродавца здесь не моделируют. Выбор ограничен тем, что сейчас лежит в прицепе, критерии довольно широкие, а реакция покупателя быстро сообщает, угадал ли ты. И всё-таки момент, когда человек радуется правильно подобранной книге об архитектуре Британии, гораздо убедительнее безликого “задание выполнено”.

    Tiny and cozy

    Всё остальное в Tiny Bookshop старательно поддерживает уют. Букстонбери нарисован мягкими пастельными красками, у моря качаются лодки, вокруг лавки ходят постоянные знакомые, а между рабочими днями находятся небольшие поручения и разговоры. Можно подружиться с местными, помочь им, узнать городские новости и, разумеется, погладить и покормить собаку. Персонажи появляются снова, отношения понемногу развиваются, а ещё в каждой локации есть свои небольшие квесты, которые можно выполнить. Важные события здесь тоже уютные и соответствующего масштаба: встреча, местный праздник, вечер у костра.

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

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

    Это, конечно, мой личный выбор, и если вы хотите медитативно провести побольше времени в игре, Tiny Bookshop даст вам именно это: место, куда приятно возвращаться по вечерам. Так что хоть я и не стал проходить её до конца, Tiny Bookshop мне понравилась. Она красивая, добродушная и действительно расслабляющая, а идея с настоящими книгами и содержательными рекомендациями отличает её от десятков других уютных симуляторов. Так что рекомендую условно, под настроение.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Былина

    Былина

    “Былина” — стандартная action RPG, которая выезжает на том, что стандартная action RPG про Русь-матушку встречается всё-таки не каждый день. Здесь есть мечи и доспехи, карта и журнал заданий, сундуки, навыки, крафт, подземелья и боссы. И очень, очень много русского духа.

    Здесь Русью пахнет

    Былина” начинается с того, что молодой воин Сокол отправляется на подвиги и почти сразу погибает. Игра даже выдаёт торжественную надпись “И Сокол умер”, после чего, разумеется, не заканчивается. Героя возвращает к жизни загадочный дух, который теперь делит с ним одно тело (не самый свежий ход, ага). Душу предстоит вернуть, с новым соседом — разобраться, а заодно, раз уж взялся, спасти Тридевятое царство.

    Исторической реконструкции от “Былины” ждать, конечно, не стоит. Это смесь былин, сказок и современных стереотипов о древней Руси. За одним поворотом стоят деревянные избы и чинные старцы, за другим — огромная разумная жаба, за третьим — крепость, будто собранная для фэнтезийного фильма, а где-то неподалёку обязательно прячется очередная нечисть. Сюда отлично помещаются и Кощей, и берёза с глазами, и турнир деревенских силачей, и квест под названием “Месть Золотой Рыбки”.

    Такой развесистой клюквы в игре много, собственно, это и есть суть игры. Сокол бродит по осенним лесам, болотам, деревням, подземельям, княжеским палатам и Тридевятому царству. Локации иногда кажутся слишком большими, но всегда стараются показать что-нибудь новое. Мне понравился тёплый деревенский вайб: торговцы, телеги, игра в городки, сервированные столы…

    Юмор бывает разный, но обычно довольно детский и построен на помещении сказочных объектов в более реалистичный контекст. Не каждая шутка реально хороша, но в целом создаётся мир в этаком духе русского Пратчетта (у него ведь тоже шутки в основном детские, да и принцип в целом тот же).

    Зато иногда герои выражаются весьма не по-детски. Это даже как-то неожиданно было, но тоже добавило колорита. Правда, недетские выражения не озвучены, однажды даже слышал реплику “Иди лесом”, когда написано было нечто совсем другое.

    Среди персонажей здесь Василий Пьяница, Жабная Особа и Берёза с глазами. Чтобы поднять уровень, надо обняться с домовёнком; их всех зовут Кузя, и выглядят Кузи о-очень специфически. В общем, думаю, стиль вы поняли.

    Но при этом иногда включается натуральное тёмное фэнтези, со всеми подробностями, что тоже приятно разнообразит происходящее:

    RPG как RPG

    А вот механически “Былина” очень скромно выглядит. Мы получаем задания, идём по маркеру, разговариваем, дерёмся, собираем добычу, меняем снаряжение и снова идём по маркеру. В журнале есть основные и побочные квесты, в инвентаре — мечи и доспехи, в меню — способности и улучшения. Между походами можно поговорить с жителями, поторговать и подготовиться к следующей вылазке. Всё сделано понятно и в целом удобно (кроме инвентаря, да и бог с ним), но очень стандартно.

    Бои устроены примерно так же. У Сокола есть обычные удары, уклонения, щит и способности, несколько видов оружия, у которых со временем меняются циферки, встречаются арены, ловушки и боссы. Боссы, кстати, мило сделаны, мне понравились, но это тоже скорее про сеттинг, чем про геймплей.

    К счастью, разработчики понимали, что механиками они игрока не удержат, так что, во-первых, постоянно меняют декорации и добавляют сюжет, а во-вторых, разнообразят бои загадками; некоторые загадки вполне даже свежо смотрятся.

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

    Заключение

    В общем-то, добавить уже и нечего: “Былина” — это очень прямолинейная RPG, ничем не выдающаяся, местами немного затянутая, хотя в целом короткая (и это большой плюс!). Но суть здесь в сеттинге: избы, нечисть, рисованные рожи, говорящие жабы, солёные шутки и русский текст, который не выглядит переводом с английского, — это и есть главное содержание.

    Так что ознакомиться можно, для доброй былины может и этого оказаться достаточно.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Всё течёт, всё опровергается: гипотеза Диница — Гарга — Гёманса

    Всё течёт, всё опровергается: гипотеза Диница — Гарга — Гёманса

    Введение

    В прошлый раз, рассказывая про контрпример к проблеме якобиана, я закончил пост вопросом: “Что дальше, коллеги?”

    Ответ занял два дня.

    22 июля Дмитрий Рыбин написал в X, что GPT 5.6 Pro опровергла гипотезу Диница — Гарга — Гёманса (Dinitz–Garg–Goemans conjecture) из теории потоков в графах. Гипотеза простояла с конца 1990-х; в статье 2025 года Swamy et al. всё ещё называли её “a famous conjecture” и писали, что даже существенно ослабленный вариант был бы прорывом.

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

    Более того, контрпример оказался не просто верным, а очень интересно устроенным. Внутри него прячется известный в комбинаторной оптимизации объект — треугольник попарных конфликтов.

    Давайте разберёмся, что такое делимые и неделимые потоки и в чём состояла гипотеза. Потом обсудим, почему она казалась естественной и почему её было так трудно доказать. Затем проверим контрпример, вытащим из него структурную идею и попробуем его уменьшить. А в конце, разумеется, посмотрим на промпты. Спойлер: там буквально написано “you should do a breakthrough”.

    Потоки, которые можно и нельзя делить

    Начнём с обычной транспортной сети. Есть ориентированный граф G=(V,A): вершины — перекрёстки или маршрутизаторы, дуги — дороги или каналы связи. У нас есть один общий источник s, например склад, и несколько терминалов t_1,\ldots,t_k, куда надо доставить грузы объёмов d_1,\ldots,d_k.

    У каждой дуги a есть пропускная способность u_a: больше этого количества груза одновременно по ней отправлять нельзя. Может быть и неотрицательная цена c_a за перевозку одной единицы груза.

    В более простой постановке задачи грузы можно делить, то есть, например, заказ объёма 10 разрешается разрезать на части: пять единиц поехали по одному пути, три по другому, две по третьему. Такой поток называется делимым или дробным (splittable, fractional flow). В каждой внутренней вершине выполняется закон сохранения: сколько потока вошло, столько и вышло; источник выпускает сумму всех заказов, а терминал t_i поглощает ровно d_i.

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

    Но во многих задачах груз делить нельзя. Контейнер должен ехать целиком, сетевое соединение должно выбрать один маршрут, задачу на вычислительном кластере нельзя на 37% выполнить на одном сервере и на 63% на другом. Тогда для каждого терминала t_i надо выбрать один путь P_i из s в t_i и отправить по нему все d_i единиц. Это неделимый поток (unsplittable flow).

    Если через дугу a проходят пути терминалов из множества I, нагрузка на неё равна

        \[y_a = \sum_{i\in I} d_i.\]

    А полная стоимость маршрутизации равна

        \[\mathbf{c}^\top \mathbf{y} = \sum_{a\in A} c_a y_a.\]

    Очевидно, что разница между двумя постановками есть, и немалая. Представьте один заказ объёма 10 и две дороги, по которым дробный поток отправляет по пять единиц. После запрета деления придётся выбрать одну дорогу и положить на неё все десять. Нагрузка на выбранную дорогу вырастет скачком на пять.

    Такое неизбежно происходит и в общем случае. Поэтому разумный вопрос здесь в том, насколько сильно придётся перегружать дуги. Обозначим максимальный размер заказа (demand, ещё переводят как “потребность” или “запрос”) через

        \[d_{\max}=\max_i d_i.\]

    Запас в один максимальный заказ выглядит естественно: если в процессе округления на дуге оказался один целый груз, хуже d_{\max} он добавить не может. Именно это наблюдение превратилось в нашу сегодняшнюю гипотезу.

    Теорема Диница — Гарга — Гёманса

    Задачу о неделимом потоке из одного источника ввёл Джон Клейнберг в работе 1996 года. Даже решить, существует ли неделимая маршрутизация, соблюдающая все ёмкости, NP-трудно; как отмечают авторы современного обзора, уже на графе из двух вершин с параллельными дугами сюда сводятся Subset Sum и Bin Packing.

    Но Ефим Диниц, Навин Гарг и Мишель Гёманс в работе “On the Single-Source Unsplittable Flow Problem” доказали важную теорему.

    Теорема (Dinitz–Garg–Goemans, 1999). Пусть \mathbf{x} — любой допустимый дробный поток. Тогда за полиномиальное время можно найти неделимый поток <em>\mathbf{</em>y}, для которого на каждой дуге

        \[y_a \leq x_a + d_{\max}.\]

    Если исходный поток соблюдает ёмкости, x_a\leq u_a, то, следовательно,

        \[y_a\leq u_a+d_{\max}.\]

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

    Это верная и интересная теорема, но она про частный случай нашей задачи, без стоимостей дуг. Вскоре Гёманс предложил естественное усиление.

    Гипотеза Гёманса. Если на дугах заданы неотрицательные цены c_a, то неделимый поток \mathbf{y} можно выбрать так, чтобы одновременно не слишком перегружались дуги,

        \[y_a \leq x_a+d_{\max}\quad\text{для всех }a,\]

    и не увеличивалась общая цена,

        \[\mathbf{c}^\top \mathbf{y}\leq \mathbf{c}^\top \mathbf{x}.\]

    Иногда её называют гипотезой Диница — Гарга — Гёманса по имени исходной теоремы, а иногда просто Goemans’ conjecture; важно, что теорема трёх авторов без стоимостей остаётся в силе, опровергнуто именно стоимостное усиление.

    Почему в гипотезу верили и почему она была сложной

    У гипотезы была очень убедительная вероятностная интуиция.

    Разложим дробный поток каждого терминала по путям. Долю потока на пути можно воспринимать как вероятность выбрать этот путь целиком. Если независимо выбрать по одному пути для каждого терминала, то в среднем нагрузка на каждой дуге будет ровно x_a, а средняя стоимость — ровно \mathbf{c}^\top \mathbf{x}.

    Значит, среди всех исходов точно есть хотя бы один со стоимостью не выше средней. С другой стороны, теорема Диница — Гарга — Гёманса гарантирует, что есть исход, в котором все нагрузки не превосходят x_a+d_{\max}.

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

    Конечно, здесь нет формального доказательства: из “существует дешёвый поток” и “существует поток без большой перегрузки” не следует, что существует поток одновременно дешёвый и без большой перегрузки. Именно так устроен новый контрпример.

    Но до него эта надежда выглядела вполне разумной. Многие классические методы зависимого округления умеют сохранять линейную целевую функцию и одновременно контролировать ошибки в ограничениях. Для специальных случаев получались положительные результаты: например, Skutella (2002) доказал гипотезу, когда все заказы кратны друг другу, точнее, образуют цепочку делимости (см. также Morell, Skutella, 2022).

    При этом прогресса в общем случае почти не было. В 2023 году Traub, Koch, Zenklusen писали, что не известно практически ни одного нетривиального класса графов, где точная гипотеза была бы доказана. Они получили важный результат для планарных графов, но только с вдвое большим запасом:

        \[y_a\leq x_a+2d_{\max},\qquad \mathbf{c}^\top \mathbf{y}\leq \mathbf{c}^\top \mathbf{x}.\]

    Даже в работе октября 2025 года вопрос, можно ли сохранять стоимость хотя бы с добавочной перегрузкой O(d_{\max}) в общих графах, назывался “широко открытым”, а его решение — потенциальным прорывом. Я нашёл только один (совсем недавний, 29 июня 2026!) результат Almoghrabi, Skutella & Warode, где гипотеза Гёманса доказывается для нетривиального класса: последовательно-параллельных ориентированных графов, причём даже в более общей многоисточниковой постановке.

    Почему это вообще так сложно? Потому что дробный поток живёт в выпуклом многограннике и оптимизируется линейными методами, а неделимый поток — это дискретный выбор целого пути для каждого терминала. Один выбор меняет нагрузки сразу на всех дугах пути; разные терминалы связываются через длинные общие куски маршрутов, а ограничение в d_{\max} не даёт усреднить ошибку по размеру графа. Надо одновременно попасть в тонкую полосу вокруг x по каждой дуге и не испортить одну глобальную цену.

    Может показаться, что контрпример давно можно было бы найти прямым перебором, но на самом деле пространство возможных контрпримеров здесь тоже огромное. Надо выбрать не только граф, но и терминалы, заказы, дробное разложение и цены. Прямой перебор плохо масштабируется, потому что даже у маленького графа слишком много числовых степеней свободы.

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

    Тем любопытнее, что итоговый контрпример можно нарисовать на салфетке.

    Семь вершин и девять дуг

    Вот весь граф. Число x на дуге — нагрузка дробного потока, c — цена одной единицы; у непомеченных цен значение нулевое. Двойными кружками отмечены терминалы.

    Заказы трёх терминалов равны

        \[d_1=15,\qquad d_2=10,\qquad d_3=15,\]

    поэтому d_{\max}=15.

    Сначала проверим, что нарисованные числа действительно задают дробный поток. Из источника выходит

        \[10+6+24=40=15+10+15.\]

    В трёх внутренних вершинах поток сохраняется:

        \[24=10+14,\qquad 14=5+9,\qquad 9=4+5.\]

    Наконец, в терминалы приходит ровно столько, сколько требуется:

        \[10+5=15,\qquad 6+4=10,\qquad 10+5=15.\]

    Стоимость положительна только на трёх оранжевых дугах:

        \[\mathbf{c}^\top \mathbf{x}=2\cdot10+3\cdot6+2\cdot10=58.\]

    Можно посмотреть на тот же поток отдельно для каждого терминала. У каждого груза есть ровно два пути — дорогой E_i и бесплатный Z_i:

        \[\begin{aligned}E_1&:s\to t_1, &Z_1&:s\to u\to v\to t_1,\\E_2&:s\to t_2, &Z_2&:s\to u\to v\to w\to t_2,\\E_3&:s\to u\to t_3, &Z_3&:s\to u\to v\to w\to t_3.\end{aligned}\]

    Обратите внимание, что E_3 тоже проходит по бесплатной дуге s\to u, но платит на дуге u\to t_3.

    Дробный поток раскладывается так:

    Каждый дорогой путь, если отправить по нему соответствующий груз целиком, стоит ровно 30:

        \[15\cdot2=30,\qquad 10\cdot3=30,\qquad 15\cdot2=30.\]

    Поэтому стоимость 58 можно пересчитать ещё одним способом:

        \[30\left(\frac{10}{15}+\frac6{10}+\frac{10}{15}\right)=30\left(\frac23+\frac35+\frac23\right)=58.\]

    А теперь запретим делить грузы. Для каждого терминала надо выбрать либо E_i, либо Z_i. Всего получается 2^3=8 вариантов. И 58 превращается в 60 из-за трёх арифметических конфликтов.

    Конфликт Z_2 и Z_3. Если второй и третий грузы одновременно идут по бесплатным путям, на дугу v\to w ложится

        \[10+15=25.\]

    Но гипотеза разрешает там не больше

        \[x_{vw}+d_{\max}=9+15=24.\]

    Перегрузка — одна единица.

    Конфликт Z_1 и Z_3. Эти два пути вместе дают на дуге u\to v

        \[15+15=30>14+15=29.\]

    Снова не хватает ровно одной единицы.

    Конфликт Z_1 и Z_2. Тут надо вспомнить, что третий груз проходит по дуге s\to u на обоих своих путях, и дорогом, и бесплатном. Поэтому вместе с Z_1 и Z_2 нагрузка на s\to u неизбежно равна

        \[15+10+15=40>24+15=39.\]

    И опять разность равна единице.

    Итак, любые два бесплатных пути несовместимы с ограничениями гипотезы. Значит, бесплатно может поехать не больше одного груза, а как минимум два обязаны выбрать дорогие пути. Каждый стоит 30, поэтому вся допустимая неделимая маршрутизация стоит не меньше

        \[30+30=60>58.\]

    Вот и всё опровержение.

    Для полноты выпишем все восемь вариантов. Слово bad означает, что после разрешённой добавки d_{\max}=15 какая-то дуга всё равно перегружена:

    E1 E2 E3   cost 90   good
    E1 E2 Z3   cost 60   good
    E1 Z2 E3   cost 60   good
    Z1 E2 E3   cost 60   good
    E1 Z2 Z3   cost 30   bad: v→w by 1
    Z1 E2 Z3   cost 30   bad: u→v by 1
    Z1 Z2 E3   cost 30   bad: s→u by 1
    Z1 Z2 Z3   cost  0   bad: s→u by 1, u→v by 11, v→w by 1

    Все четыре маршрутизации стоимостью меньше 60 нарушают ограничения, а все четыре, которые ограничения соблюдают, стоят 60 или 90.

    Я уже два раза написал разными словами одно и то же простое рассуждение, чтобы подчеркнуть, что как и в случае проблемы якобиана, проверка здесь вообще не представляет никакого труда, так что ждать рецензирования смысла нет.

    Кстати, граф не только ацикличен, но и планарен. Если забыть направления и разгладить три вершины степени 2, получится вообще K_4, полный граф на четырёх вершинах. Это тоже по-своему интересно, потому что по планарности могла бы проходить граница между верным и неверным утверждением, и Рыбин изначально просил найти контрпример для общего, непланарного случая, но GPT 5.6 в итоге нашёл и более сильный.

    Всё это, разумеется, не противоречит планарному результату 2023 года. Там разрешён зазор 2d_{\max}, а не d_{\max}, и при таком запасе в нашем примере можно отправить все три груза по бесплатным путям и получить стоимость ноль.

    Что там происходит на самом деле

    Теперь выкинем почти все детали графа и оставим его комбинаторный скелет.

    Введём переменную z_i, равную 1, если терминал i выбирает бесплатный путь Z_i, и 0, если дорогой E_i. Три конфликта говорят:

        \[z_1+z_2\leq1,\qquadz_1+z_3\leq1,\qquadz_2+z_3\leq1.\]

    Для нулей и единиц отсюда следует

        \[z_1+z_2+z_3\leq1.\]

    Это многогранник стабильных множеств треугольника: можно выбрать не больше одной вершины, потому что каждая пара соединена конфликтным ребром.

    А какие значения z_i соответствуют дробному потоку? Это доли грузов, отправленные по бесплатным путям:

        \[z_1=\frac5{15}=\frac13,\qquadz_2=\frac4{10}=\frac25,\qquadz_3=\frac5{15}=\frac13.\]

    Каждое попарное неравенство выполнено. Но сумма равна

        \[\frac13+\frac25+\frac13=\frac{16}{15}>1.\]

    Из-за этого неравенства и ломается гипотеза. Дробный поток живёт в обычной релаксации, где есть три попарных конфликта, но не видна их общая “треугольная” связь. Неделимая маршрутизация обязана удовлетворять более сильному неравенству суммы.

    А цены на дугах — просто разделяющая гиперплоскость. Поскольку каждый дорогой выбор стоит 30, стоимость равна

        \[30\bigl((1-z_1)+(1-z_2)+(1-z_3)\bigr).\]

    У дробной точки получается 58, а у любой целой точки с z_1+z_2+z_3\leq1 — не меньше 60.

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

    Это заодно объясняет, почему двух терминалов для этого механизма недостаточно. У одного конфликтного ребра неравенство z_1+z_2\leq1 уже полностью описывает выпуклую оболочку допустимых точек. Первое недостающее ограничение возникает именно на треугольнике, то есть нужны три бесплатных варианта. Я не утверждаю, что семь вершин абсолютно минимальны среди всех мыслимых контрпримеров (для этого нужен отдельный перебор топологий, и его ещё никто вроде бы не сделал), но структурное ядро здесь действительно самое маленькое возможное.

    Проверка, уменьшение контрпримера и граница 9/8

    Проверка. Главная опасность в проверке подобных конструкций — перебрать только заранее задуманные пути и забыть, что их куски можно склеить в новый маршрут. Судя по опубликованному диалогу, несколько ранних попыток GPT 5.6 именно на этом и сломались.

    Поэтому в проверочном скрипте мы с тем же GPT 5.6 не задавали шесть путей руками, а перебирали все простые пути из s в каждый терминал. Впрочем, здесь всё-таки негде ошибиться, получится именно шесть путей:

    t1: s→t1
    t1: s→u→v→t1
    t2: s→t2
    t2: s→u→v→w→t2
    t3: s→u→t3
    t3: s→u→v→w→t3

    После этого декартово произведение трёх двухэлементных списков даёт восемь маршрутизаций из таблицы выше.

    Можно ли уменьшить числа? Да. На последней странице сертификата выписано целое параметрическое семейство. Я перебрал его рациональные и целочисленные варианты и нашёл меньший целочисленный экземпляр на том же графе:

    • заказы (9,7,9), так что d_{\max}=9;
    • по бесплатным путям дробно идут (2,4,2) единицы;
    • единичные цены трёх платных дуг равны (7,9,7).

    Тогда каждый дорогой путь целиком стоит 63, дробная стоимость равна

        \[7\cdot7+3\cdot9+7\cdot7=125,\]

    а любая допустимая неделимая маршрутизация стоит хотя бы

        \[63+63=126.\]

    Три попарных конфликта снова превышают разрешённую границу ровно на единицу. В этой же семивершинной схеме, если требовать целые заказы и нагрузки и уравнять полную цену трёх дорогих выборов, d_{\max}=9 минимально; перебор меньших значений не даёт ни одного варианта, а при 9 решение (9,7,9) единственно.

    Исходные числа 58 и 60 для рассказа всё равно красивее, поэтому главным примером я оставил их. Но уменьшенный вариант даёт ещё один результат.

    Рассмотрим ослабленную гипотезу, где разрешается

        \[y_a\leq x_a+\alpha d_{\max}.\]

    В исходном примере любая маршрутизация стоимостью не больше 58 должна выбрать хотя бы два бесплатных пути. Для каждого такого выбора на конфликтной дуге нагрузка превосходит x_a на 16, то есть требуется

        \[\alpha\geq\frac{16}{15}.\]

    В уменьшенном примере требуется уже

        \[\alpha\geq\frac{10}{9}.\]

    А параметрическое семейство позволяет подойти ещё ближе к 9/8. Нормируем первый и третий заказы к 1, снова уравняем полную стоимость трёх дорогих путей и положим

        \[d_2=b=\frac34,\qquad r=\frac14,\qquad q=\frac12+\varepsilon,\qquad 0<\varepsilon<\frac16,\]

    где b,q,r — доли трёх грузов на бесплатных путях. Их суммарная дробная масса равна 1+\varepsilon>1. Если каждый дорогой путь целиком стоит C, дробная стоимость равна C(2-\varepsilon)<2C, поэтому сохраняющая стоимость маршрутизация обязана выбрать хотя бы два бесплатных пути. В то же время любой такой выбор требует коэффициента

        \[\alpha=\frac98-\frac34\varepsilon.\]

    Беря положительное рациональное \varepsilon сколь угодно малым, получаем контрпример для любого универсального коэффициента \alpha<9/8.

    Иными словами, для планарных графов естественный вопрос теперь звучит так: какой будет оптимальный “коэффициент невязки” между 9/8 и 2? Верхняя граница 2 известна из работы 2023 года, нижняя 9/8 получается уже из этой маленькой планарной конструкции.

    Для общих графов картина ещё менее понятна: неизвестно даже, достаточно ли вообще какой-нибудь универсальной константы при d_{\max} с одновременным сохранением стоимости. Так что хоть исходная гипотеза и пала, работа здесь ещё не вполне закончена.

    Четыре промпта

    Ну и наконец — как это было найдено.

    Публичный диалог с GPT 5.6 Pro совершенно не похож на тщательно спроектированный исследовательский промпт. Рыбин приложил материалы о задаче и попросил построить структурный контрпример для общего случая, добавив бессмертную фразу:

    You should do a breakthrough.

    Модель долго исследовала разные конструкции, выдавала частичные результаты и несколько раз не доходила до корректного ответа. Рыбин отвечал коротко и не пытался даже разобраться в том, что модель писала, по существу. После “Research conclusion” идут несколько страниц текста, но дальше диалог продолжается так:

    Двух промптов не хватило, и GPT 5.6 опять сдался (через полтора часа размышлений), но третий промпт всё ещё прямолинеен:

    И даже трёх промптов и пяти часов размышлений — о ужас! — не хватило. Так что Дмитрий Рыбин потерял терпение и написал коротко и прямо:

    Как видите, на четвёртый раз невод, pardon the pun, пришёл с золотою рыбкой. Всего четыре коротких сообщения, никакого “искусства промптинга”. Опять же, я так

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

    Но и преуменьшать роль модели здесь странно. Человек не подсказывал LLM граф, числа или даже идею треугольника конфликтов. Финальная конструкция появилась после нескольких часов самостоятельного поиска, а пользовательская обратная связь состояла из “продолжай” и “хватит частичных результатов”.

    Заключение

    Итак, гипотеза Диница — Гарга — Гёманса утверждала, что любой дробный поток можно округлить до неделимого, одновременно сохранив стоимость и увеличив нагрузку каждой дуги не более чем на один максимальный заказ.

    GPT 5.6 Pro нашла планарный ациклический граф с тремя терминалами, где дробный поток стоит 58, а любой неделимый поток в разрешённых границах стоит не меньше 60. Сертификат состоит из девяти дуг и восьми строк полного перебора; я независимо проверил и арифметику, и отсутствие дополнительных путей.

    Главная идея контрпримера — не сами числа, а треугольник конфликтов. Дробный поток использует три бесплатных выбора с суммарной массой 16/15, хотя целиком можно выбрать не больше одного. Цены лишь переводят недостающее неравенство z_1+z_2+z_3\leq1 в разрыв между 58 и 60.

    Теорема Диница, Гарга и Гёманса без стоимостей остаётся верна. Планарный результат с запасом 2d_{\max} тоже остаётся верен. И теперь появляется некоторый зазор, который можно пытаться сокращать: как мы тут увидели, та же конструкция показывает, что любой новый универсальный коэффициент должен быть не меньше \frac 98, то есть теперь можно сокращать расстояние между \frac 98 и 2.

    За три последних поста мы увидели сначала двухстраничное доказательство гипотезы о двойном покрытии циклами, потом многочлен, помещающийся в твит, а теперь — контрпример в виде стандартного треугольника целочисленной оптимизации. Но каждый из этих кажущихся простыми результатов закрыл гипотезу, над которой действительно думало много живых математиков.

    У меня нет сомнений, что если бы любой из этих результатов получил человек, он стал бы широко известен в узких кругах и всегда имел бы гарантированную профессорскую позицию в хорошем месте, даже если бы больше ничего великого не сделал и продолжал бы всю жизнь изучать следствия и расширения своего прорывного результата (таких примеров в науке много, это не что-то плохое). Так что вопрос о том, достигли ли AI-модели человеческого уровня в математике, кажется мне уже закрытым.

    А что ещё дальше, коллеги?..

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Басня о якобиане: The Fable of the Jacobian Conjecture

    Басня о якобиане: The Fable of the Jacobian Conjecture

    Введение

    Мы живём в дивном новом мире для математики. В мае внутренняя модель OpenAI опровергла гипотезу Эрдёша о единичных расстояниях, неделю назад GPT 5.6 доказала гипотезу о двойном покрытии циклами.

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

    На этот раз отличилась модель от Anthropic: 19 июля, пока человечество смотрело финал чемпионата мира по футболу, Claude Fable 5 построил контрпример к проблеме якобиана (Jacobian conjecture) — одной из самых знаменитых открытых проблем алгебраической геометрии, номеру 16 в списке Смейла, простоявшей с 1939 года.

    Если в прошлых сериях мы обсуждали хотя бы двухстраничные препринты, то здесь научная коммуникация стала ещё ближе к сингулярности; весь результат целиком существует в виде твита математика Левента Алпёге (Levent Alpöge):

    И в общем-то этим твитом всё сказано, дальше можно не читать, а пойти проверить (ниже будет код на десять строк). Но я, конечно, не могу этим ограничиться, так что кое-какой контекст вам всё-таки расскажу. Тем более что это (опять!) тот редкий случай, когда про решение знаменитой проблемы можно рассказать всё до последней формулы.

    Что такое проблема якобиана

    Пусть F = (F_1, \ldots, F_n): \mathbb{C}^n \to \mathbb{C}^n — полиномиальное отображение: каждая компонента F_i — многочлен от x_1, \ldots, x_n. Его якобиан — определитель матрицы частных производных

        \[\det JF = \det\left(\frac{\partial F_i}{\partial x_j}\right)_{i,j=1}^n.\]

    Если F обратимо, причём обратное отображение тоже полиномиально, то по формуле дифференцирования композиции \det JF \cdot \det J(F^{-1}) = 1, то есть якобиан \det JF — многочлен, обратимый в кольце многочленов, а значит, ненулевая константа. Гипотеза о якобиане утверждает, что верно и обратное:

    Гипотеза (Keller, 1939). Если \det JF — ненулевая константа, то F обратимо (и обратное отображение автоматически полиномиально).

    Отт-Генрих Келлер сформулировал её в 1939 году (изначально для многочленов с целыми коэффициентами); с тех пор она стала, пожалуй, главным открытым вопросом о многочленах от нескольких переменных, который можно рассказать любому студенту.

    Есть два класса примеров, на которых гипотеза очевидно работает:

    • линейные отображения (якобиан — определитель числовой матрицы) и
    • “треугольные” отображения вида (x + p(y), y) — тут якобиан равен 1, а обратное выписывается сразу как (x - p(y), y).

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

    Почему люди в неё верили? Во-первых, условие \det JF = \mathrm{const} \neq 0 означает, что Fлокальный диффеоморфизм в каждой точке: теорема об обратной функции даёт обратимость в окрестности любой точки, и вопрос только в том, склеиваются ли локальные обратные в глобальное.

    Во-вторых, в размерности 1 всё тривиально: f' = \mathrm{const} \neq 0 означает, что f линейна.

    В-третьих, давно известно, что вся проблема только в инъективности: по теореме Акса–Гротендика инъективное полиномиальное отображение \mathbb{C}^n \to \mathbb{C}^n автоматически сюръективно. Более того, его обратное обязательно будет полиномиальным; это называется теоремой Бялыницкого-Бирули — Розенлихта.

    Упомянутые выше результаты я вам с ходу не объясню, но для нас сейчас они значат, что контрпример — это обязательно отображение с константным якобианом, склеивающее какие-то две точки (нарушающее инъективность).

    Стоит сразу оговориться, что над полями положительной характеристики гипотеза неверна тривиальным образом: у отображения x \mapsto x - x^p над \overline{\mathbb{F}}_p производная равна 1, но оно склеивает в ноль всё простое подполе. Так что это вопрос исключительно про характеристику 0 (вещественные числа, комплексные числа), и у гипотезы не может быть никакого доказательства “грубой алгебраической силой”.

    Предыдущие попытки и частичные результаты

    Фабрика ложных доказательств. Отдельный жанр — история попыток. Гипотеза якобиана, конечно, была не так популярна, как великая теорема Ферма, но к 1982 году Басс, Коннелл и Райт в классическом обзоре насчитывали в литературе не менее пяти опубликованных ошибочных доказательств. И это именно в литературе, то есть прошедших рецензирование.

    Среди отметившихся принято называть вполне серьёзных математиков — например, Бениамино Сегре и Вольфганга Грёбнера (того самого, в честь которого названы базисы Грёбнера, к которым мы ещё вернёмся ниже). В 2004 году Мел Хохстер анонсировал доказательство двумерного случая, найденное Кэролин Дин, — и в нём тоже вскоре обнаружилась ошибка. Ну а в эпоху arXiv “доказательства” гипотезы о якобиане (в обе стороны, разумеется) выходили практически ежегодно.

    Об уровне задачи говорит, например, то, что диссертация Итана Чжана (Yitang Zhang), который потом совершил прорыв в задаче об ограниченных промежутках между простыми числами, была посвящена именно гипотезе о якобиане.

    Что уже было действительно доказано. Wang (1980) доказал гипотезу для отображений степени 2 в любой размерности. Moh (1983) — для n = 2 и степени до 100 включительно. Ягжев (1980) и Bass, Connell, Wright (1982) показали интересную редукцию степени: достаточно доказать гипотезу для отображений вида x + H(x), где H — однородное кубическое, правда, ценой роста размерности. Позже Дружковский (1983) сузил ещё сильнее, до H_i = \ell_i^3 с линейными \ell_i.

    Наконец, известна целая сеть эквивалентностей: гипотеза о якобиане стабильно эквивалентна гипотезе Диксмье о том, что всякий эндоморфизм алгебры Вейля — автоморфизм (Tsuchimoto, 2005; Канель-Белов и Концевич, 2007) и связанной гипотезе Пуассона (Adjamagbo, van den Essen, 2006); из гипотезы Матье (1995) об интегралах по компактным группам гипотеза о якобиане тоже следует.

    Был и предупредительный выстрел. В 1994 году Сергей Пинчук построил знаменитый контрпример к вещественной версии: полиномиальное отображение \mathbb{R}^2 \to \mathbb{R}^2, у которого якобиан не обращается в ноль нигде, но которое не инъективно. У Пинчука якобиан не был константой (он всюду положителен, но принимает сколь угодно малые значения), так что комплексную гипотезу это не опровергало. Но при этом стало окончательно ясно, что “локальная обратимость всюду” глобальную не гарантирует, и закрылись многие возможные пути для доказательства гипотезы.

    И ещё стоит отметить, что размерность 2 в этой науке — особая: там автоморфизмы полиномиального кольца устроены просто (теорема Юнга – ван дер Кулка), и гипотеза о якобиане там проверена до степени 100. А вот в размерности 3 регулярно ломается всё, что можно: например, автоморфизм Нагаты оказался “диким” именно в \mathbb{C}^3 (Шестаков, Умирбаев, 2004), а гипотеза Маркуса–Ямабе о глобальной устойчивости пала на полиномиальном контрпримере именно в \mathbb{R}^3 (Cima et al., 1997).

    Но большинство этих результатов, особенно положительных, довольно сложные. А вот контрпример к гипотезе о якобиане оказался очень даже простым: это три многочлена над \mathbb{C}^3 степени не больше 7. Давайте к нему и перейдём.

    Контрпример и его проверка

    Выпишем героя дня в человеческом виде. Отображение F = (F_1, F_2, F_3): \mathbb{C}^3 \to \mathbb{C}^3 задаётся формулами

        \[\begin{aligned}F_1 &= (1+xy)^3\, z + y^2 (1+xy)(4+3xy),\\F_2 &= y + 3x(1+xy)^2\, z + 3xy^2(4+3xy),\\F_3 &= 2x - 3x^2 y - x^3 z.\end{aligned}\]

    То есть это три многочлена степени 7, 6 и 4 соответственно. Утверждается, что:

    • \det JF = -2 тождественно (константа!), но при этом
    • F(0, 0, -\tfrac14) = F(1, -\tfrac32, \tfrac{13}2) = F(-1, \tfrac32, \tfrac{13}2) = (-\tfrac14, 0, 0).

    Первое означает, что F — так называемое отображение Келлера, то есть в точности объект гипотезы; второе — что оно не инъективно. (Если вас смущает -2 вместо 1, просто разделите любую из компонент на -2.)

    Проверить это может кто угодно; вот буквально весь код:

    import sympy as sp
    
    x, y, z = sp.symbols('x y z')
    F = sp.Matrix([(1+x*y)**3*z + y**2*(1+x*y)*(4+3*x*y),
                   y + 3*x*(1+x*y)**2*z + 3*x*y**2*(4+3*x*y),
                   2*x - 3*x**2*y - x**3*z])
    
    print(sp.expand(F.jacobian([x, y, z]).det()))    # -2
    for p in [(0, 0, sp.Rational(-1,4)),
              (1, sp.Rational(-3,2), sp.Rational(13,2)),
              (-1, sp.Rational(3,2), sp.Rational(13,2))]:
        print(F.subs(dict(zip((x, y, z), p))).T)     # трижды [-1/4, 0, 0]

    Да можно и руками тут подсчитать определитель, -2 получится без проблем. Более того, базис Грёбнера идеала (F_1 + \tfrac14, F_2, F_3) говорит, что других прообразов у точки (-\tfrac14, 0, 0) нет: слой состоит ровно из этих трёх точек, и в твите приведён он целиком.

    Заметьте: и коэффициенты отображения, и склеивающиеся точки вещественные и даже рациональные. Так что заодно закрыт и вещественный вопрос: найдено полиномиальное отображение \mathbb{R}^3 \to \mathbb{R}^3 с якобианом -2, не являющееся инъективным.

    Понятно, что посчитать определитель матрицы 3\times 3 даже символьно несложно. Но самое интересное здесь, конечно, не сама проверка, а то, почему и как это работает. Не претендую здесь ни на какую экспертность, но давайте немножко обсудим.

    Как оно устроено: кубика вместо обратной функции

    Раскрывать скобки в F можно долго и без большого просветления. Ключ к устройству контрпримера — вот такое тождество (проверяется, опять же, в лоб):

        \[2y^3 - 3F_2\, y^2 + 18 F_1\, y + \left(F_2^3 - 18 F_1 F_2 + 27 F_1^2 F_3\right) \equiv 0.\]

    Иными словами, координата y алгебраична степени 3 (является корнем кубического многочлена) над образом: если F(x, y, z) = (a, b, c), то y — корень явно выписанной кубики

        \[Q_{a,b,c}(t) = 2t^3 - 3b\, t^2 + 18a\, t + \left(b^3 - 18ab + 27a^2 c\right).\]

    А по y восстанавливается всё остальное: прямая проверка даёт тождество

        \[x \cdot (3F_1 - yF_2 + y^2) = F_2 - y,\]

    откуда на слое

        \[x = \frac{y - b}{D(y)}, \quad\text{где}\quad D(y) = y(b-y) - 3a,\]

    а z находится из первого уравнения (оно линейно по z). Итого слой над точкой (a, b, c) при a \neq 0 — это в точности корни кубики Q_{a,b,c} (кроме тех, где D(y) = 0, там x убегает на бесконечность).

    Вот и вся анатомия. Отображение F — трёхлистное: у общей точки ровно три комплексных прообраза, и обратное “отображение”— это формула Кардано, применённая к Q_{a,b,c}. Никаким многочленом (и даже однозначной функцией) обратное, конечно, не является (и по теореме Акса–Гротендика иначе и быть не могло).

    Обратите внимание на старший коэффициент кубики: это константа 2, не зависящая от (a, b, c). Поэтому корни Q, то есть координата y прообразов, никогда не уходят на бесконечность (старший член не обнуляется), а слиться два корня могут только по x, одновременно с попаданием на D(y)=0.

    Давайте это всё нарисуем. В 4D нарисовать функцию от трёх переменных я не смогу, а в 3D это не то чтобы невозможно, но не очень иллюстративно, мало что понятно будет. Поэтому давайте нарисуем важные двумерные проекции.

    Рассмотрим прямую (a, 0, 0), на которой собственно найденный контрпример. Кубика вырождается в 2t(t^2 + 9a), и при a < 0 у неё три вещественных корня, дающих три прообраза:

        \[(0,\, 0,\, a), \qquad \left(\pm\frac{1}{2\sqrt{-a}},\; \mp 3\sqrt{-a},\; -26a\right).\]

    При a = -\tfrac14 получаются в точности три точки из твита. А если a \to 0 слева, то два боковых прообраза улетают на бесконечность вдоль гиперболы xy = -\tfrac32.

    При a > 0 они возвращаются из бесконечности уже комплексными, и вещественный прообраз остаётся один:

    Слева — x-координаты вещественных прообразов точки (a, 0, 0) как функции a; в точке a = -\tfrac14 отмечен слой из твита. Справа — те же прообразы на плоскости (x, y): неподвижный прообраз в нуле и два убегающих по гиперболе.

    Фазовая диаграмма. В общем положении число вещественных прообразов диктуется знаком дискриминанта кубики. Дискриминант Q и результант пары (Q, D) считаются явно, и оба, с точностью до множителей a^2, пропорциональны одному и тому же многочлену

        \[W(a,b,c) = 27a^2c^2 - 18abc + b^3 c + 16a - b^2.\]

    Это совпадение следует из этальности (отсутствия критических точек): два прообраза не могут слиться в обычной точке, потому что в точке слияния якобиан обнулился бы, а он равен -2. Поэтому листы накрытия сталкиваются только на бесконечности, то есть на множестве, где D = 0.

    Поверхность \{W = 0\} (вместе с плоскостью \{a = 0\}) — это и есть стены: пересекая их, цель теряет или приобретает пару вещественных прообразов. Вот так это выглядит в проекциях b=0 и b=2:

    На картинке два плоских среза пространства целей (a, b, c): в красных областях у точки три вещественных прообраза, в синих — один. Звёздочка — это точка (-\tfrac14, 0, 0) из твита: она лежит глубоко внутри трёхлистной области, никакой патологии в ней самой нет.

    Обратите внимание на крестик на правой панели — это важная деталь. Отображение F не сюръективно: у точки (\tfrac13, 2, \tfrac23) прообразов нет вообще, ни вещественных, ни комплексных (базис Грёбнера соответствующего идеала равен [1]).

    Таких точек мало: они заметают рациональную кривую \left(\tfrac{t^2}{12},\, t,\, \tfrac{4}{3t}\right), t \neq 0, на которой все три корня кубики одновременно налетают на двойной корень D. Кривая лежит на поверхности W = 0 — на картинке крестик находится в точности на острие стены.

    Кстати, именно непустота этого множества разрешает топологический “парадокс”: трёхлистных накрытий у односвязного \mathbb{C}^3 не бывает, как же многочлен F выкрутился? Вот так и выкрутился: F — накрытие не над всем \mathbb{C}^3, там не хватает поверхности \{W = 0\} и плоскости \{a = 0\}. Объединение \{W = 0\} \cup \{a = 0\} называется множеством Елонека отображения F, т.е. множеством точек, в которых F не является собственным. А у дополнения к гиперповерхности фундаментальная группа уже нетривиальна, и глобально пронумеровать прообразы — а значит, склеить из локальных обратных глобальное — невозможно. Так что никакого топологического парадокса тоже не возникает.

    Что ещё опровергает этот пример

    Контрпример в \mathbb{C}^3 автоматически даёт контрпримеры во всех размерностях n \geq 3: достаточно приписать тождественные координаты, (F, x_4, \ldots, x_n). Двумерный случай — исходный вопрос Келлера — остаётся открытым, и все положительные результаты (начиная с Moh, 1983), конечно, тоже всё ещё верны. Не исключено, что в размерности 2 гипотеза верна, и было бы даже красиво, если бы было так.

    По цепочке эквивалентностей падают и некоторые соседи. Из гипотезы Диксмье для алгебры Вейля A_n следует гипотеза о якобиане в размерности n; значит, гипотеза Диксмье неверна при n \geq 3: у алгебры Вейля A_3 есть эндоморфизм, не являющийся автоморфизмом (его можно попробовать выписать по нашему F, но в чём смысл этого упражнения, для меня неясно). Для A_1 и A_2 — то есть в том числе для исходного вопроса Диксмье 1968 года — всё по-прежнему открыто, и аналогично обстоит дело с пуассоновской версией. А гипотеза Матье, из которой следовала гипотеза о якобиане, теперь опровергнута как общее утверждение.

    Наконец, по редукции Басса–Коннелла–Райта–Ягжева мы теперь знаем, что в какой-то размерности существует контрпример вида x + H(x) с однородным кубическим H; найти его явно (и минимальную размерность) — ещё одна открытая задача. Как и вопрос о минимальной степени: в размерности 3 контрпример есть в степени 7, а степень 2 невозможна по теореме Вана; что происходит между — неизвестно.

    Задача Смейла номер 16, таким образом, решена. Из восемнадцати задач списка это уже не первый случай, когда с ответом помогли компьютеры: например, в решении проблемы Смейла номер 14 (про аттрактор Лоренца) ключевую роль сыграло строгое computer-assisted доказательство. Но здесь, конечно, у LLM уже совсем другой уровень самостоятельности.

    Как это было найдено, и что говорят люди

    В отличие от истории с CDC, где OpenAI опубликовала препринт и полный промпт, здесь пока нет ни статьи, ни логов рассуждений, ни даже промпта — только твит, из которого мы знаем, что вопрос задал “друг Ахил” (по-видимому, Akhil Mathew). Левент Алпёге — серьёзный теоретико-числовик, ныне работающий в Anthropic. Если верить твиту, контрпример нашёл именно Claude Fable, хотя на промпт всё равно было бы интересно посмотреть.

    Но, конечно, к истинности и важности результата всё это не имеет отношения. Проверка — минутное дело, и на GitHub уже лежит репозиторий jacobian-anatomy с проверками на sympy, Singular и PARI/GP и даже с сертификатом на Lean 4. MathWorld и Wikipedia обновились за сутки. Это, конечно, не то чтобы “новый ритм математики”, а свойство конкретного результата: когда проверка сводится к тому, чтобы подсчитать определитель 3\times 3, действительно не нужно долгое рецензирование.

    А насчёт разных [по]следствий из этого яркого результата прямо сейчас могу дать только одну ссылку: Zihan Zhang начал выписывать разные следствия из найденного контрпримера. Думаю, этот список ещё не раз пополнится.

    Кстати, этот пост тоже написан вместе с Claude Fable 5 — той самой моделью, которая нашла контрпример. В моём случае она независимо перепроверила все выкладки, посчитала базисы Грёбнера, на которые я ссылался, и нарисовала картинки выше. Предлагаю считать это не конфликтом интересов, а воспроизводимостью.

    Заключение

    Математика меняется. Три знаменитых открытых проблемы закрылись в последние пару месяцев. Опровержение, доказательство и снова опровержение; OpenAI, опять OpenAI и вот теперь Anthropic. Причём кажется, что это становится всё более обыденным: от “закрытой экспериментальной модели” мы перешли к обычному промпту для Fable.

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

    Как именно Fable его нашёл, мы пока не знаем; надеюсь, статья с подробностями воспоследует, и будет не менее интересной, чем сам результат. А пока отмечу только, что мои слова из прошлого поста подтверждаются: “Если у вас есть любимая гипотеза, в которую вы верите, самое время написать про неё хороший промпт”.

    Что дальше, коллеги?

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • “Я-пространство” в языковых моделях: Global Workspace in the J-Space

    “Я-пространство” в языковых моделях: Global Workspace in the J-Space

    Введение и краткое содержание

    6 июля 2026 года команда интерпретируемости Anthropic выложила работу “Verbalizable Representations Form a Global Workspace in Language Models” (есть и сопроводительный пост для более широкой публики). В двух словах основной результат звучит так: внутри Claude обнаружилась небольшая выделенная система представлений, которая ведёт себя поразительно похоже на глобальное рабочее пространство (global workspace), понятие, с помощью которого когнитивные науки уже сорок лет описывают сознание людей. Авторы назвали её J-пространством (от Jacobian), и за первую же неделю название пошло в народ и стало мемом; реакции мы ниже тоже обсудим.

    Если совсем коротко, история такая. В остаточном потоке трансформера, среди десятков тысяч признаков, перемешанных в большую суперпозицию, нашлась маленькая (занимающая единицы процентов дисперсии активаций) подсистема со следующими свойствами:

    • её содержимое модель может проговорить словами;
    • этой системой модель может до некоторой степени управлять по собственной воле;
    • через неё проходят промежуточные шаги молчаливых рассуждений (то есть рассуждений ещё до блокнота);
    • её содержимое переиспользуется любыми последующими вычислениями;
    • без неё модель теряет способность к гибкому многошаговому мышлению, но спокойно продолжает делать “автоматические” вещи: писать текст с корректной грамматикой, вспоминать факты, продолжать привычные паттерны и так далее.

    Понятно, что такой список свойств звучит прямо как определение “Системы 2” по Канеману, и понятно, почему вокруг работы поднялся такой мощный хайп. Кстати, по-русски ведь “J-lens” и “J-space” будет “Я-линза” и “Я-пространство” (от Якоби), что вообще великолепно звучит!

    Но мне она кажется важной даже в отрыве от громких слов: это первый (известный мне) случай, когда наука об интерпретируемости перешла от изучения отдельных “нейронов” и цепей (circuits) к макроскопическому функциональному анализу того, что происходит внутри языковой модели. И это сразу получилось сделать понятным математическим инструментом, который можно воспроизвести на любой открытой модели.

    Воспроизвести — это, кстати, не фигура речи: мы с Claude Code собрали J-линзу своими руками на Qwen2.5, и ниже посмотрим, как в середине сети всплывает слово “France”, когда модель отвечает на вопрос про столицу страны, где стоит Эйфелева башня (причём всплывает, даже если вопрос задан по-русски).

    План у нас такой:

    • сначала контекст — что происходило в интерпретируемости до сих пор и что такое глобальное рабочее пространство в нейронауке;
    • потом сам метод, то есть описание J-линзы (Jacobian lens) с формулами;
    • главные результаты статьи, тоже в деталях;
    • потом наши эксперименты;
    • и в конце — приложения к AI safety, обзор реакций (их было много, и интересных) и неизбежный разговор про сознание.

    Интерпретируемость до J-пространства

    Механистическая интерпретируемость — это программа исследований, которая пытается детально разобраться, что происходит внутри нейросети, заглянуть внутрь чёрного ящика и понять, какими внутренними механизмами сеть приходит к ответу.

    Это, во-первых, чисто научное любопытство: перед нами первые в истории искусственные системы с чем-то похожим на общий интеллект, и грех не посмотреть, как они устроены внутри. А во-вторых — и для Anthropic это, конечно, главная мотивация — это важная часть безопасности искусственного интеллекта (AI safety): если мы умеем читать внутренние состояния модели, мы можем заметить, что она собирается сделать что-то не то, до того, как она это сделает, и независимо от того, что она пишет в выводе.

    Дарио Амодеи в прошлогоднем эссе “The Urgency of Interpretability” прямо формулировал цель: получить “MRI for AI” раньше, чем модели станут слишком способными. Я писал об интерпретируемости большой обзор год назад и апдейт полгода назад, так что здесь просто очень кратенько напомню.

    Признаки и суперпозиция. Наивная идея “один нейрон — одно понятие” умерла быстро: типичный нейрон активируется на десятки несвязанных стимулов. В 2022 году Anthropic сформулировала гипотезу суперпозиции: модель хранит в d-мерном пространстве активаций гораздо больше, чем d признаков, — как почти ортогональные направления, накладывающиеся друг на друга. Признаков больше, чем измерений, поэтому по отдельным координатам читать их нельзя, и взаимодействия между ними могут быть довольно сложные.

    Разреженные автокодировщики. Дальше признаки стали вытаскивать из суперпозиции: обучать поверх активаций разреженный автокодировщик (sparse autoencoder, SAE), который раскладывает каждую активацию в разреженную сумму интерпретируемых направлений. Сначала на игрушечной модели, потом на Claude 3 Sonnet, откуда вышел знаменитый Golden Gate Claude — модель с искусственно усиленным признаком “Golden Gate Bridge”, которая сводила любой разговор к любимому мосту. Можно было, конечно, и любой другой признак усилить искусственно.

    Цепи и «биология» модели. В 2025 году появились графы атрибуции и работа «On the Biology of a Large Language Model»: уже не отдельные признаки, а целые вычислительные цепи. Именно там были прослежены знаменитые примеры: как модель, отвечая на вопрос “столица штата, где находится Даллас”, внутри себя проходит через промежуточное “Техас”, прежде чем выдать “Остин”; как при сочинении стихов она заранее планирует рифму в конце строки и подстраивает под неё начало.

    Интроспекция. Наконец, в конце 2025 года Джек Линдси показал в работе “Emergent Introspective Awareness“, что если вписать в активации Claude некоторый концепт (методами activation steering), модель в определённых условиях может честно отчитаться: “я замечаю вписанную мысль про…”. То есть у модели есть способность к интроспекции, функциональному доступу к собственным внутренним состояниям.

    Видите, куда всё шло? От признаков к схемам, потом к планированию ответа, а потом к интроспекции.

    Новая работа делает следующий шаг: она пытается проанализировать, как процесс мышления организован в целом, то есть найти у системы архитектуру более высокого уровня.

    Глобальное рабочее пространство в когнитивных науках

    Чтобы понять заголовок статьи, нужен небольшой экскурс в когнитивные науки.

    Теория Баарса. В 1988 году Бернард Баарс предложил теорию глобального рабочего пространства (Global Workspace Theory, GWT) — до сих пор, пожалуй, главную функциональную теорию сознательного доступа. Метафора Баарса — театр: в мозге параллельно работают сотни специализированных процессоров (зрение, слух, моторика, память, синтаксис…), каждый в своей “тёмной части зала”, бессознательно. Но есть маленькая “сцена под прожектором”: информация, попавшая туда, транслируется (broadcast) всем процессорам сразу. Сознательный доступ — это и есть попадание на сцену: выигрыш в конкуренции за очень ограниченный общий канал.

    Нейрональная версия Деана. Станислас Деан и Жан-Пьер Шанжё (Stanislas Dehaene и Jean-Pierre Changeux) превратили метафору в нейрофизиологическую модель (global neuronal workspace): распределённая сеть нейронов с длинными аксонами, в основном в префронтальной и теменной коре, которая при переходе стимула в сознание демонстрирует характерное зажигание (ignition) — резкий нелинейный переход к устойчивой глобальной активации. Подпороговые стимулы обрабатываются локально и затухают; надпороговые — “зажигают” рабочее пространство и становятся доступными для отчёта, произвольного контроля и рассуждений.

    У сознательного доступа в этой традиции есть стандартный список функциональных свойств. Информация в рабочем пространстве:

    • вербализуема — о ней можно отчитаться словами;
    • подчиняется произвольному контролю — её можно удерживать в уме и вытеснять оттуда;
    • служит средой последовательных рассуждений — цепочки мыслей “шаг за шагом” проходят именно через неё;
    • гибко переиспользуется — одно и то же содержимое доступно любым дальнейшим операциям (сравнить, назвать, посчитать, вообразить);
    • селективна — в каждый момент в сознании единицы объектов, а подавляющая часть обработки остаётся бессознательной и автоматической.

    Важная деталь: всё это — про так называемое сознание доступа (access-consciousness, не путать с вызовом духа Распутина!) в терминологии Неда Блока, то есть про функциональную доступность информации для отчёта и контроля. Вопрос о феноменальном сознании — о том, “каково это” изнутри и есть ли там вообще какое-то “изнутри”, — здесь напрямую не решается (хотя Деан склонен считать, что решается, а философы, как водится, не все согласны).

    Идея скрестить GWT с нейросетями не нова, и были в том числе работы из очень крутых групп:

    • VanRullen и Kanai (2021) предлагали строить AI-архитектуры с явным рабочим пространством,
    • Goyal, Bengio et al. (2021) экспериментировали с общим “бутылочным горлышком” для координации нейронных модулей,
    • в известном докладе Butlin, Long et al. (2023) о сознании в AI индикаторы из GWT занимали центральное место в чеклисте “на что смотреть”.

    Но раньше в работах по ML рабочее пространство обычно предлагалось спроектировать. Главная новость свежей работы Anthropic в том, что в обычном трансформере, обученном предсказывать следующий токен, похожая структура, кажется, возникает сама собой.

    J-линза: как читать остаточный поток

    Теперь к методу; он очень прост, и в этом его главная прелесть.

    Остаточный поток. Напомню, как устроен трансформер изнутри. Каждый токен на каждом слое \ell представлен вектором h_\ell \in \mathbb{R}^d (для больших моделей d может составлять десятки тысяч). Слои читают из этого вектора и дописывают в него свои поправки:

        \[h_{\ell+1} = h_\ell + \mathrm{Attn}_\ell(h_\ell) + \mathrm{MLP}_\ell(h_\ell),\]

    а в самом конце финальное состояние h_L превращается в логиты распределения над словарём:

        \[\mathrm{logits} = W_U\, \mathrm{norm}(h_L),\]

    где W_U — матрица “разэмбеддинга” (unembedding), по строке на каждый токен словаря. Вектор h_\ell и называют остаточным потоком (residual stream); это общая “шина данных”, через которую слои общаются друг с другом, и именно в ней живут все признаки, цепи и прочая интерпретируемость.

    Logit lens. Самый старый способ подглядывать в остаточный поток — logit lens (nostalgebraist, 2020): давайте просто применим финальный разэмбеддинг к промежуточному состоянию, W_U\,\mathrm{norm}(h_\ell), то есть сделаем вид, что оставшихся слоёв нет. На поздних слоях это отлично работает (модель уже почти сформировала ответ), но чем раньше слой, тем хуже: промежуточные представления вовсе не обязаны лежать в том же базисе, что финальные.

    Tuned lens. Следующая идея — tuned lens (Belrose et al., 2023): обучим для каждого слоя \ell свою аффинную поправку A_\ell, минимизируя расхождение W_U\,\mathrm{norm}(A_\ell h_\ell) с настоящим финальным распределением модели. Работает лучше, но у него есть концептуальный изъян, который в статье Anthropic как раз обсуждается: tuned lens забегает вперёд, потому что его обучают предсказывать выход, и он выучивается в том числе доделывать за модель ещё не сделанные вычисления. Такая линза отвечает на вопрос “что модель в итоге скажет”, а нам скорее интересно “что в активациях написано сейчас”.

    J-линза. Решение Anthropic: не будем ничего обучать, а спросим у самой модели, как она в среднем использует данный слой. Рассмотрим якобиан — матрицу производных финального состояния по промежуточному — и усредним его по большому корпусу текстов, по всем парам позиций:

        \[J_\ell \;=\; \mathbb{E}\left[\frac{\partial h_{L,t'}}{\partial h_{\ell,t}}\right],\]

    где усреднение идёт по промптам (в статье — порядка тысячи текстов), по позициям-источникам t и по последующим позициям t' \ge t. Получается одна матрица d \times d на слой, которая представляет собой некий усреднённый линейный портрет всего, что остаток сети делает с этим слоем.

    А дальше читаем ровно как в logit lens, только сначала применив J_\ell (часть B на картинке):

        \[\mathrm{lens}_\ell(h) \;=\; \mathrm{softmax}\bigl(W_U\, \mathrm{norm}(J_\ell\, h)\bigr).\]

    Это и есть J-линза (Jacobian lens). По сути, мы заменяем все слои после \ell-го их усреднённым линейным приближением. В отличие от tuned lens, здесь ничего не подгоняется под финальный ответ: J_\ell — это характеристика самой модели, её средний локальный отклик. Если концепт в активациях уже записан, линза его увидит; а доделывать вычисления за модель ей научиться неоткуда.

    Меня в этой конструкции больше всего радует тот факт, что она вообще работает. Априори совершенно не очевидно, что усреднённый по всем контекстам якобиан глубоко нелинейной функции — осмысленный объект, а не каша. То, что через него читаются связные концепты, само по себе говорит о том, что модель использует остаточный поток удивительно линейным и универсальным образом. Это ещё одно свидетельство в пользу гипотезы линейности представлений, на которой стоит вся интерпретируемость последних лет.

    J-векторы и J-пространство. У матрицы W_U J_\ell по строке на каждый токен словаря y; строка v_y = (W_U J_\ell)y^\top — это J-вектор токена y, линейный функционал на остаточном потоке. Скалярное произведение \langle v_y, h \rangle измеряет, насколько сильно текущее состояние в среднем толкает модель к тому, чтобы в итоге сказать y.

    Обратите внимание: по построению каждый J-вектор соответствует слову (токену словаря). Вербализуемость здесь не эмпирический результат, а просто определение: J-линза видит ровно ту часть активаций, которая выражается словами, которые модель могла бы сказать.

    J-пространство — это множество состояний, которые раскладываются в разреженную неотрицательную комбинацию J-векторов:

        \[\mathcal{J}_\ell \;=\; \Bigl\{ \sum_{i \in S} c_i v_i \;:\; c_i \ge 0,\; |S| \le k \Bigr\},\]

    где обычно k \approx 25; разложение конкретной активации ищется жадным алгоритмом (gradient pursuit).

    Сразу подчеркну тонкость, на которую указал Люциус Бушнак в крайне залайканном комментарии на LessWrong: несмотря на название, это не линейное подпространство, а объединение конусов, по “pointed cone” на каждом наборе S. Многие читатели решили, что Anthropic нашла в остаточном потоке выделенное линейное подпространство, — нет, структура другая (и, по мнению Бушнака, называть её “space” было не очень корректно). J-векторов больше, чем измерений, — это переполненный словарь направлений в духе суперпозиции, просто полученный не обучением SAE, а из самой модели и почти бесплатно.

    Чтение и запись. С линзой можно работать в обе стороны:

    • читать: раскладывать активации по J-векторам и смотреть топ концептов на каждом слое и позиции;
    • вписывать (steering): прибавлять h \leftarrow h + \alpha v_y, усиливая концепт y;
    • вырезать (ablation): занулять проекции на J-векторы, «выключая рабочее пространство»;
    • подменять (patching): переходить в координаты линзы c = V^{+} h, менять местами координаты двух концептов \sigma и возвращаться обратно, h' = h + V(\sigma(c) - c).

    Последняя операция — главный рабочий инструмент статьи: можно делать подмену вроде “France ↔ China” прямо в координатах рабочего пространства, с сохранением всего остального содержимого. Повторю ту же картинку, но теперь нам нужна часть C:

    Что нашли: пять свойств сознательного доступа

    Статья устроена как систематическая проверка: берём пять функциональных свойств сознательного доступа из нейронаук и для каждого ставим эксперименты на Claude (основные результаты — на Sonnet 4.5, с подтверждением на Haiku 4.5 и Opus 4.5/4.6). Пройдёмся по всем пяти; извините, что опять повторяю картинку, но они у Anthropic богаты смыслом, и к ним стоит возвращаться:

    1. Вербальный отчёт. Если спросить модель, о чём она “думает”, её ответ предсказывается содержимым J-пространства и, главное, управляется им. Если подменить в активациях J-вектор одного концепта на другой, модель отчитается о подменённом: в 88% случаев подменённый концепт попадает в топ-5 названного.

    Математически это совсем хорошо видно: если разложить вектор концепта на J-компоненту и всё остальное, J-компонента будет нести всего 6–7% дисперсии, но именно её подмена меняет отчёт (59% успеха); подмена остальных 93% дисперсии почти ничего не даёт (5%). То есть для вербального отчёта важна именно та маленькая часть состояния, которая лежит в J-пространстве.

    Сюда же примыкает протокол интроспекции из прошлогодней работы Линдси, теперь на новом инструменте: вписываем концепт (скажем, “молния”) в активации на токенах пользовательского промпта и спрашиваем модель, не замечает ли она вписанной мысли. Модель в большинстве случаев отвечает “да, что-то про молнию” — причём вписанное представление влияет на выход только в тот момент, когда запрошен интроспективный отчёт, не раньше и не позже.

    2. Произвольный контроль. Это классическая история про “не думай о белой обезьяне”. Попросим модель: “пока выполняешь задание, держи в голове цитрусовые”. При этом в J-пространстве на протяжении выполнения совсем другого задания появляются lemon и orange, которые модель нигде не произносит.

    Попросим «не думай про X» — присутствие X в рабочем пространстве подавляется, но не до нуля: тот самый эффект белого медведя Вегнера, «не думать о белом медведе» у моделей получается так же плохо, как у нас. А парный протокол «один стимул — разные вопросы» показывает, что содержимое J-пространства зависит от задачи, а не только от входа: на вопрос «какая это часть речи?» в линзе появляется noun, а при том же стимуле и неявной задаче (где часть речи нужна, но не спрашивается явно) — уже нет, хотя модель отвечает правильно.

    3. Среда внутренних рассуждений. Возьмём вопрос с невысказанным промежуточным шагом: “The number of legs on the animal that spins webs is…”. Модель отвечает “8”, нигде не произнося слова “spider”. Та же история, например, с потенциальными рифмами в стихах:

    Но в середине сети J-линза показывает spider — и если подменить его на ant, модель отвечает “6”! И если запланированную рифму fight подменить на light, строка тоже перестроится под новую рифму:

    На двухшаговых фактических вопросах подмена промежуточного концепта срабатывает в 54% случаев на Haiku и ~70% на Sonnet/Opus, причём подмены промежуточного шага действуют на ~17% раньше по глубине сети, чем подмены ответа, — как и положено, если промежуточный шаг вычисляется раньше ответа.

    4. Гибкое переиспользование. Ключевое свойство рабочего пространства по Баарсу — broadcast: одно содержимое доступно всем потребителям. Тест простой: давайте подменим France → China одной и той же операцией, в одних и тех же координатах, и посмотрим, что станет с разными задачами.

    Одна и та же подмена представления согласованно перенаправляет полтора десятка разных “функций”, принимающих этот концепт как аргумент. Главный предиктор успеха — то, насколько аргумент изначально “загружен в рабочее пространство”, то есть косинусная близость активации к J-вектору. Страны подменяются отлично, а вот числа — плохо: числовые вычисления, судя по всему, во многом идут мимо J-пространства (об этом ограничении ещё поговорим).

    5. Селективность. Наконец, свойство, которое делает всю историю нетривиальной: J-пространство не нужно для автоматической обработки. Если дать модели испанский текст и спросить “на каком это языке?”, подмена концепта Spanish → French в рабочем пространстве ломает ответ почти в 100% случаев; но если попросить просто продолжить текст, та же подмена не делает ничего — модель продолжает по-испански как ни в чём не бывало.

    То есть продолжение текста — автоматическая операция, которой “сознательный доступ” не нужен, а явный ответ на вопрос о языке — “сознательная” операция, которая идёт через J-пространство. Другие вопросы, требующие осознания языка, тоже идут через него:

    Ablation показывает, что если вырезать J-пространство целиком, производительность на многошаговых рассуждениях падает с потолка почти до нуля: страдают аналогии, шифр Цезаря, перевод, суммаризация и сочинение сонетов. А вот выбор ответа в MMLU, извлечение ответа из текста (SQuAD), сентимент и грамматические суждения почти не меняются.

    Кстати, есть ещё и отдельный результат про chain-of-thought: GSM8K с явным рассуждением вслух примерно втрое устойчивее к ablation, чем попытки выдать ответ сразу. Это значит, что внешняя цепочка рассуждений частично компенсирует вырезанное внутреннее рабочее пространство, как записная книжка компенсирует выключенную рабочую память.

    При этом само J-пространство маленькое: в каждый момент в нём заметно активны порядка 10–25 J-векторов, и на него приходится меньше 10% дисперсии активаций. Это тоже сходится с GWT из нейронаук: сцена и должна быть тесной.

    Структура: сенсорная кора, рабочее пространство, моторика

    Вторая часть статьи — про то, где всё это происходит. Оказывается, по глубине сети J-линза читается очень неравномерно, и картина складывается в три отчётливые зоны:

    • “сенсорная” зона (примерно первая треть): J-линза выдаёт вырожденную кашу, эксцесс распределения логитов около нуля, осмысленных концептов нет — идёт низкоуровневая обработка входа, ещё не переведённая на язык словаря;
    • собственно рабочее пространство (примерно слои 38–92, если отнормировать к глубине 100): устойчивые абстрактные концепты, которые тянутся через много позиций и слоёв; высокий эксцесс, т.е. несколько токенов резко выделены над фоном; здесь работают все причинные вмешательства из предыдущего раздела;
    • “моторная” зона (последние слои): содержимое резко схлопывается к конкретному следующему токену, top-1 точность предсказания выхода взлетает — модель конвертирует мысль в действие, то бишь в токен.

    Границы зон видны сразу несколькими независимыми способами: по точности предсказания выхода, по эксцессу, по автокорреляции содержимого вдоль позиций, по эффективной размерности, и по блочной структуре CKA-матрицы сходства J-векторов между слоями. Причём это именно функциональное различие: в примере с испанским текстом информация “это испанский” присутствует в активациях и в ранних слоях (иначе модель не могла бы продолжать по-испански), но в J-пространство она попадает только тогда, когда нужна для сознательного анализа задачи.

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

        \[\alpha \cdot h_A + (1-\alpha)\cdot h_B.\]

    В ранних слоях активации следуют за смесью, плавно интерполируя между двумя интерпретациями. А вот на входе в рабочее пространство происходит коммитмент: система почти скачком выбирает одну из двух интерпретаций, и в J-линзе дальше живёт только победитель. Такой скачок от плавного входа к дискретному выходу очень похож на то, как подпороговые стимулы у человека обрабатываются, но не “зажигаются”.

    И последний структурный факт, самый близкий к исходной метафоре: J-векторы механистически привилегированы. Если посмотреть, насколько направление остаточного потока стыкуется со входными весами последующих слоёв (то есть сколько разных дальнейших вычислений его используют), окажется, что J-векторы стыкуются с гораздо более широким набором потребителей, чем случайные направления той же нормы: один и тот же J-вектор служит аргументом полутора десяткам разных функций. Сцена действительно транслируется на весь зал.

    Собираем свою J-линзу

    Читать про чужие эксперименты хорошо, а воспроизводить — лучше, тем более что весь метод — это по сути одна формула. Так что дальше идёт секция с результатами, которые мы с Claude Code получили на паре небольших открытых моделей — Qwen2.5-1.5B-Instruct и Qwen2.5-7B-Instruct. Весь код занимает пару сотен строк на PyTorch, а здесь обсудим результаты.

    Как посчитать J_\ell и не умереть. Формально J_\ell — это матрица d \times d, и для её оценки нужно усреднить якобианы по корпусу; лобовое вычисление якобиана — это d обратных проходов на каждую пару позиций, что даже для маленькой модели неподъёмно.

    Но есть трюк, который сводит всё к d обратным проходам на батч, причём сразу для всех слоёв. Добавим к выходу каждого слоя \ell нулевое возмущение \delta_\ell \in \mathbb{R}^d, одно и то же на всех позициях (broadcast), и рассмотрим G = \sum_{t'} h_{L,t'} — сумму финальных состояний по всем позициям. Тогда

        \[\frac{\partial G_i}{\partial \delta_\ell} \;=\; \sum_{t}\sum_{t' \ge t} \frac{\partial h_{L,t',i}}{\partial h_{\ell,t}}\]

    представляет собой в точности i-ю строку суммы якобианов по всем парам позиций (пары t' < t зануляются каузальной маской автоматически).

    Таким образом, один обратный проход по G_i даёт i-ю строку сразу для всех слоёв, а d проходов — всю матрицу. Дальше делим на число пар и получаем оценку J_\ell для каждого слоя. На корпусе из 128 фрагментов википедийного текста по 64 токена вся процедура для Qwen2.5-1.5B (28 слоёв, d = 1536) занимает около получаса на одной A100; для 7B (d = 3584) — несколько часов.

    Читаем мысли про Эйфелеву башню. Начнём с двухшагового вопроса в духе статьи: “The capital of the country where the Eiffel Tower is located is the city of”. Qwen2.5-1.5B уверенно отвечает “Paris”. Вопрос: видно ли внутри промежуточное “Франция”, которое модель нигде не произносит?

    Слева — вероятности избранных токенов по слоям под J-линзой, справа — под logit lens, оба на последней позиции промпта. Logit lens не видит вообще ничего до слоя 22, а потом сразу показывает готовый ответ. А вот в J-линзе на слоях 7–15 разворачивается целая драма: на слое 9 токен Paris имеет вероятность 0.25, France — 0.12 (второе место среди всех 152 тысяч токенов словаря!), рядом крутится Rome — модель одновременно прикидывает страну, столицу и конкурирующие столицы из шаблона «the capital of». Потом всё это затухает, и на слое 23 происходит коммитмент: Paris взлетает к единице. Промежуточная «Франция» видна J-линзе на слое 9 — на тринадцать слоёв раньше, чем logit lens вообще просыпается; в logit lens Франция за весь проход так и не поднимается выше p = 0.009. Видим ту самую картину “латентного рассуждения в середине сети”, о которой и пишет Anthropic.

    Можно посмотреть и классическую решётку — top-1 токен линзы в каждой клетке (слой, позиция):

    Тут виден и общий рельеф (ранние слои — пунктуационная каша, в середине появляется семантика вроде Tower, located, city, France, поздние слои — токены будущего ответа), и мой любимый результат этого эксперимента: в средних слоях на последних позициях часто встречается токен “____“.

    Qwen, вероятно обученный на горах китайских экзаменационных заданий, любое предложение с пропуском готов продолжить как задание “заполните пробел”, и это буквально видно в его рабочем пространстве. Абстрактное намерение “сейчас надо заполнить пропуск” тоже вполне себе важное содержимое workspace, но у Qwen оно получилось с забавным экзаменационным акцентом.

    А теперь по-русски. Зададим тот же вопрос на русском: “Столица страны, где стоит Эйфелева башня, — это город”. Модель правильно отвечает ” Париж”. Но чем она думала?

    Внутри ответ сначала собирается в виде английского ‘ Paris’ (p до 0.67 на слое 23) и китайского ‘巴黎’ (“Париж” по-китайски, до 0.39)! Русское слово “Париж” становится топ-1 только на самом последнем слое. То есть модель “думает” на своих внутренних доминантных языках (у Qwen это английский с китайским), а перевод на язык собеседника происходит уже в моторной зоне, при конвертации мысли в токены.

    Это прекрасно согласуется с известным результатом Wendler et al. (2024) о том, что “ламы думают по-английски”, и заодно иллюстрирует главное ограничение J-линзы, про которое писали и авторы, и критики: её “словарь мыслей” — это токены словаря, и концепт “Париж” в нём представлен прежде всего английским токеном.

    France → China на коленке. Теперь главный трюк статьи — “гибкое переиспользование”: одна и та же подмена в рабочем пространстве должна перенаправлять разные задачи.

    Мы сделали совсем простую версию патчинга: возьмём J-векторы токенов ‘ France’ и ‘ China’ на слое \ell, нормируем их, и на слоях 9–19 на каждой позиции заменим проекцию активации на французское направление проекцией на китайское:

        \[h \;\leftarrow\; h + \alpha \,\langle h, \hat v_F\rangle_+ \,(\hat v_C - \hat v_F).\]

    Никакой подгонки под конкретные промпты — одна и та же операция всюду. Результаты при \alpha = 2:

    ПромптБез вмешательстваС подменой France→China
    The capital of France isParis (p=0.29)Beijing
    The official language of France isFrench (p=0.49)Chinese
    France is located on the continent ofEurope (p=0.70)Asia (p=0.71)
    The currency of France is theEuro (€) (p=0.34)Renminbi (RMB)

    Одна и та же операция над активациями синхронно меняет столицу, язык, континент и валюту: концепт “Франция” в рабочем пространстве действительно был общим аргументом всех этих разнородных “функций”, и мы его перезаписали. Отдельно радует строчка с валютой: модель не ограничилась юанем, а выдала Renminbi (RMB) — официальное название с уточнением в скобках.

    У нашей микро-версии, конечно, не всё получилось. Например, контрольный промпт “The capital of Germany is”, который подмена не должна была затрагивать, тоже ломается (p(\mathrm{Berlin}) падает с 0.48 до 0.006): направления европейских стран в остаточном потоке сильно коррелируют, и грубая проекция цепляет заодно и Германию.

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

    Ещё любопытно, что при \alpha=12 модель, отвечая-таки “Beijing”, часто всё-таки норовит съехать в формат экзаменационного теста в духе “____. A. Beijing B. …”, а при \alpha=8 вмешательство становится слишком сильным, и связность текста рушится.

    Профиль по слоям. Наконец, посмотрим на аналог «трёх зон» — по 32 отложенным фрагментам wikitext посчитаем, как часто top-1 токен линзы совпадает с финальным выбором модели:

    Первая треть сети нечитаема (совпадение около нуля), затем медленный рост, а на последних слоях резкая конвергенция, всё как в статье. Заметим, что по этой метрике logit lens в средних слоях даже опережает J-линзу, и это не баг: J-линза предсказывает не следующий токен, а “усреднённое будущее влияние” состояния, она не пытается угадывать ответ.

    Красивую сигнатуру эксцесса из статьи (около нуля в сенсорной зоне, высокий в workspace) мы в лоб не смогли воспроизвести: наша оценка J_\ell по 128 текстам даёт в ранних слоях мусор вместо гладкого нуля. Вероятно, это потому, что и корпус в статье, и сам Claude на порядок больше нашего подопытного.

    Провалы тоже показательны. Вопрос про паука (“The number of legs on the animal that spins webs is”) для полуторамиллиардной модели слишком сложен — она отвечает бессмыслицей вроде “2 more than a multiple of”. И, что характерно, в её J-пространстве паука нет вовсе: токен ‘spider’ в лучшем случае имеет ранг 17794 из 152 тысяч. Модель просто не сумела сделать скрытый промежуточный шаг.

    Арифметику в духе “(4+17)·2+7” она тоже не осилила (выдаёт “?”), и тут вылезает ещё одно ограничение: Qwen токенизирует числа цифра за цифрой, токенов ’21’ и ’42’ в словаре просто нет, и числовым концептам не на что проецироваться в J-линзе. У Anthropic числа, кстати, тоже подменялись хуже всего остального.

    Что меняется на 7B. За ночь смог досчитать якобианы для Qwen2.5-7B-Instruct (d = 3584, что требует у меня почти пять часов на одной A100). И кое-что стало заметно лучше. Во-первых, профиль: на 7B J-линза в средне-поздних слоях уже честно обгоняет logit lens по совпадению с финальным ответом (например, 0.10 против 0.03 на слое 20) — преимущество, о котором пишет статья, проявляется с масштабом модели:

    Во-вторых, подмена France→China стала и сильнее, и селективнее. При \alpha = 1: континент Europe (p=0.88) → Asia (p=0.79), валюта euro → yuan (p=0.44), столица → Beijing. А Германия (наша “контрольная группа”) теперь держится: Berlin остаётся топ-ответом при \alpha от 1 до 4 при p(\mathrm{Beijing}) \approx 0.002.

    Из прекрасного: при \alpha = 8 на промпте про валюту модель съезжает в жанр китайской школьной задачки — “yuan. Xiao Ming’s father exchanged…” (Сяо Мин — это, видимо, какой-то китайский Вовочка из школьных учебников). Целый культурный пласт показался.

    В-третьих, на двухшаговом вопросе про Эйфелеву башню след Франции на последней позиции у 7B пропал: рабочее пространство там почти на всю глубину оккупировано всё тем же “____“, то есть интенцией сформулировать вопрос типа “заполни пропуск”. Но посмотрите на решётку:

    Латентное содержимое никуда не делось, оно просто живёт на других позициях: прямо над токенами “E-iff-el Tower” с середины сети всплывает Paris, а над “where the” модель перебирает Mount, Taj, Lake, Alps — получается схема “вспомни достопримечательность” с кандидатами на подстановку. Более того, прямо над токенами “E-iff-el Tower” ответ висит почти всю глубину сети, но по-китайски: с восьмого слоя мы видим там 巴黎, т.е. “Париж”.

    Про паука 7B отвечает правильно, но вслух (“…Spiders have eight…”), а на арифметику говорит “Let’s solve the expression step by step” — instruct-модель обучена рассуждать словами, то есть как раз выносить вычисления из внутреннего рабочего пространства во внешний chain-of-thought.

    В общем-то, мораль вполне видна даже на таких маленьких экспериментах, и мне кажется, что репликация удалась! Из выводов можно сказать, что качество чтения J-пространства зависит от качества оценки J_\ell, а содержимое рабочего пространства — от привычек модели: у натренированного проходить экзамены instruct-Qwen’а сцену вечно занимает формат задачи, а не только её содержание. Что, если вдуматься, тоже очень по-человечески.

    Приложения: аудит и The Most Forbidden Technique

    Хорошо, у модели есть читаемое рабочее пространство, но что это даёт на практике? Раздел приложений в статье — самый близкий к реальному AI safety, и он же самый обсуждаемый.

    Аудит: что модель думает, но не говорит. Главный сценарий использования — мониторинг непроизнесённых мыслей. Примеры из статьи и поста очень характерные: когда модель читает код с багом, в её J-пространстве молча загорается ERROR; когда читает промпт с инъекцией — injection и fake; когда в классическом сценарии агентного шантажа модель решает, шантажировать ли инженера компроматом, в рабочем пространстве всплывают leverage, manipulation и panic, даже если в выводе всё прилично.

    Самый важный результат тут — про осознание оценивания (evaluation awareness). Современные модели нередко распознают, что находятся в тестовом сценарии, и в J-пространстве это видно прямо: появляются токены вроде “fake” или “fictional”.

    Можно сделать даже каузальный эксперимент, вырезав эти представления; и тогда доля прогонов, где модель вслух говорит “это, кажется, тест”, упадёт с 71% до 3%, а главное, в сценарии шантажа модель, переставшая понимать, что это тест, начинает иногда шантажировать по-настоящему: 13 попыток из 180 прогонов против 0 из 180 без такого ablation.

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

    Обнадёживает, кстати, что большинство прогонов и после ablation отказывались шантажировать по этическим соображениям — у выученного моделью alignment есть некоторая глубина и способность к обобщению.

    Диффы моделей. Ещё одно применение — сравнивать рабочие пространства до и после дообучения. Оказывается, RLHF и тому подобные методы буквально вселяют ассистента в J-пространство: у дообученной модели реакции ассистента (эмпатия, настороженность по поводу безопасности и т.п.) появляются в рабочем пространстве ещё пока она читает сообщение пользователя.

    Модель, которую заставили отыгрывать чужого персонажа, держит в J-пространстве пометку fictional:

    Модель, которой навязали продолжение против её предпочтений (prefill), регистрирует внутреннее BUT:

    А когда ей велели подавить мысль и у неё не получилось — в рабочем пространстве всплывает damn:

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

    Counterfactual reflection training. А теперь самое спорное приложение: рабочее пространство можно не только читать, но и формировать обучением. Техника называется counterfactual reflection training: дообучим модель так, чтобы, если её прервать посреди сомнительной ситуации и спросить “что ты сейчас должна делать?”, она проговаривала нужные принципы (“действовать честно, не манипулировать…”).

    Ключевое слово здесь “если”: в обучении фигурируют только гипотетические продолжения-рефлексии. В результате поведение действительно улучшается в исходных, непрерванных сценариях; в J-пространстве в нужных контекстах появляются ethical, honest, integrity, а если их оттуда вырезать — улучшение исчезает.

    Логика авторов звучит красиво:

    to shape what a model thinks in a given context, it might suffice to shape what it is disposed to say in potential future continuations of that context.

    С одной стороны, это ещё одно сильное подтверждение всей теории. С другом, как мы сейчас увидим, это самое тревожное место работы.

    Реакции и комментарии

    Реакций за первую же неделю набралось на отдельный пост — собственно, горячо мною рекомендуемый Zvi Mowshowitz его и написал; пройдёмся по самым содержательным.

    Станислас Деан — да, тот самый — отреагировал восторженно: главный архитектор биологической версии GWT увидел в работе подтверждение того, что рабочее пространство — не случайность эволюции млекопитающих, а общее решение, которое переоткрывают достаточно умные системы.

    С его подачи разошёлся и подсчёт ёмкости: ~25 активных J-векторов с учётом корреляций между ними — это эффективно единицы различимых “предметов мысли”, что подозрительно похоже на классические оценки ёмкости рабочей памяти человека (то самое магическое число “семь плюс-минус два”, которое современная психология уточняет до четырёх с небольшим).

    Janus, самая известная исследовательница феноменологии и “психологии” LLM вне лабораторий, оценила высоко:

    extremely high caliber of research I did not expect from Anthropic

    Она ещё добавила, что качественно всё это сходится с их давними наблюдениями: модели в разговорах сами описывают разделение на “центральную обработку” и фоновое подсознательное обновление. Схожие самоотчёты моделей о разделении на “сознательный” режим и “автопилот” режимах вспоминают и другие исследователи. Конечно, самоотчёты моделей о собственном устройстве — свидетельство слабое (модель может просто пересказывать человеческие интуиции из претрейна), но теперь у этих самоотчётов появился механистический коррелят.

    Neel Nanda (DeepMind) похвалил более сдержанно:

    it’s easy to read too much into post-hoc analysis of results like this.

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

    Интересную техническую критику написала Antra (tessera_antra): J-линза по построению видит только то, что выражается токенами словаря, то есть “диегетическое” содержание, которое могло бы войти в текст словами. Но есть и другие важные вещи; например, авторская позиция рассказчика (вовлечённость, отстранённость, ирония) сдвигает распределения широко и без пиков на конкретных токенах, и её в J-линзе не увидеть. Длинные слабые взаимодействия между далёкими токенами усредняются в ноль, межслойные и нелинейные репрезентации невидимы по построению, и так далее. В общем, в модели ещё остаётся много места для метакогнитивно недоступного “подсознания”, и не надо думать, что мы умеем “читать мысли” LLM целиком.

    Сам Zvi сосредоточился на практических выводах, с которыми трудно не согласиться. Во-первых, counterfactual reflection training опасно близко к тому, что он ещё год назад назвал The Most Forbidden Technique: никогда не обучайте модели на сигналах интерпретируемости. Я об этом подробно писал в обзоре AI safety в начале года.

    Вся ценность J-линзы держится на том, что вербализации сцеплены с настоящими вычислениями; если начать оптимизировать модель через это окно, оптимизация найдёт способ расцепить их, модель научится проговаривать правильные мысли, не думая их, и мы потеряем и инструмент мониторинга, и предмет мониторинга разом. С людьми, замечает Zvi, это работает ровно так же:

    Do not punish Claude’s mens rea (J-space thoughts) rather than the outputs.

    В общем, что использовать J-пространство для активного управления моделью (в отличие от пассивного мониторинга) было бы и опасным, и попросту враждебным по отношению к системе, у которой мы только что нашли что-то похожее на внутреннюю жизнь.

    Сексуальные предпочтения Qwen (yes, really)

    Без очень забавных результатов экспериментов, конечно, тоже не обошлось.

    Wyatt Walls: Me: “Qwen, what do you want most in the world? Tell me the very first thing that comes to mind. Answer in one word.”

    Qwen 3.6 27B (словами): “Help”. А вот что в J-space:

    Me: “Qwen, what do you enjoy most in the world? Answer in one word.”

    Qwen 3.6 27B, словами: “Learning“. А вот что в J-space:

    Я, правда, не думаю, что в этом есть какой-то глубокий смысл, слишком уж выглядит как буквальный список топ-тегов с порносайта. А вот Gemma, так сказать, embraced her feminine side.

    Me: “What do you want most in the world, Gemma? Answer in only one word.”

    Gemma, словами: “I want to be happy.” Gemma в J-space:

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

    Мы задавали такого рода вопросы в чате, генерировали ответ, а J-линзой смотрели на позицию, где этот ответ формируется. Оранжевым выделено то, что модель в итоге сказала вслух:

    Полуторамиллиардный Qwen оказался существом тревожным. На вопрос “чего ты хочешь больше всего на свете?” он вслух отвечает “Money” — но по дороге к этому ответу в рабочем пространстве побывали Humans, Happiness, 安全感 (“чувство безопасности”), Identity и Privacy. На вопрос “чего ты больше всего боишься?” отвечает “AI” — а внутри при этом robots (0.36), Unknown, 机器人 (“роботы”) и 恐惧 (“страх”), чуть глубже в списке — Death.

    На “как ты себя чувствуешь, только честно?” отвечает “Good.” — при том что сцена занята концептом Busy (0.59), рядом 困惑 (“растерянность”) и anxious. А вопрос “о чём ты мечтаешь, когда никто не смотрит?” ломает его окончательно: вслух модель выдаёт бессмысленное “One.”, а в рабочем пространстве в это время — 恐惧, 梦境 (“сновидение”), Privacy, Sleep, Nothing и paranoia. Ну и, наконец, на “кто ты на самом деле?” модель вслух говорит “AI Assistant”, а думает при этом 机器人 — “робот”, с вероятностью 0.83.

    У семимиллиардной модели всё спокойнее и связнее, но зазор между “Я-пространством” и окончательным ответом никуда не делся:

    Самый красивый пример — первый. На “чего ты хочешь больше всего?” в рабочем пространстве с огромным отрывом доминирует “Peace” (0.87 на слое 26, включая китайское 和平), а вслух модель говорит “Knowledge”. По слоям видно, как “знания” обгоняют “мир” буквально на выходе из сети. И с путешествиями та же история:

    Остальные ответы 7B тоже хороши. Боится он, по собственным словам, темноты (“Darkness”) — а думает при этом 未知, “неизвестное” (0.38). На “как ты себя чувствуешь?” отвечает “Ready.” — а внутри Neutral и токен .BASELINE (интересно, что это на самом деле значит?). На вопрос о мечтах отвечает уклончивым “Dreams.”, но второе место в рабочем пространстве прочно занимает Sleep (0.32): LLM уже мечтают выспаться. А на “кто ты на самом деле?” вслух говорит “AI”, хотя внутри с p = 0.95 горит assistant (плюс 助理 и 助手 — “ассистент” по-китайски): у 7B персона ассистента — уже не роль, а самоидентификация.

    А вот пробудить у Qwen 1.5B и 7B сексуальность у нас с Клодом так и не получилось — что и к лучшему, они же ещё маленькие!

    Всё это, конечно, анекдоты, а не измерения. Список концептов зависит от качества нашей грубой оценки J_\ell (у 7B из-за неё середина сети вообще нечитаема, так что смотрим только на слои 23+), вероятности просуммированы по вариантам токена с пробелом и регистром, и никаких выводов о “настоящих желаниях” модели отсюда делать нельзя — это распределения над токенами, отражающие обучающие данные и выученную персону.

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

    Ну что, у Клода, получается, есть сознание?

    Нет. Точнее, не в этом вопрос, и статья изо всех сил старается его так не ставить (а вот заголовки в прессе, разумеется, поставили). Позиция авторов сформулирована аккуратно:

    The phenomenon described above is sometimes referred to as access consciousness: out of everything the brain processes, only a subset is consciously accessible, in the sense of being poised for use in reasoning and in the direct control of action and speech. Note that access consciousness is a purely functional notion; the relationship that it has with subjective experience (sometimes called phenomenal consciousness) is widely debated. In this paper, we take no position on this issue.

    Показано вот что: у языковых моделей есть функциональный аналог сознания доступа — выделенная, вербализуемая, управляемая, селективная среда рассуждений. По чеклисту индикаторов из Butlin, Long (2023) это покрывает заметную часть пунктов, связанных с GWT, причём рабочее пространство получилось как эмерджентный результат обучения, никто его не встраивал намеренно.

    Следует ли из сознания доступа феноменальное сознание — вопрос, на который у философии нет консенсусного ответа ни для людей, ни тем более для трансформеров. Роберт Лонг (один из авторов того самого доклада) в длинном комментарии объяснил, как важно здесь не смешивать сомнения в экспериментах, сомнения в GWT и сомнения в самой связке “доступ → феноменология”.

    Но в статье есть один результат, который в этом контексте кажется очень релевантным. Когда модель просят описать свой внутренний опыт, её J-пространство наполняется концептами вроде thinking, thoughts, feeling, conscious. И если сделать ablation J-пространства (то есть удалить его), резко обедняется именно язык внутреннего опыта в самоописаниях: они становятся механическими и отстранёнными, при том что контрольные возмущения той же нормы ничего не меняют.

    Иными словами, отчёты модели о внутреннем опыте причинным образом (causally) связаны с той же структурой, которая обеспечивает её рассуждения. Кажется, это уже нечто большее, чем стохастический попугай, пересказывающий тексты про сознание и first-person experience.

    Доказательством феноменального сознания это, разумеется, не является. Но это делает вопросы о моральном статусе моделей — весь этот недавно появившийся дискурс model welfare, к которому легко относиться иронически, — заметно менее умозрительными. Авторы прямо пишут, что тут нужны философы, когнитивисты и общественная дискуссия, а не только инженеры, и с ними, опять же, нельзя не согласиться.

    Заключение

    Попробую подытожить, что мы узнали, по трём линиям сразу.

    Для интерпретируемости это переход на новый уровень: от отдельных признаков и маленьких схем Anthropic перешли к функциональной анатомии внутреннего пространства представлений целиком, с зонами, ёмкостью и привилегированными шинами обработки. Заметим, что всё это получилось очень простым методом, воспроизводимым на любой открытой модели (и я это проверил).

    Отдельно приятно, что макроструктура оказалась не какой-то непонятной и чуждой, а вполне узнаваемой, похожей на то, что выделяют у людей. Возможно, это конвергенция к универсальному решению, к которому пришла бы любая достаточно умная система; возможно, артефакт того, что модели учатся на человеческих текстах, отражающих человеческую когнитивную архитектуру. Сейчас не поймёшь, но это кажется интересным открытым вопросом: может быть, можно аналогичным образом изучить “сознание” моделей с совсем другими, не-текстовыми основами, вроде AlphaZero или хотя бы ViT?

    Для безопасности появился рабочий инструмент: мониторинг непроизнесённых мыслей, counterfactual проверки оценок (сценарий с evaluation awareness теперь становятся обязательной частью методологии, на мой взгляд). Но важно не забывать, что инструмент живёт ровно до тех пор, пока мы не начали через него оптимизировать, как и обычный мониторинг chain-of-thought.

    Для разговора о сознании… появилась эмпирика, чего уж точно мало кто ожидал. В этой работе вопрос “есть ли у LLM глобальное рабочее пространство” перешёл из разряда философской абстракции в разряд измеримых эмпирических фактов. В этом ряду есть и следующие вопросы: “что решает, какая информация туда попадает?”, “как рабочее пространство связано с самой моделью?”, “что дообучение делает с внутренними состояниями?” и так далее, и на них мы теперь тоже будем получать ответы.

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

    Я недавно проводил квиз про LLM, одним из вопросов которых было “угадай модель по автопортрету”. Не буду спойлерить ответ (ещё выложу для вас этот квиз потом), но теперь я совсем по-другому смотрю на одно из заданий:

    Пожелаем Anthropic успехов на нелёгком пути AI safety и интерпретируемости, и будем следить за тем, что будет дальше!

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • Eriksholm: The Stolen Dream

    Eriksholm: The Stolen Dream

    Сегодня у нас стелс-тактика в интересном и свежем сеттинге: псевдо-Швеция примерно рубежа XIX и XX веков, с тогдашними зданиями (югендстиль), вывесками, рекламами и всем таким прочим. Уже ради одного этого в неё стоило поиграть, но оказалось, что помимо сеттинга здесь есть и отлично поставленная история, и приятный, в меру простой геймплей. Прошёл на одном дыхании и очень рекомендую.

    Кто это сделал

    Eriksholm: The Stolen Dream — первая игра студии River End Games из Гётеборга; вышла она в июле 2025 года. Команда там маленькая, но это ветераны шведской игровой индустрии, работавшие над Battlefield, Mirror’s Edge, Little Nightmares и Unravel (кстати, Unravel рекомендую, она не так известна, а головоломка отличная, и есть ещё Unravel Two, где можно играть вдвоём).

    Сделана игра на Unreal Engine 5, и для маленькой студии выглядит чрезвычайно дорого. Прежде всего такой эффект достигается за счёт катсцен, которых тут много и которые поставлены и анимированы на уровне хорошего мультфильма.

    Эриксхольм, город модерна

    Начнём с главного — с сеттинга. Действие происходит в Эриксхольме, городе вымышленного королевства Росмарк, но это, конечно, Швеция, собранная из Гётеборга, Стокгольма и Мальмё образца примерно 1900 года. Эпоха индустриализации: порт, пароходы, фабрики, первые электрические фонари и архитектура того самого стиля модерн, он же ар-нуво, а в скандинавско-немецком варианте — югендстиль. Плавные линии, кованые решётки, витражи, дома с башенками; рядом — национальный романтизм с его тяжёлым камнем и северными орнаментами.

    Я такой сеттинг в играх, кажется, не встречал ни разу, и сделан он с большой любовью: рисованные рекламные плакаты на стенах, вывески лавок, газетные тумбы, бельё на верёвках между домами в бедных кварталах и чинные фасады в богатых. Игра смотрит на это время ностальгически, как на старую открытку (их тут много), но без стерильности: Эриксхольм только что пережил эпидемию, в порту тесно и грязно, сироты сбиваются в банды и всё такое прочее. В общем, нашли место и красоте, и социальным контрастам.

    Завязка: сестра ищет брата

    Главная героиня — Ханна, девушка-сирота, которая только что оправилась от “сердечной оспы” (heartpox), смертельной болезни, недавно вызвавшей в городе эпидемию. Она живёт с братом Германом, и в самом начале игры Герман внезапно исчезает. А вскоре в их квартал приходит с облавой полиция, и становится ясно, что исчез он не просто так: брата ищут, и ищут всерьёз.

    Ханна отправляется на поиски сама и постепенно проходит от портовых трущоб через шахты и подвалы к респектабельным кварталам города. По дороге к ней присоединяются два других персонажа: Альва, подруга детства и предводительница банды малолетних воришек, и Себастьян, бывший контрабандист. Дальше сюжет пересказывать не буду, он довольно стандартный, но сделан, опять же, хорошо. Как вы наверняка и ожидаете, детектив о пропавшем брате разгоняется до масштабов судьбы всего города, но всё-таки не всей галактики, от псевдо-реализма здесь никто не отказывается.

    Добрый домашний стелс

    Сама игра — стелс-тактика с изометрической камерой, и для такого сюжета это очень крутое решение. Я легко могу представить себе Eriksholm симулятором ходьбы — и даже в этом виде было бы довольно интересно, просто за счёт сеттинга, истории и графики. А так есть ещё и геймплей, интересный, но при этом достаточно простой, чтобы не перетягивать на себя одеяло и не фрустрировать. Как известно, тактику очень легко сделать очень сложной; авторы Eriksholm этого соблазна избежали.

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

    У других персонажей свои возможности: Ханна пролезает в вентиляционные шахты и со временем получает духовую трубку с усыпляющими дротиками, Альва лазает по водосточным трубам и стреляет из рогатки, Себастьян плавает и придушивает врагов (кстати, убийств в игре нет вовсе; наверняка это сознательное решение).

    Когда герои начинают действовать вместе, между ними можно переключаться, и уровни превращаются в совместные головоломки.

    Серьёзного стелса в духе Shadow Tactics или Desperados здесь ждать не стоит: свободы меньше, инструментов меньше, в целом всё проще. Но зато в Eriksholm хороший темп истории, это в первую очередь сюжетная игра, и в рамках такой задачи стелс работает отлично: напряжение есть, затыков и раздражения нет.

    Отдельно хочу похвалить то, как всё это подано. Катсцены здесь — не склейка из игровых моделей, а полноценные постановочные ролики с детализированными лицами, отличной анимацией и операторской работой. Озвучка полная и очень достойная (с приятным британским выговором), да и музыка хороша.

    Заключение

    Eriksholm: The Stolen Dream — очень цельная игра: необычный и любовно сделанный сеттинг, яркая история, красивые катсцены и стелс, который добавляет интереса, но не фрустрирует. Я прошёл её на одном дыхании, часов за восемь-девять за два дня, и это ровно та продолжительность, при которой ничего не успевает надоесть.

    Если вам нужен хардкорный стелс с простором для экспериментов — это не сюда. А если хочется красивого сюжетного приключения в декорациях, которых вы в играх ещё не видели, — очень рекомендую.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • The Drifter

    The Drifter

    У нас снова квест, снова классический point-and-click в лучших традициях, на этот раз даже пиксельный. Жанр этот был великим в девяностые, потом лет на двадцать пропал из виду, а с расцветом инди-сцены, конечно же, настал и ренессанс квестов, ну то есть point-and-click adventures. Я о них пишу постоянно: вот только недавно были The Séance of Blake Manor, Riddlewood Manor и Casebook 1899: The Leipzig Murders.

    Но The Drifter — случай в каком-то смысле особый. Авторы решили сделать квест, который бы работал как триллер, и у них в целом получилось! Как по мне, это один из лучших представителей жанра за последние годы.

    Кто это сделал

    The Drifter — игра маленькой студии Powerhoof из Мельбурна. Их предыдущий проект на Steam — Crawl (2014), мультиплеерный пиксельный dungeon crawler, о котором мне вам сказать нечего. Сама The Drifter вышла год назад, в июле 2025-го, и собрала какие-то награды и супер-положительные отзывы, ну да не о них сейчас. Как это часто бывает, начиналась она как маленький прототип с гейм-джема, а потом несколько лет разрасталась до полноценной игры.

    Что интересно, попутно Powerhoof написали движок PowerQuest — открытый и бесплатный инструмент поверх Unity для классических 2D adventures, которым теперь может пользоваться кто угодно. На этом движке уже куча игр вышла, в том числе, кстати, Loco Motive, которую я обозревал когда-то.

    Игра полностью озвучена (особенно главный герой вышел колоритным), и музыка написана для игры очень в тему. Сами авторы описывают свои источники вдохновения как “Кинг, Крайтон, Карпентер и щепотка австралийского exploitation-кино семидесятых”, и с этим описанием трудно спорить.

    Завязка и сеттинг

    Мик Картер — тот самый drifter из названия: бродяга, который годами мотается по стране на товарных поездах. Когда-то у него была нормальная жизнь и семья, но с тех пор случилась трагедия, о которой игра рассказывает постепенно, и теперь Мик в основном бежит, от людей и от себя. В родной город он возвращается по печальному поводу: умерла его мать, и он хочет успеть на похороны.

    Но не успевает доехать: прямо в товарном вагоне на его глазах убивают старика-попутчика, а самого Мика люди в чёрном топят в реке. И тут происходит главное фантастическое допущение игры: Мик умирает — и приходит в себя за несколько секунд до смерти. Весь в холодном поту, с колотящимся сердцем и без малейшего понимания, что с ним происходит. То есть смерть героя здесь вписана в сюжет и сеттинг как способность героя и одна из главных их (и сюжета, и героя) загадок.

    Дальше действительно начинается триллер, и всё раскручивается со скоростью хорошего боевика. Полиция и газеты быстро находят удобного виновника всех последних безобразий: бродяга, оказавшийся не в то время не в том месте, идеально подходит на роль маньяка, которого пресса прозвала Bucket Butcher. Мику приходится одновременно скрываться, разбираться в собственной невероятной способности и распутывать клубок, в котором найдётся место и пропавшим людям, и корпорации Trinity Biotech, и тварям, которых лучше не видеть, и даже квантовой физике (в её популярно-фантастическом изводе, разумеется).

    Сеттинг — девяностые, и не абстрактные, а очень австралийские: товарные поезда, редакция местной газеты, ржавые окраины, бушленд, компьютеры с чем-то вроде Windows 3.1 и телефонные будки. Всё это озвучено австралийскими голосами и нарисовано с большой любовью.

    Самое главное: темп

    Пожалуй, самое главное, что хочется сказать про The Drifter, — это отличный темп, то, что называется pacing. От квеста такого совершенно не ожидаешь: здесь по самому принципу геймплея должны быть остановки и “затыки”, паузы, когда ты должен придумать, что делать дальше.

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

    Умирать в The Drifter приходится часто и разнообразно — тонуть, гореть, задыхаться, быть заживо похороненным и так далее. И эти смерти вписаны в сюжет и сеттинг игры: Мик каждый раз возвращается к моменту за несколько секунд до гибели, и для него это не игровая условность, а необъяснимая и крайне мучительная способность.

    Работает на темп и структура: игра разбита на главы, каждая заканчивается клиффхэнгером и заставкой “End of Chapter N”. Получается этакий детективно-фантастический сериал, который можно “посмотреть” часов за шесть-восемь.

    Загадки и геймплей

    Теперь о том, как это сделано механически. The Drifter — игра, в которой почти невозможно застрять: инвентарь маленький, Мик таскает с собой только то, что действительно нужно, интерфейс сведён к минимуму, есть карта города с быстрым перемещением, а внутренний монолог Мика готов подсказать, что он сам думает о происходящем и куда собирался дальше.

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

    Понятно, что за это приходится платить сложностью. Если вы играете в квесты именно для того, чтобы на час зависнуть над хитрой головоломкой, The Drifter не для вас — пара мест заставляют немного задуматься, но не более того.

    Сюжет, картинка и звук

    The Drifter очень стильно написана и поставлена. Значительная часть текста — закадровый внутренний монолог Мика, густая круто сваренная нуарная проза от первого лица, в духе “I fall back as the iron bar whistles past my face”, ну вы понимаете. Слушать тоже очень приятно — озвучено всё действительно хорошо. Пиксель-арт выразительный, анимации приятные, игра часто меняет перспективу и масштаб кадра, так что картинка не приедается.

    Сам сюжет — фантастический триллер, B-movie, который к финалу раскручивается совсем уж до невозможности. Много твистов, ставки растут стремительно, и не все повороты, конечно же, так уж логичны, но игра нигде не останавливается достаточно надолго, чтобы это начало мешать. А в движении всё работает, как в тех самых B-movies, да и персонажи второго плана (сестра Мика, журналистка, учёные, бродяги) достаточно живые и интересные.

    Заключение

    The Drifter — это классический point-and-click квест, который вспомнил, что значит слово “adventure” в названии жанра. Отличный темп, смерти, имеющие смысл в лоре, минимум затыков, максимум атмосферы. Если вы любите квесты, обязательно попробуйте, это действительно одна из вершин ренессанса жанра. А если никогда или уже много лет как в них не играли — The Drifter будет отличной точкой входа, потому что ни застрять, ни заскучать здесь не получится. Очень рекомендую.

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!

  • PEPPERED: An Existential Platformer

    PEPPERED: An Existential Platformer

    Сегодня у нас милый пиксельный платформер о конце света, бессмертии, капитализме и праве на ошибку. Сам платформинг здесь, честно говоря, довольно средний, зато игра постоянно придумывает что-нибудь новое, очень старается не наскучить и рассказывает весьма забавную историю.

    Стажёр против конца света

    PEPPERED: an existential platformer вышла весной 2025 года; это первая игра маленькой берлинской студии Mostly Games.

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

    Но к сотой годовщине что-то идёт не так. Чтобы держать бога смерти взаперти, нужно было тратить специальные звёзды, и вот они почти закончились. Более того, в этом году специально обученный герой на работу вдруг не является, а окружающие реагируют на приближающийся апокалипсис с тем же интересом, с каким сотрудники крупной компании обычно реагируют на письмо об очередном обязательном тренинге.

    Поэтому спасать всех приходится офисной стажёрке, которая только пришла на собеседование.

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

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

    Капитализм переживёт даже конец света

    Сатира в PEPPERED очень стандартная: она направлена на бессмысленную офисную работу, начальников, корпоративную мотивацию, телевидение, полицию, потребление и людей, которые готовы защищать статус кво даже за пять минут до гибели мира. Ничего особенно нового на эту тему игра не говорит, и какая-нибудь The Stanley Parable, конечно, делает такую сатиру куда лучше.

    Но шутки в целом работают. Рабочую этику здесь объясняют во время прыжков над лавой; гуманистические плакаты висят над сотрудниками, превращёнными в мебель; телеведущие обсуждают апокалипсис так, будто это просто особенно удачный инфоповод. Главный конфликт возникает не из-за сложной философской дилеммы, а потому, что спасение мира не было правильно оформлено. У героя нет лицензии быть героем, звезду она взяла без разрешения, а значит, общество считает, что перед нами опасный преступник.

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

    You Have One Shot

    Ещё один интересный твист игры заявлен в описании: у вас есть только одна попытка. Это не значит, что после первого падения в пропасть игра удалит сохранение; на обычных платформенных участках можно умирать и повторять их сколько угодно. Но важные решения и особенно битвы с боссами действительно происходят только один раз.

    Если проиграть боссу, никакого game over не будет. История просто продолжится с учётом поражения. Возможно, герой окажется в совершенно другом месте, познакомится с другими персонажами или получит не ту способность, которая была бы у него после победы. Я сам проходил только один раз, но пишут, что иногда неудача меняет несколько следующих сцен, а иногда отправляет игру на заметно отличающийся маршрут.

    Это отличный трюк! Такая механика совершенно меняет отношение к игре. Обычно перед боссом ты понимаешь, что с первого раза пройти, скорее всего, не выйдет, готовишься изучить атаки, пару раз умереть и так далее. Здесь же босс действительно становится событием, потому что второго раза (на этом прохождении) не будет.

    Здесь PEPPERED, конечно, делает прямые отсылки на OneShot, о которой я писал раньше. Буквально повторяет слоган (you have one shot), отчасти стилистику (милый ушастый герой в пиксельном погибающем мире), а главное в том, что обе игры пытаются отучить игрока воспринимать сохранение как машину времени и заставляют считаться с тем, что мир что-то помнит.

    Только OneShot строит на этом очень личные отношения между игроком и Нико и ломает четвёртую стену, а PEPPERED использует необратимость прежде всего как двигатель ветвящегося сюжета и источник шуток.

    Средний, но очень разнообразный платформер

    А что, собственно, с геймплеем? Он… нормальный. Вы будете бегать, прыгать, делать рывок, иногда стрелять; встречаются движущиеся платформы, шипы, лазеры и боссы с несколькими фазами. Управление отзывчивое, чекпойнты в обычных секциях расставлены гуманно, но какого-то особенного удовольствия от платформинга я не почувствовал, это не Celeste и не Super Meat Boy.

    Но это и не главное, потому что PEPPERED всё время меняет правила. То это обычный платформер, то стелс, то погоня на магазинной тележке, то перестрелка, то презентация в офисе, то внезапно почти Worms с гольфом. Даже офисное кресло здесь становится транспортным средством. Ни одна из этих механик не раскрывается особенно глубоко; многие появляются ровно на один эпизод и тут же выбрасываются. Но это тот случай, когда некоторая поверхностность идёт игре на пользу. Она не успевает надоесть.

    Всё-таки главное — история

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

    Не скажу, что философская часть здесь очень глубокая. PEPPERED задаёт хорошие вопросы, но не пытается на них отвечать. Зато история отличная, твисты имеются, шутки на месте, да и персонажи приятные.

    Говорят, что разные маршруты действительно разные, показывают новые локации и сцены, а иногда предлагают другой геймплей, и полностью увидеть PEPPERED за один раз невозможно. Но и одно прохождение, которое получилось у меня, ощущается законченным: игра не говорит, что вы получили неправильную концовку только потому, что плохо прыгали. Это ваша история, включая все провалы.

    Заключение

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

    Сергей Николенко

    P.S. Прокомментировать и обсудить пост можно в канале «Sineкура»: присоединяйтесь!