CodeBlanks Logo Icon CodeBlanks

Fine-tuning

Fine-tuning, pre-trained modelin bazı katmanlarını yeniden eğitir.

Fine-tuning

İnce ayar (fine-tuning), önceden eğitilmiş ağırlıklardan başlayıp tüm ağı (ya da üst katmanlarını) yeni veriyle küçük bir öğrenme oranıyla eğitmektir. Küçük oran, değerli genel özelliklerin bozulmasını önler:

opt = torch.optim.Adam([
    {"params": govde.parameters(), "lr": 1e-4},   # gövde: küçük adım
    {"params": yeni_bas.parameters(), "lr": 1e-3},  # yeni baş: büyük adım
])

Yeni baş rastgele başladığı için daha hızlı öğrenmesi gerekir; gövde ise yalnızca ince düzeltmeler yapar.

Aşamalı ince ayar

Yaygın bir strateji iki aşamalıdır: önce gövde dondurulup yalnızca baş eğitilir; baş makul hale gelince gövde de açılıp küçük oranla birlikte eğitilir:

# 1. aşama
for p in govde.parameters():
    p.requires_grad = False
egit(bas, epoch=3)
# 2. aşama
for p in govde.parameters():
    p.requires_grad = True
egit(tum_model, epoch=5, lr=1e-4)

Böylece başın rastgele başlangıcı gövdeye zarar veremeden düzelmiş olur.

Uygulama Parametre grupları

govde için lr=1e-4, yeni baş nn.Linear(32, 5) için lr=1e-3 olan bir Adam optimize edici kur. Grup sayısını ve her grubun öğrenme oranını liste olarak aynı satırda yazdır. Ardından her grubun parametre sayısını liste olarak yazdır.

Başlangıç kodu

model.py
import torch
from torch import nn

torch.manual_seed(0)
govde = nn.Sequential(
    nn.Conv2d(3, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(16, 32, 3, padding=1), nn.ReLU(),
    nn.AdaptiveAvgPool2d(1), nn.Flatten())
bas = nn.Linear(32, 1000)
onceden = nn.Sequential(govde, bas)

# buraya yaz

Örnek çözüm

model.py
import torch
from torch import nn

torch.manual_seed(0)
govde = nn.Sequential(
    nn.Conv2d(3, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
    nn.Conv2d(16, 32, 3, padding=1), nn.ReLU(),
    nn.AdaptiveAvgPool2d(1), nn.Flatten())
bas = nn.Linear(32, 1000)
onceden = nn.Sequential(govde, bas)

yeni_bas = nn.Linear(32, 5)
opt = torch.optim.Adam([{"params": govde.parameters(), "lr": 1e-4}, {"params": yeni_bas.parameters(), "lr": 1e-3}])
print(len(opt.param_groups), [g["lr"] for g in opt.param_groups])
print([sum(p.numel() for p in g["params"]) for g in opt.param_groups])

Beklenen çıktı

2 [0.0001, 0.001]
[5088, 165]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İnce ayarda gövdeye büyük öğrenme oranı vermenin riski nedir?

  • Risk yoktur
  • Bellek taşması
  • Önceden öğrenilmiş özelliklerin bozulması Doğru cevap
  • Eğitimin yavaşlaması

Açıklama: Rastgele başın büyük gradyanları ilk adımlarda gövdeyi bozabilir.

2 Gövdeye küçük öğrenme oranı ver.

Soru
{"params": govde.parameters(), "____": 1e-4}
Cevap
{"params": govde.parameters(), "lr": 1e-4}

Açıklama: Parametre grubu sözlüğünde lr anahtarı kullanılır.

3 Ayarları eşleştir.

Kavram Anlamı
gövde lr 1e-4 (küçük)
baş lr 1e-3 (büyük)
1. aşama Gövde donuk
2. aşama Tüm model

İleri seviye bölümündeki tüm dersler