GANs Nedir? Nasıl Çalışır?
GANs yapay sinir ağları sınıflandırma, tahmin etme ve problem çözme konularında son derece başarılı ve makine öğrenimi alanında son dönemlerdeki en heyecan verici gelişmelerden biri. Ian Goodfellow tarafından 2014 yılında geliştirildi. Son olarak Google ve Apple’da görev alan Ian, 28 yaşındayken bu teknolojiyi keşfetti ve makine öğrenimi dünyasında büyük bir yankı uyandırdı.
GANs(açılımı Generative Adversarial Networks) resimleri öğrenip neredeyse gerçekle farkı olmayan yeni resimler oluşturabilir. Bu yazıda GANs’i tanımaya ve yeni resim üretme algoritmasının çalışma şeklini inceleyeceğiz.
GANs’i oluşturan iki ana yapı var. Bunlar:
- Generator (Üretici)
- Discriminator (Ayırt Edici)
Generator ve discriminator sürekli birbiri ile bağlantı içerisinde çalışırlar. GANs’in yapısını ve çalışma şeklini basitçe şöyle açıklayabiliriz;
Generator bir resim üretir, discriminator ise generator’un ürettiği resmin gerçek mi yoksa sahte mi olduğunu belirler. Tabii elimizde önceden eğitilmiş bir yapı yok. Her ikisi de sıfırdan birlikte eğitilecek. Eğitim esnasında bu ikisi birbiri ile bağlantılı olacak. Discriminator’un elinde gerçek bir resim olacak, generator oluşturduğu resmi discriminator’e gönderecek. Discriminator, generator’un ürettiği resim ile kendi elinde ki resmi karşılaştırıp generator’e bir cevap dönecek. Bu cevaba göre generator kendini güncelleyip gelişecek. Döngü bu şekilde devam ettiği sürece, artık generator’un discriminator’ın elinde ki resime daha benzer resimler ürettiğini göreceğiz. Kısaca birlikte öğrenip birlikte gelişecekler.
Generator ve discriminator aslında birer yapay sinir ağı. Bildiğiniz gibi sinir ağları, aldığı veriyi öğrenebilen yapılar. Haliyle bizde generator’un gerçeğe yakın resimler üretmesini ve discriminator’un de üretilen resmin gerçek ve sahte resimleri ayırmasını istiyoruz.
Discriminator Eğitimi
Generative kısmında bulunan generator, model input olarak rastgele bir gürültü alıyor(rastgele sayılar diyebiliriz). Ardından output olarak bir resim veriyor.
Adversarial kısmında ise discriminator var. Generator tarafından üretilen resimleri discriminator’a vereceğiz. Tabi discriminator’dan beklentimiz gelen resmin doğruluğunu kontrol etmek. Peki ne ile karşılaştıracak? Bu yüzden de discriminator’a generator’un üretmesini istediğimiz asıl resimleri vermemiz gerekiyor. Böylelikle discriminator, generator’den gelen resimlerle kendisine verdiğimiz resimleri karşılaştıracak.
Şu an ilk adımda olduğumuzu düşünelim, haliyle generator’de discriminator’de eğitilmedi. Discriminator orjinal resimlere 0.1-0.9-0.2 gibi sayılar verecektir. Generator’den gelen resimlere de orjinallerine bakarak 0.8-0.3–0.5 değerlerini vermiş. Bunlar oldukça yüksek sayılar, biz resimlerde köpek olmadığını görebiliyoruz fakat discriminator daha önce köpek görmediği için generator’den gelen resimlerde köpek olduğunu söylüyor. Aslında bu noktada tamamen rastgele davranıyor.
Discriminator’ın 0 veya 1 değerini dönmesi gerekmektedir. 1 doğru resim, 0 ise yanlış resim anlamını taşıyor.
Sinir ağlarının ilk adımlarda hatalarını düzeltmesi için verdiği değerleri alıyoruz ve gerçekte bu değerlerin ne olması gerektiğini söylüyoruz.
Bu da demek oluyor ki gerçek köpek resimlerine Discriminator’un verdiği değerleri 1 olarak değiştiriyoruz. Generator’ün ürettiği resimlere verilen değerleri ise 0 olarak değiştiriyoruz.
Olması gereken %100 1 ya da 0 sonucu. Ama bu hiçbir zaman mümkün olmayacaktır. Yine de hatalarından öğrenip kendini geliştirebilir. Loss Fonksiyonu ile hatanın büyüklüğünü öğrendikten sonra bu hatanın giderilmesi için Back Propagation uyguluyoruz. Back Propagation sonrası networkdeki weightler güncelleniyor ve daha isabetli bir sinir ağı elde ediyoruz. Discriminator bu şekilde öğrenme işlemini gerçekleştiriyor. Artık sonraki karşılaştırmaları daha başarılı olacaktır.
Discriminator’ı eğittik, sıra geldi generator’un eğitimine.
Generator’un ürettiği resimleri alıyoruz ve eğitim için yeniden kullanıyoruz. Bu resimleri eğitilmiş olan discriminator’a tekrar gönderiyoruz. Generator’un öğrenme şekli sanki discriminator’u kandırmak da diyebiliriz. Böylelikle eğitilmiş discriminator köpekleri tanıdığı için vereceği output değerleri daha gerçekçi olacaktır. Ancak discriminator’ın verdiği değerler tam olarak 0 değil. Çünkü discriminator’ın da eğitilmesi zaman alacak. Şuan yalnızca tek bir batch üzerinde eğitildi. Neyin köpek olup neyin köpek olmadığını çok iyi bilmiyor. Bu yüzden ikisininde eğitimini sıfırdan başlatıyoruz.
Discriminator daha önceden eğitilmiş olsaydı ve bu resimleri çok iyi ayırabilseydi generator’un öğrenmesi için fırsat bırakmazdı. Daha ilk adımdan bu resimdekilerin köpek olmadığını söylerdi.
Eğitilmiş discriminator, eğitilmemiş generator’dan daha zeki olduğu için generator’un discriminator’ı kandırma şansı olmazdı. Bu yüzden sıfırdan birlikte eğitilmeleri lazım. Discriminator’dan çıkan outputları alıp yine gerçekte ne olması gerektiği ile karşılaştıracağız. Önceden bu resimleri 0 ile karşılaştırmıştık. Şimdi ise 1 ile karşılaştıracağız.
Generator’un Discriminator’ı kandırabilmesi için gerçek köpek resimlerine yakın resimler çıkması gerekiyor. 1 gerçek köpek resmini 0 ise sahte köpek resmini simgeliyordu. Sahte resimleri 1 ile karşılaştırıp Generator’un gerçek köpek resmine yaklaşmasını sağlayacağız. Yine bu noktada yaptığımız şey Loss hesaplamak. Loss Fonk. ile aldığımız hata oranına göre Generator’de Back Propagation uyguluyoruz. Bu sayede Generator’un weight değerleri güncelleniyor ve bir sonraki adım için daha gerçekçi resimler üretecek seviyeye geliyor. Bir Discriminator, Generator’a hatalarını göndermiş oldu diyebiliriz.
Kaynaklar:
https://machinelearningmastery.com/impressive-applications-of-generative-adversarial-networks/
http://papers.nips.cc/paper/2020-on-discriminative-vs-generative-classifiers-a-comparison-of-logistic-regression-and-naive-bayes.pdf
https://blog.aylien.com/modeling-documents-generative-adversarial-networks/
https://www.udemy.com/
https://medium.com/