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

























