# DEFT: Metinden Görsele Modeller için Ayrıştırılabilir Verimli İnce Ayar

[DEFT](https://proceedings.neurips.cc/paper_files/paper/2025/hash/93a34a7138bdad95e874018d5f491cc6-Abstract-Conference.html) (Decompositional Efficient Fine-Tuning), metinden görüntüye modeller için parametre verimli bir ince ayar yöntemidir. Donmuş bir ağırlık matrisinin `W` güncellemesini, `W`'den düşük rütbeli bir alt uzayı kaldıran bir projeksiyon ve o alt uzaya yeni içerik enjekte eden düşük rütbeli bir güncelleme olmak üzere iki eğitilebilir bileşene ayırır. Bu formülasyon, hedef dağılımla hizalanmayı, birkaç görüntüden yeni kavramları öğrenmeyi (kişiselleştirme) ve önceden eğitilmiş modelin talimat izleme yeteneği ile düzenlenebilirliğini korumayı dengeleyecek şekilde tasarlanmıştır.

Somut olarak DEFT, iki eğitilebilir düşük-rank bileşeni birleştirir: (1) düşük-rank bir matris tarafından gerilen düşük-rank bir alt uzayın tamamlayıcısına bir projeksiyon ve (2) bir düşük-rank güncelleme. İlk düşük-rank matris alt uzayı tanımlarken, ikincisi bu alt uzay içinde esnek parametre uyarlama sağlar.

DEFT'nin ne zaman kullanılacağı: DEFT, **temel modelin talimat izleme yeteneğini koruyup hatta geliştirirken** ve **önceki yeteneklerinin unutulmasını en aza indirirken** bir modelin yeni verilere veya kavramlara uyarlanması için en uygun çözümdür.

Hedef katman başına DEFT, bir projeksiyon yönü `P` (şekil `out_features x r`) ve bir enjeksiyon matrisi `R` (şekil `r x in_features`) öğrenir. Etkili ağırlık, artımlı projeksiyondur

```
W' = (I - P_proj) @ W + Q_P @ R
```

Projeleyici `P_proj`, `P`'den `decomposition_method`'ye göre türetilir:

- `"relu"` (varsayılan): `Q_P = P`, `P_proj = P @ relu(P).T` — ortogonal olmayan bir izdüşüm.
- `"qr"`: `Q_P = qr(P)`, `P_proj = Q_P @ Q_P.T` — dik bir izdüşüm.

`(I - P_proj) @ W` terimi, önceden eğitilmiş ağırlığın bir alt uzayını kaldırırken `Q_P @ R` yeni içeriği bu uzaya enjekte eder. Varsayılan olarak (`init_weights=True`) `R`, başlatma anında güncellemenin tam bir kimlik dönüşümü olacağı şekilde (`W' == W`) başlatılır; böylece eğitim, önceden eğitilmiş ağırlıklardan başlar ve enjeksiyonu öğrenir. Güncelleme, `out x out` boyutundaki projeksiyon matrisini hiç oluşturmadan hesaplanan ve çıkarım için serbest dağıtım amacıyla taban ağırlıklarla birleştirilebilen, düşük rütbeli bir eklemeli delta `Q_P @ (R - right.T @ W)` ile eşdeğerdir.

`para=True` olarak ayarlamak, [PaRa](https://proceedings.iclr.cc/paper_files/paper/2025/hash/f09e8dd9274cb7c2dd0dc65ffc6f427a-Abstract-Conference.html) (Parameter Rank Reduction) varyantını seçer: yalnızca alt uzay kaldırma terimini koruyup enjeksiyonu düşüren, sadece kaldırma içeren bir güncelleme `W' = (I - P_proj) @ W`. Yalnızca projeksiyon `P` eğitilir (enjeksiyon matrisi `R` yoktur), bu nedenle adaptör başlangıçta birim (identity) değildir. PaRa, metinden görüntüye difüzyon modellerini kişiselleştirmek için tanıtılmıştır ve burada DEFT'nin özel bir durumu olarak mevcuttur.

DEFT şu anda `torch.nn.Linear` ve `Conv1D` (ör. gpt-2, `fan_in_fan_out` üzerinden) katmanları için uygulanmıştır. Makaledeki orijinal uygulama ve deneyler (Stable Diffusion ve birleşik bir model üzerinde Dreambooth, Dreambench Plus, InsDet, VisualCloze) [github.com/MAXNORM8650/DEFT](https://github.com/MAXNORM8650/DEFT) adresinde mevcuttur.

Çalışmanızda DEFT kullanıyorsanız, lütfen makaleyi atıf olarak belirtin:

```bibtex
@article{kumar2026deft,
  title={DEFT: Decompositional Efficient Fine-Tuning for Text-to-Image Models},
  author={Kumar, Komal and Anwer, Rao and Shahbaz Khan, Fahad and Khan, Salman and Laptev, Ivan and Cholakkal, Hisham},
  journal={Advances in Neural Information Processing Systems},
  volume={38},
  pages={102009--102035},
  year={2026}
}
```

PaRa varyantını (`para=True`) kullanıyorsanız, lütfen şu kaynağı da alıntalayın:

```bibtex
@inproceedings{chen2025personalizing,
  title={Para: Personalizing text-to-image diffusion via parameter rank reduction},
  author={Chen, Shangyu and Pan, Zizheng and Cai, Jianfei and Phung, Dinh},
  booktitle={International Conference on Learning Representations},
  year={2025}
}
```

## DeftConfig[[peft.DeftConfig]]

#### peft.DeftConfig[[peft.DeftConfig]]

```python
peft.DeftConfig(task_type: Optional[Union[str, TaskType]] = None, peft_type: Optional[Union[str, PeftType]] = None, auto_mapping: Optional[dict] = None, peft_version: Optional[str] = None, base_model_name_or_path: Optional[str] = None, revision: Optional[str] = None, inference_mode: bool = False, r: int = 8, target_modules: Optional[Union[list[str], str]] = None, exclude_modules: Optional[Union[list[str], str]] = None, decomposition_method: Literal['relu', 'qr'] = 'relu', init_scale: float = 1.0, alpha: Optional[int] = None, para: bool = False, fan_in_fan_out: bool = False, deft_dropout: float = 0.0, init_weights: bool = True, layers_to_transform: Optional[Union[list[int], int]] = None, layers_pattern: Optional[Union[list[str], str]] = None, bias: str = 'none', modules_to_save: Optional[list[str]] = None)
```

[Kaynak](https://github.com/huggingface/peft/blob/main/src/peft/tuners/deft/config.py#L25)

**Parametreler:**

r (`int`) : Katmanlar arası DEFT projeksiyon/enjeksiyonunun rütbesi.

target_modules (`Optional[Union[List[str], str]]`) : Adaptörün uygulanacağı modüllerin adları. Bu alan belirtilirse, yalnızca belirtilen adlara sahip modüller değiştirilir. Bir dize geçirildiğinde, bir regex eşleşmesi yapılır. Dize listesi geçirildiğinde, tam bir eşleşme yapılır veya modül adının, geçirilen dizelerden herhangi biriyle sona erip ermediği kontrol edilir. Bu alan 'all-linear' olarak belirtilirse, çıktı katmanı hariç tüm lineer modüller seçilir. Bu alan belirtilmezse, modüller model mimarisine göre seçilir. Mimari bilinmiyorsa bir hata oluşturulur -- bu durumda, hedef modülleri manuel olarak belirtmelisiniz.

exclude_modules (`Optional[Union[List[str], str]]`) : Uygulanmayacak modüllerin adları. Bir dize geçirildiğinde, bir regex eşleşmesi yapılır. Bir dize listesi geçirildiğinde, tam bir eşleşme yapılır veya modül adının, geçirilen dizelerden herhangi biriyle sona erip ermediği kontrol edilir.

decomposition_method (`str`) : `P_proj` projeksiyoncunun `P`'den nasıl türetildiğini belirtir. Ya `"relu"` (varsayılan, ortogonal olmayan `P @ relu(P).T`) ya da `"qr"` (ortogonal `Q_P @ Q_P.T`).

init_scale (`float`) : Enjeksiyon matrisi `R`'i başlatmak için kullanılan standart saplamaya uygulanan ölçekleme (yalnızca `init_weights=False` olduğunda kullanılır). Daha küçük değerler, başlangıçta enjekte edilen güncellemeyi sıfıra daha yakın tutar. Varsayılan değeri `1.0`'dır.

alpha (`Optional[int]`) : Enjeksiyon terimi için ölçekleme faktörü, `alpha / r` ile ölçeklenir (LoRA'nın alfasına benzer şekilde). `None` ise ölçekleme uygulanmaz (faktör `1.0`). Alt uzay kaldırma terimi etkilenmez.

para (`bool`) : PaRa yönteminin kullanılıp kullanılmayacağı: enjeksiyon terimi olmadan saf alt uzay kaldırma (`delta = -P_proj @ W`). `True` olduğunda, `R` oluşturulmaz, `P` tek eğitilebilir matris olur ve adaptör başlangıçta birim (identity) olamaz. Varsayılan değer `False`'tır (tam DEFT).

fan_in_fan_out (`bool`) : Değiştirilecek katman ağırlıkları (fan_in, fan_out) biçiminde saklıyorsa bunu `True` olarak ayarlayın. Örneğin, gpt-2 ağırlıkları (fan_in, fan_out) biçiminde saklayan `Conv1D` kullandığı için bu değer `True` olarak ayarlanmalıdır.

deft_dropout (`float`) : Katman girdisine uygulanan dropout olasılığı. Varsayılan değeri `0.0`'dir.

init_weights (`bool`) : Eğitim başlangıcında adaptörün hiçbir işlem yapmaması (no-op) için DEFT'nin varsayılan (identity) başlatma yöntemini adaptör ağırlıkları için kullanıp kullanmayacağını belirtir. Bu ayarı, ne yaptığınızı tam olarak biliyorsanız değiştirin. Varsayılan olarak `True`'dur.

layers_to_transform (`Union[List[int], int]`) : Dönüştürülecek katman indeksleri. Bir int listesi geçirilirse, adaptör bu listede belirtilen katman indekslerine uygulanır. Tek bir tamsayı geçirilirse, dönüşümler bu indeksteki katmana uygulanır.

layers_pattern (`Optional[Union[List[str], str]]`) : Katman desen adı, yalnızca `layers_to_transform` `None`'den farklıysa kullanılır. Bu, genellikle `'layers'` veya `'h'` olarak adlandırılan modelin `nn.ModuleList`'ini hedeflemelidir.

bias (`str`) : DEFT için sapma türü. `'none'`, `'all'` veya `'deft_only'` olabilir.

modules_to_save (`List[str]`) : Son kontrol noktasında eğilebilir olarak ayarlanacak ve kaydedilecek, adaptör katmanları dışındaki modüllerin listesi.

Bu, bir [DeftModel](/docs/peft/main/tr/package_reference/deft#peft.DeftModel) yapılandırmasını depolamak için kullanılan yapılandırma sınıfıdır.

DEFT (Decompositional Efficient Fine-Tuning), bilgi enjeksiyonunu bir artımsal-yansıtma güncellemesi yoluyla gerçekleştirir. Donmuş bir taban ağırlığı `W` için, düşük rütbeli bir yansıtma yönü `P` (şekil `out_features x r`) ve bir enjeksiyon matrisi `R` (şekil `r x in_features`) öğrenilir. Uyarlanmış ağırlık `W' = (I - P_proj) @ W + Q_P @ R` şeklindedir; burada yansıtıcı `P_proj`, `P`'den `decomposition_method`'a göre türetilir:

- `"relu"` (varsayılan): `Q_P = P`, `P_proj = P @ relu(P).T` (ortogonal olmayan izdüşüm)
- `"qr"`: `Q_P = qr(P)`, `P_proj = Q_P @ Q_P.T` (ortogonal izdüşüm)

Varsayılan olarak (`init_weights=True`) `R`, başlangıçta güncellemenin tam bir kimlik dönüşümü olacağı şekilde (uyarlanmış ağırlık `W`'ye eşit olacak şekilde) başlatılır; böylece eğitim önceden eğitilmiş ağırlıklardan başlar ve enjeksiyonu öğrenir.

## DeftModel[[peft.DeftModel]]

#### peft.DeftModel[[peft.DeftModel]]

```python
peft.DeftModel(model, peft_config: Union[PeftConfig, dict[str, PeftConfig]], adapter_name: str, low_cpu_mem_usage: bool = False, state_dict: Optional[dict[str, torch.Tensor]] = None)
```

[Kaynak](https://github.com/huggingface/peft/blob/main/src/peft/tuners/deft/model.py#L27)

**Parametreler:**

model (`torch.nn.Module`) : Adapter tuner katmanlarının bağlanacağı model.

config ([DeftConfig](/docs/peft/main/tr/package_reference/deft#peft.DeftConfig)) : DEFT modelinin yapılandırması.

adapter_name (`str`) : Adaptörün adı, varsayılan olarak `"default"`'tur.

low_cpu_mem_usage (`bool`, `optional`, varsayılan `False`) : Meta cihazında boş adaptör ağırlıkları oluşturur. Yükleme sürecini hızlandırmak için faydalıdır.

**Dönüş:** `torch.nn.Module`

DEFT modeli.

Önceden eğitilmiş bir modelden DEFT (Decompositional Efficient Fine-Tuning) modeli oluşturur.

DEFT, temel ağırlıkları dondurur ve her hedef modül için düşük sıralı bir projeksiyon yönü `P` ile bir enjeksiyon matrisi `R` öğrenir. Etkili ağırlık `(I - P_proj) @ W + Q_P @ R` haline gelir ve `W`'nin bir alt uzayını, yeni enjekte edilen içerikle değiştirir (mevcut `decomposition_method` varyantları için [DeftConfig](/docs/peft/main/tr/package_reference/deft#peft.DeftConfig)'e bakın).

**Öznitelikler**:
- **model** (`~torch.nn.Module`) -- Uyarlanacak model.
- **peft_config** ([DeftConfig](/docs/peft/main/tr/package_reference/deft#peft.DeftConfig)): DEFT modelinin yapılandırması.

