Recurrent Neural Network ile Hayyam Rubaileri Yazmak

Andrej Karpathy, Stanford Üniversitesinde bir doktora öğrencisi, Github hesabında paylaştığı içeriklere bakarken char-rnn reposuna denk geldim.

Karpathy bu çalışmasında çok katmanlı kompleks bir Recurrent Neural Network kullanarak, verdiği metin içeriği ile bu içeriğe benzer yeni içerikler üretebiliyor. Örneklerinde Shakespeare metinlerini vererek bu metinlere benzer yeni içerikler yada Linux kaynak kodlarını vererek söz dizimi(syntax) hatası çok çok az olan girdileri uyumlu kod parçaları üretebiliyor.

Bu ağı kurarken Torch kullanılmış. Torch; makine öğrenmesi algoritmaları için GPU’yu öncelik alarak bilimsel hesaplama kütüphanesi olduğunu söylüyor. Lua isimli bir dil ile yazılmıştır, Karpathy de Torch ile daha uyumlu çalışabilmesi için olsa gerek bu çalışmasını Lua ile yazmış.

Karpathy’nin oluşturduğu bu ağı kullanmak çok basit, Ubuntu üzerinde birkaç komut ile kısa sürede kendi verinizi eğitim için kullanıp yeni veriler üretebilirsiniz. Github adresinde anlatıldığı gibi hangi adımlarla ağı eğiterek yeni veriler alabildim anlatayım.

Ubuntu 16.04 üzerinde ve Nvidia GPU üzerinde yaptım bu çalışmayı. Nvidia’nın sunduğu CUDA Toolkit ve kütüphaneleri önceden kuruluydu.

Torch kurulumu ile başlayalım, bir terminal/komut satırı açarak aşağıdaki satırları sırası ile çalıştırıyoruz.

$ curl -s https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash
$ git clone https://github.com/torch/distro.git ~/torch --recursive
$ cd ~/torch; 
$ ./install.sh      # and enter "yes" at the end to modify your bashrc
$ source ~/.bashrc

Kurulum sorunsuz bittiyse aşağıdaki satırlar ile bir kaç Lua paketini kurmamız gerekiyor. Luarocks; Lua için hazırlanmış bir paket yöneticisi.

$ luarocks install nngraph 
$ luarocks install optim
$ luarocks install nn

Bir sonraki adım eğer GPU üzerinde hesaplamaları yapacaksanız gerekli. Belirttiğim gibi CUDA Toolkit kurulu olmalı sisteminizde.
Ben bu adımda kurulumu tamamlayamayıp hata aldım, biraz araştırınca Torch kurulumunu tekrarlamam gerektiğini buldum. *

# Eğer cutorch kurulumunda hata alırsanız bu satır ile Torch kurulumunu tekrar edin
$ luarocks install torch

$ luarocks install cutorch
$ luarocks install cunn

Kurulum bitti. Eğitim ve üretim kısmına geçiyoruz. Tavsiye edilen veri boyutu >1MB ama Ömer Hayyam’a ait bulabildiğim tüm içerikler ~80kb, nasıl bir yanıt verecek ağ görmek için bu veri setiyle devam ediyorum. data klasörü içinde hayyam isimli bir klasör oluşturup veri setimizi input.txt adıyla buraya koyuyoruz. Eğitimi aşağıdaki satır ile başlatıyoruz.

$ th train.lua -data_dir data/hayyam -rnn_size 512 -num_layers 2 -dropout 0.5
# CPU üzerinde çalışır, tek bir döngü ~10sn sürüyor

$ th train.lua -data_dir data/hayyam -rnn_size 512 -num_layers 2 -dropout 0.5
# GPU üzerinde çalışır, tek bir döngü ~0.7sn sürüyor, bununla devam

Ağ eğitim sırasında cv klasörüne belirli döngü sayılarında eğitim verilerini kayıt ederek eğitim yarıda kalırsa verilerin kaybolmamasını sağlıyor. Burada kayıt edilen dosya isimleri eğitimi beslediğiniz veri setinden bağımsız olduğu için yeni bir veri seti ile denerseniz önceki kayıtları buradan almanız yararlı olacaktır. Benim durumumda son kayıt edilen dosya lm_lstm_epoch50.00_1.9708.t7

th sample.lua cv/lm_lstm_epoch50.00_1.9708.t7

Ağın ürettiği veri
miş herin, yaramak.

Ne gitmiş de kendimizi kerdiler doğrulur!
Ken der özünde dertlere düşerekleri.

Faler lir içiniz deren soluksun gönür eter;
Benik bir kadehle gelen girmegin maptan:
Bir gelip gönlümüz bir durda gönlüm yüreğini.

Şarap içir kazerte bedenimde
Acı manar tehkesi, söyleşim olsun, beni;
Ben kendimden geçtikçi benim gelip girmemezdim;
Cennetende kubu derlanları birser kolum:
Çeneldi sonan gelirsen aşca olgadak!

Seni aldınma eliyorsun amaşıldığın senin;
Bir nüz vursu ki kudur giyer kalkım:
Açıldır gökler yaptığından yüreğin
Bırak dert aracağımız onlarsan.
Benim var yıktılgızla yaşarın boş:
Kez gevendir isteyi günleri.

Yaşamak sanah yalatsı ne yapardak etmiş.

Şarap iç, sansız gönü gün et!i
Ailıkıp görünü püp bulduğandır,
Aya Tazrı, hen at de sensin, biyli gün haber her gebi
Amlı gelir geder, ne olayar;
Er gör, da varam dünyaya geler gümelde.

Şarap iç, aklın kadehinde, bir şef eder çeker?
Bir muduyu çokmaya kanlıdır, iç.

Felek şarabı gitirme; şarap hel seci-sem
Elinde öyle etmek eden yeleese
Ben gezindi bir gece vermemizsen?
Biz tutar var olun sabga alatlıktan benim;
Kimden gece şey diverek yapmadan yok;
Benim şurah: Gözleri insanlar;
Elimi ne kötü beyip içinde varcı şaraptan
Elim şarap varlalı kötümün bizilir gider.

Bu dünyanın göklerden başka!
Şarap iç, ya gün kazarsın?

Her yapar ver, kitmiş germişim adlından toprağa;
Günah incesen yolumlur gibi!
Biz dertli sevinç yolradı beni yolu?
Son azam güzallar haramsay yadınlamızan.

Eyler bir ser sırlarıyı hara yerine goldulmaz benim.

Dünyada yolan hoş gelin de;
Senin kimdiyor geleyle, yağamlaşan görünü;
Ukandım şim dolamakın verilir.
Kendiyle yüzülüryer gitek yeşip de:
Yoklağımdan senin dedikonuyla
Ömer Hayyam

Rubailer 10
Bir gecen dertten katiştir birim
Kallık olmuşsun haya bir :
Sevhili gelip gider gibiyiz

Bi görünü ardında mişten başka onan ken, g

Çok küçük bir veri ile bile başarılı bir şekilde bazı örgüleri yakalayabiliyor. Örneğin hiç uzun cümleler içeren satırımız yok, bir kaç yer hariç noktalama işaretleri satır sonralarında kullanılmış. Veri setinde bazı şiirlerin sonunda Ömer Hayyam yazıyordu bilerek temizlemedim, o örgüyü de yakalamış görünüyor.

Tahmine başlayacağı kelimeyi vererek ve daha kısa metinler ürettirerek yeni içerikler üretelim.

th sample.lua cv/lm_lstm_epoch50.00_1.9708.t7 -primetext "Şarap" -length 300

Şarap:
Bir günlü mül!
Bir gece pimaz bu dünyaya gelen.

Biz yaridi kalbet kinsimi, benden yerine
Bir güzelin Tanrı unranda ben!

Bir gece gelmeyiyse bir de yok ne?
Bir kuru bir kamaz gider ki bizim,
Mala can gözünü karar gibi girsin
Yursun gibisizlerin sana;
Bizimiz al dönen aman iki sevilmiş

th sample.lua cv/lm_lstm_epoch50.00_1.9708.t7 -primetext "şarap" -length 300

şarap:
Bir gündük sabah, ne giler kadeh ben.
Bizim olduğum zerkene bu görmüş gelin.

Ceni bonu göndüm bil akamayı:
Ey dünyayı söyle da varlı güzele sulmuşsun..
Yül gittin zaman iki,
Göldüm yolumu gibi gül pevgilir.

Kime gavurum, bir yayka kasmasın koşura.

Bugün baş kadehi kanlama

th sample.lua cv/lm_lstm_epoch50.00_1.9708.t7 -primetext "Aşk" -length 300

Aşkın:
Ne var, bir de kisin de sonmam kendimi:
Onu görlü özerdin bir de versim,
Kefcilirte güne gibi ki neybiz:
Ovunca bise olsa diğil mi issen?

Bir gecen geçti gidiyor, dereninse:
Senden boşunda mibahında birmen.

Ey gözler, de üyük dökmeğim uygunda bir;
hir sahuha belmiş bilgiyi diler

th sample.lua cv/lm_lstm_epoch50.00_1.9708.t7 -primetext "aşk" -length 300

aşkın, izisinim.
Dimezlerim asılmış oltadırsan.

Kim geçmiş gelen gözlere harama:
Nerden vergin de olur alamıyın.

Kama düşünceler sırız gibi de tahalır buzlur geker!
Gül yeri gönlüm yüreğinden sevinsin, bilgiderlere.

Yüz demrizi yüzün dertlerli ısak bire;
Bilmek de sevinçler

Veri setinde hiç bulunmayan bir kelime ile deneyelim.

th sample.lua cv/lm_lstm_epoch50.00_1.9708.t7 -primetext "merdiven" -length 300

merdivenim hamat, boşka amalak.
Almaz kanacım ne güneli;
Dünyayı galdi gelmiş vermeme.

Gün birt gemiz ki bir behdim, bir de sarhoş.

Benden bu köçeyer de koramızırdan.

Bilgininle suldakların ne bir değil senki;
Ereli mifilsiz ka zurun kalmayayda.

Madem a sınmış dünya bin hok elin atmaz;

Kelimeye bir ek getirerek veri setinden bir kelimeye benzetmiş ve türetmeye devam etmiş olabilir. Bazı denemelerde ise yanıtsız kalarak hata veriyor.


Yayımlandı

kategorisi

yazarı:

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir