All streams
Search
Write a publication
Pull to refresh
53
0
Илья @proxy3d

нейробиология, нейронные сети, AR/VR

Send message

Тут есть интересный момент.

1) префронтальная зона имеет несколько областей: держит разные контексты в памяти, корректирует ошибку контекстов.

2) в мозге механизм коррекции ошибки в целом одинаково реализован, но разными способами. Локальная слой 6 неокортекса - предсказание шума нейронов, глобальная коррекция глобальной базальными ганглиями через выработку дофамина для нормализации гомеостаза организма. Но вот как префронтальная кора корректирует ошибку в контексте пока плохо изучено.

3) как формируется речи и текст

https://www.youtube.com/watch?v=4RnyT3wv6AM

Тут в начале видео есть про то, что частые звуки зависят от уровня шума. То есть наша речь и текст и их вероятность это следствия упорядочивания вероятных сигналов с разным уровнем шума. Сначала на уровне звука, затем сочетания звуков, затем слов и так далее. Понятие уровня шума все сильнее абстрагируется, но это тот же шум (чем ниже вероятность, тем хаотичные колебания значений).

Я к тому, что механизм коррекции ошибки в рассуждениях должен быть построен на той же коррекции ошибки шума. Но не совсем понятно, как это устроено на верхнем уровне.

4) у нас есть области, которые получают итоговые выходы сигналов от всех и в обратную корректируют входной сигнал. Минимизируя шум, и выделяя значимый сигнал.

По сути весь текст и речь, это упорядочивание сигнала по вероятности (чем вероятнее, тем более стабильный) и убирание из него шума.

5) например есть петля гистерезис, она на всех уровнях. Ее суть, что скорость роста накопления суммарного сигнала медленнее, чем скорость его падения. Поэтому шум отсеивается из за постоянных колебаний, а важный признак в сигнале постепенно расчет.

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

Я планировал написать посты и статью о том, как добавить чувствительность в глобальную ошибку. Поделюсь тогда пока так.

В нем ниже нет локальной ошибки. Глобальная ошибка связана с блоками тоже упрощенно - это одна из первых версий. Тут так же нет рецепторов, архитектура блока должна иметь одинаковый размер тензора для глобальной цели и блока (это решается введением двух выходов, один для обучения и один для связи между блоками).

Но сама идея думаю будет понятна.

тут в forward есть такое место

self.last_output = x.

Каждый следующий блок разрывает связь с прежним в начале, поэтому граф будет разорван по всем блокам. У каждого блока - свой граф. Но последний будет связан со слоем classifier верхней модели. Если хотите, что и его связь была разорвана то делайте

self.last_output = x.detach().clone().requires_grad_()

но результат будет хуже, модель дольше будет сходиться, так как глобальная связь хуже работает на уровне одного слоя (если оставляем одинокий classifier как отдельный блок), а не блока. Вы можете запихнуть в блок хоть трансформер вместо обычных слоев (делал на отдельных тестах).

Надеюсь этот код будет вам отправной точкой. Дальше смотрите в сторону дополнительных выходов, чувствительность на уровне матрицы а не параметра, связь локальной и глобальной потребует самостоятельного обновления градиентов (там вообще уже на Loss не стоит полагаться так как пока не ясно как правильно интерпретировать это смешенное значение и следует смотреть на тестирование обучение, а не Loss).

import random
import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# --- Архитектура блока ---
class LocalBlock(nn.Module):
    def __init__(self, input_dim, hidden_dim):
        super().__init__()
        self.linear1 = nn.Linear(input_dim, hidden_dim)
        self.relu = nn.ReLU()
        self.linear2 = nn.Linear(hidden_dim, input_dim)
        self.sensitivity = nn.Parameter(torch.ones(1))
        self.last_input = None
        self.last_output = None

    def forward(self, x):
        self.last_input = x.detach().clone().requires_grad_()
        x = self.linear1(self.last_input)
        x = self.relu(x)
        self.last_output = self.linear2(x)
        return self.last_output

    def local_backward(self, loss_fn, target):
        loss = loss_fn(self.last_output, target) * self.sensitivity
        loss.backward(retain_graph=True)

        return loss

# --- Модель с локальным обучением ---
class LocalModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_blocks=20):
        super().__init__()
        self.blocks = nn.ModuleList([LocalBlock(input_dim, hidden_dim) for _ in range(num_blocks)])
        self.classifier = nn.Linear(input_dim, 1)

    def forward(self, x):
        for block in self.blocks:
            x = block(x)
        return self.classifier(x)

# --- Модель с глобальным обучением ---
class GlobalModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_blocks=20):
        super().__init__()
        layers = []
        # Каждые три слоя: Linear(input_dim, hidden_dim) -> ReLU -> Linear(hidden_dim, input_dim)
        for _ in range(num_blocks):
            layers.append(nn.Linear(input_dim, hidden_dim))
            layers.append(nn.ReLU())
            layers.append(nn.Linear(hidden_dim, input_dim))
        self.blocks = nn.Sequential(*layers)
        self.classifier = nn.Linear(input_dim, 1)

    def forward(self, x):
        x = self.blocks(x)
        return self.classifier(x)

# Генерация данных с операциями
def generate_classification_data(batch_size, input_dim=16):
    X = torch.randn(batch_size, input_dim)  # Признаки (входные данные)
    y = torch.zeros(batch_size, 1)  # Метки для классификации

    for i in range(batch_size):
        # Выбираем случайную операцию
        operation = random.choice(['+', '-', '*', '/'])

        # Генерируем числа для операции
        num1 = random.uniform(1, 10)
        num2 = random.uniform(1, 10)

        # Различная генерация данных для каждой операции
        if operation == '+':
            X[i] = torch.tensor([num1 + num2] + [random.uniform(-0.5, 0.5) for _ in range(input_dim - 1)])
            y[i] = torch.tensor([0])  # Операция сложения
        elif operation == '-':
            X[i] = torch.tensor([num1 - num2] + [random.uniform(-0.5, 0.5) for _ in range(input_dim - 1)])
            y[i] = torch.tensor([1])  # Операция вычитания
        elif operation == '*':
            X[i] = torch.tensor([num1 * num2] + [random.uniform(-0.5, 0.5) for _ in range(input_dim - 1)])
            y[i] = torch.tensor([2])  # Операция умножения
        elif operation == '/':
            X[i] = torch.tensor([num1 / num2] + [random.uniform(-0.5, 0.5) for _ in range(input_dim - 1)])
            y[i] = torch.tensor([3])  # Операция деления

    return X, y

# --- Обучение локальной модели ---
def train_local_model(model, optimizer, criterion, x, y):
    optimizer.zero_grad()
    out = model(x)
    loss = criterion(out, y)

    for block in model.blocks[::-1]:
        # Обратный порядок для backward (от последнего блока к первому)
        block.local_backward(criterion, y)

    loss.backward()
    optimizer.step()
    return loss.item()

# --- Обучение глобальной модели ---
def train_global_model(model, optimizer, criterion, x, y):
    optimizer.zero_grad()
    out = model(x)
    loss = criterion(out, y)
    loss.backward()
    optimizer.step()
    return loss.item()

# --- Настройки ---
input_dim = 16
hidden_dim = 32
epochs = 1000
lr = 1e-3
batch_size = 32

# --- Инициализация моделей ---
torch.manual_seed(42)
local_model = LocalModel(input_dim, hidden_dim)
global_model = GlobalModel(input_dim, hidden_dim)

# --- Оптимизаторы ---
optimizer_local = torch.optim.Adam(local_model.parameters(), lr=lr)
optimizer_global = torch.optim.Adam(global_model.parameters(), lr=lr)

# --- Критерий ---
criterion = nn.MSELoss()

# --- Хранение результатов ---
losses_local = []
losses_global = []

# --- Обучение ---
for epoch in range(epochs):
    x, y = generate_classification_data(batch_size, input_dim)
    loss_l = train_local_model(local_model, optimizer_local, criterion, x.clone(), y.clone())
    loss_g = train_global_model(global_model, optimizer_global, criterion, x.clone(), y.clone())

    losses_local.append(loss_l)
    losses_global.append(loss_g)

# --- Визуализация ---
plt.figure(figsize=(10, 5))
plt.plot(losses_local, label='Локальное обучение (по блокам)')
plt.plot(losses_global, label='Глобальное обучение')
plt.title('Сравнение глобального Loss при разных подходах')
plt.xlabel('Эпоха')
plt.ylabel('Loss (MSE)')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

losses_sensitivity = []
# Значения обучаемых параметров чувствительности:
for block in local_model.blocks[::-1]:
    losses_sensitivity.append(block.sensitivity.item())
    print("Block sensitivity (LocalModel):", block.sensitivity.item())

# --- Чувствительность ---
plt.figure(figsize=(10, 5))
plt.plot(losses_sensitivity, label='LocalModel')
plt.title('Сравнение чувствительности по блокам')
plt.xlabel('Блок')
plt.ylabel('Чувствительность')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

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

  • базальные ганглии определяют конечную цель - это наш criterion, который решает сколько дофамина надо выделить. Решает соответствие глобальной цели, и корректирует глобальную ошибку. Базальные ганглии помогают понять на сколько сигнал "непредсказуем" (высокий Loss), тем больше дофамина будет выработано (больше коррекция глобальной ошибки у градиентов через Loss)

  • затем дофамин (он является аналогией индикатора глобальной ошибки) поступает в каждую область шестислойной модели (блоки архитектуре)

  • каждая область по разному реагирует на дофамин (на глобальную ошибку), поэтому рецепторы по разному настроены на уровень влияния дофамина в каждой области (вводим чувствительность у блоков к глобальной ошибке)

Разница тут в том, что в отличии от классического метода обратного распространения ошибки (который слабо связан с реальной работой мозга), мы биологически корректно корректируем ошибку в каждом блоке (области мозга).

Тут сказано про галлюцинации: что они возникают одновременно с обучением фактам. Модель уверенно предсказывает неверные факты для новых персон. Что при файтюнинге новые знания искажают старые. Ассоциативные воспоминания легко перезаписываются. Паттерны внимания более устойчивы, но знания — нет.

В статье галлюцинациями называют накопленные знания. Галлюцинации приравниваются к уверенности – модель может быть уверенной в ошибке, что делает её опасной в критических системах.

Авторы смешали в одну кучу три вещи: ошибочные знания, галлюцинации и бред. При всем моем уважении к DeepMind либо в исходной статье речь была о проблеме знаний (а не галлюцинаций) либо это бредовые выводы какого-то конкретного сотрудника. Мне очень сложно поверить, что DeepMind имеющий в своем штате нейробиологов, будет путать эти три понятия (бред и галлюцинации это два разных понятия в нейробиологии).

Что касается самих трех понятий:

Ошибочные знания: Модель выучила ложные или искажённые паттерны из обучающих данных.

В LLM:

  • Википедия была с ошибкой → модель повторяет её.

  • Много фейковых данных о «вреде вакцин» → модель будет склонна выдавать их как возможную правду.

В мозге:

  • Человек прочитал много дезинформации и поверил — когнитивные искажения на уровне долговременной памяти.

Галлюцинации: Модель выбирает маловероятное или контекстно неуместное слово/фразу из-за высокой температуры, слабого контекста или неправильного attention’а.

Для примера:

  • Вместо «Маша гуляет в парке», выходит «Маша танцует с лампочкой».

В LLM:

  • Механизм внимания не продолжает работать при обобщении в FFN — heads выбрали признаки, а FFN слил их без учета иерархии контекста.

В мозге:

  • В слое 5 коры нейроны интегрируют контекст и значения признаков, подкрепленные модуляцией извне (например, зона A2 может подавить неуместные связи). В LLM это отсутствует — attention работает на уровне токенов, но не на уровне обобщения признаков. Это как если бы мозг воспринимал все признаки, но не умел их "отфильтровать" по уместности.

Бред: результат низкой связности, недостатка обучения или архитектурных ограничений.

В LLM:

  • Модель мелкая, FFN маленький, плохой датасет → фразы вроде "Мозг обедает звёздным языком параллельных гвоздей".

В мозге:

  • У ребёнка: ещё не сформированы связи → «словесная окрошка».

  • При патологиях (шизофазия): повреждены ключевые участки, как слой 5 → обрыв логических цепочек, внутренняя неструктурированность.

  • В LLM это эквивалент архитектурной недостаточности: FFN не может удержать сложную комбинацию признаков.

https://t.me/greenruff/2090 и https://t.me/greenruff/2103

Галлюцинации возникают именно из за того, что в LLM отсутствует механизм обобщения в FFN. Он заменен на температуру, которая не учитывает контекст.

В мозге в слое 5 выбор обобщённого признака происходи на основе модуляции других зон, которые могут подчеркнуть важность признака в рамках данного контекста. В LLM такого нет, в них механизм внимания работает только на уровне признаков и отсутствует при их обобщении. Поэтому в LLM механизм внимания отбирает важные возможные признаки в головах (heads), но в момент их обобщения в FFN просто связывает их все и выдает все их связи.

https://t.me/greenruff/2223

Бред - связан с недостатком связей, недостаточной сложностью модели, недостаточным кол-вом данных на которых было обучение.

Это можно сравнить со словесной окрошкой в речи. Она возникает либо при повреждении слоя 5 или других слоев. Проблемы могут быть разной формы: от дендритов до рецепторов, вплоть до низкой плотности нейронов.

Например у ребенка словесная окрошка вызвана естественным образом из за недостатка обученных данных, пока еще недостаточному кол-во связей, возможно еще недостаточной плотности нейронов и так далее.

В то время как у шизофрении - это вызвано нарушениями на данных участках. Но эффект схожий, хотя и по разным причинам.

По аналогии и в LLM, причины могут быть как малым датасетом, недостаточно сложная архитектура, плохо подобранные параметры LLM. Например, если FFN слой недостаточно большой, то LLM не сможет вместить в себя обобщение всех признаков и может выдавать некачественные связи.

Тест на 1000 блоков.
Тест на 1000 блоков.

Дополню, роль локальной ошибки видна выше. Она позволяет быстро адаптироваться. Всплеск далее был вызван тем, что архитектура специально выла выбрана не удачной: linear-relu-linear. Что из за отсутствия нормализации приводит к всплеску, но все равно данный подход быстро с ним справляется. Если добавляет нормализацию, то этого всплеска не будет.

Тут главное другое, то что LocalModel модель быстрее адаптируется при большом кол-ве элементов.

LocalModel: тут каждый блок стремиться к глобальной цели. Состоящая из коррекции локальной и глобальной ошибке

GlobalModel: классический подходом коррекции ошибки методом обратного распространением.

Это происходит из за учета локальной ошибки, которая убирает шум из сигнала. В классическом методе обратного распространения, это происходит медленнее, так как пока градиенты нормализуют веса первых слоев, пройдет больше времени. Тогда как локальная ошибка, как раз позволяет системе быстро адаптироваться. И дальше уже главную роль играет глобальная ошибка.

Это был просто пример различная генерация данных для каждой операции. Есть два числа и делаем либо +, -, *, / . Числа генерируются случайно. Поэтому система нашла уровень шума этого случайного процесса и вышла на плато.
Это был просто пример различная генерация данных для каждой операции. Есть два числа и делаем либо +, -, *, / . Числа генерируются случайно. Поэтому система нашла уровень шума этого случайного процесса и вышла на плато.

Выше можно как раз наблюдать, как при обучении меняется локальная ошибка. То что она растет и выходит на плато, говорит о том. что система выявила шум и дальше уже стабилизировалась. В данном случае локальную ошибку, это по сути уровень шума который мы должны учитывать. Так как Predict Coding как раз и пытается определить шум в сигнале, чтобы затем оставить только сам сигнал.

Я к тому, что локальная ошибка на уровне шума играет роль до определенного момента, а потом стабилизирует значение и мы работаем уже с очищенным сигналом. где главное это уже признаки, которые и стремятся к конечной цели. А признаки без глобальной ошибки (глобальной цели) определить нельзя. Да, у произвольных наборов это график будет не таким ровным (выше - если мы искусственно добавляем случайный шум). Но все равно он уже будет колебаться в определенном интервале.

Модель состоит из двух блоков с Linear-ReLU-Linear. Каждый из которых имеет свою обучаемую чувствительность к глобальной ошибке.
Модель состоит из двух блоков с Linear-ReLU-Linear. Каждый из которых имеет свою обучаемую чувствительность к глобальной ошибке.

Что касается чувствительности, то тут пример для двух блоков. Можно видеть как во время обучения меняется чувствительность блоков к глобальной ошибке. Видно, что она не одинаковая. Каждый блок на самом деле по разному реагирует на глобальную ошибку (цель). Именно так работают рецепторы дофамина, которые в каждой области адаптируются свою чувствительность к глобальной ошибке (выбросу дофамина).

Надеюсь, что данная информация поможет вам в ваших дальнейших исследованиях.

шестислойная модель неокортекса
шестислойная модель неокортекса

В качестве размышления, вам стоит рассмотреть как работает неокортекс. Он состоит из множества областей шестислойной модели. В некоторых областях какие-то части отсутствуют, например в ассоциативных зонах нет шума и поэтому нет блока "фильтрации и обобщения" (слой 4). По сути все сводиться к цепочке - "Обобщение сигнала на входе и фильтрация" - "выделение признаков из шума - устойчивого сигнала" - "обобщение найденных признаков". Все - это весь неокортекс. К этому добавляется коррекция ошибки для фильтрации шума (слой 6) и коррекция сигнала другими областями (модуляция через слой 1 и напрямую через селективность).

Исследование NoProp и другие подобные без классического метода обратного распространения учитывают только по сути коррекцию локального сигнала на уровне шума (как на схеме выше). Это присуще областям в мозге, которые получают сенсорные сигналы, так как те содержат шумы. Но в дальних областях уже данный механизм редуцирован (так как сигнал очищен от шума уже, и уже идет упор на выделение признаков и связей между ними).

Когда выше я объединил коррекцию локальной и глобальной ошибки, то это было как раз Predict Coding который в обратном порядке (подобно Forward Gradient ) обновляет градиенты внутри блока. И коррекция глобальной ошибки, через передачу блоку глобальной цели, где он корректирует ошибку как классический метод обратного распространения, но только в рамках данного блока. По сути локальная ошибка убирает шум, а глобальная цель (ошибка) корректирует конечный результат через связь. Важным моментом тут является добавление чувствительности блоков, подобно рецепторам дофамина. Поэтому каждый блок подстраивается, на сколько сильно глобальная ошибка влияет на него (это очень важный момент).

Вот что дало введение чувствительности блоков к глобальной цели. Без нее, подход с глобальной целью всегда проигрывает классическому (в качестве примера исследование Blockwise Self-Supervised Learning at Scale на сетке ResNet-50, где нет чувствительности и результат ошибки на 1,1% хуже классического).

По сути локальная ошибка убирает шум, а коррекция глобальной ошибки - позволяет корректировать конечную (глобальную) цель.

Блоки связаны друг с другом. Но связь эта происходит через глобальную цель (глобальный результат). Именно так мозг и обучается. Если проводить параллели - это уровни детализации. Современные LLM делают тоже самое, на одном уровне мелкие признаки, далее более крупные и так далее. В LocalModal как в мозге каждый блок обучается детализировать свой уровень иерархии признаков и их связей. Но каждый блок связан между собой, так как передает сигнал дальше в следующий блок, который работает с признаками более высокого уровня. Чтобы было понятно, приведем абстрактный пример. Допустим мы строители и у нас толпа людей это сигнал.

Первый блок: наш сигнал (толпа людей) формирует кирпичи из глины и передает их во второй блок.

Второй блок: наш сигнал (толпа людей) работает с кирпичами (а не с глиной) и строит из них дома и передает в третий блок.

Третий блок: работает с домами и строит города.

Четвертый блок: работает с городами и строит страну.

Пятый блок: работает со странами с строит регионы (европа, азия, южная американский и так далее).
и так далее.

Вот тоже самое делает каждый блок LLM или каждая область мозга. Сами по себе они преследуют одну и туже цель строительства, но работают каждый на своем уровне детализации и сравнивания с итоговым глобальным результатом.

Собственно выше как раз и была показана его реализации. И вас стоит рассмотреть это направление, если хотите улучшить показатели обучения.

Тоже недавно разбирал NoProp. По сути это метод исправления локальной ошибки, подобный Predict Coding, но немного иначе и для каждого слоя (только данного критерия недостаточно). Он не будет работать в ряде случаев, а так же имеет ряд ограничений:

1) Требует ручного задания или подбора локальных loss-функций.
Это прям один из главных недостатков. Для каждого слоя нужно специально определить, какой сигнал считать «целью» для этого слоя, иначе обучение не работает.

Например, для выходного слоя — это просто ground truth, а для скрытого — нужно вручную придумать target (или использовать какой-то эвристический метод, типа autoencoding, reconstruction loss и т.д.)

2) Ограниченная передача информации между слоями.
Из-за отсутствия global backpropagation информация об ошибке из верхних слоёв не распространяется вниз. Поэтому глубокие архитектуры обучаются хуже, если не придумать специальные механизмы согласования между слоями. Это очень хорошо заметно когда мы сделаем 50-100 слоев (для контраста).

3) Нестабильность при использовании finite-difference.
Метод использует оценку градиента по конечным разностям, а это шумно и зависит от выбора шага (epsilon). Особенно проблема будет возникать при обучении, когда сигнале практически нет явного шума и мы работаем уже с абстракциями. Например, LLM.

4) Зависимость от архитектуры.
Некоторые архитектурные решения требуют специальной адаптации, та же структура с skip-соединениями или BatchNorm может нарушать локальную целевую функцию, я уже не говорю про трансформеры и SSM модели.

В целом метод был протестирован на простых задачах (MNIST, CIFAR-10). Но когда мы берем более сложные, где в основе уже не шумный сигнал, а содержит абстракции, то только данного подхода будет недостаточно.

Если хотите пробовать развивать эту тему, то рекомендую подумать о том, чтобы расширить этот подход.

Тест обучение классификатору sentiment140 на 20 блоках, где каждый блок состоит из FFN (для простоты)
Тест обучение классификатору sentiment140 на 20 блоках, где каждый блок состоит из FFN (для простоты)

Я сейчас тестирую подход. где совестил как раз локальную ошибку Predict Coding (это как и метод выше убирает шум, корректируя локальную ошибку) и глобальную ошибку (через глобальную цель). Выше как раз результат такого подхода, где локальная - это как описал, а глобальная это классический метод обратного распространения.

Accuracy of Local Model: 81.2500%
Accuracy of Global Model: 15.6250%

В этом случае на тестах локальный метод выигрывает у классического. Так как классический не учитывает индивидуальные изменения.

Так что смотрите в эту сторону. Так как данный подход позволяет распараллелить вычисления нейронных сетей каждого блока на разных машинах. Например те же LLM и блоков трансформеров, где каждый его блок можно вычислять параллельно на другой машине. Что в теории должно ускорить обучение в N раз (при N блоках), конечно меньше так как затраты на обмен данными тоже съедает время.

почитал. NoProp по сути реализует коррекцию локальной ошибки через диффузные модели. Но тут есть ряд проблем:

1) подход NoProp имеет свои ограничения, особенно когда речь идет о сложных моделях с модуляцией, таких как трансформеры или модели с состоянием скрытого мира (SSM, State-Space Models). В трансформерах и других моделях с модуляцией важно, чтобы глобальная ошибка учитывалась для всех слоев сети и обновляла веса с учётом всех этих взаимодействий. Это позволяет учесть контекст и влияние всех слоев на конечный результат. В NoProp нет такой глобальной обратной связи, что приводит к отсутствию взаимодействия между слоями на более высоком уровне.

2) Модуляции, такие как внимание, требуют, чтобы изменения в сети зависели от глобальных сигналов, которые накапливаются в процессе обучения, что важно для адаптации сети к более сложным задачам.

3) Модели типа SSM (state-space models) включают динамические зависимости между состоянием системы и ошибкой, а также между различными частями сети. Это требует наличия глобальной ошибки, которая бы корректировала все эти динамические связи и учитывала все прошлые состояния. В NoProp эти зависимости не могут быть правильно учтены, так как слои обучаются независимо и не имеют явного механизма для коррекции динамических изменений. Поэтому ни каких Mamba и спайковых сетей.

В целом, они реализуют Predict Coding, но только в диффузной форме. Где локально выделяется сигнал из шума. Это подходит для простых моделей, но недостаточно для сложных. Плюс там еще надо настраивать метки слои индивидуально самостоятельно и еще ряд ограничений.

Но все равно исследование мощное в плане исправления локальной ошибки.

Только сегодня как раз описал методом, где изменяется метод обратного распространения ошибок, чтобы обучать блоки независимо

https://habr.com/ru/companies/bothub/news/898262/comments/#comment_28146102

Но описанный метод в статье, это конечно ещё лучше. Так как это как раз то что делает predict coding. Но все же они сделали исправление локальной ошибки. Так как именно она стремится убрать шум. Я как раз думал, как переписать метод обратного распространения внутри слоев и блоков, чтобы он учитывали локальную ошибку. И тут эта статья.

Спасибо, это отличная новость. Значит подход учёта локальной ошибки и глобальной в связке это правильное решение. По сути, ошибка это разница между выходным сигналом и входным. Где задача обучения сводиться к минимизации ошибки, то есть убирания шума, чтобы остался только важный сигнал.

Но в любом случае важно учитывать обе ошибки. Так что от глобального loss все равно не уйти.

Deepseek молодцы прежде всего в другом. До них так же использовали данные подходы. Их главная заслуга в изменении внутренней архитектуры, где они оптимизировали матрицы контекста, что позволило уменьшить затраты на вычисления и память, ускорить сходимость и так далее.

Это главное их достижение. Да рассуждение и грамотная комбинация с MoE тоже их заслуга, но тут они просто грамотно использовали имеющиеся достижения.

Я очень надеюсь что наши компании, тоже углубляться в разработку фундаментальных изменений.

Например, я сейчас исследую изменения классического метода обратного распространения ошибки. Суть заключается в том, что мы обучаем не всю цепочку методом, а каждый блок отдельно через глобальную ошибка.

Я тут не первый. Такие исследования были:

Blockwise Self-Supervised Learning at Scale

Авторы: Shoaib Ahmed Siddiqui, David Krueger, Yann LeCun, Stéphane Deny
arXiv

В этом исследовании ResNet-50 разделяется на четыре основных блока, каждый из которых обучается независимо с использованием функции потерь Barlow Twins. Результаты показали, что такой блочный подход к обучению достигает точности, сравнимой с полным обратным распространением ошибки на ImageNet, отставая всего на 1,1%.

Таким образом, блочное обучение почти не уступало классическому.

Но так как авторы, просто попробовали новый подход не понимая до конца что делают, они не смогли сделать шаг вперёд.

Дело в том, что методом обратного распространения ошибки можно сравнить с базальными гаеглиями, которые вырабатывают дофамин для подкрепления. И этот дофамин влияет на все области мозга подобно обратному распространению ошибки. Но с одной оговоркой:

1) дофамин индивидуально влияет на каждую область мозга, а не от последней к первой.

2) он имеет разную чувствительность в разных областях через рецепторы

Так вот, авторы исследования выше были на один шаг от правильного подхода. Они не учли чувствительность области к глобальной ошибке

Как у авторов исследования
Как у авторов исследования

Я повторил данный подход и мы видим, что обучение каждой области отдельно, действительно проигрывает классическому методу где то на 1,1%.

Но если мы вводим обучаемый параметр чувствительности, подобие рецепторов к дофамина, то видим в этом случае, что данный метод даёт тот же результат (как только коэффициент чувствительности будет обучен).

Уже это небольшое изменение открывает совершенно новые возможности в обучении моделей.

1) сейчас у больших моделей есть проблема затухающих градиентов. При обучении же локальных блоков, такая проблема минимизируется. Так как каждый блок обучается отдельно

2) сложные иерархические модели. Сейчас метод классический обратного распространения ошибки не подходит для сложных иерархических моделей (например мультмодальных). Это приводит к тому, что приходиться отдельно обучать модели и замораживать веса. В случае блочного обучения такой проблемы нет, так как в этом случае блоки могут пересекаться и нас это не волнует.

Это первый шаг к изменениям. Дальше уже надо переписывать полностью метод обратного распространения ошибки, чтобы он мог учитывать матрицу рецепторов для каждого блока, а не скаляр как сейчас. А так же писать новый метод для локальной ошибки (predict coding), который должен наоборот править градиенты от первого слоя к последнему в блоке, на основе вычисления ошибки входного и выходного сигнала.

Но в любом случае, даже добавление обучаемый чувствительности у блоков уже показало, что мы можем использовать данный подход с отдельным обучением блоков а не как сейчас.

Да, этот подход с чувствительностью тоже требует переделок, так как в этом случае пришлось написать метод изменения loss внутри блока и грамотно разрывать граф при обучении (чтобы ошибка не распространялась по всем блокам).

Для таких исследований не нужны миллионы долларов. И я надеюсь , что разработчики нейронных сетей на Хабре первыми возьмут на вооружение результат данного исследования.

Может и мое имя когда нибудь будет вписано как вклад в улучшения нейронах сетей.

Вот, каких результатов хочется видеть. Как deepseek разработавший алгоритмы для сжатия матриц и метода позиционирования для них, или DeepMind разработавший новые архитектуры мультмодальных моделей. Та и такие подходы к изучению принцип обучения.

Шумиха вокруг Суцкевера забавна, если посмотреть на реальность, то он хороший инженер, который понимает как лучше оптимизировать архитектуру, что то внести и так далее. Но я не видел ни одной разработку от него ни в Google Brain, ни когда он ушел в OpenAI. Чего то нового создано не было.
А вот DeepMind, которым ранее и был Google Brain, лично для меня заслуживает уважения. Именно определенный коллектив, который не просто создает новое, но и понимает что именно он создает и почему так делает. Именно в этой команде работают как нейробиологи, так и инженеры. Мне сложно поверить, что они изменяют архитектуру методом случайного перебора. Например, они осознано в двух прошлых архитектурах вынесли конкретные матрицы для создания мультизадачности.

Flamingo – мультимодальная модель DeepMind
Flamingo – мультимодальная модель DeepMind

Эти изменения явно были сделаны целенаправленно. И люди понимают, что они делают, пытаясь нащупать оптимальное решение.

Perceiver IO – мультимодальная модель DeepMind
Perceiver IO – мультимодальная модель DeepMind

А так же в другой их модели Perceiver IO. Я когда рассматривал и описывал вынос контекстного окна и описывал почему его надо выносить для мультимодальности https://t.me/greenruff/2146 то видно, что DeepMind работали над такой моделью не случайно. Поэтому не вижу какой то особой роли Суцкевера во всем этом, так как после ухода он ни чего не сделал, кроме оптимизации параметров для LLM в OpenAi и настройки их обучения. А ушел он из Google Brain (DeepMind), и после ухода DeepMind работает над фундаментальными изменениями. А OpenAi так и осталась на прежнем уровне, хотя так же добавляет мультимодальные модели, но более простые.

Как результат, DeepMind выпустила Gemini более полноценную мультимодальную модель (в архитектурном плане). Не берусь судить про ее возможности, но то момент, что они понимают над чем работают и что делают вызывает у меня уважение к ним.

Какая сасореплкация и развитие llm?)) они тут не могут нормально написать реализацию SSM модели (типа Mamba, и даже проще). Вчера бился бился, ни одна не справилась. Код тупо не работает, при отправке им на доработку ошибки меняет логику, выкидывает элементы, упрощает. Хотя там реализация небольшая.

В итоге написал сам. Но что хуже, показываешь ее модели и она ее переделывает и тут же ломает. Ломает уже рабочий код, она просто не может остановиться чтобы ничего в нем не изменить)

Так что если из нее и выйдет вирус, только такой, который поломает все исходники.

С postgres sql тоже самое. Сложные запросы не может сделать, ломает все, не может реализовать. Шаблон накидать да, а дальше ручками его правишь. Не дай бог потом нейронке его показать и сказать, надо было вот так. Ответит: отлично, но давайте тут изменим и ... снова ломает.

Да, игру Lines она напишет. Но таких полно на гитхабе. Но если мы скачаем с гитхабе, то не будет ощущения , что игру написали мы.

Мне это напомнило ситуацию с одним продуктом для домохозяек в Британии. По-моему в 50-70-ых к Берннейсу (племянник Фрейда) обратилась одна компания. Она продавала "пирог быстрого приготовления", точно не вспомню. Суть была, что просто надо вылить на сковороду и запечь. В фокус группах домохозяйки положительно отзывались, но сам продукт ни кто не покупал. Берннейс (вроде он) выяснил, что причина в том, что у домохозяек было чувство вины. Что они не участвуют в процессе, это не они приготовили пирог. Решение оказалось простым, в инструкцию добавили, что для приготовления нужно разбить и добавить яйцо. Чувство вины было снято, ведь теперь вроде они готовят пирог. Продажи взлетели.

С нейронками тут так же. Скачать игру Lines на гитхабе, как у домохозяек, нет ощущения что ее написали мы. А когда просишь сетку, то вроде бы как ты пишешь уже сам. А по факту, качаешь с гитхабе используешь то на чем сетка обучилась.

Вот сейчас и появились везде голоса домохозяек вайб-кодероа, которым llm дало ощущение, что они не скачали готовое, а сами написали. Будь то бот, или игра lines. А то, что такое при должном желании может написать школьник (в детстве писал себе подобные игры), ну это дело десятое.

Проблема только в том, что серьезные вещи она сделать не может.

Нейронки супер помощник, когда ты накидываешь основу и дальше сам, когда делаешь ревью и правишь на за ними. Но как дополнение. А сасореплкация, так они себя на Nой итерации сами и поломает, если весь код не сводиться к Format C:/

Не очень понял. RAG в основном используется, чтобы подтянуть данные пользователя. Например, у банка там информация о тарифах, описание режимов работы, действий сотрудников и так далее. Эти документы постоянно обновляются.

В бизнесе крупные компании используют RAG в связке с развернутыми llm внутри компании, так как не одна служба безопасности не даст добро на внешние LLM.

И это могут быть сотни файлов или больше. Там могут быть результаты ответов и выгрузки. Я так понимаю описанный подход работает в рамках небольших компаний, которые внутри своего продукта используют openai или другие подобные llm. И все равно не понял, как данный подход позволит динамически обеспечить доступ к такой информации? Стажёр заполняющий файлы тут отпадает, у банка может быть десятки подразделений с кучей информации , которая обновляется каждый день. А если таких ручных файлов будет тысячи? Филиал А сегодня изменил тарифы, филиал В выпустил новый регламент, филиал С выгрузил новые юридические документы и так далее. Пока кроме RAG тут ничего лучше не придумали.

Поправьте меня, если ошибаюсь и не правильно понял статью.

Столько слов, а самого главного по существу вопроса и нет. Не вижу в текст даже упоминания закона Вебера-Фехнера.

Из описания восприятия пауз/скорости речи https://t.me/greenruff/2059?single
Из описания восприятия пауз/скорости речи https://t.me/greenruff/2059?single

Например, для речи это работает точно так же. Так же это работает и для зрения, и для других оценок. То есть миллион вполне будет воспринят, только интервал будет будет восприниматься иначе.

на примере того же интервала к звуку https://t.me/greenruff/2066
на примере того же интервала к звуку https://t.me/greenruff/2066

Поэтому, надо понимать, что и миллион и миллиард будет восприниматься, но только огромным интервалом.

Только эти интервалы будут очень быстро расти в наше понимании. Выше пример частот речи и интервалы. Чем меньше частота, тем уже интервал. Чем больше частота, тем шире воспринимаемый интервал, где восприятие будет размазано по нему. То есть если условно на мелких мы можем воспринимать 1 Гц, то на больших частотах можем разве что отличать 5000 Гц от 20000 Гц.

Так что тема интересная, но сама статья тему не раскрывала ни как.

За все время, я могу сказать только об одном кейсе успешной конференции и мини встреч. В свое время была AVRA комьюнити по дополненной и виртуальной реальности. Мы там много общались все. В какой то момент одна из основательниц стартапы проиграла мне кальян. там был спор что Magic Leap ни чего не имеет и по сути являются мошенниками, поэтому загнуться (и доказательства с моей стороны). В общем по шумок предложили всем прийти и встретиться. Неожиданно пришло много народу, порядка 30 человек из разных компаний и разработчики. Это заложило основа общения комьюнити, когда люди знают друг друга в живую.

Затем спустя года два, один из участников решил сделать конференцию MIXAR (на много тысяч человек), где было множество компаний и по сути участники хорошо знали друг друга по комьюнити и общей сфере. Конечно были и те, кто попал туда случайно. Вот те кто пришел случайно, лично я мало вижу проку. Хотя после бокалов алкоголя, все уже перезнакомились с остальными. Кто-то знакомил друг друга через "рукопожатие" знакомых, кто то просто подходил подсесть послушать и представлялся. По сути это была конференция на базе комьюнити, где люди до этого уже читали кто-что пишет в чате и были хотя виртуально "знакомы".

Когда же я пришел на конфу в технополис Ломоносова (точно не помню как называется на базе МГУ), то по сути это были несколько человек у стендов и толпа студентов, которых согнали (или заманили халявной едой?), которые бегали то поесть, то между стендами смотря вакансии. А доклады были в большом зале, с огромными толпами сидящих в полумраке людей. В самих докладах не было абсолютно ни чего кроме воды (конференция была по робототехнике). Толкну от нее было ровно -1 по шкале от 0 до 10.

Если у вас есть комьюнити, где уже идут коммуникации по обмену опытом, которые зарождаются сначала виртуально (тем более у интровертов). Тогда конфа оправдана, иначе в чем ее эффективность? Так как доклад на 15-30 минут проще посмотреть онлайн или найти такую же лекцию или видео с описанием на Youtube.

У вашей конференции есть комьюнити? Есть что-то, где эти люди общаются друг с другом и можно писать и читать их?

Радует, что вы сразу правильно предполагаете сразу учитывать и текст и акустический анализ.

Не допускайте тут ошибок, которые делают многие. Включая Сбер со своей системой оценки "эмоций" основанной на речи. Это не будет работать. Я в свое время разбирал это у них в комьюните, все равно мимо ушей прошло (бизнес сказал надо, значит надо даже если это не работает).

https://t.me/greenruff/1855

Тут как раз я специально генерировал пример (особенно в комментариях там), что одни и те же акустические паттерны наложенные на разных текст, воспринимают мозгом как разные эмоции. Поэтому есть базовые паттерны, а уже они накладываются на текстовые (связанные с контекстом). И отдельно по тексту нельзя и отдельно по речи нельзя распознать правильно.

https://t.me/greenruff/1847

Там же выше показано, что эмоции могут иметь одинаковые акустические паттерны у совершенно противоположенных эмоций. А страх, так вообще понятие размытое и надо опираться на контекст, так как может быть выражен шепотом, взволновано громко, дрожащим голосом и так далее. А только по тексту тоже нельзя определить, яркие примеры слово "Нет", которое можно сказать множеством способом и оно будет нести разный оттенок.

https://t.me/greenruff/2059

Как еще одно последнее доказательство, это исследование пауз речи. Где выяснилось, что речь является последовательным графом. Где каждый его уровень является либо слогом, словом, эмоциональным выделением слов, синтагмой, набором синтагм. И без понимания смысла, мы не можем понять, к какой типу относиться данный уровень. И поэтому не можем определить это длинное слово со слогами или это быстрая эмоциональная речь уменьшившая микропаузы в эмоциональном выражении. Там простой пример, взять неизвестный вам иностранный язык и попробовать понять что за эмоция перед вами, где слова, где синтагмы заканчиваются.

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

Боли нет, скорее хочу, описать проблемы которые могут возникнуть, чтобы ваш читатель мог понимать, с чем может столкнуться. И лучше понять решение у вашего кейса.

Так же вопрос, "в начале звонка спокоен либо модель у нас на это не сильно триггериться", можете объяснить что вы имеете ввиду про триггеться. Вы указываете про определение эмоционального разговора, как понимаю как триггер или как одну из метрик. Как вы определяли эмоциональный разговор? Этот эмоциональный, этот не эмоциональный? Что было критерием этой оценки?

Про быструю речь , если я правильно понимаю вы опускали такие случаи? Так как тут надо определять скорость и ускорение или замедление речи сильно отличаются, так как простое сжатие скорости возможно лишь в маленьких пределах вроде х0.8-1.2. Но, когда кто то в звонке говорить на сильных эмоциях, то речь может сильно ускоряться. Тут простым растяжением не вытянуть. Wsola тоже не идеальна, отдельные сетки (?). Для звонков в службу поддержки (как и в сервисы такси) эмоциональная быстрая речь не редкость. Поэтому любопытно, определяли ли скорость речи, до распознавания (так как распознавание быстрой даёт сбои). Для меня просто очень странно, что у вас редкие такие случаи. Так как обычно человек в таких звонках очень волнуется или зол и может очень быстро говорить. Или для вас потери текста были допустимы, я же правильно понимаю? (В моем случае я готовил датасет эмоциональной речи, поэтому такие ситуации были критичны и наиболее важны).

Ещё чуть чуть и вы возможно "додумаетесь" до более сложной системы арбитров в роли LLM.

https://habr.com/ru/articles/893634/comments/#comment_28098838

Я привел книгу как удобный пример. Не умер opensource. В США rayserve это повсеместное использование, его автоматом можно развернуть на серверах Амазон.

Chstgpt вам не поможет с autoscaling в rayserve, пробовал . Доходил до этого сам, обучаясь. Все это важно, когда начинаешь считать затраты на gpu и нагрузку, тогда считаешь каждую копейку.

Просмотрите rayserve, там не только разворачивание , мониторинг, логированание, автоматическое распределение ресурсов, создание связки между разными машинами , внешний api и многое другое. Как развернуть обучение моделей, распределить автоматически нагрузку порт обучении и так далее.

Какой смысл изобретать колесо, которое будет изначально хуже? И про книгу вы зря, она очень полезная. Я использую и доки и книгу, когда не за компом.

Укажите , как вы подготавливали данные при передаче его в Whisper. Как боролись с краткими фразами. Когда пользователь сказал только одно слово. В этом случае Whisper может тупить. Например, слово стоп, может распознать неправильно.

Как решили проблему с быстрой речью в whisper.

Как решали проблему со спикерами, когда допустим говорит мама и дочка (по очереди или в фоне). Анализ таких аудио у меня показывал, что их тональность схожая. Разделяли ли вы такую речь? Или считали как ошибка.

Как решали проблему ложных срабатываний, когда VAD решит, что данный отрезок речь. Как вы сначала подготавливали такие аудио, перед их распознаванием. Так как если вы выйдите на улицу, где рядом ездят машины, то просто VAD и Whisper не смогут справиться, и будет не мало ложных срабатываний.

Судя по вашему кейсу, вы анализировали звонки. Я когда анализировал звонки в такси, то все описанные выше проблемы были. Интересно как вы их решали.

Information

Rating
4,892-nd
Location
Москва, Москва и Московская обл., Россия
Registered
Activity