Комментарии 9
Спасибо автору за интересный материал - скормил своему агенту)
50mb без квантов интересно, разумеется. 11 слоёв потому что.. ЧТО?! Вы где-нибудь в сети обучающую выборку держите?
Четыре слоя, не 11: [0, 5, 9, 11] - индексы из 12 донорских. Набор выбран перебором, цифры и скрипт в статье. Выборку не публиковал, о чём там же написано!! опубликован конвейер, повторяйте на своём корпусе.
Подбор ("весов", похоже) перебором, без математических этюдов - такой ход, когда скорость обучения стоит не на первом месте: в таком случае или не достижима какая-то определенная степень исполнительности llm; или маленькая и быстрая модель всё-таки получится - но исключительно с тщательной подготовкой обучающей выборки. Я такую работу никак не осмелюсь в одиночку проводить :)
впрочем, сложный инференс если строить между группами слоев: внимательно изучать где требуются такие компромиссы, а где к ощутимой прибавке производительности не приводят - мне-то только предстоит.
Вывод: взяли бы какой-нибудь шустрый HOLO, да посмотрели какие постандартизированные типы слоев там были использованы. На runtime-базе llama.cpp (с годным набором стандартов слоев от ggml) все равно отсутствуют какие-либо сложные типы инференсов (эт взаимодействие групп слоев между собой).
Перебором подбирались не веса, а то, какие четыре слоя из двенадцати оставить. Веса при этом наследуются от донора дословно: в warmstart_sweep.py обрезка сделана как чистое переименование ключей state_dict, ни градиентов, ни оптимизатора, ни loss там нет вообще. И это дешёвый путь. Наборов я взял четыре (last4, strided, late, spread), прогнал на dev без обучения и оставил лучший старт: late [0,5,9,11] 0.306, last4 [8,9,10,11] 0.281, spread [0,4,8,11] 0.153. Результат strided не сохранился, поэтому в статье его нет. Дорого было бы обучить каждый вариант и потом сравнивать, а так это вечер работы. Аналитически предсказать, какая четвёрка даст лучший старт, я не берусь, и разброс от 0.153 до 0.306 намекает, что гадание тут вышло бы боком.
По терминам - STRIZH не LLM!!! Это энкодер-ретривер: один forward-проход, mean pooling, на выходе вектор длины 384. Он ничего не генерирует, поэтому никакой «степени исполнительности» у него нет.
Поэтому и вопрос про сложный инференс между группами слоёв отпадает сам. У четырёхслойного энкодера таких групп физически нет, схема и так минимальная, оптимизировать в ней нечего))))) Ограничение ggml, о котором вы пишете, здесь ничего не связывает.
Типы слоёв, кстати, не подбирают у соседних моделей, их наследуют от донора. Откройте config.json опубликованной модели: layer_types: ['full_attention', 'sliding_attention', 'full_attention', 'sliding_attention'], и rope theta у типов разная, 160000 против 10000. При обрезке эти поля обязаны переехать вместе со слоями, иначе получите rope mismatch, и модель деградирует молча, без единой ошибки в логах. Об этом написано первой строкой в докстринге warmstart_sweep.py.
Насчёт подготовки выборки да! у меня это в выводах отдельным пунктом: hard negatives дали +0,9 п.п. (0.737 → 0.746) там, где рост корпуса в 2,44 раза дал +0,3. Сложность сигнала решает))
Таким образом - он может точно больмень подсказать один из 300-т сниппетов в редакторе кода, но при условии что я его сам учил со своим набором сниппетов?? Это задача толстого эмбеддера! А этот, то есть, руль прямо поддержит в рамках системы стабилизации? С кнопки сигнал слишком сложной формы - а он подебаунсит?
Ладно, по порядку)
Триста сниппетов. Триста) На таком объёме эмбеддер вообще не обязателен, там и grep справится. Спорить «толстый или тонкий» на трёхстах документах это как выбирать грузовик под перевозку чайника.
Учить при этом ничего не надо, вы путаете обучение с индексацией. Прогнали свои 300 штук через модель один раз, получили 300 векторов, положили рядом, поиск работает. Дообучение начинается там, где домен уехал далеко и документов на пару порядков больше. Вы всерьёз предлагаете обучать модель ради поиска по трёмстам строкам? Это курсы вождения, чтобы дойти до ларька)
«Это задача толстого эмбеддера!» Вы сейчас с восклицательным знаком процитировали мою же статью) У меня там есть список «когда не стоит брать STRIZH», и в нём отдельной строкой стоит англоязычная нагрузка. Сниппеты кода на английском. EN у меня 0.341 против примерно 0.60 у bge-m3, и я там же сам пишу, что даже mixed 0.624 предъявлять нельзя, потому что набор пересекается с обучением. Обычно с автором спорят, а вы ухитрились согласиться и возразить одной фразой. Читать до конца иногда полезно)
Руль и стабилизация. Если перевести на человеческий, вопрос такой: это вспомогательный компонент внутри большей системы? Да. И это, сюрприз, тоже написано в статье: hybrid retrieval и позиция перед реранкером. Сама по себе модель ничего не решает, я этого нигде и не обещал.
Теперь дебаунс, медленно, потому что тут уже не метафора хромает, а предмет уехал в соседнюю отрасль. Дебаунс это подавление дребезга: контакт скачет, вы фильтруете сигнал во времени и получаете одно нажатие вместо двадцати. Нужны состояние, история и порог срабатывания. У эмбеддера нет ни состояния, ни истории, ни порога, ни времени как такового. Он берёт строку и один раз превращает её в 384 числа. Всегда одинаково, без памяти между вызовами. Подать ему «сигнал сложной формы» некуда, на входе текст, а не осциллограмма. Если вы про то, что запрос у пользователя кривой и его надо причесать, то это другая стадия и другая модель, переписывание запроса. А вопрос «подебаунсит ли эмбеддер кнопку» остался без ответа не потому, что я чего-то не знаю, а потому что это не вопрос. С тем же успехом можно спросить, какой у него радиус поворота)
Жду предметных вопросов или критики по существу, отвечу с числами и ссылками на скрипты, как отвечал выше. За фидбек спасибо, даже за такой)
Чаще так - grep не быстрее настроить, чем описать обучающую выборку для сниппетов в редакторе кода! С другой стороны - какая-нибудь толстая gemma обеспечит инструментом разработчика сразу и можно сосредоточиться на чём-то.. с большей степенью эффекта в итоге :)
Пусть будет тайна.. поисковый ИИ Гугла в восторге и говорит, что вы качок))
Нейминг можно считать самобытным до тех пор пока не ясно как им пользоваться) мне вот не ясно покачто хватит ли тому что воспроизводит сложную когнитивную функцию 4 названия: last4, strided, late, spread.
Предметные вопросы задавать не буду. Привлечением внимания человеческой аудитории вы тут не на соточку позанимались :)

Как я ужал русский эмбеддер до 24 млн параметров — и чуть не испортил его одной цифрой