Python ile Yapay Zeka

TensorFlow Hub ile Duygu Analizi

TensorFlow Hub, önceden eğitilmiş modellerin bulunduğu bir depodur. Bu yazımda TensofFlow Hub kullanarak Doğal Dil İşlemenin (NLP) bir alt alanı olan duygu analizini anlattım.

Tirendaz Akademi
8 min readJun 13, 2021
Photo by Everton Vila on Unsplash

Veri analizi yaparken eğitim verileri ile model kurulur ve yeni veriler bu eğitilen modele göre tahmin edilir. Model eğitmek zor bir süreçtir. Sıfırdan bir modeli eğitmek için büyük miktarda etiketli veri ve işlem gücü gereklidir. Örneğin 2017 yılında geliştirilen NASNet modelini eğitmek için binlerce saat GPU çalıştırıldı.

Şanslıyız ki metin veya resim sınıflandırma gibi analizler için kullanabileceğimiz önceden eğitilmiş modeller var. Bu eğitilmiş modeller, TensorFlow gibi kütüphaneler de bulunur. Bu modelleri kullanmak için tek yapmanız gereken bu modelleri çağırmak ve veri setlerinize uygulamaktır.

Bu modelleri direk veri setlerinize uygulayarak iyi sonuçlar alamayabilirsiniz. Çünkü bu modeller belirli veriler üzerinde eğitilmiştir. Örneğin köpek ve kedi resimlerini sınıflamak için ResNet modelini kullanmak istiyorsunuz. ResNet, binlerce resmi sınıflandırmak için eğitilmiştir. Bu modelin son katmanlarını özelleştirerek sadece köpek ve kedi resimlerini sınıflandırabilirsiniz.

Geçen yazımda TensorFlow ile doğal dil işlemeye giriş yapmıştım ve sıfırdan doğal dil işleme modeli nasıl kurulur anlatmıştım.

Bu yazımda TensorFlow Hub deposundaki hazır modelleri kullanarak nasıl model kuralacağını anlatacağım.

TensorFlow Hub Nedir?

TensorFlow Hub, önceden eğitilmiş makine öğrenmesi modellerinin bulunduğu bir depodur. TensorFlow Hub’da bulunan BERT gibi modelleri bir kaç kod satırı ile kendi çalışmalarınız için kullanabilirsiniz. Harika değil mi? TensorFlow Hub ile görüntü sınıflandırma, metin embeddings, ses ve video tanıma gibi analizler yapabilirsiniz.

Özetle TensorFlow Hub’da önceden eğitilmiş modelleri kullanarak daha az veri, daha az işlem gücü ve daha az zamanda, çalıştığınız özel alan için hızlıca kendi modelinizi eğitebilir ve eğittiğiniz modeli dağıtabilirsiniz. Bu yazıda IMDB veri setini kullanarak adım adım metin sınıflandırma için TensorFlow Hub’ın nasıl kullanacağını göstereceğim.

Duygu Analizi Nedir?

Sosyal medyanın ve teknolojinin gelişmesi ile çoğu kişi fikirlerini ve düşüncelerini paylaşır oldu. Bu paylaşılan veriler sosyal bilimler ve pazarlama gibi alanlarda analizler yapmak için çok önemlidir.

Bir metinin olumlu ya da olumsuz mu olduğunu analiz etmeye duygu analizi denir. Duygu analizi, doğal dil işleminin bir alt alanıdır ve günümüzün popüler alanlarından biridir.

TensorFlow Hub ile Duygu analizini göstermek için IMDB veri setini kullanacağım. Hadi IMDB veri setini biraz tanıyalım.

IMDB Veri Seti

IMDB veri seti, 25,000 eğitim ve 25,000 test olmak üzere 50,000 film yorumundan oluşuyor. Bu yorumların yarısı pozitif diğer yarısı negatif olarak etiketlenmiştir. Bu veri setindeki pozitif ve negatif etiketler eşit olduğu için bağlantılı bir veri setidir. Metin analizi derslerinde bu veri setinin kullanımını çok sık görürsünüz.

TensorFlow içinde kullanabileceğimiz hazır veri setleri vardır. TensorFlow Datasets (TFDS) kütüphanesi ile bu veri setlerini yükleyebilir ve analize uygun hale getirebilirsiniz. Bu kütüphaneyi aşağıdaki kodlardan biri ile yükleyebilirsiniz.

pip install tensorflow-datasets #Stable versiyon için
pip install tfds-nightly #Veri setlerinin son versiyonunu içerir

Şimdi bu kütüphaneyi ve TensorFlow’u import edelim.

import tensorflow_datasets as tfds

IMDB veri setini yüklemenin en kolay yolu tfds.load() metodunu kullanmaktır.

IMDB Veri Setini Yükleme

Şimdi tfds.load() metodunu kullanarak IMDB veri setini yükleyelim. Veri setini yüklerken ayrıca eğitim, validasyon ve test şeklinde parçalayalım.

Model eğitim verileri ile kurulur, validasyon verileri ile hiperparametreler ayarlanır ve test verisi ile model değerlendirilir.

Eğitim veri setini yüzde 60 eğitim yüzde 40 validasyon olacak şekilde parçalayalım.

train_data, validation_data, test_data = tfds.load(
name="imdb_reviews", #1
split=('train[:60%]', 'train[60%:]', 'test'), #2
as_supervised=True #3
)

Hadi bu kodların üzerinden geçelim.

(1) Veri setinin ismini name argümanına yazdım.

(2) split argümanına veri setinin nasıl parçalanacağını yazdım.

(3) as_supervised argümanına True yazmak ile veri setini, girdi ve etiket şeklinde yapısını ayarlamış oldum.

Böylece veri setini yükledik. Hadi veri setini tanıyalım.

Veri Setini Tanıma

Veri setini anlamak, veri analizinin önemli aşamalarından biridir. IMDB veri setinde her bir örnek, film yorumu ve bu film yorumunun etiketinden oluşur. Etiketler 0 veya 1'ler oluşur. 0, yorumun negatif ve 1, yorumun pozitif olduğunu gösterir. Hadi ilk 10 örneği ekrana yazdıralım. Öncelikle örneklerdeki yorumları ve etiketleri ayıralım.

train_examples_batch, train_labels_batch = next(iter(train_data.batch(10)))

Burada kullandığım batch ile ilk 10 örneği seçtim, iter metodu ile veri setindeki bileşenleri saydırdım ve next ile bileşenleri train_examples_batch ve train_labels_batch değişkenlere atadım. Şimdi ilk 10 yorumu yazdıralım.

train_examples_batch
Eğitim Veri Setindeki İlk 10 Yorum

Gördüğünüz gibi yorumlarda <br /> şeklinde html tag’leri var. Bu tagleri kaldırmak için TensorFlow Hub’daki önceden eğitilmiş katman kullanacağım. Hadi şimdi ilk 10 etiketi görelim.

train_labels_batch

Gördüğünüz gibi etiketler 0 ve 1'lerden oluşuyor.

Model Kurma

Veri setini tanıdık. Artık bir sinir ağı modeli inşa edebiliriz. Derin sinir ağları modelleri özellikle son yıllarda çok popüler oldu. Derin sinir ağları ile yüksek doğruluğa sahip modeller elde edilebildi. Sinir ağlarının en büyük dezavantajı model hiper-parametrelerinin ayarlamaktır. Eğer hiper-parametreleri ince ayarlamazsanız iyi modeller elde edemezsiniz.

Bir sinir ağını inşa ederken, metin nasıl temsil edilecek, modelde kaç katman ve her bir katmanda kaç nöron kullanılacak gibi hiper-parametreleri belirlemek gerekir.

Girdi verileri cümlelerden oluşuyor. Bu metinleri temsil etmenin bir yolu cümleleri embeddings vektörlere çevirmektir. Böylece vektör uzayındaki bir kelimenin yeri metinden öğrenilir. Kelimenin öğrenildiği vektör uzayındaki pozisyona embedding denir [1]. Unutmayın vektör uzayında daha yakın olan kelimelerin benzer anlamaları vardır.

Metin analizlerinde ilk katman önceden eğitilmiş text embedding’dir. Bu katman ile metin ön işlemi yapılır. Böylece en yorucu süreçlerden biri olan metin ön işleme süreci kolayca yapılır.

TFHub’da birçok önceden eğitilmiş text embeddings var. Bu text embedding’ler, ileri beslemeli Neural-Net Language Models (NNLM)’ye dayanır [2]. Bu embedding’lerden birini kendi çalışmanıza göre kullanabilirsiniz. Ben bu çalışmada nnlm-en-dim50/2 kullanacağım.

Bu model, 7B İngilizce Google haber corpus’unda eğitilmiş text embedding’e dayanan tokenları kullanır ve 50 embedding boyut içerir. İsterseniz nnlm-en-dim128/2 ismindeki 200B İngilizce Google haber corpus’unda eğitilmiş, 128 embedding boyutlu mimariyi de kullanabilirsiniz.

Daha büyük boyutlu embedding’ler kullanarak daha iyi modeller elde edebilirsiniz ama modelinizin eğitimi daha uzun sürer.

Öncelikle kullanacağımız önceden eğitilmiş embedding katmanını embedding ismindeki değişkenine atayalım.

embedding = “https://tfhub.dev/google/nnlm-en-dim50/2"

Şimdi TensorFlow Hub modeli kullanan bir Keras katman oluşturalım. Öncelikle tensorflow_hub’ı hub kısaltması ile import edelim.

import tensorflow_hub as hub

Şimdi daha sonra çağırılabilecek bir Keras katman oluşturalım.

hub_layer = hub.KerasLayer(embedding, input_shape=[], dtype=tf.string, trainable=True)

Bu katmanda girdi metnin uzunluğunun bir önemi yoktur. dtype argümanı katman ağırlıklarının veri tipini gösterir. Veri tipi metin olduğu için bu argümana tf.string yazdım. Katmanların eğitilebilir olmasını istediğim için trainable argümanına True yazdım.

Hadi eğitim veri setindeki ilk üç örneğin hub_layer katmanına göre çıktısını görelim.

hub_layer(train_examples_batch[:3])
Eğitim Veri Setinin İlk Üç Örneği

Böylece ilk üç örneğin 50 boyutlu çıktıları ekrana yazıldı. Artık tüm modeli kurabiliriz. Modeli inşa etmek için Sequential tekniğini kullanalım.

model = tf.keras.Sequential()

Her bir katmanı add metodu ile ekleyelim. Öncelikle biraz önce oluşturduğum hub_layer embedding katmanını yazalım.

model.add(hub_layer)

Bu katman ile cümleler token’lara ayrılır. Anlam olarak birbirine yakın olan token’lar bir araya getirilir. Daha sonra 16 katmanlık Dense katman ekleyelim ve bu katmanda relu aktivasyon fonksiyonunu kullanalım.

model.add(tf.keras.layers.Dense(16, activation=’relu’))

En son çıktımız pozitif ve negatif şeklinde iki sınıflı olduğu için 1 katmanlı dense katman ekleyelim.

model.add(tf.keras.layers.Dense(1))

Yazdığımız tüm kodlar aşağıdaki gibi olur.

model = tf.keras.Sequential()
model.add(hub_layer)
model.add(tf.keras.layers.Dense(16, activation=’relu’))
model.add(tf.keras.layers.Dense(1))

İşte bu kadar. Modelimizi inşa ettik. İsterseniz summary() metodu ile modelin özetini ekrana yazdırabiliriz.

model.summary()
Model Özeti

Böylece modeli özeti ekrana yazıldı. Her bir katmanda kullanılan parametre sayısını görebilirsiniz.

Kayıp Fonksiyonu ve Optimize Edici

Artık modeli derleyebiliriz. Modeli derlemek için compile() metodu kullanılır. Modeli derlerken loss fonksiyonu ve bir optimize edici belirlememiz gerekir.

model.compile(
optimizer=’adam’, #1
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), #2
metrics=[‘accuracy’] #3
)

(1) Optimize edici olarak son zamanlarda popüler olan “adam” kullandım.

(2) Ele aldığımız problem bir sınıflandırma problemi olduğu için loss argümanına binary_crossentropy yazdım.

(3) Her bir epoch’da modelin performansını görmek için “accuracy” metriğini kullandım.

Model inşa etme ve model derleme ile ilgili daha fazla bilgiye aşağıdaki blog yazısından ulaşabilirsiniz.

Böylece modeli derledik artık model eğitim için hazır.

Model Eğitme

Modeli eğitmek için fit metodu çağıralım ve eğitim verilerini kullanalım.

history = model.fit(train_data.shuffle(10000).batch(512), #1 
epochs=10, #2
validation_data=validation_data.batch(512), #3
verbose=1 #4
)

Hadi bu kodların üzerinden adım adım geçelim.

(1) Eğitim verilerini her 10,000 örnekte karıştırmak için shuffle(10000) metodunu kullandım. Modeli eğitirken örneklemleri 512 gruplar halinde alalım. Bunun için batch(512) metodunu kullandım.

(2) Modelin epoch sayısı 10 olsun. epoch argümanı, tüm verilerin inşa ettiğimiz sinir ağından kaç defa geçeceğini belirler.

(3) validation_data argümanına validasyon veri setini yazdım. Eğitim verisi ile model kurulurken validasyon verisi ile modelin hiper-parametreleri ayarlanır.

(4) Her bir epoch’da, ilerleme çubuğu ve bilgilendirme satırını görmek için verbose=1 argümanını kullandım.

Eğitim ve Validasyon Kayıp ve Doğruluk Değerleri

Böylece modelimiz eğitildi ve her bir epoch’da modelin doğruluğu ve loss değerleri ekrana yazıldı. Beklediğimiz gibi epoch sayısı arttıkça modelin eğitim ve validasyon doğruluğu artıyor. Diğer yandan eğitim ve validasyon loss değerleri azalıyor.

Dikkat ederseniz modelin eğitim verisi üzerindeki doğrulu validasyon verisi üzerindeki doğruluğundan fazla. Bu modelde ezberleme probleminin olabileceğini gösteriyor. Ezberleme problemi olan modeller genelleştirme sorunu yaşarlar. Dolayısıyla model yeni verileri iyi tahmin etmekte zorlanır. Modelin ezberleme problemini çözmek için L1, L2 veya Dropout regülerleştirme teknikleri kullanabilirsiniz.

Model Değerlendirme

Şimdiye kadar önce modeli inşa ettik sonra modeli eğittik. Peki eğittiğimiz modelin performansı nasıl? Modelin performansını görmek için test veri seti kullanılır. Hadi evaluate() metodunu çağırarak modelin test verisi üzerindeki doğruluk değerini bulalım.

results = model.evaluate(test_data.batch(512), verbose=2)

Şimdi zip() metodunu kullanaranak modelin test veri seti üzerindeki loss ve accuracy değerlerini ekrana yazdıralım.

for name, value in zip(model.metrics_names, results):
print("%s: %.3f" % (name, value))

Modelin doğruluğu yaklaşık yüzde 86 çıktı. Regülerleştirme tekniklerini kullanarak modelin doğruluğunu yüzde 95'lere kadar çıkarabilirsiniz.

Sonuç

TensorFlow Hub, önceden eğitilmiş modellerin bulunduğu bir depodur. Bu modellerin ince ayarları yapılmıştır ve dağıtıma hazırdır. Sadece bir kaç satır kod satırı kullanarak bu modelleri kendi analizlerinize ekleyebilirsiniz. Bu modelleri kullanarak zamandan ve işlem gücünden tasarruf edebilirsiniz. TensorFlow Hub ile görüntü sınıflandırma, metin embeddings, ses ve video tanıma gibi analizleri yapabilirsiniz.

Bu yazımda, TensorFlow Hub’da önceden eğitilmiş nnlm-en-dim128/2 embedding katman kullanarak duygu analizi için bir makine öğrenmesi modeli eğittim. Kurduğum modelin eğitim veri seti üzerindeki doğruluk değeri yüzde 99 ve test veri seti üzerindeki doğruluk değeri yüzde 86 çıktı.

Modelin eğitim veri seti üzerindeki doğruluk değeri test veri seti üzerindeki doğruluk değerinden büyük çıktığı için modelde ezberleme problemi var demektir. Ezberleyen modeller iyi genelleştirilemez. Ezberleme probleminin üstesinden gelmek için dropout gibi regülerleştirme tekniklerini kullanabilirsiniz.

Umarım faydalı bir yazı olmuştur. Aşağıdaki yazılarda ilginizi çekebilir.

Bizi Tirendaz Akademi YouTube, Twitter, GitHub ve LinkedIn sayfalarından takip edebilirsiniz.

Başka bir yazıda görüşmek üzere. Hoşça kalın…

Kaynaklar

[1] https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/

[2] https://www.tensorflow.org/tutorials/keras/text_classification_with_hub

--

--