ReLU (Rectified Linear Unit)
ReLU (düzeltilmiş doğrusal birim), max(0, x) değerini verir; pozitif girdileri geçirir, negatifleri sıfırlar. Gradyanı, ölü ReLU sorunu, çeşitleri ve PyTorch kodu.
Düzeltilmiş doğrusal birim (ReLU), f(x) = max(0, x) aktivasyon işlevidir: Pozitif girdileri değiştirmeden geçirir, diğer tüm girdiler için sıfır verir. Bu tek karşılaştırma, bir sinir ağına (NN) neredeyse hiç hesaplama maliyeti getirmeden eğri örüntüleri öğrenmesi için gereken doğrusal olmayanlığı kazandırır. Vinod Nair ve Geoffrey Hinton'ın 2010'da ReLU'yu kullanmasının ardından ReLU, derin öğrenmede gizli katmanların varsayılan aktivasyonu oldu. ReLU'lar üzerine kurulu bir evrişimli sinir ağı (CNN) olan AlexNet'in 2012 ImageNet yarışmasını kazanması da bunu pekiştirdi. SiLU ve GELU gibi daha yeni aktivasyonların karşılaştırıldığı temel yöntem olmayı sürdürüyor.
ReLU Nasıl Çalışır#
ReLU'nun türevi pozitif girdiler için 1, negatif girdiler için 0'dır. Tam olarak sıfırda türev tanımsızdır; PyTorch gibi çatı sistemler 0 kullanır. Bu iki değer ReLU'nun temel özelliklerini açıklar:
- Hesaplaması ucuz: İleri geçişte sıfırla karşılaştırma, geri geçişte ise maskeleme yapılır; sigmoid veya tanh gibi üstel hesaplamalar gerekmez.
- Pozitif girdilerde doygunluk yoktur: Tam olarak 1 olan gradyan, etkin her birimden değişmeden geçer. Böylece hata sinyalleri çok sayıda katman boyunca geriye giderken küçülmez; bu, doygunluk işlevlerinin yol açtığı kaybolan gradyan sorununu önler.
- Seyrek aktivasyonlar: Her negatif girdi tam olarak sıfıra dönüşür; bu nedenle herhangi bir anda bir katmanın yalnızca bir bölümü etkindir. Rastgele başlatılmış ağırlıklarla, belirli bir girdi için katmandaki birimlerin yaklaşık yarısı sıfır çıktı verir.
- Parçalı doğrusal: ReLU'lardan oluşan bir ağ, birimlerin etkinleştiği veya kapandığı noktalarda birleşen çok sayıda doğrusal bölge içeren, girdisinin parçalı doğrusal bir işlevini hesaplar.
Aşağıdaki PyTorch örneği nn.ReLU uygular ve aynı noktalardaki gradyanı hesaplamak için autograd kullanır:
import torch
from torch import nn
relu = nn.ReLU()
# Inputs on both sides of zero, tracked so PyTorch can compute gradients
x = torch.tensor([-2.0, -0.5, 0.0, 0.5, 2.0], requires_grad=True)
y = relu(x)
# Backpropagate a gradient of 1 from each output to its input
y.sum().backward()
print(f"Output: {y.tolist()}")
print(f"Gradient: {x.grad.tolist()}")[0.0, 0.0, 0.0, 0.5, 2.0] çıktıları ve [0.0, 0.0, 0.0, 1.0, 1.0] gradyanlarını yazdırır. Pozitif girdiler, gradyanları korunarak geçer; negatif girdiler ile sıfır ise hiç gradyan almaz. Bu durum hem ReLU'nun seyrekliğinin hem de başlıca başarısızlık biçiminin kaynağıdır.
ReLU Nöronunun Ölmesi Sorunu#
Eğitim verilerindeki tüm örnekler için girdisi negatif olan bir ReLU birimi sıfır çıktı verir ve sıfır gradyan alır. Bu nedenle ağırlıkları bir daha değişmez ve birim fiilen ölür. Birimler genellikle yüksek bir öğrenme hızının yol açtığı büyük bir ağırlık güncellemesi sapmayı çok negatife ittiğinde ölür. Birkaç ölü birimin maliyeti düşüktür; ancak kötü ayarlanmış bir çalışma katmanın büyük bir bölümünü öldürebilir. ReLU katmanları için başlangıç ağırlıklarını ölçeklendiren He başlatması, makul öğrenme hızları ve yığın normalizasyonu, birimlerin çoğunu etkin tutar. Sızdıran varyantlar ise gradyanın sıfıra inmesine hiçbir zaman izin vermeyerek bu sorunu ortadan kaldırır.
ReLU Varyantları#
- Leaky ReLU: Negatif girdileri küçük, sabit bir eğimle (genellikle 0,01) çarpar. Böylece etkin olmayan birimler de gradyan alır.
- PReLU: Negatif eğimi eğitim sırasında öğrenir. Kaiming He ve çalışma arkadaşları, He başlatmasını önerdikleri makaleyle birlikte 2015'te PReLU'yu tanıttı.
- ReLU6: Çıktıyı 6 ile sınırlar: min(max(0, x), 6). Böylece aktivasyonlar, düşük duyarlıklı aritmetiğin iyi temsil ettiği bir aralıkta kalır. MobileNetV1 ve MobileNetV2 bunu kullanır.
- ELU: Negatif tarafı −1'de doygunluğa ulaşan düzgün bir üstel eğriyle değiştirir ve ortalama aktivasyonları sıfıra yaklaştırır.
- SiLU ve GELU: x · σ(x) ve x · Φ(x) biçimindeki düzgün eğrilerdir. Büyük girdilerde ReLU gibi davranır, ancak küçük negatif değerleri geçirir ve sıfırda keskin bir köşeleri yoktur. Her öğe için daha fazla hesaplama gerektirirler. GELU makalesi, test ettiği tüm görme, dil ve konuşma görevlerinde ReLU'ya kıyasla iyileşme bildirdi.
ReLU, Sigmoid ve Tanh Karşılaştırması#
ReLU'dan önce gizli katmanlarda sigmoid veya tanh kullanılırdı. Her ikisi de doygunluğa ulaşır: Eğrileri büyük pozitif veya negatif girdilerde düzleşir ve türevleri sıfıra yaklaşır. Sigmoid'in türevi, en dik olduğu noktada bile 0,25'i aşmaz. Bu tür türevlerin çok sayıda katmanda çarpılması, erken katmanların gradyandan yoksun kalmasına neden olur. AlexNet makalesinde, ReLU kullanan dört katmanlı bir CNN, CIFAR-10 üzerinde aynı ağın tanh birimleriyle çalışan hâlinden altı kat daha hızlı biçimde %25 eğitim hatasına ulaştı. Sınırlandırılmış aralıklarının önemli olduğu yerlerde sigmoid ve tanh kullanılmaya devam eder: Olasılıklar için çıktı katmanlarında ve tekrarlayan hücrelerin kapılarında sigmoid, tekrarlayan gizli durumlarda tanh kullanılır.
Modern Modellerde ReLU#
ResNet ve döneminin çoğu CNN'i baştan sona ReLU kullanır. 2017'deki orijinal Transformer da ileri beslemeli katmanlarında ReLU kullanıyordu. Daha yeni birçok model daha düzgün işlevlere geçti: BERT ve görsel Transformer'larda GELU, günümüzdeki birçok büyük dil modelinde ise SwiGLU kullanılıyor. Hızın ve donanım desteğinin en önemli olduğu yerlerde ReLU yaygınlığını koruyor. YOLO26, Conv bloklarında varsayılan olarak SiLU kullanır. Model YAML dosyasındaki bir activation: nn.ReLU() satırı, eğitimden önce her Conv bloğunda ReLU kullanacak şekilde değişiklik yapar. Bu, SiLU'yu yerel olarak çalıştırmayan ancak ReLU'yu çalıştıran AMD Zynq UltraScale+ DPU gibi hızlandırıcılara uygundur. PyTorch'ta nn.ReLU(inplace=True), ayrı bir çıktı tensörünün belleğini kullanmamak için girdi tensörünün üzerine yazar.










