以下の内容はhttps://cysec148.hatenablog.com/entry/2025/04/15/165943より取得しました。


第48回:Parameter-Efficient Fine-Tuning(PEFT)の基本と実装

Hello there, ('ω')ノ

🧠 はじめに:PEFT(Parameter-Efficient Fine-Tuning)とは?

PEFT(Parameter-Efficient Fine-Tuning) とは、
大規模言語モデル(LLM)のパラメータのごく一部のみを調整してファインチューニング する手法です。
従来の フルファインチューニング に比べて、
計算コスト・メモリ消費量を大幅に削減 しながら、
同等の性能向上を実現 できます。

PEFTの目的:
- 計算コスト・メモリ使用量の削減
- ファインチューニング時間の短縮
- タスクごとに迅速なモデル適応

PEFTの適用範囲:
- 📚 テキスト分類(Sentiment Analysis, Intent Detection)
- 🔍 質問応答(Question Answering, Retrieval-Augmented Generation)
- ✍️ 要約・翻訳(Summarization, Translation)
- 🤖 対話型AI(Conversational AI, Chatbot)


📚 1. PEFTの基本概念とメリット


🎯 ① PEFTの基本概念

PEFT では、
大規模モデルのパラメータのごく一部のみを微調整 することで、
タスク特化型の微調整(ファインチューニング)を効率化 します。

フルファインチューニング vs. PEFT の違い

項目 フルファインチューニング PEFT
パラメータ更新 全パラメータ更新 一部パラメータ更新
メモリ消費量 非常に大きい 90%以上削減
学習時間 数日〜数週間 数時間〜1日
モデルサイズ 大きい 軽量で保持
タスク適応性 高い 迅速なタスク適応

🎯 ② PEFTの主な手法

PEFTには以下の代表的な手法があります。

手法 説明 主な用途
LoRA(Low-Rank Adaptation) 行列の低ランク変換でモデルパラメータ更新量を抑制 多様なLLM適応
Prefix Tuning プロンプトに学習済みトークンを追加して微調整 会話モデル・翻訳
Adapter Tuning 中間層(Transformer)の一部のみを更新 文書分類・QA
P-Tuning 入力プロンプトに学習済みトークンを挿入 対話モデル・生成

PEFTは、計算リソースが限られた環境でも、特定タスク向けの高度なモデル適応を可能にします。


🔥 2. LoRA(Low-Rank Adaptation)の詳細


🎯 ① LoRAの基本概念

LoRA(Low-Rank Adaptation) とは、
- 行列分解(低ランク近似)を活用して、モデルの一部パラメータのみを更新 する手法です。
- モデルの重み行列 (W) を 低ランク行列 に分解し、
更新パラメータを低次元空間で学習 します。

LoRAの構造

W' = W + ΔW
ΔW = A × B  (A, Bは低ランク行列)

メリット:
- 学習パラメータ数を大幅に削減(最大99%)
- メモリ使用量と学習時間の削減
- 精度の維持とタスク特化型微調整の実現


🎯 ② LoRAの主な適用先

BERT / RoBERTa / GPT-2 / GPT-3 / LLaMA などのLLMモデルに適用可能
以下のようなタスクで効果的:
- テキスト分類(Sentiment Analysis)
- 質問応答(Question Answering)
- テキスト生成(Chatbot, Text Completion)


🛠️ 3. PEFTの実装方法:LoRAを用いたファインチューニング


📦 ① 必要なライブラリのインストール

# 必須ライブラリのインストール
pip install transformers peft accelerate torch datasets

セットアップ完了!


📚 ② モデルとデータセットの準備

BERTモデルの読み込み

from transformers import AutoModelForSequenceClassification, AutoTokenizer
from datasets import load_dataset

# モデル・トークナイザーの読み込み
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

# IMDBデータセットの読み込み
dataset = load_dataset("imdb")

データの前処理

# テキストデータのトークナイズ
def preprocess_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

# データセットの前処理
tokenized_datasets = dataset.map(preprocess_function, batched=True)

# 訓練・検証データの準備
train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(2000))
eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(500))

🧠 ③ LoRAの導入と設定

LoRA設定

from peft import LoraConfig, get_peft_model

# LoRAの設定
lora_config = LoraConfig(
    r=8,  # 低ランク次元
    lora_alpha=32,  # 学習率スケール
    target_modules=["query", "value"],  # 微調整対象のモジュール
    lora_dropout=0.1  # ドロップアウト率
)

# LoRAを適用したモデルの取得
model = get_peft_model(model, lora_config)

# モデルの構造を確認
model.print_trainable_parameters()

結果:

Trainable params: 0.06M || All params: 110.65M || Trainable%: 0.05%

🎯 ④ トレーニングの設定

トレーニングパラメータの指定

from transformers import TrainingArguments, Trainer

# トレーニング設定
training_args = TrainingArguments(
    output_dir="./lora-finetuned-bert",
    evaluation_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=8,
    num_train_epochs=3,
    weight_decay=0.01,
    save_total_limit=2,
    logging_dir="./logs"
)

# Trainerの作成
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset
)

# 微調整の実行
trainer.train()

結果:

[INFO] LoRAを用いた微調整が完了しました!

📚 ⑤ モデルの評価と保存

モデルの評価

# モデルの評価
eval_results = trainer.evaluate()
print(f"Evaluation results: {eval_results}")

結果:

Evaluation results: {'eval_loss': 0.215, 'eval_accuracy': 0.92}

微調整済みモデルの保存

# 微調整済みモデルの保存
trainer.save_model("./lora-finetuned-bert")

🔥 4. Prefix Tuning と Adapter Tuning の応用


🎯 ① Prefix Tuning の基本

概要:
- 入力プロンプトに学習済みトークンを追加して微調整
- タスク特化型のLLM最適化

適用例:
- 対話システム(Chatbot)
- 文章要約・翻訳(Summarization, Translation)

Prefix Tuningの実装

from peft import PrefixTuningConfig

# Prefix Tuningの設定
prefix_config = PrefixTuningConfig(
    num_virtual_tokens=20,
    task_type="SEQ_2_SEQ_LM"
)

# Prefix Tuningの適用
model = get_peft_model(model, prefix_config)

🎯 ② Adapter Tuning の基本

概要:
- Transformerの中間層に「アダプター」を挿入して微調整
- 一部パラメータのみ更新することでタスク適応性を向上

適用例:
- 文書分類・QA・テキスト生成

Adapter Tuningの実装

from peft import AdapterConfig

# Adapter Tuningの設定
adapter_config = AdapterConfig(
    reduction_factor=16,
    target_modules=["query", "value"]
)

# Adapter Tuningの適用
model = get_peft_model(model, adapter_config)

📊 5. PEFTの手法比較と選択ポイント


📚 PEFT手法の比較

手法 精度 メモリ使用量 トレーニング速度 主な用途
LoRA 高い 非常に少ない 高速 テキスト分類・QA
Prefix Tuning 中〜高 少ない 速い 対話・翻訳
Adapter Tuning 高い 中程度 適度 文書分類・生成タスク

LoRA: 精度と効率のバランスが良く、ほとんどのLLMタスクで推奨
Prefix Tuning: 対話や翻訳タスクで柔軟性のある微調整
Adapter Tuning: 高精度・特定タスク向けの適応性を重視


🎁 6. まとめ:PEFTを活用してLLMの微調整を効率化しよう!

PEFT(Parameter-Efficient Fine-Tuning)は、LLMの微調整を効率化し、計算コストとメモリ消費量を削減できる手法です。
LoRA・Prefix Tuning・Adapter Tuning などのPEFT手法を活用することで、タスク特化型のモデルを迅速に構築できます。
特にLoRAは、計算資源が限られた環境でも、精度の高いモデル微調整が可能です。
PEFTを使いこなして、GPT-3、BERT、LLaMA などの大規模モデルを自社タスクに最適化しましょう!

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/04/15/165943より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14