Pull to refresh
58
0.5
Илья@proxy3d

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

Send message
Мышление и саморефлексия в мозге на примере текста/слуха
Мышление и саморефлексия в мозге на примере текста/слуха

Если хотите понять как это происходит в мозге, обращайтесь к нейробиологи.

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

Таламус тут состоит из трёх ядер (это условное обозначение, в реальности там 40-60 ядер), но сути не меняет. В рамках только слуха /текста мы можем считать как три ядра. Одно принимает внешние сигналы (сенсорные ядра), другое внутренние (ассоциативные ядра) и одно объединяет их сигналы.

Формально: текст идёт в таламус, затем в ассоциативные области (LLM), затем в PFC которая выделяет общие признаки (в реальности туда прийдёт и от зрения и от слуха в итоге и других). Тут происходит абстрактный поиск общих признаков. Затем в зону MPFC, это обобщение этих признаков, она и отвечает за саморефлексию. От нее сигнал идёт а ACC (,это по сути predict coding но для конечных сигналов), ACC так же приходит сигнал от LLM чтобы найти конфликты и ошибки.

Затем от ACC сигнал идёт в таламус для модуляции выходного сигнала из него и подавления ошибок.

Из MPFC сигнал идёт в гиппокамп (через энториальную кору которая преобразует сигнал в нужную форму как на входе в гиппокамп и на выходе из него)

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

Ллм снова прогоняет сигнал и каждая ее область через слой 6 (в каждой области, является локальным predict Coding) сигнал идёт в ассоциативные ядро таламуса, чтобы повторно податься на вход.

Так формируется петля при мышлении.

Во время сна к примеру, ACC и сенсорное ядро таламуса подавляется и остаётся только саморефлексия. Она позволяет перенести информацию из гиппокампа в ассоциативные зоны. Бред сновидений вызван тем, что ACC подавлен и не контролирует конфликты/ошибки контекста.

Этот прекрасный механизм мозга позволяет

1) держать множество контекстов в памяти гиппокампа.

2) делать полноценную саморефлексию на каждом шаге уменьшая конфликт/ошибку в рассуждениях через ACC

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

Это только схема для слуха/текста от таламуса до петли. Подобная есть у зрения, моторной зоны и так далее. Все они ведут у PFC области и одновременно связаны со всеми блоками на каждом участке. Поэтому я показал схему только на примере текста, опустив некоторые детали для упрощения понимания.

Все остальное, не имеет ни какого отношения к нейробиологи и является абстрактными домыслами.

И да, это называется Реэнтрантные петли

DeepMind явно лидер. Мне не важно что показывают бенчмарки. На них можно обучить модель, поэтому опираться на них для оценки очень субъективно. Дело в фундаментальных исследованиях, и они именно у DeepMind, а не у openai.

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

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

Это фундаментальные исследования. А что может дать openai? Даже их отдельные голосовые и генерации картинок и текста, это разные по сути модели. Это не та мультимодальность, которая есть у DeepMind.

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

Яндекс не занимался исследованиями, когда возникает необходимость в шёпоте? Банальное, говорить тише как триггер - так себе условие.

Я когда изучал этот момент, то он достаточно сложный. Для этого у модели должно быть внутренне состояние, чего в Алисе нет.

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

Я был бы благодарен, за любые ссылки на исследования, которые раскрывают или пытаются трактовать этот механизм. Например при шёпоте энергия речи выше, чем при нормальной речи. Хотя звук тише. Так как это требует контроля голосовых связок, что отражается на оценке формант речи и тона. Что отражается на речи. Но что было триггером? Какой из набор.

Куда копать, не ясно. Что в данном случае происходит на уровне лимбической системы и неокортексе?

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

Интеллектуальные можно убрать из заголовка. Как было ранее в GigaChat низкое качество ответов, так и осталось в версии Max 2.

Вопрос
Вопрос

как не справлялась раньше с данным вопросом, так и сейчас не справляется.

Она настрочила кучу бесполезного длинного текста, создавая иллюзию размышления. Который по факту был бредом умалишённого.
Она настрочила кучу бесполезного длинного текста, создавая иллюзию размышления. Который по факту был бредом умалишённого.

Далее показываем ей, что не правильно.

указываем ей на ошибки
указываем ей на ошибки

Далее она выдает опять кучу выводы и говорит, что да вот так правильно.

Спрашиваем, почему ошиблась?
Спрашиваем, почему ошиблась?

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

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

Прошу прощение, увлекся. Саморефлексия она такая 😁. Забываешь, что это не блокнот, а Хабр.

Я бы выделил две важные особенности:

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

На новом уровне происходит такое же обобщение и выделение признаков, которые затем выделяются, обобщаются и выделяют корректирующее предсказание. Затем эта модель должна подаваться на вход в исходную LLM для повторного прогона сигнала.

Обобщая эту модель:

Она получает на вход текст и обобщает его в сигналы верхнего уровня иерархии (термины или что она решит важным). Затем выдает на выход это обобщение, которое поступает повторно на вход LLM. Тут же происходит предсказание локальной ошибки между обобщённым входом этой модели и предсказаным. Эта локальная ошибка модулирует вход данной модели на следующем шаге рассуждений.

Это напоминает петли реэнтрантной обработки в мозге (Edelman, Felleman & Van Essen и др.)

Есть близкие направления:

Predictive processing в когнитивной науке: восприятие и мышление как непрерывное предсказание и корректировка.

Cognitive conflict monitoring (Botvinick et al.): префронтальная кора отслеживает конфликт между ожиданием и реальностью.

Text coherence models в NLP: модели оценивают связность текста и могут служить “оценкой стабильности”.

И нащупать бы идею

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

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

3) как на основе предсказаний скорректировать повторно поданный сигнал.

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

Реализация self-debugging в архитектуре рассуждения. Вот базовая идея:

Модель генерирует несколько вариантов рассуждений (гипотез).

Каждый вариант пропускается через фильтр гистерезиса — устойчивость при повторной генерации/вариациях.

Те, кто выдержали несколько итераций и остались стабильными, усиливаются.

Остальные "гаснут" как шум.

Можно представить это как LLM с короткой памятью, сравнивающей свои рассуждения с предыдущими и отклоняющей те, которые нестабильны.

Вот только вопрос , как это правильно реализовать на уровне архитектуры. Пока открытый.

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

Возможный механизм:

Каждый “контекст рассуждения” = локальное предсказание.

Префронтальная кора (или аналог в LLM/AGI) запускает несколько таких параллельных "петель рассуждения".

Каждая петля накапливает устойчивость сигнала (по типу гистерезиса).

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

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

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

Есть данные, что dorsolateral PFC отвечает за поддержание контекста в рабочей памяти, а anterior cingulate cortex (ACC) — за отслеживание ошибок и конфликтов между контекстами.

Пока неясно, как именно происходит коррекция ошибки контекста. Вероятно, через сравнение ожидаемого результата (выбранного контекста) с входными сигналами и наличие "конфликта", который ACC распознаёт как ошибку и инициирует переключение или пересчёт контекста. Возможно, через нечто вроде глобального сигнала “предсказание не совпало” с временным подавлением предыдущего паттерна.

На базовом уровне — в сенсорике — шум можно предсказать буквально как вероятность колебаний. На когнитивном уровне шум — это непредсказуемость идей, рассуждений, ожиданий.

Чем ниже вероятность — тем выше "шум" в смысле нестабильности паттерна. То есть неуверенное рассуждение — это шумное рассуждение. И задача саморефлексии — подавить эти шумные колебания, выделив устойчивые.

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

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 более полноценную мультимодальную модель (в архитектурном плане). Не берусь судить про ее возможности, но то момент, что они понимают над чем работают и что делают вызывает у меня уважение к ним.

Information

Rating
1,823-rd
Location
Москва, Москва и Московская обл., Россия
Registered
Activity