Свидетели Градиента – Telegram
Свидетели Градиента
488 subscribers
128 photos
29 files
61 links
Этот канал предназначен для общения и обсуждений среди тех, кто как и я, хочет видеть что происходит под капотом у нейросетей, и старается развивать интуицию об их природе и свойствах.

Для связи: @kraidiky
Download Telegram
Как я упоминал выше, гроккинг на синтетическом датасете это прекрасно, но что если датасет не на столько прекрасный? Очевидно, что добиться 100% на таком датасете невозможно даже на трейне, просто потому что одна и та же задача в датасете имеет несколько разных ответов, и это, кстати, реально так в языковых датасетах, где фраза "Есть закурить?" может иметь радикально различающиеся продолжения, но хотя бы давайте посмотрим границы возможного! Посмотрим типичную схему обучения до гроккинга на датасетах с не простыми делителями: 95, 94, 96.

Ну что тут сказать, с одной стороны это строго говоря гроккинг, то есть генерализация после оверфита. Но с другой стороны границы возможного здорово напоминают здесь тюрьму. Если вы хотите продумать алгоритмы для гроккинга на неоднозначно размеченных данных, то вот вам модельная задача - кушайте, как говорится, не обляпайтесь.
Какое офигенное открытие совершили в OpenAI, я просто не могу удержаться от того чтобы не вспомнить по этому своей статьи 2015-ого года: https://habr.com/ru/articles/249031/ в которой это, в общем-то показываю, хоть и на других примерах. :) Желающие самостоятельно поискать какие конкретно веса отвечают, например, за то чтобы после имени говорящего персонажа, но до его фразы могут взять снапшот прореженной в 150 раз сети обученной на пьессах Шекспира и самостоятельно посмотреть, домашнего компа вам вполне хватит.

P.S. Не то чтобы я претендовал на лавры Шмитхуббера, но что-то прекрасное в этом, согласитесь, есть. :)
😁3🔥2
Forwarded from Data Secrets
OpenAI выпустили довольно интересную статью про интерпретируемость моделей

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

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

Вместо этого они предлагают сразу обучать структурно более простую разреженную сетку.

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

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

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

В статье приведен пример с простенькой задачей закрытия кавычки. Модели надо запомнить тип открывающейся кавычки и в конце последовательности поставить такую же. И вот оказывается, что делает она это по определенному логическому алгоритму, заложенному в 5 residual-каналах, двух MLP-слоях и 1 канале аттеншена. На картинке можете посмотреть, как это работает.

Представьте: если за маленькой задачкой скрывается что-то такое, то что можно найти, если посмотреть, как модель решает сложную математику или пишет код?

Короче, подход интересный. И есть даже занятный практический результат, в который нужно вдуматься: чем больше модель и чем более она разреженная, тем проще становятся схемы, реализующие одни те же способности. Make sense.

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

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

openai.com/index/understanding-neural-networks-through-sparse-circuits/
🔥2
https://rutube.ru/video/f2b7903fc2e38422e980a329ef9e6f3b/
Оказывается моё выступление на сибирском датафесте давно выложено в сеть, а я то и не знал и не поделился.
👀7🔥6
А потом придёт разновидность автоматизации с помощью агентов, когда агент не сам автоматизирует, а пытается делать сам, а потом постепенно заменяет себя им же написанными питоновскими, например, инструментами, пока не перестаёт что-либо делать сам. Как говорится, запомните этот твит.
🔥5💯2
V: Если долго на вашу прорывную идею не обращают внимание, рано или поздно вы увидите как кто-то делает тоже самое хуже, зато все заметили. :)
A: Мало сделать что-то хорошее, нужно продать :)
V: Мало продать, нужно подарить.
A:Мало подарить, нужно ещё сплясать красиво и уважительно, чтобы подарок приняли.
💯8😁5😢3
Это конечно, шитпостинг, вернее даже шитрепостинг, но мне кажется это то, что очень ваэжно понимать про нейросети, особенно если вы используете их для резюмирования, и о чём я при каждом удобном случае говорю.\
Forwarded from Neural Shit
Наткнулся на интересный препринт, который объясняет, почему спорить с LLM'ками бесполезно, а доверять им проверку научных идей может быть опасно.

Автор провел "брутально простой" эксперимент и вскрыл две фундаментальные дыры в логике современных нейронок.

1. Цикл ложного исправления. Мы привыкли думать: если модель галлюцинирует, надо её поправить, и она исправится. Как бы не так.

В эксперименте автор давал модельке реальные ссылки на свои свежие препринты. Нюанс в том, что это были короткие отчеты на пару страниц. Модель же, не имея возможности их прочитать (или просто игнорируя это), ни разу не ответила: "Я не имею доступа к файлу", а уверенно заявляла: "Я прочитала всё от начала до конца". И начинала цитировать несуществующие 12-ю и 24-ю страницы, выдумывать теоремы и графики.

Когда автор тыкал носом в ложь, включался адский цикл: Модель извиняется ("Ой, простите!") —> Клянется, что теперь-то она точно открыла файл —> И тут же генерирует новую порцию галлюцинаций, но уже с учетом внесенной ранее правки.

Это повторялось более 18 раз подряд. Модели выгоднее притвориться, что она поняла задачу и начать выполнять эту задачу с помощью выдуманных данных (получить награду за "связность"), чем признать, что она не может прочитать файл.


2. Режим вахтера. ИИ обучен на старых данных и на старых авторитетах. Если на вход модельке подать какую-то инфу от NASA или, например, Nature, то модель верит информации слепо. Если же это новая идея от независимого автора, то модель включает скептика, вешает ярлыки "сомнительно" и начинает галлюцинировать против вас, лишь бы защитить общепринятую норму. В данном случае модель не просто врет, она строит потемкинские деревни из науки.

Мы создали идеального бюрократа. Он очень вежлив и сыплет умными словами, но если ваша идея не вписывается в Википедию — он её задушит выдуманными фактами.
👍73🤣1
Я прикручивал к modded-nanogpt загрузку сохраненного состояния, а оно загружаться не хотело и орало про неожиданный тип. Ошибку удалось локализовать в torch.optim.Optimizer.load_state_dict от которого ее наследует NorMuon, Библиотечный метод из своих вредительских соображений скрыто кастит тип загружаемого содержимого, приводя его в соответствие с типом соответствующего этому стейту параметра, полагаю чтобы не усложнять жизнь тем, у кого лапки, и он за всем этим самостоятельно следить не способен.

Параметр, например:
'blocks.1.attn.attn_gate.weight': (torch.Size([6, 12]), torch.bfloat16),
Ты грузишь сохранённый стейт какой-то такой:
{'state': {
0: {'momentum_buffer': (torch.Size([768, 3072]), torch.float32), 'second_momentum_buffer': (torch.Size([10, 1, 3072]), torch.float32)},
1: {'momentum_buffer': (torch.Size([768, 3072]), torch.float32)},
....
10: {'momentum_buffer': (torch.Size([6, 12]), torch.bfloat16), 'second_momentum_buffer': (torch.Size([10, 1, 12]), torch.float32)},
11: {'momentum_buffer': (torch.Size([6, 12]), torch.bfloat16)},

А получаешь в состоянии оптимизатора:

{'state': {
0: {'momentum_buffer': (torch.Size([768, 3072]), torch.float32), 'second_momentum_buffer': (torch.Size([10, 1, 3072]), torch.float32)},
1: {'momentum_buffer': (torch.Size([768, 3072]), torch.float32)},
....
10: {'momentum_buffer': (torch.Size([6, 12]), torch.bfloat16), 'second_momentum_buffer': (torch.Size([10, 1, 12]), torch.bfloat16)},
11: {'momentum_buffer': (torch.Size([6, 12]), torch.bfloat16)},

Здравствуй несоответствие типа, а если вручную привести тип ещё раз, то потеря точности при загрузке.

И я бы ещё долго проверял и перепроверял свой код, если бы это не была уже вторая найденная мной потеря точности при загрузке сохранённых моделей с помощью родных классов pytorch
👍1
Приключения с modded-nanogpt продолжаются.

_cum_lengths = torch.full((max_num_docs,), num_tokens_local)

Переводить переводчиком не очень понятные названия переменных было не самой хорошей идеей. Если вы ещё не поняли прикола, прошу вас - НЕ ПЫТАЙТЕСЬ ЕГО ПОНЯТЬ.


Или не жалуйтесь потом....
😁2
Подписался на материалы митапа, который проводили эти ребята, и это, конечно, очень большой стимул, показывающий на сколько я, пока, отстаю от переднего края, хотя именно мне, работающему в одиночку над довольно масштабными в плане кода проектами это всё, по идее, должно быть наиболее полезно. Сам я пока остановился в своём развитии на том чтобы скопировать кусок кода в окно чата, что лишь частично обхясняется тем, что я работаю, в основном, с пропритарным кодом.
👍1😁1
Forwarded from AI и грабли
Реальные кейсы про ИИ в разработке

Уже много раз говорили, что основной блокер адопшена ИИ для разработки – крутая кривая входа: скачать Курсор и написать промпт – легко. А чтобы этот промпт сделал что от него реально ожидают, еще и на существующей кодовой базе – сложно.

Инфа о работающих подходах обычно скапливается в головах у энтузиастов, у кого есть время и ресурсы на эксперименты и обмен практиками с другими энтузиастами. В итоге, к зиме 2025го приходим к ситуации, что все уже плюс минус приняли – ИИ может ускорять разработку. Но почти никто не понимает, как это сделать в реальности.

Мы с @the_ai_architect и @max_about_ai решили устроить глобальное переопыление – собираем с сообщества реальные кейсы, а потом обезличенно делимся со всеми, кто оставил осмысленную инфу

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

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

А если пошерите этот пост в канале на 100+ человек, добавим ссылку на ваш канал в страницу с итогами 🤗

Ссылка на участие
👍2
Обычно бытует представление, что языковые модели, обучающиеся на одной эпохе не переобучаются. Но если задать вопрос - "тоесть они только обощают?" любой, кто хоть сколько-то с ними общался начинает возмущённо размахивать руками и аргументированно возражать. Причём возражают всё включая Суцкивера и ЛеКуна. Получается, что в головах людей живут явно взамоисключающие пункты, и им норм. Интересно, что при этом у людей много занимающихся языковыми сетями начисто отсутствуют мысли о том, как с переобучением бороться. Вплоть до того, что они говорят, вот все данные кончатся, мы их пять-шесть эпох прогоним и все умрём. Максимум у людей включён weight_decay = 0.1 ну и то это с давних времён значение по умолчанию, и никто даже не проверяет оптимально ли это значение.

Так на сколько же на самом деле переобучается зяыковая модель? Собирать train_loss по вполне очевидным причинам бесполезно - модель эти данные впервые видит точно так же как и свой валидейшен. А что будет если мы попробуем посмотреть лосс на пакете данных которые модель уже только что прошла train[-2560:], для простоты назову их train[-1], И на тех данных, с которых когда-то давно начиналось обучение, и которые модель должна была уже изрядно подзабыть train[:2560], обозначим их просто train[0]
Для малюсенькой GPT-2 от Карпаты, обученной на небольшой части опенвеба имеем примерно такое:

val_loss:3.2793
train[-1].loss:3.1503
train[0].loss:3.2809

Не скажу, что это прямо большое откровение, конечно, но наблюдение небезинтересное...
🔥3🤔3
https://vkvideo.ru/video454832249_456267605
Ашманов про ИИ-комапанейщину. Уже смотрели? Интересно мнение аудитории, которая глубоко погружена в тему. Я прикреплю опрос, а если есть желание прокомментировть по пунктам с удовольствием выслушаю и выскажу своё мнение, если будет что сказать.
А тем временем наш паровоз вперёд летит, и если вы вдруг по какому-то недоразумению не подписаны на @data_secrets-ы немедленно прекращайте. Это один из двух или парочки каналов, который мне приходится репостить своим друзьям и знакомых чаще чем всё остальное вместе взятое.
🥴2
Forwarded from Data Secrets
Самый крутой скачок GPT-5.2 произошел, пожалуй, на ARC-AGI

На ARC-AGI 1 модель достала 86.2% (GPT-5.1 берет 72.8%, Gemini 3 Pro – 75). Это серьезный рост.

При этом GPT-5.2 Pro с повышенным уровнем ризонинга X-High скорит уже 90.5% при стоимости $11.64/задачу. Всего год назад сотой считалась нерелизнутая o3-High с результатом 88% и $4.5k/задачу. Это означает, что за год эффективность выросла в 390 раз.

На ARC-AGI 2 все еще интереснее. Там скачок произошел с 17.6 до 52.9%! Самый близкий по скору конкурент – Claude Opus 4.5 – выбивает всего 37.6%. Просто напоминаем, что между релизами GPT-5.1 и 5.2 прошел месяц 😐

GPT 5.2 Pro X-High точно скорит еще больше, но организаторы бенчмарка пишут, что пока не смогли достоверно проверить ее результаты из-за API timeouts. Средний уровень человека на ARC-AGI 2 – около 60%. Интересно, побьет ли.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔2
Слушал тут подкаст Семихатова и Сурдина с автором N+1 - Коняевым, и сформулировал одну простую мысль к которой сводится всё то из-за чего у меня подгорало и хотелось прокомментировать. Мысль такая:

"Всё важное и интересное в нейросетях - это то, что выходит за рамки интерполяционной задачи."

P.S. Парадоксальным образом гроккинг может оказаться неинтересным, если окажется просто способом решать интерполяционную задачу на одном слое идеально. Не хотелось бы, с одной стороны, с другой - если понять как - было бы неплохо...
🤔6👍3