13 чисел, которые ставят под сомнение весь зоопарк адаптеров
Когда в конце 2025 года на arXiv вывалилась статья про Tinylora, все подумали, что это шутка. «Всего 13 обучаемых параметров для тонкой настройки 8-миллиардной модели?» — спросите вы. Да, именно так. И нет, это не магия, а жёсткая математика, которая заставила нас пересмотреть, сколько на самом деле нужно параметров, чтобы научить LLM чему-то новому.
Что сломали в обычной LoRA?
Классическая LoRA, о недостатках которой мы уже писали, добавляет низкоранговые матрицы к весам внимания и feed-forward слоёв. Каждый такой адаптер — это тысячи, а то и миллионы параметров, которые считаются «лёгкими». Tinylora пошла дальше и спросила: а что, если все эти матрицы — просто избыточный шум?
Вместо того чтобы настраивать отдельные матрицы для каждого слоя, Tinylora вводит 13 глобальных параметров. Эти параметры не привязаны к конкретным весам модели. Они контролируют глобальные масштабы и сдвиги для всего процесса адаптации. Представьте, что вместо того чтобы подкручивать каждую шестерёнку в механизме, вы меняете напряжение в сети, от которой работает весь завод.
| Метод | Обучаемые параметры (для 7B модели) | Память для обучения | Философия |
|---|---|---|---|
| Полная настройка (Full Fine-tuning) | ~7 миллиардов | Гигантская (нужен многократный VRAM модели) | Переписываем всю книгу |
| Обычная LoRA (ранг=8) | ~4-8 миллионов | Умеренная (добавляет 10-20% к VRAM) | Пишем заметки на полях |
| Tinylora | 13 | Смехотворно малая | Меняем освещение в комнате, где читают книгу |
Код, который помещается в твит
Вот как выглядит ядро Tinylora в PyTorch. Никаких сложных архитектур — просто параметры и функция, которая их применяет.
import torch
import torch.nn as nn
class TinyLoraConfig:
"""Всего 13 глобальных параметров."""
def __init__(self):
# 7 параметров масштаба для разных типов слоёв
self.scale_q = nn.Parameter(torch.ones(1) * 0.01)
self.scale_k = nn.Parameter(torch.ones(1) * 0.01)
self.scale_v = nn.Parameter(torch.ones(1) * 0.01)
self.scale_o = nn.Parameter(torch.ones(1) * 0.01)
self.scale_up = nn.Parameter(torch.ones(1) * 0.01) # FFN up-projection
self.scale_gate = nn.Parameter(torch.ones(1) * 0.01) # FFN gate
self.scale_down = nn.Parameter(torch.ones(1) * 0.01) # FFN down-projection
# 6 параметров сдвига (bias)
self.bias_q = nn.Parameter(torch.zeros(1))
self.bias_k = nn.Parameter(torch.zeros(1))
self.bias_v = nn.Parameter(torch.zeros(1))
self.bias_o = nn.Parameter(torch.zeros(1))
self.bias_up = nn.Parameter(torch.zeros(1))
self.bias_down = nn.Parameter(torch.zeros(1))
def apply_tinylora(self, hidden_states, layer_type):
"""Применяет глобальные масштаб и сдвиг к активациям."""
scale = getattr(self, f'scale_{layer_type}')
bias = getattr(self, f'bias_{layer_type}')
return hidden_states * scale + biasЭти 13 параметров обучаются, в то время как веса исходной модели Qwen3.5 заморожены. Вся магия — в том, как эти глобальные корректировки, применённые к активациям внутри модели, меняют её поведение. Это похоже на принципы нейропластичности, только в коде.
Внимание, подводный камень: Tinylora не панацея для всех задач. Если ваша задача требует обучения модели сверхспецифичным паттернам (например, генерировать уникальный стиль арта, как в VibeVoice), 13 параметров может не хватить. Но для многих NLP-задач — более чем.
Эксперимент: Qwen3.5 учится быть юристом за 5 минут
Мы взяли Qwen3.5-7B-Instruct и датасет из 1000 примеров юридических вопросов и ответов. Цель — научить модель отвечать в формате «Статья X, пункт Y».
- Оборудование: Одна RTX 4090 (24 ГБ VRAM).
- Baseline: Обычная LoRA (ранг=8, ~8M параметров).
- Конкурент: Tinylora (13 параметров).
- Метрика: Accuracy на hold-out датасете и скорость обучения.
Результаты после 3 эпох:
| Метод | Accuracy | Пиковый VRAM | Время эпохи | Размер чекпоинта |
|---|---|---|---|---|
| Обычная LoRA | 78.5% | 18.2 ГБ | ~12 мин | ~32 МБ |
| Tinylora | 76.1% | 15.8 ГБ (экономия ~2.5 ГБ!) | ~8 мин | <1 КБ (да, килобайт) |
Разница в качестве — всего 2.4%. Но Tinylora сэкономила память, ускорила обучение, а её чекпоинт весит меньше, чем этот абзац текста. Для прототипирования или обучения на слабом железе — это game-changer. Кстати, если у вас Mac, посмотрите на mlx-tune — там такие трюки особенно ценны.
Кому сейчас нужен Tinylora? (А кому — нет)
Не обольщайтесь малым числом параметров. Tinylora — инструмент с очень конкретной зоной применения.
Идеальный кандидат:
- Исследователи с ограниченным бюджетом на GPU. Хотите быстро проверить гипотезу по адаптации модели на новом датасете? Tinylora позволяет запустить эксперимент на карте с 16 ГБ VRAM, где обычная LoRA уже не влезает.
- Разработчики, которым нужно развернуть тысячи слегка разных адаптированных моделей. Представьте: у каждого пользователя — своя персональная модель, но храните вы только базовую Qwen3.5 и 13 чисел для каждого пользователя. Фантастическая экономия на хранении.
- Те, кто боится переобучения. С 13 параметрами просто нечему переобучаться на маленьких датасетах. Это изящный выход из ситуации, когда данных мало, как в советах из гайда по датасетам.
Ищите другой метод, если:
- Вам нужна максимальная точность на сложной задаче (например, генерация кода с точным синтаксисом). Здесь может не хватить выразительной силы. Лучше использовать полноценную LoRA с большим рангом.
- Вы работаете с новым оборудованием, поддерживающим FP8. Проблемы с underflow, о которых мы уже предупреждали, для Tinylora могут быть ещё острее из-за экстремально малых значений параметров.
- Ваша цель — тонкая настройка для творческих задач, где нужно улавливать тонкие стилистические нюансы. 13 глобальных параметров могут не схватить разницу между хайку и одами.
Что дальше? Личный прогноз
Tinylora — не конечная точка, а начало новой гонки. Уже сейчас видно, как сообщество пытается выжать из этого подхода ещё больше. Мой прогноз на 2026-2027 годы: появятся гибридные методы, где 95% слоёв настраиваются через 10 глобальных параметров, а для критически важных 5% — оставляют обычную LoRA. Это даст и эффективность, и контроль.
Главный урок Tinylora в другом. Он показал, что мы, возможно, десятикратно переоценивали сложность адаптации больших моделей. Иногда чтобы изменить поведение системы, не нужно лезть в её внутренности — достаточно аккуратно подкрутить несколько внешних ручек. Именно этот принцип лежит в основе инструментов вроде TuneService, который предлагает тонкую настройку моделей через API без необходимости разбираться в коде.
Так что берите код Tinylora, качайте свежий Qwen3.5 и экспериментируйте. Возможно, следующие прорывные 10 параметров найдёте именно вы. А если заблудитесь в процессе — возвращайтесь к полному руководству по тонкой настройке.