Ters dropout
Zorluk: Kolay Çözüldüdüzenlileştirme
Dropout, eğitim sırasında her birimi (unit) olasılıkla rastgele düşürür (sıfırlar) ve ağın tek bir birime fazla güvenmesini engeller. Ters dropout (inverted dropout) bunu yaparken kalan birimleri hemen büyütür; böylece çıkarımda (inference) hiçbir şey değiştirmek gerekmez.
dropout(x, p, training, seed=0) fonksiyonunu yaz. x herhangi bir şekilde (shape) bir dizidir (array), p bir birimin düşürülme olasılığıdır (), training bir bool’dur ve seed (tohum) maskeyi belirler.
Eğitimde (training=True) maskeyi şöyle üret:
rng = np.random.default_rng(seed)mask = rng.random(x.shape) >= p
True olan birimler kalır, False olanlar düşer. Kalanları ile ölçekle:
Çıkarımda (training=False) ‘i olduğu gibi döndür. Shape’i x ile aynı olan tek bir array döndür.
Örnekler
Girdi: x = [[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [-1.0, -2.0, -3.0, -4.0]], p = 0.5, training = True, seed = 0
Çıktı: array([[ 2., 0., 0., 0.],
[10., 12., 14., 16.],
[-2., -4., -6., -0.]])
Girdi: x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0], p = 0.25, training = True, seed = 7
Çıktı: array([ 1.33333333, 2.66666667, 4. , 0. , 6.66666667,
8. , 0. , 10.66666667])
Girdi: x = [[1.0, -2.0, 3.0], [4.0, 5.0, -6.0]], p = 0.5, training = False, seed = 3
Çıktı: array([[ 1., -2., 3.],
[ 4., 5., -6.]])
İpucu 1
rng.random(x.shape), [0, 1) aralığından x ile aynı shape’te rastgele sayılar verir. Bunların p’den büyük ya da eşit olması, bir birimin kalma olasılığını yapar.
İpucu 2
Kalan birimlerin sayısı ortalamada katına iner; ölçekleme bunu telafi eder. Maskeyi x ile çarptıktan sonra ‘ye böl.
İpucu 3
training yanlışsa maskeye hiç bakma. Fonksiyonun ilk satırında x’i döndürmek yeter.
Gereksinimler
- Maskeyi tarifteki gibi üret:
rng = np.random.default_rng(seed)verng.random(x.shape) >= p. Aynıseedaynı maskeyi vermelidir;np.random.seedkullanma. - Eğitimde kalan birimleri ile çarp, düşenleri yap.
- Çıkarımda dropout hiçbir şey yapmaz: ne birim düşer ne ölçekleme olur.
pveseedçıktıyı etkilemez. - Dönüş değeri
xile aynı shape’te bir NumPy array’i. p = 0iken eğitimde dexaynen döner.x’i değiştirme. Fonksiyon bittiğinde çağıran kodun array’i aynı kalır.
Ters dropout, beklenen değeri korur. Bir birimin değeri olsun. olasılıkla kalır ve olur; olasılıkla düşer ve olur. Beklenen değer:
Yani eğitimde çıktı ortalama olarak ‘e eşittir. Örneğin iken kalan birimler ile çarpılır ve bir birimin ortalama katkısı olur.
Ölçeklemeyi eğitimde yapmak, çıkarımı basit tutar: çıkarımda hiçbir birim düşmez ve çıktı olduğu gibi geçer. Ölçeklemeyi çıkarıma bırakan eski yöntemde ise çıkarımda her çıktı ile çarpılmak zorundadır.
Dropout bir düzenlileştirme (regularization) yöntemidir. Her adımda farklı bir alt ağ eğitilir, bu yüzden ağ tek bir birimin varlığına güvenemez. Bu, aşırı öğrenmeyi (overfitting) azaltır.
Daha fazlası için Normalizasyon ve düzenlileştirme dersine bak.
Çıkarımda x’i döndür; eğitimde maskeyi üret, x’e uygula ve ‘ye böl:
import numpy as npdef dropout(x: np.ndarray, p: float, training: bool, seed: int = 0) -> np.ndarray: if not training: return x.copy() rng = np.random.default_rng(seed) mask = rng.random(x.shape) >= p return x * mask / (1.0 - p)
Sık yapılan hata, ölçeklemeyi unutmak ya da ters yöne uygulamaktır. Ölçeksiz dropout’ta eğitimde çıktının ortalaması katına iner. Çıkarımda da ile çarparsan ters dropout’un amacını bozarsın.
Bir diğer hata ‘yi kalma olasılığı sanmaktır: bu problemde düşürme olasılığıdır.
Bu problemde bir sorun mu var?