PEFT documentation
TinyLoRA: Обучение рассуждениям на 13 параметрах
TinyLoRA: Обучение рассуждениям на 13 параметрах
TinyLoRA — это крайне параметрически эффективный метод дообучения, основанный на подходе LoRA-XS, который использует разложение SVD замороженных весов и проецирует крошечный обучаемый вектор через фиксированные случайные тензоры. В сочетании с методами обучения с подкреплением (RL), такими как GRPO, TinyLoRA способен обеспечить конкурентоспособную производительность всего с 1–13 обучаемыми параметрами.
Ключевая инновация TinyLoRA заключается в замене обучаемой матрицы низкого ранга R на взвешенную сумму фиксированных матриц случайного проецирования: R = Σᵢ vᵢ Pᵢ, где v ∈ R^u — небольшой обучаемый вектор размерности u, а Pᵢ — фиксированные случайные матрицы. Это значительно сокращает количество обучаемых параметров, сохраняя при этом конкурентоспособную производительность.
TinyLoRA поддерживает связывание весов с помощью параметра weight_tying — отношения от 0.0 до 1.0, которое определяет, сколько модулей разделяют один и тот же обучаемый вектор v. Значение weight_tying=0.0 (по умолчанию) означает отсутствие разделения, а weight_tying=1.0 — полное разделение между всеми целевыми модулями, что обеспечивает предельную эффективность по параметрам благодаря единственному вектору из u обучаемых параметров для всей модели.
При сохранении параметров адаптера можно отказаться от хранения матриц случайного проецирования, установив save_projection=False в TinyLoraConfig. В этом случае эти матрицы будут восстановлены на основе фиксированного случайного зерна из аргумента projection_seed. Это уменьшает размер контрольной точки, но мы не можем гарантировать воспроизводимость на всех устройствах и во всех будущих версиях PyTorch. Если вы хотите обеспечить воспроизводимость, установите save_projection=True (это значение по умолчанию).
В настоящее время у TinyLoRA есть следующие ограничения:
- Поддерживаются только слои
nn.Linear,nn.Embeddingиtransformers.pytorch_utils.Conv1D.
Аннотация из статьи:
Недавние исследования показали, что языковые модели способны обучаться рассуждению, часто с использованием обучения с подкреплением. Некоторые работы даже обучают параметризации низкого ранга для рассуждений, однако стандартный LoRA не масштабируется ниже размерности модели. Мы ставим под сомнение необходимость даже LoRA с рангом=1 для обучения рассуждению и предлагаем TinyLoRA — метод масштабирования адаптеров низкого ранга до размеров, составляющих всего один параметр. В рамках нашей новой параметризации нам удалось обучить модель Qwen2.5 с 8 млрд параметров до точности 91% на GSM8K, используя всего 13 обучаемых параметров в bf16 (26 байт суммарно). Мы обнаружили, что эта тенденция сохраняется в целом: нам удалось восстановить 90% прироста производительности, обучая в 1000 раз меньше параметров на наборе более сложных бенчмарков обучения рассуждению, таких как AIME, AMC и MATH500. Примечательно, что столь высокую производительность нам удалось достичь только с использованием RL: модели, обученные с помощью SFT, требуют обновлений в 100–1000 раз больших для достижения аналогичного результата.
Обзор бенчмарков
API
TinyLoraConfig
класс peft.TinyLoraConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 2u: int = 64weight_tying: float = 0.0projection_seed: int = 42save_projection: bool = Trueinit_v_bound: float = 0.02target_modules: Optional[Union[list[str], str]] = Nonetinylora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: Union[bool, str] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )
Параметры
- r (
int, необязательный, по умолчанию2) — ранг SVD для замороженного разложения U, Sigma, V. В статье рекомендуется r=2. - u (
int, необязательный, по умолчанию64) — Изменяемая размерность вектора на группу. Этот параметр управляет выразительностью адаптации. Может быть таким низким, как 1-13 для экстремальной параметрической эффективности. - weight_tying (
float, необязательный, по умолчанию0.0) — Степень связывания весов между целевыми модулями, выраженная как отношение от 0.0 до 1.0. Определяет, сколько модулей делят один и тот же обучаемый вектор v. Значение 0.0 означает отсутствие общего использования (каждый модуль имеет собственный v). Значение 1.0 означает полное общее использование (все модули делят один v). Промежуточные значения обеспечивают частичное общее использование. - projection_seed (
int, необязательный, по умолчанию42) — Случайный сид для генерации фиксированных проекционных матриц P. - save_projection (
bool, необязательный, по умолчаниюTrue) — Сохранять ли тензоры проекции P в state dict. Если False, они будут перегенерированы из seed при загрузке. - init_v_bound (
float, необязательный, по умолчанию0.02) — Граница равномерной инициализации для обучаемого вектора v. Значения инициализируются в диапазоне [-init_v_bound, init_v_bound]. - target_modules (
Union[List[str], str], необязательный) — Имена модулей, к которым следует применить TinyLoRA. Это может быть список имён модулей (например,['q_proj', 'v_proj']), регулярное выражение (например,'.*decoder.*(q|v)_proj$') или специальное ключевое слово"all-linear"для обработки всех линейных модулей. Поддерживаются только слоиnn.Linear,nn.Embeddingиtransformers.pytorch_utils.Conv1D. - tinylora_dropout (
float, необязательный, по умолчанию0.0) — Вероятность dropout для слоев TinyLoRA. - fan_in_fan_out (
bool, необязательный, по умолчаниюFalse) — Установите это значение в True, если заменяемый слой хранит веса в формате (fan_in, fan_out). Например, gpt-2 используетConv1D, который хранит веса в формате (fan_in, fan_out). - bias (
str, необязательный, по умолчанию"none") — Тип смещения для TinyLoRA. Может принимать значения ‘none’, ‘all’ или ‘tinylora_only’. - modules_to_save (
List[str], необязательный) — Список модулей, помимо слоёв TinyLoRA, которые нужно сделать обучаемыми и сохранить. - init_weights (
bool|Literal["uniform"], необязательный, по умолчаниюTrue) — Способ инициализации обучаемого вектора v. ПередачаTrue(по умолчанию) инициализирует v нулями, превращая адаптер в операцию тождественного преобразования (no-op). Передача"uniform"инициализирует v равномерными случайными значениями в диапазоне[-init_v_bound, init_v_bound]. ПередачаFalseоставляет v неинициализированным (для продвинутых сценариев использования). - layers_to_transform (
Union[List[int], int], необязательный) — Индексы слоев, которые нужно преобразовать. Если указано, адаптируются только эти слои. - layers_pattern (
Optional[Union[List[str], str]], необязательный) — Имя шаблона слоя, используется только в том случае, еслиlayers_to_transformотличается отNone.
Это класс конфигурации для хранения конфигурации модели TinyLoraModel.
TinyLoRA — это крайне параметрически эффективный метод дообучения, основанный на статье «Learning to Reason in 13 Parameters» (arXiv:2602.04118). Он использует разложение по сингулярным значениям (SVD) замороженных весов и проецирует небольшой обучаемый вектор через фиксированные случайные тензоры.
Статья: https://arxiv.org/abs/2602.04118
Пример:
from peft import get_peft_model, TinyLoraConfig
config = TinyLoraConfig(
r=2, # SVD rank (paper recommends 2)
u=64, # Trainable vector dimension
weight_tying=0.0, # No weight tying (0.0 = none, 1.0 = full)
target_modules=["q_proj", "v_proj"],
projection_seed=42,
)
model = get_peft_model(base_model, config)TinyLoraModel
класс peft.TinyLoraModel
< source >( modelconfigadapter_namelow_cpu_mem_usage = False**kwargs ) → torch.nn.Module
Параметры
- model (PreTrainedModel) — Модель, подлежащая адаптации.
- config (TinyLoraConfig) — конфигурация модели TinyLoRA.
- adapter_name (
str) — имя адаптера, по умолчанию"default". - low_cpu_mem_usage (
bool, необязательный, по умолчаниюFalse) — Создаёт пустые веса адаптера на meta-устройстве. Полезно для ускорения процесса загрузки.
Возвращает
torch.nn.Module
Модель TinyLoRA.
Создаёт модель TinyLoRA на основе предобученной модели transformers.
TinyLoRA — это крайне параметрически эффективный метод дообучения, который использует разложение по сингулярным значениям (SVD) замороженных весов и проецирует небольшой обучаемый вектор через фиксированные случайные тензоры. Основано на статье «Learning to Reason in 13 Parameters» (arXiv:2602.04118).
Пример:
>>> from transformers import AutoModelForCausalLM
>>> from peft import TinyLoraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = TinyLoraConfig(r=2, u=64, target_modules=["q_proj", "v_proj"])
>>> model = get_peft_model(base_model, config)Атрибуты:
- model (PreTrainedModel) — Модель, подлежащая адаптации.
- peft_config (TinyLoraConfig): конфигурация модели TinyLoRA.
Удалите адаптер и очистите общие на уровне модели параметры v.