Merhaba, geliştirdiğim bir projeden bahsetmek istiyorum.

Proje alanı: NLP - Deep Learning
Kullanılan programlama dili: Python
Kullanılan araçlar: PyTorch, Scikit-Learn, RayTune, HuggingFace, NLTK, standart veri işleme ve görselleştirme kütüphaneleri (pandas, numpy, matplotlib ve seaborn)

Doğal dil işleme (NLP) üzerine yapılan uygulamaların pek çoğu artık tamamen derin öğrenme ile geliştiriliyor, bu projemde de tamamen derin öğrenme tabanlı modern bir doğal dil işleme modeli kullanarak Medium mobil uygulamasının yorumlarını analiz ettim. Öncelikle yorumları bir şekilde toplamam gerekiyordu ki işleyebileyim, bunun için basit bir data scraper hazırladım. Yaklaşık 40K yorumu topladıktan sonra artık metni analiz etme zamanı gelmişti.

Benim geliştirdiğim pipeline veriyi alıp işleyip modeli besleyebiliyor, ardından eğitilen modeli ve popüler bir takım araçları kullanarak yorumları kategorize ediyor ve yorumların olumlu, olumsuz ya da nötr olup olmadığını sınıflandırıyor. Medium uygulamasına gelen yorumların büyük bir çoğunluğu İngilizce olduğu için modelde İngilizce veri üzerinde eğitilmiş oldu, zaten var olan bir modeli fine-tune ettiğim için eğitim verisinin ağırlıklı olarak İngilizce olması işime geldi açıkçası . Eğer farklı dillerdeki yorumları çoğunlukla nötr olarak değerlendirebilirse bunun verilecek kararlara etkisi minimal olacaktır, dolayısıyla büyük bir sorun olduğunu sanmıyorum. Potansiyel bir geliştirme veriyi tamemen İngilizce olacak şekilde filtrelemek olabilir, bu modelin farklı dillere odaklanmasını engelleyeceği için nötr kararların daha tutarlı olmasını sağlayacaktır. Tabii ki bu geliştirme modelin farklı dillerdeki yorumları nötr olarak yorumlayacağı varsayımından yola çıkıyor, bunu teyit etmeden işe yarayıp yaramayacağından emin olamayız.

NOT: Eğer projenin detaylarıyla ilgilenmiyorsanız "Veri işaretleme ve active learning" ve "Modelleme" kısımlarını geçebilirsiniz, sonda sonuçları gösteren bir kaç grafik ve bir dashboard yer alıyor.

Geliştirme sebebim


Genel olarak ürünlere gelen yorumları değerlendirmek oldukça önemli, istediğiniz bir feature ın nasıl çalıştığını yahut müşterilerinizin bir problem yaşayıp yaşamadığını anlamak atacağınız bir sonraki adımı belirlemede can alıcı bir önem taşıyor. Yanlış noktalara odaklanmak bir mobil uygulamanın performansını düşürebileceği gibi, sattığınız ürünün müşterilerini kaybetmenize de olanak sağlayabilir.
Veriyi manuel olarak analiz etmek neredeyse her koşulda bir derin öğrenme modeli eğitmekten daha pahalı, bundan dolayı az miktarda veriyi gözden geçirip işaretleyerek (labeling) bir model eğitmek hem daha hesaplı hem de daha kullanışlı. Belirli zaman aralıklarında aynı pipeline ı kullanıp veri toplayarak, sonrasında da modeli fine-tune ederek güncelleme yapabiliyorsunuz. Ayrıca uygulayabileceğiniz ileri seviye analizler verinin nasıl eğilim gösterdiğini anlamanızda da yardımcı oluyor. Böylelikle müşterilerinizin sorunlarını daha rahat belirleyebildiğiniz gibi, yaptığınız değişikliklerin nasıl sonuçlara yol açtığını da daha detaylı bir şekilde görebiliyorsunuz.

Veri işaretleme ve active learning

Medium özünde ücretli bir uygulama, aylık abonelik satın alıyorsunuz ve makalelerin aldığı beğeni miktarına göre abonelikten gelen paranın bir kısmı yazarlara bölüştürülüyor. Yorumları gruplandırırken çalıştığım start-up'ın uygulamasını kullandım ve yorumları 4 ayrı kategoriye ayırdım:

1- Abonelik (Subscription): Uygulamanın abonelik mekanizması hakkındaki her yorum bu başlık altında işaretlendi.
2- İçerik (Content): Makalelerin ve her türlü yazılı içeriğin paylaşılabildiği bir uygulama olduğu için, büyük bir çoğunluk uygulamanın tavsiye ettiği içerikleri ve içerik kalitesini eleştirebilir. Bu tip yorumlar bu başlık altında işaretlendi
3- Interface (Arayüz): Mobil uygulamanın arayüzü inanılmaz önemli bir faktör, bu konu hakkındaki her yorum bu başlık altında derlendi
4- Kullanıcı deneyimi (User Experience): Diğer kategoriler kullanıcı deneyimini oldukça açıklıyor, bu yüzden herhangi bir kategoriye giremeyecek kadar soyut olan UX reviewları burada toplandı

Bu projede active learning kullandım, yani belirli miktarda veri işledikten sonra modeli tekrar eğitiyorum ve veri miktarını sürekli arttırarak buna devam ediyorum. Az çok yeterli miktarda performans almaya başladığım zaman eğitimi kesiyorum. Ben 11 adım boyunca 50'şer review inceleyip işaretleyerek devam ettim:


9. versiyonda 350 örneğin biraz üstüne çıktım. Bir kaç versiyonda bir eşleştirmelerimi kontrol ediyordum, dolayısıyla işaretlemelerimi kontrol ettim ve bir kaçını çıkardım. Bu sonradan performans düşüşüne sebep oldu. Ardından veri işaretlemeyi kestim ve 9. versiyonu kullanmaya karar verdim. Kendimi veri çıkarmaya biraz kaptırdığımı düşündüm açıkçası

Veri analizi ve önişleme

Modern projelerde artık veri işlerken noktalama işaretlerini vs. çıkarmanıza gerek kalmıyor, dolayısıyla genellikle yalnızca veriyi anlamak için analiz ediyor ve çok pre-processing uygulamıyorsunuz. Veri işlerken ve bundan değer üretmeye çalışırken her zaman bilimsel bir yol izlemeniz gerek; yani bir varsayım veya hipotezden yola çıkıp, veriyi kullanarak bu görüşlerinizi doğrulamanız ya da yanlışlamanız lazım. Ancak böylelikle yaptığınız işlemlerin ve kabul ettiğiniz varsayımların ne işe yaradığını belirleyebilirsiniz. Uygulama incelemeleri (reviewlar) farklı dillerde olabiliyor, bunları ayırmakla uğraşmadım. Benim yaptığım analizde kontrol ettiğim şeylerle ilgili bir kaç grafik aşağıda yer alıyor, bunları kendim veriyi anlamak istediğimden dolayı hazırladım, dolayısıyla çok havalı gözükmüyorlar

Öncelikle reviewların uzunluğunu ve ortalama kaç kelimeden oluştuklarını kontrol ettim, bu kullanılan kelimelerin uzunluğunu (cümlenin potansiyel kompleksliğini) da kapsadı. Medium uygulaması her türden makalenin ve yazının paylaşıldığı bir platform olduğundan dolayı yorumlar hakkında bir varsayım ile yola çıkmadım. Her telden içeriğin olması, her telden farklı kullanıcıya da hitap ettiğini gösteriyor doğal olarak.

Yukarıda grafikte de anlaşıldığı üzere reviewların büyük bir çoğunluğu ortalama 5-6 karakterlik kelimelerden meydana geliyor, bu oldukça anlaşılır çünkü çoğunluk günlük dildeki kelimeleri kullanıyor, bunlar da genellikle çok uzun değil.




Yukarıda ise yorumlara göre kelime miktarı dağılımını görüyoruz, büyük bir çoğunluk 0-15 kelime aralığındayken kısmen uzun yorumların olduğunu da söylemek mümkün. Tabii ki outlierlar (dağılımın dışında kalan aykırı değerler) hesaba katılmıyor. 10-15 kişinin yaptığı 100 kelimelik reviewın inanılmaz bir etkisi yok. Benim yaklaşık 40K yorum topladığımı hesaba kattığımızda, verinin neredeyse %60'lık bölümünün 0-15 kelime arasında olduğunu, kalan %40'lık kısmın ise 15 kelimeden uzun olduğunu söylemek mümkün. Kullanıcıların biraz da olsa yüksek miktarda kelime kullanmasının faydalı yönü ise şu: bu verileri manuel olarak gruplandırıp modeli beslediğim zaman gruplar hakkında daha çok bilgi vermiş olacağız, bu da işimize yarayacak fakat overfit olma ihtimalini de arttıracak.

Genelde karşılaşılan stopwordlere (performansı çok etkilemeyen etkisiz kelimeler) ve noktalama işaretlerine bakmak da bazen faydalı olabiliyor, bu datasette ekstra bir işime yaramadı çünkü modern NLP modelleri optimize edilirken konteksten faydalanıyor. Yani stopwordleri ve noktalama işaretlerini ayıklayıp çıkartmak modelin daha az bağlamsal veri alması demek.
Sık kullanılan kelimeleri de kontrol ettim, çoğunlukla "app", "I", "articles", "great", "read" gibi kelimeler kullanılmıştı ki bunlar oldukça olağan; yorumların büyük bir kısmı 4 ve 5 puan, üstelik Medium makale okuduğunuz bir uygulama. Dolayısıyla buradaki sonuçlar beni pek şaşırtmadı.

Ardından bigram analiz uyguladım, ardışık kelimeleri gruplandırıp sayılarını kontrol ettiğimiz bu analiz tipi, genellikle klasik NLP modellerinde feature olarak kullanılıyor. Ancak cümlede hangi kalıpların kullanıldığını görmede de işinize yarayabiliyor.


Gördüğünüz üzere büyük bir çoğunluğu olumlu anlamlar taşıyor ya da direkt uygulamayı belirtiyor, yorumların çoğunlukla olumlu olması "love it", "easy to" ve "the best" gibi bigramları açıklıyor.

Bu noktadan sonra ekstra bir analiz uygulamadım, veride dil bariyeri dışında bir problem olduğunu düşünmüyorum. Dolayısıyla basit temizleme işlemlerinden geçirdikten sonra modellemeye başladım, böyle metin verisiyle çalışırken ilk yaptığım şey html taglerini varsa silmek oluyor, sonrasında bütün veriyi lowercase hale getirip gerek duyuyorsam emojileri siliyorum. Bazen kelime yazılış biçimlerini kontrol edip düzeltmeyi uygun buluyorum fakat çok efor gerektirmeyen tutarlı bir düzeltme oldukça zor, bu yüzden bu işlemi pas geçtim. Bu projede emojileri sildim, deneysel çalıştığım için yalnızca silip modeli tekrar eğittim ve bu modelin performansını arttırdı. Yani artık pre-processing pipeline ında o da var

Modelleme


Twitterda yaklaşık 58 milyon tweet ile eğitilmiş transformerdan türetilen roBERTa modelini kullandım, oldukça başarılı bir model olduğu için az miktarda veride dahi güzel sonuç alabileceğimi düşünmüştüm. Az çok istediğim gibi oldu. Text verisini işlerken tokenization denilen bir işlem uygulamanız gerekiyor bu işlemi yapan araca ise tokenizer deniyor, derin öğrenme modelleri özlerinde matris çarpımı yapan matematiksel modeller. Dolayısıyla direkt kelimeleri anlamalarının bir yolu yok, kelimeleri öncelikle sayılara çeviriyoruz. Yani karşılaşılan kelimeleri sayılarla eşleştirerek bir sözlük oluşturuyoruz. roBERTa hali hazırda eğitildiği için zaten bir tokenizer'a sahip. O yüzden sıfırdan bir işlem yapmamıza gerek yok. Veri tokenize edildikten sonra HuggingFace üzerinden eğitilmiş roBERTa'yı indirip eğitim döngüsüne soktum. Her adımda yaklaşık 6-7 saat eğitim döngüsü çalıştı, 11 veriseti versiyonu için 11 defa eğitim uygulamış oldum yani.

Makine öğrenmesinde hiper parametreler dediğimiz bir şey olur, bu parametreler veri işleme sıklığı gibi genel olarak eğitimde kullanılan ve modele ait olmayan parametrelerdir. Performansı arttıracak şekilde bu parametreleri aramaya ise hyper-parameter optimization deniyor, birebir hiper parametre optimizasyonu yani. Bir modelin genel performansından memnun olduğunuz zaman, suyunu sıkıp her bir performans zerreciğini almak istiyorsanız bu tip metotlara başvurabilirsiniz. Ben bunun için istatistiksel metotlar kullanan RayTune kütüphanesini kullandım, kısaca birden fazla paralel eğitim başlatıp iyi gitmeyeceğini düşündüklerimizi eleyerek optimizasyon uygulayacağız. ASHA (Asynchronous Successive Halving) ile paralel eğitimlerden işe yaramayanları durdurup, HyperOpt sayesinde bayesian optimization ile işe yarayan parametreleri bulacağız. 40 farklı eğitim sonucunda elde edilen en iyi parametreler ile eğitilen model aşağıdaki sonuçları verdi.

Kullandığım metrikleri bir kaç cümle ile açıklamak zor. Kısaca Precision ve Recall yapılan sınıflandırmaların başarısını yorumlamamızı sağlıyor. F1 ise Recall ve Precision değerlerinin harmonik ortalamasıdır, yine ne kadar yüksek o kadar iyi ve maksimum 1
Bu metrikleri daha derinlemesine açıklamak bu konu başlığında çok uygun olmaz diye düşünüyorum, eğer aklına takılan olursa tabii ki açıklayabilirim.

(sonuçlar sınıf miktarına göre ağırlıklı 5-fold cross validation ortalaması sonuçlarıdır)



Bitiş


3. versiyonda (dataset-3.csv) performansın tavan yapmasının yegane sebebi bazı sınıfların yoğunluğunun çok etkili olmasından kaynaklı. Yani model belirli sınıflara overfit oldu, bununla ilgili yukarıda veri işlerken bir uyarıda bulunmuştum zaten. Veriyi dengeledikten sonra performansın kısmen anlaşılır bir seviyeye ulaştığını görebiliyoruz. 6. versiyondaki düşüş ise benim saçmalamamdan kaynaklandı, veride yanlış işaretlenmiş çok örnek vardı. Bunları düzeltip devam ettim. Sonuç olarak 9. versiyonu değerlendirmeye karar verdim. Bu kadar işlem sonucunda toplamda 350 örnek işaretleyerek yaklaşık %88 tutarlı sonuçlar tahmin edebilen bir model eğitilmiş oldu. Potansiyel bir geliştirme Türkçe veri ile benzer bir model eğitmek olacaktır, tabii önce adam akıllı Türkçe veriyle eğitilmiş bir model var mı araştırmak gerek. Türkçe veriyle eğitilmiş cased BERT modelleri var fakat paperlarını okumadım, bu yüzden ne zaman yaparım bilmiyorum.

Bu kadar yapmışken bütün reviewlar üzerinde modeli uyguladım ve sonuçları Power BI'da bir dashboard haline getirdim, dashboarda buradan ulaşabilirsiniz. Normalde interaktif fakat Power BI hesabınız yoksa erişemiyorsunuz, bu yüzden aşağıya fotoğrafını koydum



Artık bu modeli ve genel işleme pipeline ını ticari olarak kullandığımdan dolayı ne yazık ki kaynak kod vs. paylaşamıyorum. Ancak bu tip konulardaki sorunuzu cevaplayacak nitelikte bilgilendirici başlıklar açabilirim, zaten uygun gördüğüm projelerimi bu şekilde paylaşmaya devam edeceğim.

Şimdi ise bu projenin cevaplamaya çalıştığı asıl soru: sizce bu tip yapay zeka ürünleri iş modellerine entegre edilmeli mi? Günümüzde pek çok modelin zaten bu amaçlarla kullanıldığını hesaba katarsak, çoktan entegre edilmiş gibi duruyor. Sizin düşünceleriniz neler?