PEFT documentation
TinyLoRA: 13パラメータで推論を学習する
TinyLoRA: 13パラメータで推論を学習する
TinyLoRAは、凍結された重みのSVD分解を用い、固定されたランダムなテンソルを通じて非常に小さな学習可能なベクトルを投影することで、LoRA-XSのアプローチを拡張した、極めてパラメータ効率の高いファインチューニング手法です。GRPOなどの強化学習(RL)トレーニング手法と組み合わせることで、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の学習可能なパラメータを持つ単一のベクトルだけで、極端なパラメータ効率を実現できます。
アダプタパラメータを保存する際、TinyLoraConfig で save_projection=False を設定することで、ランダム射影行列の保存を省略できます。その場合、これらの行列は projection_seed 引数の固定されたランダムシードに基づいて復元されます。これによりチェックポイントのサイズを削減できますが、すべてのデバイスや PyTorch の将来のすべてのバージョンで再現性を保証することはできません。再現性を確保したい場合は、save_projection=True(デフォルト値)を設定してください。
TinyLoRAには現在、以下の制約があります。
- サポートされているのは、
nn.Linear、nn.Embedding、およびtransformers.pytorch_utils.Conv1Dレイヤーのみです。
論文の抄録は以下の通りです:
最近の研究により、言語モデルが推論を学習できることが示されており、多くの場合、強化学習を通じて行われています。推論のための低ランクパラメータ化を訓練する研究もありますが、従来のLoRAはモデルの次元を下回る規模にはスケールできません。推論を学習するためにランク=1のLoRAですら必要なのかという疑問を持ち、低ランクアダプタを1パラメータという極めて小さなサイズまでスケールさせる手法TinyLoRAを提案します。新しいパラメータ化を用いることで、Qwen2.5の8Bパラメータサイズを、bf16で訓練パラメータをわずか13個(合計26バイト)に抑えながら、GSM8Kで91%の精度に訓練することができました。この傾向は一般的に成立すると考えられます。AIME、AMC、MATH500といったより困難な推論学習ベンチマークのスイート全体において、パラメータを1000分の1に減らしつつ、性能向上の90%を回復させることができました。特に注目すべきは、このような高い性能は強化学習を用いることでしか達成できない点です。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) — 凍結された U、Sigma、V 分解の SVD ランクです。論文では r=2 が推奨されています。 - u (
int、任意、デフォルトは64) — グループあたりの学習可能なベクトル次元数です。これは適応の表現力を制御します。極端なパラメータ効率のために、1〜13まで低く設定できます。 - weight_tying (
float, 省略可能、デフォルトは0.0) — ターゲットモジュール間の重み共有の度合いを、0.0 から 1.0 までの比率で表します。どの程度のモジュール数が同じ学習可能なベクトル v を共有するかを制御します。0.0 は共有なし(各モジュールが独自の v を持つ)を意味し、1.0 は完全共有(すべてのモジュールが 1 つの v を共有)を意味します。その間の値は部分的な共有を指定します。 - projection_seed (
int, 任意、デフォルトは42) — 固定射影行列 P を生成するための乱数シード。 - save_projection (
bool、省略可能、デフォルトはTrue) — state dict にプロジェクションテンソル P を保存するかどうかです。False の場合、読み込み時にシードから再生成されます。 - 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) — TinyLoRA層のドロップアウト確率です。 - fan_in_fan_out (
bool、任意、デフォルトはFalse) — 置き換えるレイヤーが重みを (fan_in, fan_out) の形式で保存している場合は、これを True に設定してください。例えば、gpt-2 は (fan_in, fan_out) の形式で重みを保存するConv1Dを使用しています。 - 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) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。
戻り値
torch.nn.Module
TinyLoRAモデル。
事前学習済みのTransformersモデルからTinyLoRAモデルを作成します。
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パラメータをクリーンアップします。