PEFT documentation
IA3
IA3
IA3は、可能な限り最小のアダプターサイズが必要な場合に優れた選択肢です。低ランク行列ではなく学習ベクトルを使用するため、利用可能な方法の中で最もパラメータ効率が高いものの一つです。ディスク/メモリ上のフットプリントの最小化と高速なトレーニングが最優先であれば、IA3は有力な候補となります。

IA3(Inner Activationsを抑制・増幅するInfused Adapter)は、self-attention層およびencoder-decoder attention層のキーとバリュー、ならびにposition-wise feed-forwardネットワークの中間活性化に対して、3つの学習済みベクトルを追加してスケーリングを行う手法です。
論文の抄録は以下の通りです:
少ショット・インコンテキスト学習(ICL)は、少数の学習例を入力の一部として与えることで、勾配ベースの学習なしに、事前学習済み言語モデルがこれまで見たことのないタスクを実行できるようにします。予測を行うたびにすべての学習例を処理するため、ICLは計算、メモリ、ストレージのいずれにおいても大きなコストを伴います。パラメータ効率の良いファインチューニング(PEFT)(アダプターモジュール、プロンプトチューニング、スパース更新手法など)は、モデルが新しいタスクを実行できるようにするための小さなパラメータセットを学習するという代替のパラダイムを提供します。本論文では、少ショットICLとPEFTを厳密に比較し、後者がより高い精度と大幅に低い計算コストを提供することを示します。その過程で、学習されたベクトルによって活性化をスケーリングする新しいPEFT手法(IA)^3を導入し、比較的わずかな新しいパラメータのみを追加しながら、より強力な性能を実現します。また、T0モデルに基づくT-Fewというシンプルなレシピを提案し、タスク固有のチューニングや修正なしに新しいタスクに適用できるようにします。RAFTベンチマークにT-Fewを適用し、完全に未見のタスクにおけるその有効性を検証し、初めてスーパーヒューマン性能を達成し、最先端の結果を絶対値で6%上回りました。実験で使用したすべてのコードは公開されています
To make fine-tuning more efficient, IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations) rescales inner activations with learned vectors. These learned vectors are injected in the attention and feedforward modules in a typical transformer-based architecture. These learned vectors are the only trainable parameters during fine-tuning, and thus the original weights remain frozen. Dealing with learned vectors (as opposed to learned low-rank updates to a weight matrix like LoRA) keeps the number of trainable parameters much smaller.
LoRAと同様に、IA3には多くの同じ利点があります:
- IA3は、学習可能なパラメータの数を大幅に削減することで、ファインチューニングをより効率的にします。(T0の場合、IA3モデルの学習可能なパラメータは約0.01%しかありませんが、LoRAでも> 0.1%です)
- 元の事前学習済み重みは凍結されたまま保持されるため、その上に構築された複数の軽量かつポータブルなIA3モデルを、さまざまな下流タスクに適用できます。
- IA3を使用してファインチューニングされたモデルの性能は、完全なファインチューニングが施されたモデルの性能と同等です。
- IA3は、アダプター重みをベースモデルにマージできるため、推論のレイテンシーを一切増加させません。
原理的には、IA3はニューラルネットワーク内の重み行列の任意の部分集合に適用でき、学習可能なパラメータ数を削減できます。著者の実装に従い、IA3の重みはTransformerモデルのkey、value、feedforward層に追加されます。具体的には、Transformerモデルの場合、各Transformerブロックにおいて、key層とvalue層の出力、および2番目のfeedforward層の入力にIA3の重みが追加されます。
IA3パラメータを注入する対象レイヤーが与えられた場合、重み行列のサイズに基づいて、学習可能なパラメータの数を決定できます。
使用方法
自己回帰モデルでは、
k_proj、v_proj、down_projをターゲットにします。これらは、著者らが最も効果的と判断したレイヤーです。feedforward_modules=["down_proj"]を設定し、IA3 がどのモジュールがフィードフォワード層であるかを認識して、正しいスケーリングを適用できるようにします。
シーケンス分類タスクでは、LlamaモデルのIA3設定を次のように初期化できます。
from peft import IA3Config, TaskType, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M")
peft_config = IA3Config(
task_type=TaskType.CAUSAL_LM,
target_modules=["k_proj", "v_proj", "down_proj"],
feedforward_modules=["down_proj"],
)
model = get_peft_model(model, peft_config)
model.print_healthcheck()IA3とLoRAの使い分け
IA3は、ストレージに制約のあるデプロイメントで可能な限り小さなアダプタが必要な場合、または学習可能なパラメータを減らして高速な収束を実現したい場合に特に有効です。LoRAは、LoRAのバリエーション(DoRA、QLoRAなど)のより広いエコシステムが必要である場合、または広範なコミュニティサポートを持つ最も広くテストされたアプローチを望む場合に、より好ましい場合があります。
ベンチマーク概要
API
IA3Config
クラス peft.IA3Config
< 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 = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonefeedforward_modules: Optional[Union[list[str], str]] = Nonefan_in_fan_out: bool = Falsemodules_to_save: Optional[list[str]] = Noneinit_ia3_weights: bool = True )
パラメータ
- target_modules (
Optional[Union[List[str], str]]) — アダプタを適用するモジュールの名前です。このパラメータが指定されている場合、指定された名前のモジュールのみが置き換えられます。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。このパラメータが ‘all-linear’ として指定されている場合、出力層を除くすべての linear/Conv1D モジュールが選択されます。このパラメータが指定されていない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合はエラーが発生します。この場合、ターゲットモジュールを手動で指定する必要があります。 - exclude_modules (
Optional[Union[List[str], str]]) — アダプタを適用しないモジュールの名前。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。 - feedforward_modules (
Optional[Union[List[str], str]]) — 元の論文に従い、フィードフォワードモジュールとして扱うモジュールの名前です。これらのモジュールには、出力ではなく入力に (IA)³ ベクトルが乗算されます。feedforward_modulesは、target_modulesに存在する名前、またはその部分集合である必要があります。 - fan_in_fan_out (
bool) — 置き換えるレイヤーが重みを (fan_in, fan_out) の形式で保存している場合は、これを True に設定してください。例えば、gpt-2 は重みを (fan_in, fan_out) の形式で保存するConv1Dを使用しているため、これをTrueに設定する必要があります。 - modules_to_save (
Optional[List[str]]) — (IA)³ レイヤーを除き、最終チェックポイントで学習可能に設定して保存されるモジュールのリスト。 - init_ia3_weights (
bool) — (IA)³ レイヤーのベクトルを初期化するかどうか。デフォルトはTrueです。Falseに設定することは推奨されません。
これはIA3Modelの設定を保存するための設定クラスです。
IA3Model
クラス peft.IA3Model
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
パラメータ
- model (PreTrainedModel) — 適応させる対象のモデル。
- config (IA3Config) — (IA)^3 モデルの設定です。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。 - low_cpu_mem_usage (
bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。
戻り値
torch.nn.Module
(IA)^3モデル。
事前学習済みのtransformersモデルから、内部活性化の抑制と増幅によってInfused Adapter ((IA)^3)モデルを作成します。この手法の詳細は、https://huggingface.co/papers/2205.05638に記載されています。
例:
>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import IA3Config, get_peft_model
>>> config = IA3Config(
... peft_type="IA3",
... task_type="SEQ_2_SEQ_LM",
... target_modules=["k", "v", "w0"],
... feedforward_modules=["w0"],
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> ia3_model = get_peft_model(model, config)属性:
- model (PreTrainedModel) — 適応させる対象のモデル。
- peft_config (IA3Config): (IA)^3モデルの設定です。
add_weighted_adapter
< source >( adapters: list[str]weights: list[float]adapter_name: str )
このメソッドは、指定されたアダプターを指定された重みでマージして、新しいアダプターを追加します。