- BrainTools - https://www.braintools.ru -
ПРЕДУПРЖДЕНИЕ : Автору 14 лет он плохо разбираеться в технологиях и программировании но основную теорию проекта придумал сам очень хотелось бы услышать критику конструктивную
Всем здрайвствуйте я Titled и я создал форк llama.cpp где реализовал все свои жаветные мечты сейчас расскажу что это было и почему я написал такооой длиный заголовок.
Сначала стоило бы пройтись по терминам вообще потому что без них читать эту статью будет не прям интерестно. Основная речь пойдет о движке запуска нейросети в который вшиты все архитектуры и вы можете сами его скачать и запустить любую нейросеть его название llama.cpp, и как принято все делают форки успешных проектов . Я не стал исключением и создал свой форк но с нестандартной идеей.
Я решил использовать реккурентность очень интерестный и гипер недооцененый инструмент который я пытаюсь продвинуть уже очень много времени если кратко обьяснять как это работает то легче показать это наглядно.

Рисовал от руки так что простите но здесь наглядно видно что мы получаем вход проходим чеерз слои и получаем выход чтобы добавить больше ума нам нужно добавить больше слоев но тогда будет больше вычислений. Изза ограниченых возможностей моей видеокарты я физически не смог поставить больше слоев дообучением тогда появилась идея я буду зацикливать слой! Лдано идея не моя я украл ее из OpenMythos [1] но в отличии от них я применил это на реальных моделях и это не все я модифицировал систему!

Так происходит на OpenMythos это странно ведь они зацикливают один слой который может технически отвечать за чтото неважное поэтому я подумал и решил делать сразу 3 слоя которые я буду зацикливать. Хардкод здесь не пеоможет и я придумал (попросил дипсик и обговорил с ним) формулу Адаптивной выборки слоев!
Для умных людей я просто оставлю эту формулу здесь. а для нормальных поясню краче
Она делит все на 4 блока и 1 блок выкидывает зацикливает средне слои сумма циклов всегда равна параметру D а чтобы выбрать слой парметр эффективности S от 1 до 100
N — всего слоёв.
k = ⌊N/4⌋, r = N mod 4.
Размеры блоков: [k, k, k, k+r].
Стартовые индексы: 0, k, 2k, 3k.
Для блока i:offset_i = ⌊ S/100 · (size_i − 1) ⌋L_i = start_i + offset_i
L₁ — отбрасывается (используется только для начального «понимания»).
Активные слои: L₂, L₃, L₄.
Общая глубина D (число циклов).
Распределение по весам (1 : 3 : 2):
text
c₂ = round(D · 1/6)
c₃ = round(D · 3/6)
c₄ = D − c₂ − c₃
Итог: слой L₂ повторяется c₂ раз, L₃ — c₃, L₄ — c₄.
При D=12 получаем (2, 6, 4), при D=16 → (3, 8, 5) и т.д.
Вот разоюрались с формулой но что нам делать если мы просто так зациклим слои два варианта или получиться бред или прироста не будет или мы взорвемся (градиенты имееется ввиду ) вобьщем мы должны юзать вот такую имбу –
Вдохновлено численным решением ОДУ:h_{t+1} = h_t + (1/iters) · f(h_t)
Мы применяем это как адаптивный шаг внутри цикла:cur = alpha cur + (1 - alpha) inpSA, где alpha = 1.0 / iters.
Это не даёт сигналу взорваться и сохраняет баланс residual-потоков, даже при большом D.
Вообще крутая штука но до сих пор не могу понять как она работает поэтому спросите ии чат бота он вам поможет а я перейду далее.
вучит пугающе но для этого мы взяли крутую шутку это KV-декапплинг (отвязка кеша от рекуррентности) тоесть кеш не связан с рекурентностью я могу вам обьяснить это сам конечно же а давайте я это и сделаю !
Если кратко запись кеша доступна только на первой итерации на всех остальных только чтение но зачем это кроме веса все изза того что на каждой итерации перезапись ключей/значений (KV) ломала внимание [2]. Это было неприятно но легко чиниться но это не конец идем далее.
Надеюсь обьяснять что такое градиенты мне не нужно поэтому просто скажу они взрываються без иньекций поэтому мы даем ей лекарство
Добавляем линейную комбинацию:h_new = alpha h_cur + beta h_inp, где beta = 1 - alpha.
Это якорь, который возвращает состояние к исходному вектору, предотвращая семантический дрейф.
Вот таким образом мы получаеться убеждаемся что мы всегда меньше 1 а значит взрыва и брейнрота у нас не будет.
Смотря эту статью вы зададитесь двумя вопросами Почему так кратко и Где пруфы на второй я отвечу прямо сейчас-
ВОТ ОН [3]
А чтобы подтвердить все я сделал базовый бенчмар gms8k и получил на маленькой модели впечатляющие результаты поэтому вот и они :
Evaluating DeepSeek-R1-Distill-Qwen-1.5B-Q4_K_M:
|
Configuration |
GSM8K Accuracy |
Correct Answers |
|---|---|---|
|
Baseline ( D = 0 ) |
39.20% |
196 / 500 |
|
Recurrent ( D = 12 ) |
77.20% |
386 / 500 |
Using Euler step scaling and KV cache decoupling to prevent semantic drift across iterations.
Да это выреза из README !!
Да это явно пруфы я думаю насчет второго вопроса отвечу – Я сделаю вторую часть где обьясню больше крутых моментов именно по разработке и переписи код на ручной C++ а не иишный вобщем так я надеюсь что ктото найдет время зайти посмотреть репозиторий и дать советы по улучшению и да по моим тестам данный форк увеличивает скорость гедто на ~10% так что юзайте на здоровье !
Спасибо за прочтение !
Автор: SimpleTitled
Источник [4]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/33691
URLs in this post:
[1] OpenMythos: https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://github.com/kyegomez/OpenMythos&ved=2ahUKEwjqp9zAoPeVAxUXFxAIHQZtDUgQFnoECA0QAQ&usg=AOvVaw1Rtn5U6tB41KSOV2Zicvfu
[2] внимание: http://www.braintools.ru/article/7595
[3] ВОТ ОН: https://github.com/cubetitled-ui/llama.cpp
[4] Источник: https://habr.com/ru/articles/1064258/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1064258
Нажмите здесь для печати.