5. LLM Architecture
LLM Mimarisi
Bu beşinci aşamanın amacı çok basit: Tam LLM mimarisini geliştirmek. Her şeyi bir araya getirin, tüm katmanları uygulayın ve metin oluşturmak veya metni ID'lere ve geriye dönüştürmek için tüm işlevleri oluşturun.
Bu mimari, hem eğitim hem de eğitimden sonra metin tahmini için kullanılacaktır.
LLM mimarisi örneği https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb:
Yüksek seviyeli bir temsil aşağıda gözlemlenebilir:
Girdi (Tokenize Edilmiş Metin): Süreç, sayısal temsillere dönüştürülen tokenize edilmiş metinle başlar.
Token Gömme ve Pozisyon Gömme Katmanı: Tokenize edilmiş metin, kelime sırasını anlamak için kritik olan bir dizideki token'ların konumunu yakalayan bir token gömme katmanından ve bir pozisyon gömme katmanından geçirilir.
Transformer Blokları: Model, her biri birden fazla katmana sahip 12 transformer bloğu içerir. Bu bloklar aşağıdaki diziyi tekrarlar:
Masked Multi-Head Attention: Modelin girdi metninin farklı kısımlarına aynı anda odaklanmasına olanak tanır.
Katman Normalizasyonu: Eğitimi stabilize etmek ve geliştirmek için bir normalizasyon adımı.
Feed Forward Katmanı: Dikkat katmanından gelen bilgileri işlemek ve bir sonraki token hakkında tahminler yapmakla sorumludur.
Dropout Katmanları: Bu katmanlar, eğitim sırasında birimlerin rastgele düşürülmesiyle aşırı uyumu önler.
Son Çıktı Katmanı: Model, 50,257 kelime dağarcığı boyutunu temsil eden 4x50,257 boyutunda bir tensör üretir. Bu tensördeki her bir satır, modelin dizideki bir sonraki kelimeyi tahmin etmek için kullandığı bir vektöre karşılık gelir.
Amaç: Amaç, bu gömmeleri alıp tekrar metne dönüştürmektir. Özellikle, çıktının son satırı, bu diyagramda "ileri" olarak temsil edilen bir sonraki kelimeyi oluşturmak için kullanılır.
Kod temsili
GELU Aktivasyon Fonksiyonu
Amaç ve İşlevsellik
GELU (Gaussian Error Linear Unit): Modelle doğrusal olmayanlık getiren bir aktivasyon fonksiyonu.
Düzgün Aktivasyon: Negatif girdileri sıfıra indiren ReLU'nun aksine, GELU negatif girdiler için küçük, sıfırdan farklı değerler alarak girdileri çıktılara düzgün bir şekilde eşler.
Matematiksel Tanım:
Bu fonksiyonun FeedForward katmanındaki doğrusal katmanlardan sonra kullanılmasının amacı, doğrusal verileri doğrusal olmayan hale getirerek modelin karmaşık, doğrusal olmayan ilişkileri öğrenmesine izin vermektir.
FeedForward Sinir Ağı
Matrislerin şekillerini daha iyi anlamak için yorum olarak şekiller eklenmiştir:
Amaç ve İşlevsellik
Pozisyon Bazlı FeedForward Ağı: Her pozisyona ayrı ve benzer şekilde iki katmanlı tam bağlı bir ağı uygular.
Katman Detayları:
İlk Lineer Katman: Boyutları
emb_dim
'den4 * emb_dim
'ye genişletir.GELU Aktivasyonu: Doğrusal olmayanlık uygular.
İkinci Lineer Katman: Boyutları tekrar
emb_dim
'ye düşürür.
Gördüğünüz gibi, Feed Forward ağı 3 katman kullanır. İlk katman, boyutları 4 ile çarpacak bir lineer katmandır ve bu, model içinde eğitilecek lineer ağırlıklar (parametreler) kullanır. Ardından, bu boyutların hepsinde daha zengin temsilleri yakalamak için doğrusal olmayan varyasyonlar uygulamak üzere GELU fonksiyonu kullanılır ve nihayetinde orijinal boyutlara geri dönmek için başka bir lineer katman kullanılır.
Çoklu Başlı Dikkat Mekanizması
Bu daha önceki bir bölümde açıklandı.
Amaç ve İşlevsellik
Çoklu Başlı Kendine Dikkat: Modelin bir token'ı kodlarken girdi dizisi içindeki farklı pozisyonlara odaklanmasına olanak tanır.
Ana Bileşenler:
Sorgular, Anahtarlar, Değerler: Dikkat puanlarını hesaplamak için kullanılan girdi lineer projeksiyonları.
Başlar: Paralel çalışan birden fazla dikkat mekanizması (
num_heads
), her biri azaltılmış bir boyutla (head_dim
).Dikkat Puanları: Sorgular ve anahtarların nokta çarpımı olarak hesaplanır, ölçeklenir ve maske uygulanır.
Maskeleme: Gelecek token'lara dikkat edilmesini önlemek için nedensel bir maske uygulanır (GPT gibi otoregresif modeller için önemlidir).
Dikkat Ağırlıkları: Maskelenmiş ve ölçeklenmiş dikkat puanlarının softmax'ı.
Bağlam Vektörü: Dikkat ağırlıklarına göre değerlerin ağırlıklı toplamı.
Çıktı Projeksiyonu: Tüm başların çıktısını birleştirmek için lineer katman.
Bu ağın amacı, aynı bağlamdaki token'lar arasındaki ilişkileri bulmaktır. Ayrıca, son ilişkilerin her başta bulunmasını sağlamak için token'lar farklı başlara ayrılır, böylece aşırı uyum önlenir.
Ayrıca, eğitim sırasında belirli bir token'a ilişkin ilişkileri incelerken daha sonraki token'ların dikkate alınmaması için bir nedensel maske uygulanır ve aşırı uyumu önlemek için bazı dropout uygulanır.
Katman Normalizasyon
Amaç ve İşlevsellik
Katman Normalizasyonu: Bir partideki her bireysel örnek için özellikler (gömme boyutları) boyunca girişleri normalleştirmek için kullanılan bir teknik.
Bileşenler:
eps
: Normalizasyon sırasında sıfıra bölmeyi önlemek için varyansa eklenen küçük bir sabit (1e-5
).scale
veshift
: Normalleştirilmiş çıktıyı ölçeklendirmek ve kaydırmak için modelin kullanabileceği öğrenilebilir parametreler (nn.Parameter
). Sırasıyla birler ve sıfırlar ile başlatılır.Normalizasyon Süreci:
Ortalama Hesaplama (
mean
): Gömme boyutu boyunca girişx
'in ortalamasını hesaplar (dim=-1
), yayılma için boyutu korur (keepdim=True
).Varyans Hesaplama (
var
): Gömme boyutu boyuncax
'in varyansını hesaplar, boyutu da korur.unbiased=False
parametresi, varyansın yanlı tahminci kullanılarak hesaplanmasını sağlar (örnek sayısıN
yerineN-1
ile bölünerek), bu da örnekler yerine özellikler üzerinde normalleştirme yaparken uygundur.Normalleştirme (
norm_x
):x
'ten ortalamayı çıkarır ve varyansın karekökü artıeps
ile böler.Ölçekleme ve Kaydırma: Normalleştirilmiş çıktıya öğrenilebilir
scale
veshift
parametrelerini uygular.
Amaç, aynı token'ın tüm boyutları boyunca 0 ortalama ve 1 varyans sağlamaktır. Bunun amacı, derin sinir ağlarının eğitimini stabilize etmek için iç değişken kaymasını azaltmaktır; bu, eğitim sırasında parametrelerin güncellenmesi nedeniyle ağ aktivasyonlarının dağılımındaki değişimi ifade eder.
Dönüştürücü Bloğu
Şekillerin matrislerin şekillerini daha iyi anlamak için yorum olarak eklendi:
Amaç ve İşlevsellik
Katmanların Bileşimi: Çok başlı dikkat, ileri besleme ağı, katman normalizasyonu ve artımlı bağlantıları birleştirir.
Katman Normalizasyonu: Dikkat ve ileri besleme katmanlarından önce uygulanır, böylece eğitim kararlılığı sağlanır.
Artımlı Bağlantılar (Kısa Yollar): Bir katmanın girişini çıkışına ekleyerek gradyan akışını iyileştirir ve derin ağların eğitimini mümkün kılar.
Dropout: Düzenleme için dikkat ve ileri besleme katmanlarından sonra uygulanır.
Adım Adım İşlevsellik
İlk Artımlı Yol (Kendi Dikkati):
Giriş (
shortcut
): Artımlı bağlantı için orijinal girişi kaydedin.Katman Normu (
norm1
): Girişi normalleştirin.Çok Başlı Dikkat (
att
): Kendi dikkatinizi uygulayın.Dropout (
drop_shortcut
): Düzenleme için dropout uygulayın.Artımlı Ekleme (
x + shortcut
): Orijinal girişle birleştirin.
İkinci Artımlı Yol (İleri Besleme):
Giriş (
shortcut
): Bir sonraki artımlı bağlantı için güncellenmiş girişi kaydedin.Katman Normu (
norm2
): Girişi normalleştirin.İleri Besleme Ağı (
ff
): İleri besleme dönüşümünü uygulayın.Dropout (
drop_shortcut
): Dropout uygulayın.Artımlı Ekleme (
x + shortcut
): İlk artımlı yoldan gelen girişle birleştirin.
Transformer bloğu tüm ağları bir araya getirir ve eğitim kararlılığını ve sonuçlarını iyileştirmek için bazı normalizasyon ve dropout uygulamaları yapar. Dropout'ların her ağın kullanımından sonra yapıldığını, normalizasyonun ise öncesinde uygulandığını not edin.
Ayrıca, bir ağın çıkışını girişi ile eklemeyi içeren kısa yolları da kullanır. Bu, başlangıç katmanlarının son katmanlar kadar "katkıda bulunmasını" sağlayarak kaybolan gradyan sorununu önlemeye yardımcı olur.
GPTModel
Şekillerin matrislerin şekillerini daha iyi anlamak için yorum olarak eklendi:
Amaç ve İşlevsellik
Gömme Katmanları:
Token Gömme (
tok_emb
): Token indekslerini gömülere dönüştürür. Hatırlatma olarak, bunlar kelime dağarcığındaki her tokenin her boyutuna verilen ağırlıklardır.Pozisyonel Gömme (
pos_emb
): Gömülere pozisyonel bilgi ekleyerek tokenlerin sırasını yakalar. Hatırlatma olarak, bunlar metindeki pozisyonuna göre tokenlere verilen ağırlıklardır.Dropout (
drop_emb
): Gömülere düzenleme uygulamak için kullanılır.Transformer Blokları (
trf_blocks
): Gömüleri işlemek içinn_layers
transformer bloğunun yığını.Son Normalizasyon (
final_norm
): Çıktı katmanından önce katman normalizasyonu.Çıktı Katmanı (
out_head
): Son gizli durumları kelime dağarcığı boyutuna projekte ederek tahmin için logitleri üretir.
Bu sınıfın amacı, bir dizideki bir sonraki tokeni tahmin etmek için diğer bahsedilen tüm ağları kullanmaktır; bu, metin üretimi gibi görevler için temeldir.
Ne kadar belirtilen kadar transformer bloğu kullanacağını ve her transformer bloğunun bir çoklu başlık dikkat ağı, bir ileri besleme ağı ve birkaç normalizasyon kullandığını not edin. Yani 12 transformer bloğu kullanılıyorsa, bunu 12 ile çarpın.
Ayrıca, çıktıdan önce bir normalizasyon katmanı eklenir ve sonuçları uygun boyutlarla almak için sonunda bir son lineer katman uygulanır. Her son vektörün kullanılan kelime dağarcığı boyutuna sahip olduğunu not edin. Bu, kelime dağarcığındaki her olası token için bir olasılık elde etmeye çalıştığı içindir.
Eğitilecek Parametre Sayısı
GPT yapısı tanımlandığında, eğitilecek parametre sayısını bulmak mümkündür:
Adım Adım Hesaplama
1. Gömme Katmanları: Token Gömme & Konum Gömme
Katman:
nn.Embedding(vocab_size, emb_dim)
Parametreler:
vocab_size * emb_dim
Katman:
nn.Embedding(context_length, emb_dim)
Parametreler:
context_length * emb_dim
Toplam Gömme Parametreleri
2. Transformer Blokları
12 transformer bloğu vardır, bu yüzden bir bloğun parametrelerini hesaplayacağız ve ardından 12 ile çarpacağız.
Her Transformer Bloğu için Parametreler
a. Çoklu Başlı Dikkat
Bileşenler:
Sorgu Lineer Katmanı (
W_query
):nn.Linear(emb_dim, emb_dim, bias=False)
Anahtar Lineer Katmanı (
W_key
):nn.Linear(emb_dim, emb_dim, bias=False)
Değer Lineer Katmanı (
W_value
):nn.Linear(emb_dim, emb_dim, bias=False)
Çıktı Projeksiyonu (
out_proj
):nn.Linear(emb_dim, emb_dim)
Hesaplamalar:
W_query
,W_key
,W_value
için her biri:
Üç böyle katman olduğu için:
Çıktı Projeksiyonu (
out_proj
):
Toplam Çoklu Başlı Dikkat Parametreleri:
b. İleri Besleme Ağı
Bileşenler:
İlk Lineer Katman:
nn.Linear(emb_dim, 4 * emb_dim)
İkinci Lineer Katman:
nn.Linear(4 * emb_dim, emb_dim)
Hesaplamalar:
İlk Lineer Katman:
İkinci Lineer Katman:
Toplam İleri Besleme Parametreleri:
c. Katman Normalizasyonları
Bileşenler:
Her blok için iki
LayerNorm
örneği.Her
LayerNorm
'un2 * emb_dim
parametresi vardır (ölçek ve kaydırma).Hesaplamalar:
d. Her Transformer Bloğu için Toplam Parametreler
Tüm Dönüştürücü Blokları için Toplam Parametreler
3. Son Katmanlar
a. Son Katman Normalizasyonu
Parametreler:
2 * emb_dim
(ölçek ve kaydırma)
b. Çıktı Projeksiyon Katmanı (out_head
)
Katman:
nn.Linear(emb_dim, vocab_size, bias=False)
Parametreler:
emb_dim * vocab_size
4. Tüm Parametreleri Özetleme
Metin Üret
Önceki gibi bir sonraki token'ı tahmin eden bir modele sahip olduğunuzda, çıktının son token değerlerini almak yeterlidir (çünkü bunlar tahmin edilen token'ın değerleri olacaktır), bu da sözlükteki her bir giriş için bir değer olacak ve ardından softmax
fonksiyonunu kullanarak boyutları 1'e toplam olan olasılıklara normalize etmek ve ardından en büyük girişin indeksini almak, bu da sözlükteki kelimenin indeksi olacaktır.
https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb adresinden kod:
Referanslar
Last updated