知識の再利用: 転移学習のアイデア
Il 転移学習 これは機械学習の最も革新的な技術の 1 つです 現代的な。このアイデアはシンプルですが強力です。新しい問題ごとにモデルをゼロからトレーニングするのではなく、 大規模なデータセットですでにトレーニングされたモデルから開始します ( ソースドメイン)そしてはい あなたの特定の問題に適しています( ターゲットドメイン)。これが機能するのは、 初期レイヤーで学習した特徴 (画像のエッジ、テクスチャ、形状、テキストの言語構造) それらは普遍的であり、譲渡可能です。
転移学習によりディープラーニングが民主化されました。GPU と数百万のクラスターはもう必要ありません。 画像分類器をトレーニングするための画像。事前トレーニングされたモデルを使用できます ResNet (120 万の ImageNet 画像でトレーニング済み) のようなものを、わずか数個で問題に適応させます 何百もの画像とトレーニングはわずか数分で完了します。
この記事で学べること
- 転移学習が機能する場合とその理由
- 特徴抽出と微調整
- レイヤーフリーズ戦略
- 画像とテキストの事前トレーニングされたモデル
- 小規模なデータセットのデータ拡張
- Pythonによる実践実装
特徴抽出: バックボーンの凍結
最も単純な転移学習戦略は次のとおりです。 特徴抽出:使用されています 固定特徴抽出器として事前トレーニングされたモデル、最後の層 (分類ヘッド) が削除される そして、ターゲット ドメインでトレーニングされた新しい分類器が追加されます。バックボーンの重みは残ります 凍った: トレーニング中は更新されません。これは、次のような場合に理想的です。 ターゲット データセットは小さく、ソース ドメインはターゲットと似ています。
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_digits
import numpy as np
# Simulazione di transfer learning con scikit-learn
# Il concetto: usare feature apprese da un modello pre-addestrato
# come input per un classificatore leggero
# Dataset: riconoscimento cifre (8x8 pixel)
digits = load_digits()
X, y = digits.data, digits.target
# Scenario 1: Training diretto (no transfer)
direct_pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(max_iter=5000, random_state=42))
])
scores_direct = cross_val_score(direct_pipeline, X, y, cv=5, scoring='accuracy')
print(f"Diretto (tutte le feature): {scores_direct.mean():.3f}")
# Scenario 2: Simulazione feature extraction
# Pre-trained model ha gia' estratto feature ad alto livello
# Usiamo PCA come proxy per le "feature apprese"
from sklearn.decomposition import PCA
# Feature extractor pre-addestrato (congela i pesi)
feature_extractor = PCA(n_components=20, random_state=42)
X_features = feature_extractor.fit_transform(X)
# Nuovo classificatore sulle feature estratte
transfer_pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(max_iter=5000, random_state=42))
])
scores_transfer = cross_val_score(transfer_pipeline, X_features, y, cv=5, scoring='accuracy')
print(f"Feature extraction (20 comp): {scores_transfer.mean():.3f}")
# Scenario 3: Con dataset ridotto (simula pochi dati nel target domain)
small_idx = np.random.choice(len(X), size=200, replace=False)
X_small, y_small = X[small_idx], y[small_idx]
X_small_features = feature_extractor.transform(X_small)
scores_small_direct = cross_val_score(direct_pipeline, X_small, y_small, cv=5)
scores_small_transfer = cross_val_score(transfer_pipeline, X_small_features, y_small, cv=5)
print(f"\nCon solo 200 campioni:")
print(f" Diretto: {scores_small_direct.mean():.3f}")
print(f" Feature extraction: {scores_small_transfer.mean():.3f}")
微調整: モデルの適応
Il 微調整 特徴抽出を超えたもの: 分類ヘッドを交換した後、 はい 彼らは解ける バックボーンのいくつかの層を再トレーニングし、非常に低い学習率で再トレーニングします。 これにより、モデルは中間特徴をターゲット ドメインに適応させることもできます。一般的なルールは次のとおりです。 ターゲット ドメインがソースと異なるほど、解凍する価値のあるレイヤーが多くなります。
の戦略 レイヤーのフリーズ 含まれるもの: レイヤーの最後のブロックのみを解凍します (保守的)。 終わりから始めに向かって段階的に解凍し (段階的な解凍)、異なる学習率を使用します。 異なる層 (識別学習率。深い層ほど学習率が低くなります)。
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_digits
import numpy as np
digits = load_digits()
X, y = digits.data, digits.target
# Simulazione di fine-tuning:
# Step 1: Pre-training su un sottoinsieme (source domain)
# Step 2: Fine-tuning su un altro sottoinsieme (target domain)
# Source domain: cifre 0-4
source_mask = y <= 4
X_source, y_source = X[source_mask], y[source_mask]
# Target domain: cifre 5-9 (con pochi dati)
target_mask = y > 4
X_target, y_target = X[target_mask], y[target_mask] - 5
# Solo 50 campioni nel target domain
np.random.seed(42)
small_idx = np.random.choice(len(X_target), size=50, replace=False)
X_target_small = X_target[small_idx]
y_target_small = y_target[small_idx]
# Modello 1: Training from scratch sul target piccolo
from_scratch = GradientBoostingClassifier(
n_estimators=100, random_state=42
)
scores_scratch = cross_val_score(
from_scratch, X_target_small, y_target_small, cv=5
)
# Modello 2: Pre-trained sul source, fine-tuned sul target
pretrained = GradientBoostingClassifier(
n_estimators=100, random_state=42,
warm_start=True # permette di continuare il training
)
# Pre-training sul source
pretrained.fit(X_source, y_source)
# Fine-tuning: aggiungiamo altri estimators sul target
pretrained.n_estimators = 150 # aggiungi 50 estimators
pretrained.fit(X_target_small, y_target_small)
# Data Augmentation: aggiungi rumore per ampliare il dataset
noise_factor = 0.3
X_augmented = np.vstack([
X_target_small,
X_target_small + np.random.normal(0, noise_factor, X_target_small.shape),
X_target_small + np.random.normal(0, noise_factor, X_target_small.shape)
])
y_augmented = np.concatenate([y_target_small] * 3)
aug_model = GradientBoostingClassifier(n_estimators=100, random_state=42)
scores_aug = cross_val_score(aug_model, X_augmented, y_augmented, cv=5)
print("Risultati con 50 campioni target:")
print(f" From scratch: {scores_scratch.mean():.3f}")
print(f" Data augmentation: {scores_aug.mean():.3f}")
エコシステム内の事前トレーニング済みモデル
彼らのために 画像、最も使用されるモデルは ImageNet でトレーニングされています (120 万個の画像、1000 クラス)。 レスネット (残存建築物)、 EfficientNet (効率を考慮して最適化)、 VGG (シンプルですが効果的です)。のために 文章、事前トレーニングされた変圧器モデル dominate: バート (Google、双方向)、 GPT (OpenAI、生成)、 ロベルタ (BERT の最適化)。
ハグフェイス は、事前トレーニングされたモデルのための頼りになるプラットフォームです。
テキスト分類、翻訳、質問応答、テキスト生成などのテンプレート、
ライブラリを介して数行のコードですべてアクセス可能 transformers.
転移学習が価値がある場合
転移学習は次のような場合に適切な選択です。 ターゲット データセットが次のような場合 小さい (サンプル数が数千未満)、ソース ドメインは次のとおりです。 似ている ターゲットへ(イメージ 医療画像を分類するのに自然です)、または必要なときにいつでも 時間を節約する とリソース 計算的な。次の場合には不便です。ソース ドメインとターゲット ドメインが大きく異なる (テキストと画像)。 ターゲット データセットがすでに大きいか、ソース フィーチャがターゲットにとって役に立ちません。
トレーニング費用: BERT を最初から事前トレーニングするには、16 個の TPU で 4 日かかります (推定コスト) 10,000ドルから50,000ドル)。特定のタスクで BERT を微調整するには、単一の GPU で数分かかります。この違いは コストは、現代の深層学習において転移学習が標準的な選択肢である理由を説明しています。
重要なポイント
- 転移学習は、新しい問題に対して大規模なデータセットで事前トレーニングされたモデルを再利用します
- 特徴抽出: バックボーンを凍結し、新しい分類ヘッドのみをトレーニングします
- 微調整: 学習率の低いレイヤーを段階的にフリーズ解除します。
- ソース ドメインとターゲット ドメインが類似しており、ターゲット データセットが小さい場合に最適に機能します。
- 画像用のResNet/EfficientNet、テキスト用のBERT/GPTが標準モデル
- データが不足している場合、データ拡張は転移学習を補完します







