SwiGLU
SwiGLU, SiLU ile etkinleştirilmiş bir izdüşümü ikinci bir doğrusal izdüşümle çarpar; Llama, PaLM ve Qwen'deki kapılı ileri beslemeli katman bu yapıyı kullanır. Kod içerir.
SwiGLU (Swish kapılı doğrusal birim), transformer'larda kullanılan ileri beslemeli katmanın kapılı bir çeşididir. Her belirteç vektörünü iki kez izdüşürür, izdüşümlerden birini SiLU (Swish) aktivasyon fonksiyonundan geçirir, ikisini eleman bazında çarpar ve çarpımı model genişliğine geri izdüşürür: FFN(x) = (SiLU(xW) ⊙ xV)W₂. Noam Shazeer bu yöntemi 2020 tarihli GLU Variants Improve Transformer makalesinde tanıttı; o zamandan beri PaLM, Llama, Mistral ve Qwen gibi büyük dil modellerinin (LLM) ileri beslemeli bloğu hâline geldi. Her sayıya bağımsız etki eden ReLU veya GELU aksine, SwiGLU öğrenilmiş ağırlıklar içerir; bu da onu kendi başına küçük bir katman hâline getirir.
SwiGLU Nasıl Çalışır#
Standart bir transformer ileri beslemeli ağı (FFN), her belirteç vektörünü bir ağırlık matrisiyle genişletir, bir aktivasyon uygular ve ikinci bir matrisle tekrar sıkıştırır. SwiGLU, ilk matrisi ve aktivasyonu, aynı girdinin paralel iki izdüşümünü kullanan bir kapılı doğrusal birimle (GLU) değiştirir:
- Kapı izdüşümü: xW, SiLU'dan, yani x · σ(x) fonksiyonundan geçer; böylece güçlü negatif girdiler için sıfıra yakın, pozitif girdiler içinse girdiye yakın değerler üretir.
- Değer izdüşümü: xV doğrusal kalır ve içeriği taşır.
- Eleman bazında çarpım: İki değerin çarpılması, kapının her gizli özelliği girdiye bağlı olarak artırmasını, azaltmasını veya neredeyse sıfırlamasını sağlar; W₂ çıkış izdüşümü de sonucu model genişliğine geri eşler.
Kapılama fikri, Dauphin ve çalışma arkadaşlarının 2016'da kapılı evrişimli dil modellerinde kullandığı sigmoid kapılı GLU'dan gelir. Shazeer'in makalesinde aynı yapı farklı kapı işlevleriyle test edildi ve her varyant aktivasyonuna göre adlandırıldı: GLU sigmoid, ReGLU ReLU, GEGLU GELU, SwiGLU Swish kullanırken çift doğrusal katmanda hiç aktivasyon kullanılmaz. T5 kod tabanını izleyen bu katmanlarda önyargı terimleri kaldırılır.
SwiGLU, LLM'lerde ReLU ve GELU'nun Yerini Neden Aldı?#
Kapılı ileri beslemeli katmanlarda iki yerine üç ağırlık matrisi bulunur; bu nedenle Shazeer, parametre sayısını ve hesaplamayı eşit tutmak için gizli katman genişliğini 2/3 oranında küçülttü. T5-base modelinde birim sayısı 3.072'den 2.048'e indi. Eşit boyutta SwiGLU, 524.288 eğitim adımından sonra ayrılmış veride 1,636 log-şaşkınlık puanına ulaştı; ReLU 1,677, GELU ise 1,679 puan aldı. Ayrıca GLUE ve SuperGLUE dil anlama kıyaslama testlerinde daha yüksek ortalama puan elde etti. Makale bu kazanım için bir kuram sunmuyor; mimarilerin başarısını, "diğer her şey gibi, ilahi lütfa" bağlıyor.
Sonuç büyük modellere de taşındı. Google'ın PaLM modeli 2022'de SwiGLU'yu benimsedi; Meta'nın LLaMA modeli ise 2023'te ReLU'yu SwiGLU ile değiştirdi ve 2/3 × 4d genişliğinde, 256'nın katına yuvarlanmış bir gizli katman kullandı. Böylece 4.096 boyutlu 7B modelinde 11.008 gizli birim elde edildi. Llama 2, Llama 3, Mistral ve Qwen bu tasarımı korudu; Mixtral gibi uzman karışımı (MoE) modellerinde ise her uzman bir SwiGLU ileri beslemeli bloğudur.
SwiGLU'yu PyTorch'ta Uygulama#
Aşağıdaki PyTorch kod parçası, 512 boyutlu bir model için standart bir ReLU ileri beslemeli katman ve bir SwiGLU katmanı oluşturup boyutlarını karşılaştırır:
import torch
import torch.nn.functional as F
from torch import nn
d_model = 512
x = torch.randn(4, d_model) # four token vectors
# Standard transformer FFN: two matrices around a 4x wider ReLU hidden layer
relu_ffn = nn.Sequential(nn.Linear(d_model, 2048, bias=False), nn.ReLU(), nn.Linear(2048, d_model, bias=False))
# SwiGLU FFN: three matrices, hidden width cut to about 2/3 of 2048
w_gate = nn.Linear(d_model, 1365, bias=False)
w_value = nn.Linear(d_model, 1365, bias=False)
w_out = nn.Linear(1365, d_model, bias=False)
y = w_out(F.silu(w_gate(x)) * w_value(x)) # (SiLU(xW) * xV) W2
relu_params = sum(p.numel() for p in relu_ffn.parameters())
swiglu_params = sum(m.weight.numel() for m in (w_gate, w_value, w_out))
print(f"ReLU FFN: output {tuple(relu_ffn(x).shape)}, {relu_params:,} parameters")
print(f"SwiGLU FFN: output {tuple(y.shape)}, {swiglu_params:,} parameters")ReLU FFN: output (4, 512), 2,097,152 parameters ve SwiGLU FFN: output (4, 512), 2,096,640 parameters çıktısını yazdırır. 1.365 gizli birimle (2.048'in yaklaşık 2/3'ü), üç SwiGLU matrisi neredeyse iki ReLU matrisi kadar ağırlık içerir; dolayısıyla kalite farkı kapılamadan kaynaklanır. Pek çok uygulama kapı ve değer matrislerini tek izdüşümde birleştirip çıktısını ikiye böler; böylece iki küçük matris çarpımı yerine tek ve daha büyük bir matris çarpımı çalıştırır.
SwiGLU ve İlgili Terimler#
- SiLU (Swish): SiLU, kapının içinde kullanılan eleman bazlı işlevdir. SwiGLU ise üç izdüşümüyle birlikte kapılı katmanın tamamıdır.
- GLU ve GEGLU: Sigmoid veya GELU kapısı kullanan benzer varyantlardır. Shazeer'in testlerinde GEGLU, 1,633 log-şaşkınlık puanıyla SwiGLU'ya denk performans gösterdi; Google'ın Gemma modellerinde de GEGLU kullanılır.
- Dikkat: Dikkat de veriye bağlı ağırlıklar üretir, ancak belirteçler arasında bilgi karıştırır. SwiGLU ise her belirteç içindeki özellikleri bağımsız olarak kapılar.
- Görüntü modelleri: Kapılı ileri beslemeli katmanlar, görüntü ve çok kipli modellerde de bulunur. Tsinghua Üniversitesi araştırmacılarının geliştirdiği ve Ultralytics paketinde çalışan açık sözcük dağarcıklı algılayıcı YOLOE, sınıf istemlerinin metin gömmelerini artık bir
set_classes()çağrısında çalışan ve dışa aktarma sırasında kaldırılan kalıntılı bir SwiGLU bloğuyla iyileştirir; dolayısıyla kare başına ek maliyet getirmez.










