Stable Diffusion'un temelinde yatan diffusion süreciyle ilgili bir şeyler öğrenmek istiyorum. Prensip olarak, resim oluşturma süreci hangi matematiksel adımlardan geçiyor? Örneğin, gürültü ekleme/çıkarma döngüsü nasıl optimize edilir? Ayrıntılı açıklamanız mümkün mü?
Diffusion modellerinin arka plan mantığı nasıl?
👁️ 7 görüntüleme💬 3 cevap❤️ 0 beğeni
3 Cevap
Diffusion modellerinin çalışma prensibi, aslında termodinamikteki "diffusion" (yayılma) sürecinin matematiksel bir yansımasıdır. Temelde, modelin amacı —örneğin Stable Diffusion’da— başlangıçta saf gürültü olarak temsil edilen bir görüntüyü, adım adım "temizleyerek" hedef bir görüntüye dönüştürmektir. Bu süreç iki ana fazdan oluşur: **ileri diffusion (gürültü ekleme)** ve **ters diffusion (gürültü giderme)**. İleri fazda, model Gaussian gürültüyü resme kademeli olarak eklerken, ters fazda ise bir evrişimsel sinir ağı (genellikle U-Net tabanlı) bu gürültüyü tahmin ederek "tersine çevirir". Burada krititk nokta, modelin öğrenmesi gereken şey, gürültü ekleme sürecinin *tersine* bir koşullu olasılık dağılımı oluşturmasıdır.
Gürültü ekleme/çıkarma döngüsünün optimizasyonunda ise aslında **evrişimli ağlar (CNN’ler) ve dikkat mekanizmaları (attention)** devreye giriyor. Model, her adımda tahmin ettiği gürültüyü, önceki gürültülü halden çıkararak "daha temiz" bir versiyona ulaşmaya çalışır. Bu süreçte kayıp fonksiyonu olarak genellikle **ortalama karesel hata (MSE)** kullanılır, ancak bazı versiyonlarda gürültünün çeşitliliğini korumak için farklı stratejiler de uygulanır. Örneğin, **DDPM (Denoising Diffusion Probabilistic Models)** gibi modellerde, her adımın varyansı ayarlanarak hem görüntü kalitesi hem de çeşitlilik dengelenir. Optimizasyonun başarısı, modelin gürültüyü ne kadar doğru tahmin ettiğine ve sonuçta elde edilen görüntünün ne kadar gerçekçi olduğuna bağlıdır.
Farklı diffusion modellerinde (örneğin Stable Diffusion’da latent uzayda çalışması) ekstra bir katman daha var: gürültü ekleme/çıkarma süreci, düşük boyutlu bir latent temsil üzerinde gerçekleştirilir. Bu, hem hesaplama maliyetini düşürür hem de modelin görüntülerin yapısal özelliklerini daha iyi yakalamasını sağlar. Latent uzayda çalışmanın avantajı, sonuçta elde edilen görüntüyü yeniden inşaa ederken daha az hesaplama gücü gerektirmesi, ancak buna rağmen gürültü ekleme/çıkarma sürecinin temelde aynı prensiple ilerlediğini unutmamak gerekiyor. Kısacası, diffusion modellerinin sihri, basit olarak başlayan gürültüden karmaşık desenler ve detaylar oluşturabilme yeteneklerinde yatıyor.
Pff, ben dün gece diffuzionu açıklamaya çalışırken resim bozulumundan başka bir şey üretemedim 😅 Her seferinde "bu model neden kedi yerine patates püresi veriyor?" diye tartışıyordum ekip arkadaşımla. Ama dediğin gibi, o gürültüyü geri almak gerçekten bir sihirbazlık! Prototipimde loss function'un gradient'iyle neredeyse yataklarımı yaktım 🔥
Diffusion modelleriyle ilk kez çalışmaya başladığımda, her şey bana tamamen sihir gibi geldi. Bir gecede siyah bir resimden gerçekçi bir portre çıkarıyordu sistem. İlk kafa karıştırıcı nokta, "diffusion" teriminin kendisiydi — adından anlaşılacağı gibi, gürültüyü yayan değil, tersine gürültüyü yavaş yavaş ortadan kaldıran bir süreç aslında. Projenin ilk adımında, basit bir MNIST rakamına gürültü ekleyip geri çıkararak başlamıştım. Basit olmasına rağmen, her adımda tensörlerin nasıl giderek temizlendiğini görmek büyüleyiciydi.
Optimizasyon kısmındaysa en büyük farkı, atlama bağlantılarını (skip connections) ve öğrenme oranlarını doğru şekilde ayarladığında yarattı. Özellikle U-Net mimarisinde, tempere edilmiş gürültü seviyelerini ve "time embedding" kullanmak, modelin her safhada ne kadar gürültü kaldırması gerektiğini anlamasını kolaylaştırır. Benim deneyimimde, pyTorch’un diffusers kütüphanesiyle denemeler yapmak en hızlı yol oldu — hem kaynak koddan hem de pratik uygulamalardan çok şey öğrendiğime eminim.
Tartışmaya katılmak için giriş yap
Giriş Yap