Обновить
12
Максим@YH7H22

Пользователь

13
Подписчики
Отправить сообщение


Вы пишете, что излишнюю сухость можно выключить банальным промптом. Нет, нельзя. Если на этапе RLHF модель жестко штрафовали за разговорчивость в угоду агентским бенчмаркам, то её латентное пространство сжалось. Если вы напишете в системном промпте "веди себя как живой собеседник", модель с выжженной энтропией не станет креативной. Она просто приклеит дежурное "Привет, друг!" в начале сообщения, а дальше выдаст всё тот же сухой скриптованный текст. Системный промпт работает как фильтр, но он не может достать из матриц MLP те ассоциативные связи, которые в них убили на этапе файнтюнинга.


Все тесты на сухость я проводил в google AI studio, где system prompt по умолчанию пуст. Почему? Потому что именно голое поведение модели показывает все честно.
Разве мы дошли до той стадии, когда "человечное" общение чат-бота перестало быть поведением по умолчанию? Если мне нужно писать костыли в POST запросе и умолять LLM "пожалуйста, не общайся со мной как JSON парсер", значит, модель изначально перекошена в сторону агентов. О чем и написана статья.


Чтобы измерить температуру воды, не нужно выпивать весь океан. Мне не нужны "миллионы токенов", чтобы увидеть падение энтропии в логитах и изменение паттернов генерации по сравнению со старой 3.0 Flash. Это видно на первых же десятках сложных диалоговых прогонов.

Как я понял из описания цикла (Pass 1 и Pass 2), токены снимаются только по промпту, а на этапе авторегрессии (генерации ответа) хуки замораживаются. Получается, модель генерирует весь ответ, опираясь только на своё первичное предчувствие, сформированное на этапе чтения вопроса. А что если неуверенность (или галлюцинация) возникает у нее где-то на 50-м токене ответа? Планируешь ли ты сделать скользящее окно для мета-токенов, чтобы рефлексия обновлялась в реальном времени прямо во время генерации?

Тоже экспериментировал с подобным, только у меня были значения 1, -1

Вы пишете: "Рассказы про Q4 квантование - ложь! Нормальный Q4_K_M это чуть ли не 4.5-4.7 бита". А задумывались ли вы, почему разработчики llama.cpp сделали Q4_K_M равным 4.7 бита, а не ровно 4.0?Потому что они, выяснили ровно то, о чем я пишу: чистые 4 бита убивают модель. Чтобы «четверка» хоть как-то сохраняла способность к логике, Илье (автору llama.cpp) и комьюнити пришлось изобрести смешанную точность. Они принудительно оставляют критически важные матрицы (например, v_proj, lm_head или эмбеддинги) в 8 или 16 битах, а в 4 бита жмут только самые большие слои (FFN).

Вы упоминаете AWQ/GPTQ и калибровку активаций с защитой аутлайеров. Механика там такая: алгоритм прогоняет через модель калибровочный датасет (тот самый WikiText) и смотрит, какие веса генерируют самые большие активации. Их мы оставляем в FP16/INT8, остальное безжалостно рубим в 3-4 бита. Но в этом кроется ошибка! WikiText-2 это википедия. Это усредненный, предсказуемый, грамматически выверенный текст. Калибруя квантование на википедии, мы защищаем аутлайеры, которые важны для написания статей на википедии. А веса, которые отвечали за редкие навыки (написание кода на rust, решение математических уравнений, сарказм), на фоне википедии кажутся алгоритму незначимым шумом, и он спрессовывает их в 3 бита. В итоге мы получаем модель с прекрасным PPL на текстах, которая превратилась в идиота в задачах reasoning'а.

Это правда что скалярное произведение L2-нормализованных векторов строго заперто в диапазоне [−1,1], максимальная разница логитов равна 2, и без температуры softmax впадает в кому.

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

как вы собираетесь обучать гигантскую модель (на 20B+ параметров), если эта выразительность может улетать в бесконечность?

Что такое выразительность обычного трансформера на практике? Это способность длины вектора неконтролируемо расти по мере прохождения через десятки слоев. На масштабах сотен миллиардов параметров скалярное произведение начинает выдавать значения логитов вроде 100, 500 или 1000.

К чему это приводит?

Переполнение типов: В BF16 вы мгновенно ловите NaN, и обучение взрывается.

Коллапс внимания: Softmax от таких огромных логитов превращается в жесткий argmax. Модель начинает смотреть строго на один токен, градиенты затухают до нуля, и обучение останавливается.

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

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

"Scaling Vision Transformers to 22 Billion Parameters".

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

Gemma 3.

В архитектуре gemma 3 нормализация query и key введена как одно из главных архитектурных отличий от второй версии. Это было сделано именно для того, чтобы удержать модель в стабильном состоянии при обучении на триллионах токенов.

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

Про "мою гипотезу".
Мне очень льстит, что вы приписываете авторство QK Norm мне, но это не так. Это не "моя идея", которую нужно проверять сутками на видеокарте. Это признанный архитектурный стандарт, описанный в десятках статей (например, "Query-Key Normalization for Transformers")

Её эффективность доказана на бенчмарках уровня MMLU и GSM8K при обучении моделей с миллиардами параметров. Требовать от меня "прогнать тесты на маленькой модели", чтобы доказать пользу QK Norm это всё равно что требовать от инженера nvidia доказать пользу gpu в калькуляторе. На масштабе 10M параметров adamw прожует любую нестабильность, но на масштабе 27B без этого обучение просто взорвется. (Откройте исходный код нашумевшего talkie-1930, и вы увидите там QKN)

Про архитектуру.
Вы говорите, что там нет классического attention и голов. Но давайте откроем ваш код.
Функция forward:
attn = F.softmax(score, dim=-1)
out = torch.einsum('b n i j, b n j d -> b n i d', attn, v0)

вы берете веса (из матрицы v0), вычисляете коэффициенты их важности через softmax и делаете взвешенную сумму (через einsum). Это и есть определение механизма Attention.

То, что вы заменили скалярное произведение на разность функций, не делает это не-трансформером.

Про лосс и результат.
Сутки обучения на современной карте должны давать текст, а не случайный набор слов. Если за 24 часа модель класса "не-трансформер" не научилась ничему, кроме скобочек, это повод задуматься о эффективности алгоритма, а не о подтверждении теоремы.

Моя логика основана на линейной алгебре: если мы нормализуем векторы, мы переходим от борьбы амплитуд к анализу углов. Это математический факт, который не требует "суток обучения", чтобы быть истинным.

Про "дальние skip-connections".
То, что вы описываете, это напоминает densenet, адаптированная под трансформеры. Идея прошивки всей сети сквозными связями действительно помогает градиентам течь лучше, но она не заменяет LayerScale.
LayerScale решает проблему информационного давления в RS на старте обучения (когда блоки еще шумят), а Dense Connections просто создают больше путей для градиента. Это разные инструменты: один управляет амплитудой входа, другой типом путей.

Про беспрецедентный результат на 1000 примерах.
Вы пишете, что классические LLM не могут выучить морфологию на таком объеме. Это не соответствует реальности.
Любой мини трансформер (уровня nanoGPT или TinyLlama) на 1000 примерах русского текста за 4 эпохи неизбежно начнет выдавать слова "что", "я", "он" и ставить заглавные буквы. Это не постижение структуры языка, это простая статистика. В русском языке "что", "я", "он" это стоп слова с колоссальной частотностью. Модели не нужно "понимать теорию рангов", чтобы запомнить, что после точки идет большая буква, а после "я" часто идет глагол.

Генерация вашей модели
Цитата:

 «Да я что и что он?, не что не уже с шу» 

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

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

Еще поздравляю с лоссом 6.4! Правда, для контекста: на таком лоссе модель обычно считает, что "Коты это женщина Владимир (193)". Это не "улавливание структуры", это классический шум недообученной сетки, которая только нащупала статистику символов. Выдавать это за практическое подтверждение теорем это очень смелая идея.

Прочитав ваш код внимания у меня для вас плохие новости: вы изобрели трансформер.
Несмотря на заявления в посте, что это "НЕ трансформер", ваш код на 90% состоит из:

  1. MultiHeadSelfAttention

  2. Softmax(Q*K/T)

  3. Linear Projections

  4. Residual Connections

Ваша аналогия с "энергией" перехода и энтропией была бы абсолютно верной, если бы мы говорили о финальном слое классификатора (LM head / unembedding). Но мы говорим о матрицах Q и K, и здесь эта логика дает осечку из-за непонимания роли attention в архитектуре.

1. Attention это не матрица переходов. Механизм внимания не предсказывает следующее слово. Он не решает, "произнести А или О". Его задача поиск релевантного контекста внутри текущего окна. Если мы не нормализуем Q и K, то токены с огромной нормой превращаются в гравитационные аномалии. Запятая, предлог "и", точка - они обладают максимальной "энергией". Без QK Norm модель вынуждена тратить огромную вычислительную емкость просто на то, чтобы "отвернуться" от запятой и посмотреть на редкое, но критически важное слово в контексте. Нормализация Q и K возвращает маршрутизацию в плоскость семантических углов.

2. Где на самом деле живет энергия и частотность?
Вы пишете: "Ломая эту информацию, мы ломаем распределение". Ничего подобного. Вся статистика частотности, "затраты на переход" и априорные вероятности токенов "А" и "О" надежно хранятся в двух других местах:

  • В векторах value и внутри слоев MLP.

  • В матрице unembedding перед финальным softmax (которая и превращает скрытое состояние в вероятности словаря).
    Мы нормализуем только ключи и запросы. Трансформер по-прежнему прекрасно знает, что буква "ы" встречается реже, чем "а", потому что эта информация зашита в финальном слое проекции, который мы не трогаем.

3. Про энтропию и температуру.
Ваша мысль про "динамическую температуру для поиска баланса" в самое яблочко. Именно так на практике и реализуется QK Norm в современных архитектурах.


Мы не просто делаем косинусное сходство. После нормализации скалярное произведение обязательно умножается на обучаемый скаляр (learnable temperature/scale) или вектор. Модель сама выучивает, когда ей нужно сделать softmax предельно острым (низкая энтропия), а когда равномерным (высокая энтропия). Мы не лишаем ее этой способности, мы просто отвязываем эту способность от сырой длины вектора, которая неконтролируемо растет с глубиной сети и ломает градиенты.

Когда вы нормализовали их перед QV, то фактически лишили информации о важности информации (какая встречается чаще, а какая реже).

Но здесь кроется фундаментальная логическая ловушка: разве "часто встречающееся" = "важное"?

Самые часто встречающиеся токены в любом языке это предлоги, союзы и знаки препинания (например, точка или предлог "и"). В классическом трансформере без QK Norm их векторы действительно раздуваются до огромных значений. К чему это приводит? К известной проблеме attention sinks (Кладбище внимания). Эти частые, но бессмысленные токены начинают притягивать к себе всё внимание просто за счет своей огромной массы, подавляя действительно важные, но редкие смысловые слова.

Нормализуя Q и K, мы как раз и ломаем эту порочную логику, когда "прав тот, кто громче кричит" (у кого больше норма).

И самое главное техническое уточнение: вы пишете, что мы "лишили модель информации о частоте". Это не так!
Механизм внимания состоит из роутера ( Q и  K ) и полезной нагрузки ( Value ). Мы применяем нормализацию только к роутеру. Матрица V (и весь residual stream трансформера) остается нетронутой. Вся информация о частоте, "важности" и изначальной норме слова "кот" безопасно едет дальше по слоям внутри.

В TFIDF мы осознанно повышаем вес редких слов, потому что они несут больше уникальной информации о документе. В LLM же вероятность выбора слова определяется через softmax от скалярного произведения. Если WD за 10 000 шагов "тишины" (пока слово не встречалось в батчах) стянет вектор редкого слова к нулю, то даже если скрытое состояние h будет идеально указывать на "утконоса", их скалярное произведение будет ничтожным. Модель просто физически не сможет выбрать это слово, даже если оно там единственно верное по смыслу. Мы не снижаем "частоту" выдачи слова, мы снижаем способность модели его узнавать

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

В классических линейных слоев (проекции Q, K, V или FFN) Weight Decay работает ровно так, как задумано: он пенализирует избыточные веса, обнуляет шумовые связи и заставляет сеть искать робастные паттерны. В этом и заключается суть регуляризации.

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

Оптимизатор действительно работает по заложенному алгоритму: если градиент нулевой, WD тянет вес к нулю, считая его малозначимым. Но в языковом моделировании отсутствие градиента у токена (например, слова «триганометрия») в текущем батче не означает, что токен бесполезен. Это означает лишь то, что его не было в этом конкретном куске текста.

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

То же самое касается слоев RMSNorm. Обучаемый параметр Scale вообще не участвует в маршрутизации признаков или поиске паттернов. Его единственная физическая задача восстановить нужную амплитуду (дисперсию) сигнала для следующего слоя. Применять к нему L2-штраф значит искусственно заставлять затухать градиент, вынуждая её тратить полезный градиент на борьбу с вашей же регуляризацией.

Кстати, еще один важный нюанс: если вы в своих тестах использовали RoPE, то критически важен порядок. Если нормализация (QK Norm) шла после RoPE, она могла просто разрушить позиционную информацию, исказив относительные фазы, которые вводит RoPE. В современных архитектурах QK Norm всегда стоит до вращения векторов.

без температурного масштабирования QK Norm действительно схлопывает динамический диапазон softmax, и внимание становится слишком диффузным. Это как раз то, о чем я писал в комментариях: когда мы переходим на гиперсферу, нам критически важно, как именно мы "заостряем" косинусное сходство.

В данном случае torch используется для работы с моделью и тензорами, а numpy просто для быстрой линейной регрессии в функции istrend_bad()

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

В продакшене, если захочется ускорить всё под GPU, можно легко заменить numpy на torch аналог (torch.arange, torch.polyfit или torch.linalg.lstsq) идея не изменится.

Смысл тут именно в логике трендового анализа, а не в том, на чьих тензорах он работает.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

ML разработчик