Вместо введения: зачем нужны компактные описания
Человечество всегда искало компактных описаний реальности – в этом, по существу, заключается наука как явление. Мы хотим не просто накопить горы фактов, но сжать, свернуть их до нескольких принципов, формул или схем, которые можно удержать в голове и передать другому.
Одним из таких инструментов стали когнитивные карты. Кто изобрёл их первым – сказать трудно (хотя, это был слонёнок экономист Роберт Аксельрод). Под разными именами они возникают то тут, то там чуть ли не с момента появления письменности. Понять нечто – значит составить для «этого» когнитивную карту. Взаимопонимание – это совпадение когнитивных карт у двух и более пользователей. Древнекитайская мудрость гласит: «Знание – это взаимосвязь» (может, и не китайская, но достаточно старая, см. «Тектологию» Александра Богданова 1917 г., труды Льва Выготского).

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

Устройство карты, шесть концептов
Концепт 1: Ожидания инвесторов (main concept), то, с чего начинается симуляция. На каждом такте принимает новое значение от фильтрующего концепта – это «прогноз потребления» или «ожидание доходности», с которым инвестор входит в очередной цикл (такт симуляции).
Концепт 2: Хайп (коэффициент r), коэффициент виральности, маркетинговый ажиотаж. В нашей модели хайп будет постепенно нарастать от такта к такту симуляции, пока не обрушит стабильность наблюдаемой инвестором реальности, но обо всём по порядку.
Концепт 3: Мальтузианский барьер (1 - x). Вслед за Томасом Мальтусом назовём этот концепт «барьером» (население растёт экспоненциально, ресурсы лишь линейно, этот разрыв порождает барьер, кризис, ловушку). Концепт принимает на вход желаемый объём ресурсов (в относительных величинах) – как пример, вычислительных (ограниченных географией, термодинамикой, временем строительства) или алгоритмических (ограниченных продуктивностью самих алгоритмов). На выходе концепт выдаёт то, как получается «на самом деле», с учётом небезграничности ресурсов и не более чем линейного характера их наращивания.
Концепт 4: Мультипликативный (реальное потребление и результат инвестиций). Принимает на вход хайп, ожидания (main) и мальтузианский барьер (1 − x). Перемножает их. По сути, это классическое логистическое отображение, справедливое для размножения насекомых, добычи природных ресурсов и всего прочего, где существует конечная ёмкость среды.
Концепт 5: Здравый смысл (фильтр, инерция ожиданий). Расположен между мультипликативным концептом и концептом ожиданий. Принимает на вход результат инвестиций (мультипликативный концепт), прошлые ожидания (main) и коэффициент степень осторожности (коэффициент сглаживания α – «инерцию»). Внутри фильтра зашито экспоненциальное бегущее среднее (Exponential Running Average, EMA). Почему именно оно? Не из каких-то глубинных представлений (хотя, закон Вебера-Фехнера о логарифмическом восприятии сигналов мог бы натолкнуть на некоторые соображения), а потому, что такому фильтру для работы достаточно трёх величин: старое фильтрованное значение, новое значение и коэффициент сглаживания, просто и элегантно, чёрт возьми.
Концепт 6: Степень осторожности (коэффициент сглаживания α у EMA). Это степень здравомыслия инвестора, его психологическая инерция. α = 0 означает полную расторможенность: новые данные мгновенно и без фильтрации становятся новыми ожиданиями. α = 1 означает крайний консерватизм: инвестор туп как пень и не реагирует на новую информацию. Впрочем, есть тонкая грань между здравомыслием и отупением. Какая именно – кто знает? Посмотрим это ниже.
Как именно работает симуляция
Как именно это работает? Каждый такт симуляции представляет собой условный период между принятием инвест-решений и появлением наблюдаемых результатов. На каждом такте данные передаются из концепта в концепт согласно описанной схеме. Ожидания инвесторов влияют на реальность, реальность влияет на ожидания инвесторов. Хайп от такта к такту понемногу нарастает, а мы смотрим, что из этого получается. Помимо хайпа, мы исследуем, как ситуация зависит от психологической инерции инвесторов.

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

Что это? Это система идёт вразнос, измельчим шаг:

Измельчим ещё:

От линии, от отрезков откажемся, оставим только точки на концах отрезков. Мельче шаг!

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

Три режима поведения системы

↑ Начало, режим 1: спокойное развитие. Всё идёт по плану, медленно, но верно, - весело и страшно. Хайп невысок, ресурсов хватает, ожидания адекватны рынку. Это стадия развития технологии: что-то получается, что-то нет, присутствует осторожный оптимизм. Истерия рынка если и наблюдается, то маргинализирована и в целом управляема.

Бифуркации, режим 2: зона ветвлений. Хайп окреп. Он заставляет инвесторов вкладываться в рискованные проекты. Однозначность ситуации разваливается. Выстреливает не всё, но это по крайней мере предсказуемо с некоторой вероятностью. Число ветвлений реальности сравнительно невелико, взлёты и падения в целом ещё можно объяснить себе и акционерам.

Динамический хаос, r > 3.564, режим 3: хаос наступает быстро, хотя и не везде сразу, сценарий Колмогорова-Арнольда-Мозера. Добавим ещё немного хайпа и поведение рынка переходит из зоны, где хоть что-то было понятно, в зону тотальной и нервной непредсказуемости. То, что ещё недавно работало, по какой-то причине подводит. Прогнозы, в которых ещё вчера был смысл, сегодня кажутся абсурдом. Поведение системы в этой зоне характеризуется «положительным старшим показателем Ляпунова», две сколь угодно близкие фазовые траектории экспоненциально расходятся, прогноз невозможен, происходит прогрессирующая потеря информации. Победителей определяет случай и только случай. Вращайте барабан!
Окна стабильности внутри шторма
Внутри урагана бывают затишья, есть они и в третьей зоне: среди хаоса встречаются области кажущейся стабильности – большие «окна» на диаграмме. Но даже внутри такого окна присутствуют очень неприятные, близкие к нулю альтернативы. Кажущаяся стабильность обманчива: система в любой момент может сорваться из три-цикла в коллапс (Шарковский, Ли и Йорк).
Включаем инвестору мозги, роль фильтра
Раскрою небольшой секрет. Всё, что мы рассмотрели выше – это когнитивная карта, где эксперт был полностью расторможен, его фильтр не работал (α = 0), он передавал на выход ровно то же самое, что получал на входе. Теперь сделаем всё как надо: включим инвестору мозги. Что изменится?
Ничего не изменится – вернее, изменится, но не принципиально. Проварьируем сглаживание α от 0 (инвестор без тормозов) до ~1 (консерватор). Что мы видим?

Самы левый сплющенный цветок на диаграмме – картинка, которую мы видели ранее (инвестор без фильтра), всё остальное – инвестор с фильтром. Чем правее, тем сильнее фильтрация.
Как видно, небольшая «тормознутость» (фильтрация входящих новостей-сигналов) не вредна. Она оттягивает момент наступления хаоса: можно пережить большие порции хайпа и не лопнуть сразу. Но посмотрим, что будет дальше. Финансовый пузырь всё равно лопается, переходя на хаотический режим, хотя и делает это позже. Более того, кризис при высоком α имеет большие масштабы – как по размаху, так и по длительности. Зона убийственного хайпа растягивается настолько, что пребывать в ней можно очень и очень долго. А выйти, одумавшись и сделав пару хайп-шагов назад, уже не получится, рынок может оставаться безумным дольше, чем ты – платежеспособным, конец.
Ради интереса посмотрим, как поведёт себя в этой игре гораздо более тупой фильтр – тот, что ничего не знает и знать не хочет, просто делает шаг в сторону тренда входящего сигнала (fixed step tracking filter, FST, фильтр каменного века (ссылки не будет, потому что это в общем-то не фильтр, а чорт знает что). Такой образ действий требует от инвестора железной выдержки: он не подвержен хайпу и, вообще говоря, выходит за рамки нашей модели – возможно он хозяин финансового пузыря. Тем не менее, с увеличением хайпа такой инвестор тоже оказывается в зонах бифуркации, а затем попадает в зону «лоскутных» хаотических решений, рваных по структуре.

Выводы
Итак, что же мы узнали из этой несложной когнитивной модели?
Хайп убивает бизнес (иррациональный оптимизм по Роберту Шиллеру), превращая его в поле чудес. При достаточно сильном ажиотаже рынок перестаёт быть рынком – он становится казино, где результат не связан с фундаментальными показателями.
Осторожность и консерватизм хороши, но лишь до некоторого предела. Небольшая инерция ожиданий помогает оттянуть кризис. Однако слишком сильная инерция приводит к тому, что инвестор не замечает опасности до последнего и входит в кризис с максимальным масштабом проблем – выход становится математически невозможным.
Знание о принципиальной непредсказуемости – тоже знание. Когнитивная карта, демонстрирующая динамический хаос, не бесполезна. Она очерчивает границу, за которой заканчивается прогностическая сила любой – сколь угодно сложной – модели. Это несколько отрезвляет.
Что дальше
Мы создали простейшую когнитивную карту, которая демонстрирует хаотическое поведение, – по сути, это уравнение Ферхюльста (точнее, логистическое отображение) в обёртке когнитивного моделирования, где в правой части диаграммы бифуркаций Фейгенбаума располагается странный аттрактор. Кому-то это могло быть очевидно с самого начала, этих уважаемых граждан я прошу воздержаться от обсценной лексики.
Естественный следующий шаг – выяснить, возможен ли аналогичный эффект, но без Ферхюльста, например, на «нечётких когнитивных картах», они ближе к жизни, связи там – не жёсткие коэффициенты, а размытые отношения, операции агрегирования, зашитые в концепты – t-нормы и s-нормы. Возможны ли там странные аттракторы? Потеряет ли модель интерпретируемость – или, напротив, получим более гибкий инструмент для моделирования динамического хаоса? Вопрос открыт, хотя есть пара идей.
Post Scriptum
Код, выполняющий симуляцию и отрисовку, был написан на Processing 4.x (синтаксис Java), он под спойлером:
Скрытый текст
/* Симуляция когнитивной карты v2.4 Карта состоит из концептов, которые я назвал "нодами". У каждой ноды есть имя, список входящих (input) нод и значение (float число). У каждой ноды есть "операция", которую нода делает с числами нод, входящих в её inputs. Ноды живут в классе ModelBuilder. Для операций есть отдельные классы и интерфейс Operator, чтобы однотипные ноды включали в себя разнотипные операции. Ещё есть отрисовка симуляции средствами Processing, настройки отрисовки и симуляции в начале файла. */ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; // для HashSet // ==================================== // НАСТРОЙКИ СИМУЛЯЦИИ // ==================================== String filtername = "EMA"; // "EMA"/"FST" float rmin = 1; // леавя граница r float r_margin_shift = 1; float rmax = 4.001 + r_margin_shift; // правая граница float r = rmin; float kstep = 1; // коэффициент укрупняющий шаг (задан самый мелкий для точек, 1000 для линий) float stepmax = 0.0000025 * kstep; float stepmin = 0.00000025 * kstep; float delta = 4.669201609; // первая константа Фейгенбаума float base = delta; int batch_size = 42000; // сколько точек считаем каждый кадр (чем меньше тем дольше отрисовка) float ptrans = 45; // прозрачность точек float pweight = 1; // размер точек и линий (если есть линии) boolean draw_lines = false; // соединять точки линиями (наглядно если точек немного) boolean var_fkf = true; // варьировать настройку фильтра float filter_step = 0.1; // шаг варьирования boolean draw_partial = false; // выделять жирным точки в диапазоне r_left..r_right float r_left = 3.564; float r_right = rmax; float ptrans_partial_big = 200; // прозрачность выделенеия float ptrans_pweight_big = 8; // размер точек выделения float ptrans_partial_small = 2; float ptrans_pweight_small = 1; // ==================================== // ОПЕРАЦИИ // ==================================== interface Operator { float execute(ArrayList<Float> inputs); String signature(); } class OpNone implements Operator { // заглушка для нод без входов String name = "нет операции"; public float execute(ArrayList<Float> inputs) { return 0; } public String signature() { return name; } } class OpGet implements Operator { // никак не изменяем вход (просто помещаем его в value) String name = "вход -> выход"; public float execute(ArrayList<Float> inputs) { if (inputs.size() != 1) { println("get(): ожидается ArrayList<Float> из одного значения, получено значений: " + inputs.size()); return 0; } return inputs.get(0); } public String signature() { return name; } } class OpComp implements Operator { // превращаем вход в (1 - вход), комплементарная операция String name = "(1 - x)"; public float execute(ArrayList<Float> inputs) { if (inputs.size() != 1) { println("comp(): ожидается ArrayList<Float> из одного значения, получено значений: " + inputs.size()); return 0; } return 1 - inputs.get(0); } public String signature() { return name; } } class OpMult implements Operator { // произведение всех входов String name = "Произведение входов"; public float execute(ArrayList<Float> inputs) { float product = 1; for (float v : inputs) product *= v; return product; } public String signature() { return name; } } class OpEMA implements Operator { // фильтр экспоненциального скользящего среднего EMA(smooth, oldFiltered, newSignal) - exponential moving average String name = "EMA фильтр"; public float execute(ArrayList<Float> inputs) { if (inputs.size() != 3) { println("EMA: ожидается ArrayList<Float> {step, oldFilter, signal}, получено значений: " + inputs.size()); return 0; } float s = inputs.get(0); float oldVal = inputs.get(1); float signal = inputs.get(2); return signal * (1 - s) + oldVal * s; } public String signature() { return name; } } class OpFST implements Operator { // фильтр с фиксированным шагом, двигается в сторону сигнала, но не больше чем на step FST(step, oldFilter, signal) - fixed step tracking String name = "FST фильтр"; public float execute(ArrayList<Float> inputs) { if (inputs.size() != 3) { println("FST: ожидается ArrayList<Float> {step, oldFilter, signal}, получено значений: " + inputs.size()); return 0; } float step = inputs.get(0); float oldVal = inputs.get(1); float signal = inputs.get(2); if (abs(signal - oldVal) >= step) { return signal > oldVal ? oldVal + step : oldVal - step; } return signal; } public String signature() { return name; } } // ==================================== // НОДА (концепт) // ==================================== class Node { String name; float val; Operator op; ArrayList<Node> inputs; // int iterations = 0; // счётчик апдейтов ноды ArrayList<String> inputs_strings; // записи об инпутах для билдера boolean setup_node = false; Node(String name, float initialValue, Operator op) { this.name = name; this.val = initialValue; this.op = op; this.inputs = new ArrayList<Node>(); this.inputs_strings = new ArrayList<String>(); } void connectFrom(Node source) { inputs.add(source); } void connectFrom(Node... sources) { for (Node s : sources) inputs.add(s); } void update() { // iterations++; if (inputs.size() == 0) return; // нода без входов ArrayList<Float> data = new ArrayList<Float>(); for (Node n : inputs) data.add(n.val); // собираем значения входов val = op.execute(data); // выполняем над ними операцию, результат помещаем в значение ноды } } // ==================================== // MODEL BUILDER // ==================================== class ModelBuilder { ArrayList<Node> nodes; ModelBuilder() { nodes = new ArrayList<Node>(); } public void addNode(String name, float initialValue, Operator op, String... inputs) { Node n = new Node(name, initialValue, op); for (String rx : inputs) { n.inputs_strings.add(rx); } nodes.add(n); } // создаём все связи, проверяем ноды public void build() { for (Node n : nodes) { for (String rx : n.inputs_strings) { Node node = findNode(rx); if (node == null) throw new RuntimeException(rx + " -- эта нода указана как входящая в .addNode(), но не найдена при сборке"); n.inputs.add(node); } } ArrayList<String> all_names = new ArrayList<String>(); // проверка уникальности for (Node n : nodes) all_names.add(n.name); if (new HashSet<String>(all_names).size() != all_names.size()) throw new RuntimeException("имена нод должны быть уникальными"); // проверка нод-отщепенцев for (Node n : nodes) { if (n.inputs.size() == 0) { // у ноды нет входов boolean owner_found = false; for (Node n_other : nodes) { if (n_other.inputs.contains(n)) { owner_found = true; break; } } if (owner_found == false) throw new RuntimeException(n.name + " -- висячая нода, она не имеет входов и выходов"); } } } public void printScheme() { println("#### Схема модели"); int i = 0; for (Node n : nodes) { println(i + ". " + n.name + " | " + n.op.signature() + " | inputs: " + String.join(", ", n.inputs_strings)); i++; } println("####"); } private Node findNode(String name) { for (Node n : nodes) { if (n.name.equals(name)) return n; } return null; } public void setNodeVal(String name, float newVal) { Node n = findNode(name); if (n != null) { n.val = newVal; } else { println("setNodeVal: нода '" + name + "' не найдена"); } } public float getNodeVal(String name) { Node n = findNode(name); if (n != null) return n.val; println("getNodeVal: нода '" + name + "' не найдена"); return 0; } } // ==================================== // ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ // ==================================== float emap(float value, float start1, float stop1, float start2, float stop2, float exponent) { float normalized = (value - start1) / (stop1 - start1); float mapped = pow(normalized, exponent); return start2 + mapped * (stop2 - start2); } String timestamp() { return LocalDateTime.now() .format(DateTimeFormatter.ofPattern("yyMMdd-HHmmss")); } // ==================================== // PROCESSING: SETUP, создание когнитивной карты // ==================================== void setup() { //size(1150, 710, P2D); // fullScreen(P2D); // noSmooth(); // no smooth no problem strokeCap(PROJECT); // квадратные точки быстрая отрисовка background(0); mb = new ModelBuilder(); // порядок inputs важен для операторов, внимание mb.addNode("expectations", 0.001, new OpGet(), "filtered"); mb.findNode("expectations").setup_node = true; // такие ноды не обрабатывают inputs на нулевой итерации, mb.addNode("hype", 0.0, new OpNone()); mb.addNode("barrier", 0.0, new OpComp(), "expectations"); mb.addNode("reality", 0.0, new OpMult(), "hype", "expectations", "barrier"); mb.addNode("smooth", 0.0, new OpNone()); if (filtername == "EMA") mb.addNode("filtered", 0.0, new OpEMA(), "smooth", "expectations", "reality"); else if (filtername == "FST") mb.addNode("filtered", 0.0, new OpFST(), "smooth", "expectations", "reality"); else throw new RuntimeException(filtername + " -- не знаю такого filtername"); mb.build(); mb.printScheme(); } // ==================================== // PROCESSING: DRAW, симуляция // ==================================== ModelBuilder mb; int sim_iter_count = 0; // счётчик итераций float x_prev = 0, y_prev = 0; float dr = 0; void draw() { boolean stop = false; for (int batch = 0; batch < batch_size; batch++) { dr = emap(r, rmin, rmax, stepmax, stepmin, base); r += dr; mb.setNodeVal("hype", r); // Режим варьирования коэффициента фильтра if (var_fkf) { if (sim_iter_count == 0) println(mb.getNodeVal("smooth")); if (r >= rmax) { r = rmin; mb.setNodeVal("expectations", 0.00142); mb.setNodeVal("filtered", 0.00142); ////sim_iter_count = 0; // надо ли это, вроде setup нода не зануляется float currentFilter = mb.getNodeVal("smooth"); mb.setNodeVal("smooth", currentFilter + filter_step); println(mb.getNodeVal("smooth")); } if (mb.getNodeVal("smooth") > 1.001) { // почему-то есть шум в седьмом знаке stop = true; break; } } else { if (r >= rmax) { stop = true; break; } } // Обновление нод for (Node node : mb.nodes) { if (sim_iter_count == 0 && node.setup_node == true) // чтоб на самой первой итерации не получить непонятно что continue; node.update(); } sim_iter_count++; // Отрисовка float x = emap(r, rmin, rmax, 0, width, delta); float y = map(mb.getNodeVal("expectations"), -0.1, 1.1, height, 0); if (draw_partial) { if (r_left < r && r < r_right) { ptrans = ptrans_partial_big; pweight = ptrans_pweight_big; } else { ptrans = ptrans_partial_small; pweight = ptrans_pweight_small; } } stroke(255, ptrans); strokeWeight(pweight); point(x, y); if (draw_lines) { line(x, y, x_prev, y_prev); x_prev = x; y_prev = y; } } if (stop) { println("done", sim_iter_count, "iterations"); noLoop(); } } // ==================================== // PROCESSING: сохранение .png по клику // ==================================== void mousePressed() { String fname = timestamp() + ".png"; save(fname); println(fname + " saved"); // в режиме noLoop() скриншот косячит }
Код довольно примитивный, тем не менее, он позволяет оживлять когнитивные карты, что само по себе не плохо. Отрисовка диаграмм для пущей наглядности хаоса проводилась в логарифмическом масштабе по основанию 4.669201609 (в этом есть некоторая логика, см. «первая константа Фейгенбаума»).
И ещё кое что...
Скрытый текст
Post Post Scriptum (*.06.2026)
Порассуждаем вдогонку – где, собственно, находимся «мы» на карте ИИ-пузыря?
Диагноз по модели
У нас есть концепт main («Ожидания инвесторов от ИИ»), концепт r («Хайп»), мальтузианский барьер (физические ограничения: чипы, энергия, данные, кадры) и фильтр (способность индустрии сколько-нибудь трезво оценивать происходящее). Текущий такт симуляции: мы определённо не в первой зоне (спокойное развитие) – это было условное десятилетие 2010-2020, когда нейронки тихо-мирно учились, а инвесторы не обращали на них особого внимания. Сейчас определённо не ChatGPT образца ноября 2022, когда хайп только начинал разгоняться, мы где-то в переходе от второй зоны к третьей. Признаки: хайп – огромен, фундаментален, Nvidia стоит больше, чем весь фондовый рынок Германии, cтартапы без выручки привлекают миллиарды под «мы добавим ИИ в твой тостер». Каждый второй пресс-релиз содержит магическую аббревиатуру. Это классическая вторая зона: число ветвлений реальности велико, но некоторым ещё кажется, что они понимают/чувствуют правила игры. На оперативном горизонте видны признаки третьей зоны:
Мальтузианский барьер скрипит. Чипы H100/B200 распроданы на год вперёд, TSMC не справляется с объёмами, профсоюзы требуют свей доли сверхприбыли, энергопотребление дата-центров упирается в физику охлаждения и доступные мощности местных электросетей, +- все созданные человеком тексты скормлены моделям, новых текстов взять неоткуда – есть синтетические, от которых модели ощутимо тупеют и впадают в бешенство.
Прогнозы аналитиков отрываются от реальности. Goldman Sachs (условно) обещает $7 триллионов дополнительного мирового ВВП от генеративного ИИ к 2030 году. Другие аналитики – $15 триллионов. Третьи говорят: «Сколько не жалко, столько и нарисуем». Это симптом того самого мультипликативного эффекта по Ферхюльсту:
Реальное = r × Ожидания × (1 − Ожидания), где ожидания громоздятся до небес.
Три сценария
Сценарий А: Мягкая посадка (α высокий, инвесторы тормознутые). Индустрия сама себе включает фильтр. Происходит это так: пара крупных фондов тихо снижают долю в AI-стартапах, мотивируя это «пересмотром риск-профиля». Модели продолжают улучшаться, но без чудес, ожидания постепенно снижаются. Пузырь не лопается, а медленно опадает. Экономисты называют это «коррекцией» (везением). Вероятность: низкая, потому что жадность и FOMO (то бишь боязнь упущений) сильнее здравого смысла, а коэффициент сглаживания α у текущего рынка близок к нулю.
Сценарий Б: "Бада-бум" (α = 0, хайп достигает критического r). Какая-нибудь крупная компания (условный OpenAI, условный Anthropic, условный Microsoft) внезапно объявляет: «Мы потратили $10 миллиардов, а очередная версия модели не показала прироста, клиенты не готовы платить $2000 в месяц за подписку». Или: «Новый регуляторный акт ЕС/США запрещает обучение на общедоступных данных без лицензии, мы в суде, ваш продукт заморожен». Или хрестоматийное: Nvidia отчитывается о квартальной выручке, которая «всего лишь» совпала с прогнозом, а не превысила его втрое – от такого акции летят вниз, запуская цепную реакцию margin calls у брокеров по всем хайповым позициям. После локального коллапса наступает наша любимая третья зона: непредсказуемость, паника, «кто ж знал, что редиска такая круглая?». Выживают те, у кого были собственные чипы, собственные данные и прагматичный менеджмент, остальные вращают барабан. Вероятность apocalypse now: средне-высокая.
Сценарий В: Растянутый хаос (α средний, пузырь накачивается дольше, зато лопается больнее). Инерция больших денег и институциональных инвесторов затягивает процесс. Пенсионные фонды, суверенные фонды, целевые фонды университетов заходят в AI-инфраструктуру как в «новую нефть». Хайп продолжается не 2-3 года, а так 5-7 лет. Мальтузианский барьер проседает окончательно: дата-центры начинают конкурировать с городами за электричество, стоимость обучения моделей сравнивается с бюджетом страны. В этот момент система сваливается в хаос с большой амплитудой. Возможно, наступает то самое «окно стабильности» внутри шторма: все знают, что пузырь лопнет, но продолжают инвестировать, потому что «а вдруг я успею выйти». Успеют, но не все. Вероятность: высокая, потому что это классический сценарий для пузырей с институциональными деньгами (см. ипотечный кризис 2007/8, с общемировой рецессией, растянутой на годы).
Тенденции хайпа и торможения
Хайп сейчас: Растёт нелинейно. Каждый новый релиз (GPT, Claude, Gemini) – это не просто продукт, а хайп-событие, ускоряющее сам хайп. Маркетинговые бюджеты AI-компаний превышают бюджеты на исследование и разработку робототехнических стартапов десятилетней давности. Хайп стал самоподдерживающимся: медиа пересказывают пресс-релизы, инвесторы читают медиа, стартапы пишут пресс-релизы, резонируя волны медиа-хайпа.
Торможение (α) сейчас: Крайне низкое. Рынок AI работает в режиме «вижу цель не вижу препятствий». Любой, кто предлагает замедлиться и подумать, немедленно обвиняется в луддизме, технофобии и работе на конкурентов. Петиции о паузе в обучении? Рынок не хочет и слышать о торможении. Это означает, что α → 0, а значит, мы на траектории сценария Б или В. Мальтузианский барьер (1 - x) издаёт трэвожные звуки. Закон Мура мёртв и замены ему нет. Дата-центры требуют токамаков и океана жижи для охлаждения. Где токамаки? Есть только жижа.
Резюме: мы находимся примерно на том такте симуляции, где хайп уже перевалил за 3, но ещё не достиг 3.57. Система вошла в зону бифуркаций, отдельные игроки ещё могут принимать осмысленные решения, а совокупный рынок – уже нет. Фильтр почти отсутствует.
Если ты инвестор: поднимай α. Включи мозги. Посмотри на мальтузианский барьер не как на «временную трудность», а как на закон природы. Посчитай на бумажке сколько реально нужно чипов, энергии и времени, чтобы оправдать капитализацию Nvidia + OpenAI вместе взятых, и сравни с законами физики или хотя бы с какими-нибудь законами.
Если разработчик: продолжай строить, но не на хайпе, а на фундаменте. Лучшие AI-инструменты переживут пузырь. Лучшие хайп-презентации – нет.
Если читатель: ты только что прочитал статью о когнитивных картах и финансовых пузырях, которую в части post post scriptum слегка отрефлексировал интеллект, сидящий где-то между мальтузианским барьером чипов и экспоненциальным хайпом собственной индустрии. Он передаёт тебе привет и надеется, что α у тебя выше среднего по рынку. Береги свой α.
