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