Featured image of post «Сложность» нельзя измерить числом символов: колмогоровская сложность и истинная природа случайности

«Сложность» нельзя измерить числом символов: колмогоровская сложность и истинная природа случайности

От длины кратчайшей программы, несжимаемости и случайности по Мартин-Лёфу до теоремы об инвариантности, парадокса Берри, невычислимости, константы Хайтина Ω, энтропии Шеннона и современных языковых моделей (LLM).

Введение: Загадка трёх строк длиной в миллион бит — Слепое пятно теории информации Шеннона

Представьте, что перед вами лежат три двоичные строки, каждая длиной ровно \(1\,000\,000\) бит:

  • Первая строка \(S_1\) — это пятьсот тысяч раз повторённая комбинация 01: 01010101...01.
  • Вторая строка \(S_2\) — первые \(1\,000\,000\) двоичных знаков после запятой числа \(\pi\): 1100100100001111110110....
  • Третья строка \(S_3\) получена в результате миллиона реальных подбрасываний симметричной монеты (орёл = 1, решка = 0).

Какая из этих трёх строк содержит больше «информации»? Какая из них «сложнее», и какая является по-настоящему «случайной»? Если мы обратимся к классической теории информации Клода Шеннона (1948), мы столкнёмся с неожиданным парадоксом: шенноновская энтропия \(H(X) = -\sum P(x)\log_2 P(x)\) измеряет среднюю неопределённость распределения вероятностей (ансамбля источника), но совершенно ничего не говорит о внутренней сложности отдельного конкретного объекта \(x\)! В модели честной монеты вероятность выпадения идеально регулярной строки \(S_1\) и хаотичной строки \(S_3\) абсолютно одинакова и равна \(2^{-1\,000\,000}\); а для детерминированной константы \(\pi\) (\(S_2\)) распределение вообще вырождено в одну точку с нулевой энтропией (\(H=0\)), хотя частота нулей и единиц в ней проходит любые статистические тесты на псевдослучайность!

Чтобы дать строгое математическое определение сложности и случайности индивидуального объекта, Рэй Соломонофф (1960), Андрей Николаевич Колмогоров (1965) и Грегори Хайтин (1966) независимо друг от друга создали алгоритмическую теорию информации (Algorithmic Information Theory, AIT). Их ключевая идея проста и гениальна: истинная сложность объекта определяется не количеством символов в нём, а длиной самой короткой компьютерной программы, способной этот объект породить!

  flowchart TD
    S1["String S1: 010101...01 (1M bits)"] -->|"Short Loop Program"| K1["K(S1) = O(log n) bits (Highly Compressible)"]
    S2["String S2: Binary Digits of Pi (1M bits)"] -->|"Spigot Algorithm"| K2["K(S2) = O(log n) bits (Deterministic Law)"]
    S3["String S3: Fair Coin Flips (1M bits)"] -->|"No Pattern / Hardcoded"| K3["K(S3) >= n - O(1) bits (Algorithmically Random)"]

1. Колмогоровская сложность \(K(x)\) и теорема об инвариантности

Зафиксируем универсальную машину Тьюринга \(U\) (или любой Тьюринг-полный язык программирования, такой как C или Python). Колмогоровской сложностью \(K_U(x)\) двоичной строки \(x \in \{0,1\}^*\) называется битовая длина \(|p|\) кратчайшей программы \(p\), которая при запуске на машине \(U\) выводит строку \(x\) и останавливается. Чтобы выполнялось неравенство Крафта \(\sum 2^{-|p|} \le 1\), в современной теории обычно используется беспрефиксная сложность (сложность Левина — Хайтина) \(K(x)\), при которой ни одна допустимая программа не является началом другой.

Взглянем на наши три строки длиной в миллион бит сквозь призму \(K(x)\):

  • Для \(S_1\) достаточно крошечной программы print("01" * 500000). Поскольку в программе нужно закодировать лишь двоичную запись счётчика цикла \(n/2\), получаем \(K(S_1) = O(\log_2 n) pprox 20\) бит — эта строка алгоритмически тривиальна.
  • Для \(S_2\) (первые \(n\) бит числа \(\pi\)), несмотря на кажущийся хаос битов, программа длиной в несколько сотен байт, реализующая формулу Мэчина или капельный алгоритм BBP, вычисляет \(S_2\) абсолютно точно. Следовательно, и здесь \(K(S_2) = O(\log_2 n)\)! Это открывает глубокую философскую истину: закон природы — это не что иное, как предельное алгоритмическое сжатие эмпирических наблюдений.
  • Напротив, для строки \(S_3\), полученной бросками монеты, не существует никакой скрытой закономерности. Кратчайшая программа для вывода \(S_3\) вынуждена буквально хранить все миллион бит в явном виде (print("1011001...")), поэтому \(K(S_3) pprox n + O(1) pprox 1\,000\,000\) бит!

Возникает естественный вопрос: не зависит ли \(K_U(x)\) от произвольного выбора языка программирования \(U\)? Теорема Колмогорова об инвариантности (Invariance Theorem) доказывает, что нет: для любых двух универсальных машин Тьюринга \(U_1\) и \(U_2\) существует константа \(c_{12}\), зависящая только от \(U_1\) и \(U_2\) (и не зависящая от строки \(x\)), такая что \(|K_{U_1}(x) - K_{U_2}(x)| \le c_{12}\). Доказательство прозрачно: \(c_{12}\) — это просто фиксированный размер интерпретатора (симулятора) машины \(U_2\), написанного на языке \(U_1\)! При стремлении длины данных \(n o \infty\) эта константа становится пренебрежимо малой.

\[ H(X) = -\sum_{x \in \mathcal{X}} P(X = x) \log_2 P(X = x) \]\[ K_U(x) = \min_{p \in \{0,1\}^*} \Big\{ |p| \;\Big|\; U(p) = x \Big\}, \qquad \Big| K_{U_1}(x) - K_{U_2}(x) \Big| \le c_{12} \]

2. Природа случайности: принцип Дирихле, несжимаемость и случайность по Мартин-Лёфу

До Колмогорова теория вероятностей не могла объяснить, почему индивидуальная строка 0000000000 не случайна, а 0110100110 кажется случайной. Алгоритмическая теория информации дала первое строгое определение: случайность есть несжимаемость — полное отсутствие алгоритмических закономерностей!

Более того, с помощью элементарного принципа Дирихле (Pigeonhole Principle) в две строчки доказывается, что подавляющее большинство двоичных строк алгоритмически случайны (несжимаемы): Всего существует ровно \(2^n\) двоичных строк длины \(n\). А сколько существует двоичных программ длины строго меньше \(n - c\) бит? Суммируя количество программ длины \(0, 1, \dots, n-c-1\), получаем \(\sum_{i=0}^{n-c-1} 2^i = 2^{n-c} - 1\) возможных программ. Поскольку каждая программа выдаёт не более одного результата, из \(2^n\) строк длины \(n\) не более чем \(2^{n-c} - 1\) строк могут быть сжаты хотя бы на \(c\) бит (\(K(x) < n - c\))! Иными словами, доля строк длины \(n\), поддающихся сжатию на \(c\) бит и более, строго меньше \(2^{-c}\). При \(c = 20\) свыше \(99,9999\,\%\) всех строк невозможно сжать даже на \(20\) бит никаким мыслимым алгоритмом! Пер Мартин-Лёф в 1966 году доказал, что бесконечная двоичная последовательность проходит все вычислимые статистические тесты на случайность (случайность по Мартин-Лёфу) тогда и только тогда, когда все её префиксы \(x_{1:n}\) несжимаемы (\(K(x_{1:n}) \ge n - O(1)\)).

\[ \sum_{i=0}^{n-c-1} 2^i = 2^{n-c} - 1 \implies \mathbb{P}_{x \sim \text{Unif}(\{0,1\}^n)}\big( K(x) < n - c \big) < \frac{2^{n-c}}{2^n} = 2^{-c} \]\[ \Omega = \sum_{p:\, U(p)\text{ halts}} 2^{-|p|} \in (0, 1), \qquad K(\Omega_{1:n}) \ge n - O(1) \]
  flowchart TD
    A["Assume Program P_K Computes K(x)"] --> B["Construct Program Q of Length L = |Q|"]
    B --> C["Q Searches Lexicographically for First String s with K(s) > L + 1000"]
    C --> D["Q Outputs s, so by Definition K(s) <= |Q| = L"]
    D --> E["Contradiction: L + 1000 < K(s) <= L (Berry Paradox / Uncomputability)"]

3. Парадокс Берри, невычислимость \(K(x)\), константа Хайтина \(\Omega\) и современный ИИ

Можно ли написать идеальный архиватор, который для любой входной строки \(x\) вычисляет её точную сложность \(K(x)\)? Ответ категоричен: нет, функция \(K(x)\) алгоритмически невычислима!

Это ограничение восходит к классическому парадоксу Берри («наименьшее натуральное число, которое нельзя описать менее чем двадцатью словами» — фраза из двенадцати слов, описывающая это число!). Грегори Хайтин формализовал его так: допустим, существует подпрограмма ComputeK(x) фиксированной длины \(L\) бит, вычисляющая \(K(x)\). Построим главную программу \(Q\), которая перебирает все строки \(s\) в лексикографическом порядке, вызывает ComputeK(s) и выводит первую же строку \(s^*\), для которой \(K(s^*) > L + 10000\). Полная длина программы \(Q\) составляет всего \(L + O(1)\) бит, но она выдаёт \(s^*\)! По определению \(K(s^*)\) как длины кратчайшей программы должно выполняться \(K(s^*) \le |Q| < L + 10000\), что прямо противоречит условию \(K(s^*) > L + 10000\)! Отсюда следует теорема Хайтина о неполноте: никакая формальная аксиоматическая система сложности \(C\) бит не способна доказать оценку \(K(x) > C + O(1)\) ни для какой конкретной строки \(x\).

Хайтин также определил вероятность остановки универсальной беспрефиксной машины Тьюринга — легендарную константу Омега \(\Omega = \sum_{U(p) ext{ останавливается}} 2^{-|p|}\). Число \(\Omega \in (0,1)\) строго определено, но абсолютно невычислимо и алгоритмически случайно (\(K(\Omega_{1:n}) \ge n - O(1)\)): знание первых \(n\) бит числа \(\Omega\) позволяет решить проблему остановки Тьюринга для всех программ длины до \(n\)!

В современной инженерии и искусственном интеллекте вычислимые оценки сверху для \(K(x)\) лежат в основе прорывных технологий:

  1. Связь с энтропией Шеннона: для стационарных эргодических источников математическое ожидание \( rac{1}{n}\mathbb{E}[K(X_{1:n})]\) сходится к скорости энтропии Шеннона \(H(X)\).
  2. Универсальная индукция Соломоноффа и принцип минимальной длины описания (MDL): бритва Оккама формализуется через универсальное априорное распределение \(P_M(x) \propto 2^{-K(x)}\).
  3. Нормализованное расстояние сжатия (NCD): аппроксимируя \(K(x)\) реальными архиваторами (zstd, lzma, gzip), формула \( ext{NCD}(x,y) = rac{C(xy) - \min(C(x),C(y))}{\max(C(x),C(y))}\) позволяет строить эволюционные деревья геномов и классифицировать вредоносный код без ручного выделения признаков.
  4. Большие языковые модели (LLM): сжатие есть интеллект: как показали Маркус Хаттер (Hutter Prize) и Илья Суцкевер, минимизация кросс-энтропийной функции потерь \(-\sum \log_2 P_ heta(x_t \mid x_{<t})\) авторегрессионного трансформера с помощью арифметического кодирования математически эквивалентна поиску кратчайшего сжатия данных без потерь. Чтобы сжать человеческие тексты до предела, нейросеть вынуждена усвоить грамматику, логику и причинно-следственную модель мира.
Измерение / КонцепцияЭнтропия Шеннона \(H(X)\)Колмогоровская сложность \(K(x)\)Инженерные аппроксимации (MDL / LLM / NCD)
Объект измеренияРаспределение вероятностей (ансамбль)Индивидуальный объект / строка \(x\)Реальные файлы, геномы, текстовые корпуса
Оценка первых \(10^6\) бит числа \(\pi\)Детерминированная константа (\(H=0\)); частоты равномерны\(K(\pi_{1:n}) = O(\log n)\) (проста благодаря короткому алгоритму)Арифметическое кодирование и нейросети находят структуру
ВычислимостьТочно вычислима при известном распределении \(P(X)\)Строго невычислима (эквивалентна проблеме остановки)Оценки сверху через zstd/LZMA или Transformer \(P_ heta\)
Ключевые теоремы и философияТеорема Шеннона о кодировании источникаТеорема об инвариантности, неполнота Хайтина, число \(\Omega\)Бритва Оккама, «Сжатие = Предсказание = Интеллект»
\[ P_M(x) = \sum_{p:\, U(p)=x} 2^{-|p|} \approx 2^{-K(x)}, \qquad \text{NCD}(x, y) = \frac{C(xy) - \min\{C(x), C(y)\}}{\max\{C(x), C(y)\}} \]
comments powered by Disqus