Bildiğiniz üzere yakın zamanda Rap şarkısı yazabilen yapay zeka projemi tanıtmıştım. http://autorhyme.xyz adresine girerek,
isterseniz Google Play Store üzerinden de Autorhyme ‘ın uygulamasını edinerek hemen yapay zekaya rap şarkılar yazdırabilirsiniz : )
Google Play Store’dan indirmek için tıklayın
Şimdi gelelim asıl konumuza. Ben bu yazıyı uygulamayı tanıtma amacıyla yazmadım. Aksine, Twitter’ da Autorhyme ‘ın çalışma prensibi hakkında kapsamlı bir yazıyı kaleme almadan duramam demiştim : )
Nihayet bu yazımda A-dan Z-ye tüm detaylarıyla Autorhyme ‘ın yapım sürecini ve çalışma prensibini birlikte inceleyeceğiz.
Bu sitenin teknik blog olmasını kesinlikle istemediğimden ve özellikle yazılım geliştirici olsun veya olmasın herkesin anlayabilmesi için bu yazımda kod paylaşmaktan çok mantık üzerine yoğunlaşacağım.
Mantığı bilindikten sonra zaten her yapay zeka uygulaması programlanabilecek düzeydedir. Sonuçta artık Keras, Tensorflow gibi dostlarımız var. Eskine nazaran her şey çok daha kolay.
Fakat geri kalan bazı noktalarda kod paylaşmam gerekebilir.
O zaman başlayalım;
İlk Adım : Veri Toplamak
Bildiğiniz üzere standart yapay zeka uygulamalarının tamamında iki önemli faktör var. Model ve Dataset.
Model, projede kullanacağımız nöron ağımızın kaç layer ve kaç düğümden oluşacağı vs. bilgileri içeren yapıdır. Öğrenici model, Tensorflow’ un basit parametreleriyle kolayca modifiye edilebilirken dataset işin en çetrefilli kısmını oluşturur.
İnternetten rap sözlerini el ile toplamak elbette akıl kârı bir iş değildir. Bu iş için hedef olarak belirlediğimiz web sitesine bağlanıp verileri otomatik olarak istifleyececek bir programcık yazacağız.
Bu işlevde çalışan yazılımlara Crawler denilir. Ekstra bilgi olarak da, Crawler’ ın daha gelişmiş ve dağıtık sistem üzerine kurulmuş olanlarına da Spider denilir.
Biz Crawler’ ımızı yazmak için python ve kütüphane olarak da Beautiful Soup kullanacağız.
     mc_linkler= []
     mc_isimler = [] 
     sayfa = requests.get('https://www.test.aksoylu.space/autorhyme/?harf=C'
+ harfler[i])

     soup = BeautifulSoup(sayfa.text, 'html.parser')
# adı C ile başlayan sanatçıların olduğu sayfaya bağlan
     sarkilar = soup.find(class_='listing wide icon')

# ilgili div etiketinin içindeki <a> taglarının seçilmesi

for linkler in sarkilar.find_all('a'):
      mc_link = linkler['href']
      mc_isim = linkler.get_text()
      mc_linkler.append(mc_link)
      mc_isimler.append(mc_isim)
# mc_isim ve mc_link arrayleri, isimler ve linklerle dolar
Yukarıdaki kod bloğunda kısaca crawler temelini görebilirsiniz.
Telif hakları ihlali olmaması için verileri çektiğim siteyi paylaşamam. Keza şarkı sözlerinden oluşan datasetleri de paylaşamam. Ancak örnek olarak bu gün itibari ile (24.10.2019) yazılmış olan tüm Türkçe rap şarkıların isimlerini ve Rap sanatçıların isimlerini bir telif hakkı ihlali oluşturmayacağını düşündüğümden dataset olarak sizinle paylaşacağım.
Bu yazının yayınlandığı tarihte;
571 Türkçe Rap Sanatçısı Mevcut. Dataset:
Rap_sanatcilari_isimleri.txtİndir
8510 Türkçe Rap Şarkısı Mevcut. Dataset:
Rap_sarkilari_isimleri.txtİndir
Böylece bu datasetleri kullanarak siz de rap şarkısı adı yazan veya gürültü eklemeyi başarırsanız rapçi nicki üreten bir AI yazabilirsiniz.
Sıradaki Adım: Verileri Optimize Etmek
Burada Autorhyme ‘ın dataseti optimizasyonuna ek olarak, ufak bir noktaya da parmak basmak istiyorum.
Örneğin kedi ve köpek fotoğraflarını ayırt edebilen bir AI uygulaması geliştirilirken sadece kedi ve köpek fotoğraflarını olduğu gibi nöron ağına girdi olarak vermek çok mantıklı bir iş değildir. Çünkü model overfitting olabilir (Ezberci davranabilir), öğrenmede fazlasıyla başarısız olabilir (underfitting) veya gereksiz detaylara takılabilir.
Örneğin köpek resimlerinin çoğu kaldırımda ve kedi resimlerinin çoğu da yeşil alanda ise yeşil alandaki bir köpeği kedi zannedebilir. Optimizasyonun öğrenmeyi hızlandırmak gibi bir ana konusu vardır fakat yalnızca öğrenmeyi hızlandırmak için yapılmaz.
Benzeri bir durum, gereksiz detaylar veya gereksiz sinapsin fazla ağırlıklı olması sebebiyle gördüğü muffin fotoğraflarını da köpek fotoğrafı olarak sınıflandırmış. Denetimli öğrenme ile bir çok muffin fotoğrafının ağa öğretilmesi veya düğüm seyreltme çözüm olabilir
Örneğin yukarıdaki kedi köpek senaryosunda görsellerde bazı renkleri maskelemek, renk filtrelerinden geçirmek gibi bazı görüntü işleme işlemleri uygulamak ve ardından görselden çıkarılan matematiksel sonuçları doğrudan nöron ağına girdi olarak sağlamak hem öğrenme başarısını katbekat arttıracak hem de öğrenme hızını arşa çıkaracaktır.
Verinin ne olduğuna bağlı olarak elbette veriyi optimize etme tekniği de değişiklik gösterir. Autorhyme ‘da bizim işimiz metinlerle olduğundan burada düzenli ifadeler ve doğal dil işleme (Natural Language Processing) kullanacağız.
Doğal Dil İşleme veya NLP, sözel metinler üzerinde yapılan yapay zeka çalışmalarının genel adıdır.
Metin verisini optimize etmek söz konusu olduğunda öncelikle koşulsuz şartsız yapılması gereken ilk şey crawlerımızın bize verdiği dataset’ den <br>, <span> gibi html ibareleri ve url leri temizlemek olacaktır.
Doğrudan find and replace kullanarak zaten bu html etiketlerini kaldırabiliriz.
Sırada linkleri kaldırmak var.
Python kullanıyorum ve linkleri kaldırmak için ufak bir regex (düzenli ifade) deseni yeterli olacaktır.
TAG_RE_href = re.compile('(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})')
dataset = TAG_RE_href.sub('', dataset)
print(dataset)
yukarıdaki kod , dataset içerisindeki tüm url leri kaldıracaktır.
Crawler her ne kadar sadece ilgili divin içindekileri çekse bile yine de bazı metin dışı tekrarlı olmayan yapılarla karşılaşabiliyoruz. Örneğin şarkı sözleri arasında bir reklam alanı varsa ve <script> etiketleri arasına alınmışsa
scrpt.compile(r'<[script]+>.*?<[/script]+>')
TAG_RE_SCRIPT =  re.compile(r'<[^<]+?>')
kalıbı kullanılarak bu reklam alanları topluca temizlenebilir.
Buraya kadar yaptığımız basit operasyon html’den sade text elde etmek içindi. Şimdi denemek için Şehinşah’ ın şarkılarından oluşan veri setini olduğu gibi öğrenime sokabiliriz.
Autorhyme ‘da İlk deneme sonucu hüsran. Merak etmeyin, eğitim sürecini de detaylıca işleyeceğiz
Öğrenmenin Temelini Atalım
Elde ettiğimiz sarkastik sonuç gayet doğal. Çünkü sistem öğrenirken Şehinşah’ın yazdığı şarkıda kahkahadan ibaret satırlarını gördü ve aynen şöyle düşündü: “Şeyn hahahahahahahaha diye söz yazmış. Ben yazınca neden olmasın ki”
Bu durumu anlayalım;
Kendisine Ceza’nın şarkılarından başka hiçbir şey öğretilmeyen nöron ağına kurduğu bu mantık için kızamayız. Zira kendi çapında en mantıklı olanı yaptı. Nöron ağlarını bilmeyen birisine bu durumu anlatmak için sanırım elektrik devreleri en doğru örnek olacaktır.
Kısa Devrenin Sembolik Gösterimi
Yukarıdaki elektrik devresinde tabii ki kısa devre durumu söz konusudur. Lise fiziğinden hatırlayacağınız üzere elektrik her zaman en zahmetsiz (en az dirençli) yolu seçer. Elektrik fiziğinde yaygın olan bu davranış, elektrik ile çalışan sinir ağlarında da yaygındır. Öğrenme davranışı gerçekleşirken en fazla ağırlık gösteren nöron bağlantısı kurulması (sinaps), her daim yakınlık gösterilen davranıştır. Keza yapay sinir ağları da nöron hücrelerinin davranışlarını taklit ettiğinden bizim modelimiz de aynı davranışı gösterdi. Bu yüzden sadece didi didi kelimelerini arka arkaya yazmak daha kolay geldiğinden (Öğrenmesi daha kolay zira daha az sinaps ile bu kabiliyet kazanılabiliyor), onu gerçek amacı zannetti ve bize de bunu verdi.
İşte bu durumu engellemek için Autorhyme dataseti olabilecek metin yığınına altın kurallar getiriyoruz:
İnsan dilinde olmayan her türlü ifade , emoji, html etiket vs. datasetden çıkarılmalıdır
Satır içerisinde ve hece düzeyinde tekrarlı ifadeler olamaz Örnek : “didi didi didi didi” veya “sen ve ben sen ve ben sen ve ben” dizeleri datasetden çıkarılmalıdır.
Aynı satır ard arda defalarca tekrarlanmamalıdır. Örnek : “alev alev yansın” dizesi Şehinşah’ ın bir şarkısında arka arkaya 7-8 defa tekrarlanmaktadır. Aynı dizeden arka arkaya çok defa varsa yalnızca bir tanesi kalacak şekilde diğerleri silinmelidir. Not: araya farklı satırlar girdikçe “alev alev yansın” dizesi istediği kadar tekrarlanabilir. Burada asıl dikkat edilmesi gereken modelin overfitting olmaması için alışacak tekrarlı yapı bulamaması gerektiğidir. (Ekstra not : Ceza’nın veri seti eğitilirken bu adım unutulmuş ve didi didi didi didi den ibaret bir çıktı alınınca afallanıp, bu kural uygulanıp tekrar ağ eğitilince istenilen sonuç alınmıştır 🙂 )
Verse, ft, bölüm gibi ifadelerle başlayan ve şarkı sözü olmayan satırlar datasetden ayıklanmalıdır.
Ceza’nın bazı şarkıları yarı Almanca yarı Türkçedir. bu durum modelimizin yürüttüğü doğal dil işleme tekniğini afallatabilir ve öğrenememe (underfitting) durumu olmasına sebep olabilir. Bunun için Almanca yazılan dizeler datasetden çıkarılmalıdır. Bu durum tam başarısızlık yaratmasa bile anlamlılaşan model bağlantılarını bir miktar da olsa anlamsızlaştıracaktır.
Sanatçılar beraber şarkı yapabilir. Örneğin Ceza’nın şarkısında Sagopa’nın verse’ü olabilir. Bu durumda AI, öğrenme sürecinde Ceza sözleri arasında bağlantı kurarken araya giren Sagopa sözünün etkisiyle anlamlı nöron bağlantısını kaybetmesine ve öğrenmenin yozlaşmasına sebep olabilir. Bu nedenle bir model bir sanatçı için eğitilirken diğer sanatçıların kısımları silinmelidir.
Büyük ve küçük harfler arasında bağlantı kurulması, bizim gözümüzle yakalayamadığımız gereksiz bir detayın eğitimde ana faktörü oluşturmasına sebep olabilir. Bu nedenle tüm dataseti küçük karaktere dönüştürmek daha mantıklı bir çözüm olacaktır
Verse satırlarını temizlemek üzerine örnek
Sagopa Verse :
Killa Hakan Verse:
...
---KOD---
TAG_RE_verse = re.compile(r'^verse.*\n?(?!:)')
Verilerimizi tüm bu kurallara göre temizledik.Bunlara ek olarak AI ile uğraşan kişilerin aklına mutlaka veri setini genişletme fikri gelmiştir. Bu konudaki deneylerimi de sizinle paylaşmak istiyorum
Sentetik Veri Üretme: Tecrübe ettiğim kadarıyla insansı olmayan noise dizeleri, modelin doğrudan underfitting olmasına sebebiyet veriyor. Model underfit olmasa bile en azından başarılı sonuçlardan ayrıklaşıyor. Daha anlamlı sonuçlar elde etmek için diğer rapçilerin dizelerini noise olarak veri setine dahil etmek de mantıklı olabilir ancak ben bunun için çok daha farklı bir yol düşündüm. Yazının sonunu bekleyin 🙂
Alakasız veri ekleme : Yapılmamasına kesinlikle emin olduğum hamle bu. Kullandığımız neural network modeli (yazının devamında daha detaylı işlenecek) random negative enjeksiyonunda pozitif sonuç vermiyor.
Gürültü ekleme: Alakasız veri olarak değil de (girdilere değil) gizli katmanlarda kısmen ve ağırlıklarda çoğunlukla gürültü eklemek gözlemlediğim kadarıyla biraz daha başarılı sonuç sağlıyor
Düğüm Seyreltme : Aklınızdan bile geçirmeyin.
Artık tüm şartları datasetimizde sağladığımıza göre modelimizi oluşturmaya başlayabiliriz.
Sinir Ağının Temelini Anlayalım
Evet, şarkı sözü yazabilmek için ihtiyaçlarımızı karşılayan bir nöron ağı tekniği mevcut;
Long Short Term Memory Recurrent Neural Networks
Bu ağ türünde (Uzun-Kısa süreli bellek) her bir düğümün bir belleği vardır. Bilgilerin kendi içinde tutulmasını ve bir sonraki düğüme aktarılmasına izin verir. Her bir düğüme LSTM(Long short term memory) denir. Tıpkı canlı nöron hücrelerinin de kendine has belleği olduğu gibi sanal nöronların da bu özelliğe sahip olması LSTMR sinir ağlarını derin öğrenme hususunda gerçekçi ve çok başarılı kılmaktadır. Zira klasik makina öğrenmesi algoritmaları gibi yalnızca o anda aldığı input ile çalışmaz. Bir adım önce çıktı olarak verdiği outputu da input olarak tekrar alır ve işler. Yani hem bir adım gerideki outputu hem de bulunduğu adımda kendisine verilen inputu işleyebilir.
Bu ağ türü bir RNN (yinelemeli öğrenme çeşididir) ve çalışma prensibi olarak çok etkileyicidir. Her bir nöronun sahip olduğu bellek, aslında her bir nöronun bir de hafıza düğümü varmış gibi davranmasına sebep olur. Normal yapay sinir ağlarında ağırlık-bias değerleri varken bazı durumlarda LSTM ağlarda hafıza düğümünün de bir ağırlık değeri olabilir. Tabii böyle bir durum her zaman yoktur ancak random aralıklarla eski değerlerin hatırlanarak yeni girdilerin işlenmesinde kat sayı olarak kullanılması gibi bir durum vardır.
Tekrarlayan (Geri beslemeli) sinir ağı ile tek yönlü sinir ağının farkı.
LSTMR Sinir Ağları, Tekrarlayan Sinir Ağlarına ek olarak düğüm belleği içerir.
Bir öğrenme klişesi olarak şu duruma benzetiriz; bir şeyi çok iyi öğrenmenin yolu çok defa tekrar etmektir.
Aslında tüm yapay sinir ağları bu temel üzerine çalışsa bile burada çok yönlü bir durum vardır. Öyle ki sinir ağı yalnızca tek bir amacı öğrenmez. Tüm ağ birbirini öğrenir gibi tuhaf bir sonuca varabiliriz.
Daha da ileri gidersek, kelimelerin anlamının birbiri üzerinden öğrenilmesinden bahsedebiliriz.
Tolstoy’un tüm romanlarını sinir ağımıza dataset olarak sağladığımızı düşünelim. Bir satırda
” Çimenler benzersiz bir yeşil renge sahipti”
ve başka bir satırda
” Yeşil mutluluk veriyordu ”
geçebilir. Çimen ile yeşil, yeşil ile mutluluk arasında bağlantıyı takip ederek doğrudan çimenin ile mutluluk arasındaki bağlantıyı kurabilir ve ikisini bir satırda kullanabilir.
Lingustik işlemlerle kafiye tutturmanın yanı sıra anlam bütünlüğü de bu şekilde sağlanır. Elbette bu, veri çokluğu sağlandıkça hissedilebilir düzeyde başarılı olacaktır.
Yine kelimelerin birbiri üzerinden anlaşılmasının bir örneği olarak şunu verebiliriz;
“Ağacın büyüleyici yaprakları vardı”
“Ağaç toprağa kökleriyle sımsıkı sarılmıştı”
“Yapraklar, gök yüzünün yeşil süsüydü”
Bu durumda siz iyi eğitilmiş ağınıza ağaç nedir diye sorarsanız size
“kökleri ile toprağa tututan ve gök yüzünde yeşil yaprakları olan “
cevabını verebilir.
Bunu hiç ağaç görmemesine rağmen diğer tanımları kullanarak yapar. Diğer tanımları da başka tanımları kullanarak. Aslında tüm tanımların örümcek ağı gibi birbirini oluşturmada kullanıldığını görebilirsiniz. Tekrarlı Sinir Ağları’nın gelişmiş türleri bize bu teknolojiyi sunabiliyor.
İşte Chatbotlar da bu prensip ile çalışır. Bu nedenle de insanlarla konuştukça daha gerçekçi cevaplar vermeye başlarlar. Çünkü datasetlerini sürekli beslerler.
Biliyorum, teorisini çok konuştuk. Şimdi biraz teknik tarafa geçelim;
Ağı Eğitmek
İlk olarak bahsettiğimiz sinir ağı için input ve target oluşturmamız gerekiyor. Bunun için NLP’de python’a has sözlük(dictionary) olarak tabir ettiğimiz yapılar kullanılır. Bu sözlüklerde her bir karakterin int ve her bir intin karakter olarak değeri tutulur.
Veri seti;
toplam harf sayısı (söz olarak verdiğimiz datasetin toplam karakter sayısı. Whitespace dahil, satır atlama dahil değil)
Benzersiz karakter sayısı
Sequeance büyüklüğü (Tercihen 100)
değişkenleri kullanılarak dictionary haline getirilir. Dictionary referans alınarak da verilerden sinir ağımız için input ve target oluşturulur.
Yazar Notu : Kodun model oluşturma, eğitim vs. ile ilgili bir çok bölümünü paylaşsam da tamamını paylaşmanın doğru olduğunu düşünmüyorum. Burası dahil birkaç bölümün araştırarak yapılmasından yanayım.
Kodlamaya Başlıyoruz
Not: Modeli oluşturmada ben LSTM kullanacağım. Zira grafik kartım Radeon RX 5700 . Nvidia’nın Cuda sürücüsü AMD CPU larda çalışmıyor malum. Aslında Tensorflowun tüm işlemlerini AMD CPU larda yaptırmanın basit bir yolu var ancak ben bu yazıda suyu bulandırmak istemiyorum. Zaten herkes araştırarak bunun çözümünü bulabilir. Eğer Nvidia grafik kartınız var ise LSTM değil CuDNNLSTM’i kullanmanızı tavsiye ederim. Eğitim hızında 20 kata varacak bir fark oluşuyor.
# Tensorflow ile model nesnesini oluşturalım.
ai_model = Sequential()


# Modele LSTM parametreleri verilim
model.add(LSTM(512, input_shape =(a.shape[1], a.shape[2]), return_sequences = True,name='input'))
# a.shape 'i açıklayalım ; input dizisinden reshape işlemi ile LSTM RNN' de
# işlenecek biçimde düzenlediğimiz datayı train_test_split fonksiyonu ile 
# ayırıyoruz


#Yığın normalleştirmeyi modele tanımlayalım
ai_model.add(BatchNormalization(name='BatchNorm'))
# Yığın normalleştirme, yapay sinir ağlarının hızını, performansını ve # dengesini arttırmak için tavsiye edilen bir matematiksel işlemdir.


ai_model.add(LSTM(512, return_sequences=True, name='LSTM'))


# Burada Flatten'ın işlevini basitçe açıklayalım
# flatten işleminden önce;
# ai_model.output_shape == (None, 64, 32, 32)
ai_model.add(Flatten(name='Flatten'))
# flatten işleminden sonra 
# model.output_shape == (None, 65536)
# kısaca matrisi uç uca ekleyerek düzleştirir.


# Ekleyeceğimiz katman Keras’ın Dense layer tipinde
ai_model.add(Dense(b.shape[1],name='FullyConnected'))


# Aktivasyon  fonksiyonu olarak softmax'i seçelim
ai_model.add(Activation('softmax',name='output'))


# Optimizer parametrelerini verelim
adam=optimizers.Adam(lr=0.00008, beta_1=0.9, beta_2=0.999, epsilon=None, decay=1e-6, amsgrad=False)
# learning_rate ile oynamanızı tavsiye etmem. Bayağı bir deneme yanılma ile # denk getirdiğim en iyi lr idi.


# modeli derleyelim. Artık modelimiz eğitime hazır
ai_model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics=['accuracy'])


#model özetini yazdıralım
ai_model.summary()
Modeli eğitmek için model’den türettiğimiz ai_model nesnesinin fit fonksiyonunu kullanacağız.
egitim = ai_model.fit(X_train,  y_train,
                    epochs = 1200,
                    batch_size = 1024,
                    callbacks= callbacks_list,
                    verbose = 1,
                    validation_data = (Alpha, Beta),
                    initial_epoch = 0)
Oluşturduğumuz modeli eğitmek için 1200 epoch’u uygun gördüm. Batch büyüklüğü olarak da 1024’ü seçiyorum
Not: Öğrenme esnasında Train Loss değeri yüksek seyrediyor ve 2’nin altına düşmüyorsa muhtemelen modelinizde yanlış giden bir şeyler vardır. Boşuna beklemeyin. Verileri ayıklayarak öğrenmeyi tekrar başlatın.
Not 2: Bu durumlar için tensorflow’un otomatik earlystopping eventi vardır. Bu yapı, “Patience değişkeni, n adet başarısız epoch eğitimi sonrasında öğrenmeyi sonlandırsın” şeklinde çalışır. (patience = n)
estop =EarlyStopping(monitor='val_loss', 
                              min_delta=0, 
                              patience=15, 
                              verbose=1,
                              mode='auto', 
                              baseline=None, 
                              )
Not 3: Verileri optimize etmenize ayıklamanıza rağmen hala aynı problem ile karşılaşıyorsanız parametreler ile oynayın. Her parametre her datasetine uyacak diye bir şey yoktur. Hatta belki ben de parametrelerle oynasaydım daha iyi çalışan bir autorhyme mümkün olabilirdi. Ama malum işlemler çok uzun sürüyor 🙂
Modelimizin başarılı bir eğitim süreci geçirdiği var sayarak devam ediyoruz.
Veri setinin eğitilmesiyle elde ettiğimiz model ağırlıkları dosyası, hdf5 formatındadır. Biz de Tensorflow’ un dahili fonksiyonlarını kullanarak tekrar modeli belleğe yükleyebiliriz.
agirliklar = 'trained_with_sehinsah.hdf5' 
model_ai.load_weights(agirliklar)
model_ai.compile(loss = 'categorical_crossentropy', optimizer = adam)
trained_model.mdf5 dosyamızı model_ai adındaki AI modelimize yükledik. Şimdi de şu parametreleri modele ekliyoruz
optimizer= ‘adam’
loss= ‘categorical_crossentropy’
Şimdi sıra geldi eğitilmiş modele kod yazdırmaya.
Modelin şarkı sözü yazması için rastgele bir şarkı bölümü seçeceğiz, ardından eğitilmiş modelimiz bu şarkı bölümünü referans noktası kabul ederek karakterler üretip şarkı yazmaya çalışacak.
Her bir harf, birbirinden farklı olarak üretilecek fakat düğümlerde LST Memory olduğundan bir önceki ağ aktivitesinde üretilmiş olan harf de bir sonraki harfin üretilmesinde input olarak kullanılmaktadır. Yani t anındaki output, t+1 anında üretilecek yeni output için input kaynağı olmaktadır.
Böylelikle tüm karakterler bir önceki karakter ile bağlantılı olacaktır. Böylece eğitimin başarısına bağlı olarak yapay zekamız Anlamlı ve kafiyeli sözler yazabilecektir.
Burada değişken olarak belirleyeceğiniz yazılacak şarkının karakter sayısı (uzunluğu) kadar bir for döngüsü dönecektir. Döngünün içinde model.predict fonksiyonu ile elde ettiğimiz pretiction değerlerinden en büyüğü; aslında modelimizin mevcut adımda uygun gördüğü bir sonraki karakterin sayısal değeridir.
Neyse ki değeri karaktere çevirmek için bir sözlük yapmıştık değil mi 🙂 Modelden aldığımız int’in karakter değerini çekip yazdırarak bir söz flowu oluşturabiliriz anlamına geliyor bu.
Artık rap şarkı sözleri yazabilen bir yapay zekamız KISMEN var.
ÇOK önemli bir nokta !
Yani üretilecek şarkının 5. karakteri 4.karaktere, 4.karakteri 3.karaktere bağlı. Demek ki böyle böyle şarkı yazdırabiliyoruz. Peki ya ilk karakter ?
İşte, ilk adımda şarkının neye uygun yazılacağımını bilmediğimizden ötürü rastgele bir şarkı bölümü seçtiriyoruz. 0.karakter, rastgele seçilen şarkı öbeğine göre yazdırılıyor.
Peki, kafa açan bir Autorhyme fikri ekleyelim. İlk şarkı öbeğini vermek yerine biz bir şeyler yazsak nasıl olur ?
Eh, biraz saçmalayabilir ama yine de güzel olur.
Doğrudan yazdığımızı değil de yazdığımızın dataset deki en benzeri olması da, modelimizin çok daha başarılı yazmasını sağlayacaktır. Ancak modelinize güveniyorsanız seçilecek öbek datasetden olmasa da olur.
Biz yine de bir tık ileri taşıyalım; sizin yazdığınız sözleri, dataset’de herhangi bir şarkı öbeği ile benzerlik oranına göre taratalım. En çok benzeyeninin bulunup şarkının o öbeğe göre yazdırılması, çok daha başarılı olarak istediğiniz konuda şarkı yazılmasını sağlayabilir.
Biraz daha kafa açalım.
Başka bir sinir ağını,
şarkı adı <-> şarkı öbeği
bağlantılı olacak şekilde eğitebilirsiniz. Bu durumda yapay zeka size yazdığınız şarkı adı ile alakalı bir şarkı bölümü verir. Bu şarkı bölümü ile siz de elinizdeki dataset’e en çok benzeyen bölümü tespit edersiniz ve o bölümü kullanarak şarkı sözü yazdırabilirsiniz.Bu ise doğrudan başlıktan şarkı yazdırmanın etkili bir yolu olacaktır.
Peki, yapay zekamız farklı sanatçıların tarzlarında nasıl yazabilir ?
Buraya kadar dayandıysanız, şimdiye kadar anlamış olmanız lazım. Çok inovatif olmasa da çözümümüz malum.
Ceza için ayrı dictionary, model, dataset,parametreler
Sagopa için ayrı dictionary,model,dataset,parametreler.
Yani aslında sagopadan sample almak (sagopa usülü söz yazdırmak) istediğimizde ayrı bir python betiği, cezadan almak istediğimizde ayrı bir python betiği ve dosyalar kullanıyoruz. İki sistemin birbiri ile bir bağlantısı yok.
Ama yukarıda kafa açan bir fikir vermiştim;
Peki, kafa açan bir Autorhyme fikri ekleyelim. İlk şarkı öbeğini vermek yerine biz bir şeyler yazsak nasıl olur ?
Ceza’yı öğrenen modele söz yazdırıp parçayı yukarıda anlattığım yöntem ile o parçayı sagopa modeline verirsek. Sonra da sagopa modeline verdiğimiz parçayı ceza modeline verirsek böyle böyle feat atmalarını (rap kültürüne hakim olmayanlar için açıklama, bkz: düet yapmak) bile sağlayabiliriz 🙂
Daha da güçlenmeli : Çekişmeli Üretici Ağlar (GAN) ve diğer teknikler
Şimdi sıra geldi ağımızı çok daha güçlü kılacak bir adımdan bahsetmeye. Bu yazıyı yayınladığım tarihte, Autorhyme ‘da çekişmeli bir ağ modeli mevcut değil.
O zaman ana fikri konuşalım. Nasıl bir operasyon Autorhyme ‘ı daha akıllı hale getirebilir ?
Klasik GAN (Generative Adversarial Networks) ya da türkçesiyle ÇÜA (Çekişmeli Üretici Ağ) ‘ın çalışma prensibini özetleyen şema. Derin öğrenme, görseller üzerinden başladığı için burada da “Images” üzerinden bir anlatım mevcut. Fakat datalar neden rap şarkısı olamasın ki ?
Çekişmeli ağ fikri aslında Autoryhme ‘ın yazdığı sözleri daha anlamlı, kafiyeli ve kurallı hale getirmek için bire bir görünüyor.
GAN fikrinde bir üretici ve bir de ayrıştırıcı olmak üzere iki ayrı yapay sinir ağı var. Autorhyme ‘ın şimdiye kadar konuştuğumuz kısmı şemadaki Generator Network kısmını oluşturuyor.
Generator Network yani üretici ağ, kendisine verilen gürültü vektörünü yani rastgele verileri alıp işleyerek o verilere göre bir çıktı üretiyor. Örneğin Autorhyme ‘ın bir şarkı öbeğini referans alıp yeni şarkı yazması da üretici ağ türüne güzel bir örnek.
Fakat sadece üretici ağ var ise şarkı yazılıyor ve bırakılıyor. Ayrıştırıcı (Discriminator) ağ ise üretilen verinin gerçek olup olmadığını anlamaya çalışıyor. Ayrıştırıcı ağ, eğer üretici ağ tarafından üretilen verinin gerçek olmadığını anlarsa, bunu üretici ağa iletiyor. Dolayısı ile üretici ağın her bir yeni adımda daha gerçekçi veriler üretmesi mümkün olabiliyor. Bu durum çoğunlukla iki ayrı yarışmacının yarışması ve yarıştıkça hem kendilerini hem rakiplerini geliştirerek daha da iddialı olmalarına benzetilebilir.
GAN, makine öğrenmesinde son zamanlarda duyabileceğiniz en efektif ve zekice fikir. Fakat Autorhyme konusunda bana farklı bir ilham verdi.
Bildiğimiz üzere fotoğraflarda olduğu gibi rap şarkıları hususunda veri bakımından pek zenginliğimiz yok. Yani gerçek ile sahte veriyi kıyaslayabilmesi için ayrıştırıcı ağa pek gerçek veri sağlayamayabiliriz. Bu nedenle madem çift ağ kullanmayı düşünüyoruz,
Neden bir de düzeltici ağ olmasın ?
Bu fikire göre aşağıdaki şemadan da anlayabileceğiniz üzere düzeltici bir ağ olacak. Rap şarkıları Autorhyme sunucusu tarafından kullanıcılara gönderilecek. Kullanıcılar da şarkıyı istedikleri gibi düzeltip hatalarından arındırıp sunucuya geri gönderecekler. Ben de denetimli öğrenme yaparak başka bir ağı eğiteceğim.
“Düzeltici Ağ Periyodik Aralıklarla Tekrarlanan Denetimli Öğrenme Eğitimi”, bu sistemin asıl maksadını kapsıyor. Düzeltici Ağ’a veri olarak doğrudan Autorhyme Üretici Ağı tarafından üretilen şarkı sözlerini sağlıyoruz. O da bize düzeltilmiş şarkıyı veriyor.
Oldukça basit değil mi ?
Fakat Düzeltici Ağı denetimli olarak eğitmek için sözlerin önce Autorhyme ‘dan çıktığı ham halini girdi olarak, sözlerin kullanıcı tarafından düzeltilmiş halini de hedef olarak sağlıyoruz. Böylece ne girdiğinde ne çıkmasını öğrenecek olan düzeltici ağımız, kendince gerekli prensipleri öğreniyor.Ardından Autorhyme tarafından üretilmiş ham şarkıyı verdiğimizde düzelterek bize geri verebiliyor.
Bu sistemi hayata geçirebilmek için de uygulamaya bir özellik eklemeye karar verdim. Böylece Autorhyme ‘ın yazdığı sözleri kullanıcılar düzenleyecek ve tekrar sunucuya gönderebilecek. Yazım hataları, bozuk kafiyeler ve anlam bozukluklarının düzenlenmesiyle Autorhyme daha başarılı şarkılar yazabilecek. Bu elbette kullanıcıların yardım etmesiyle mümkün.
Autorhyme uygulamasında kullanıcıların şarkıyı düzenledikten sonra tekrar sunucuya göndermelerini sağlayan mekanizma
Final, Autorhyme Herkesin Kullanımına Açılsın
Eh, Autorhyme ‘ın en çetrefilli kısmı tabii ki de üretici ağ inşa etmekti. Bu işten anlayan herkes mutlaka evinde ufak çapta yapay zeka projeleri deniyordur fakat ben Autorhyme ‘ı ileriye taşımak ve herkesin kullanımına açmak istedim.
İlk iş VPS sunucuma önce Python3 kurdum sonra da Tensorflow. Sonra da eğitilmiş model dosyalarını sunucuya pasladım.
Yapılacak şey basit, ilk önce eğittiğim modelden rapor almamı sağlayacak bir dizi python scripti yazdım. Daha sonra eğittiğim dört sanatçının da (Ceg, Şehinşah, Sagopa, Ceza) eğitilmiş ağırlık dosyasını (örn : sagopa.hdf5) aynı klasöre taşıdım. Python scriptine de iki parametreyi alabilecek parser ekledim. Bunların biri -<Şarkı Adı> diğeri ise <Sanatçı>
Python scripti, sanatçı adını parametre alıyor, “switch” kondisyonundan geçiriyor ve hangi sanatçı istenilmiş ise onun ağırlık dosyasını yükleyerek sample fonksiyonunu çağırıyor.
Sonra bunu da PHP bir servisle çağırmaya karar verdim. Gerekli güvenlik önlemleri sağlanıldıktan sonra Bunun web servis olmasının ne gibi bir zararı olabilir ki ?
Ama AI, sunucuda çalıştığından dikkatli olmam gerektiğini de biliyordum. Otomatik işlemleri bloklamak için bir captcha sistemi lazımdı. Neyse ki daha önce son derece işlevsel olan bir captcha sistemi yazmıştım.
(Bkz: Turing Captcha)
https://github.com/Aksoylu/Turing-Captcha
Daha önce kendimin geliştirmiş olduğu captcha sistemini kullanarak bu sorunu da kolayca çözdüm. (Canım kendim 😀 )
En sonunda da bir web sitesi ve mobil uygulama yazdım. Bunları da web servisime bağladım.
Autorhyme ‘ın Web sitesini tasarlarken de çok orijinal bir fikir ürettim.
Mobil cihazı olmayanlar veya uygulamayı indirmeyenler web siteye girdiklerinde karşılaşacakları telefon görselinin içinde Autorhyme ‘ı kullanabilsinler diye bayağı bir savaş verdim.
Bu tekniğe de gölge klonu adını verdim, nasipse başka bir yazımda anlatırım.
Autoryhme macerası da bu kadardı, eklemeleri mutlaka sizlerle paylaşacağım. Görüşmek üzere 🙂
Daha Fazla Kişiye Ulaşması İçin Bu İçeriği Paylaşabilirsiniz :
Yayınlayan
Ümit Aksoylu
Ümit Aksoylu 2021 Ümit Aksoylu tarafından yazılmış tüm yazıları görüntüle
Yayın tarihi 10 Aralık 2019 26 Haziran 2020 Yazar Ümit AksoyluKategoriler Bilim & Teknoloji, Projelerim
“Nasıl Çalışır : Rap Yapan Yapay Zeka Projem, Autorhyme” için bir yorum
Melvindaf dedi ki:
30 Aralık 2019, 20:54
Essay writing has always been a part of most university and college curriculum. Hello , i am Bily , i have a project or a research concerning responsibility in academic writing i really need your help since i have no idea what to include in my project and i need more information and details about this topic (responsibility in AW) i need it for tonight please help me. thank you in advance.
An example like my project; have a peek at this website
An introduction to academic writing for English Language Learners, focusing on essay development, grammatical correctness, and self-editing. A nonfiction writing prompt (in case you didn’t know) is a simple brainstorming tool that helps you come up with new blog posts, articles and ebook topics to write about. Conclude the essay with a paragraph that restates the thesis and recaps the descriptive and sensory details.
Please answer.
Regards
Cevapla
Bir cevap yazın Cevabı iptal et
E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir
Yorum
İsim *
E-posta *
İnternet sitesi
Bir dahaki sefere yorum yaptığımda kullanılmak üzere adımı, e-posta adresimi ve web site adresimi bu tarayıcıya kaydet.