Классические нейросети страдают от двух фундаментальных проблем:
- Переобучение — сеть «запоминает» данные вместо обобщения (сингулярность весов).
- Неустойчивость к шуму — малые возмущения входа приводят к катастрофическим ошибкам.
Решение в рамках ЕТВП: перенести принципы устойчивости вакуума на архитектуру нейросети.
В ЕТВП устойчивые частицы существуют благодаря балансу реальной и мнимой компонент поля.
В нейросети аналогом является комплекснозначная параметризация весов:
Обучение идет по двум каналам одновременно:
-
$W_{\text{Re}}$ — основной сигнал (полезная информация). -
$W_{\text{Im}}$ — фазовый канал (контроль устойчивости).
Z-принцип требует, чтобы норма весов не уходила в бесконечность:
Это достигается через проекцию на стабилизирующую сферу после каждого шага обучения:
Результат: сеть физически не может переобучиться, так как веса ограничены топологией.
В вакууме ЕТВП нелинейный демпфер tanh_limit не даёт полю схлопнуться или разлететься.
В нейросети аналогом является дыхательный слой — динамическая функция активации, которая циклически сжимает и расширяет пространство признаков.
Пусть
Вместо статичной ReLU или GELU вводим «дышащую» активацию:
где:
-
$\sigma(t)$ — медленно меняющаяся «температура» поля (аналог давления вакуума); -
$\cos(\omega t + \phi)$ — циклическая модуляция (дыхание).
При
При
Обучение подстраивает
В классических сетях шум — враг.
В ЕТВП шум — это сырьё, из которого рождаются устойчивые структуры.
Вводим шумовой слой самокоррекции:
где:
-
$\mathcal{N}(0, 1)$ — стандартный гауссов шум; -
$\nabla_{\text{loss}}$ — градиент ошибки; -
$\eta$ — амплитуда шума; -
$\beta$ — коэффициент чувствительности.
Смысл: сеть сама решает, куда добавить шум, чтобы выйти из локальных минимумов и сгладить переобученные участки.
Дополнительно вводим резонансный фильтр:
Это аналог упругого давления вакуума: подавляются высокочастотные шумовые компоненты, а низкочастотные (полезные) сохраняются.
import torch
import torch.nn as nn
import math
class EVP_Layer(nn.Module):
def __init__(self, dim_in, dim_out, R_max=1.0, eta=0.01, beta=0.1):
super().__init__()
self.W_re = nn.Parameter(torch.randn(dim_in, dim_out) * 0.1)
self.W_im = nn.Parameter(torch.randn(dim_in, dim_out) * 0.1)
self.R_max = R_max
self.eta = eta
self.beta = beta
self.sigma = nn.Parameter(torch.ones(1))
def forward(self, x, t=None):
# Z-принцип: комплексные веса
W = self.W_re + 1j * self.W_im
z = x @ self.W_re # реальная часть
# Дыхание поля
if t is None:
t = 0.0
breath = torch.tanh(z / (self.sigma + 1e-8)) * math.cos(t)
# Хаотическая самокоррекция
noise = self.eta * torch.randn_like(z) * torch.tanh(self.beta * z.abs())
# Резонансный фильтр (подавление высоких частот)
filtered = z - 0.1 * (z[2:] - 2 * z[1:-1] + z[:-2])
# Проекция на сферу (стабилизация)
W_norm = torch.sqrt((self.W_re ** 2 + self.W_im ** 2).sum())
if W_norm > self.R_max:
self.W_re.data *= self.R_max / W_norm
self.W_im.data *= self.R_max / W_norm
return breath + noise