Recommender System Genel Bakış (Part 4: Matrix Factorization with Deep Learning)
Bir önceki yazıda Recommender System Genel Bakış (Part 3: Matrix Factorization) Matrix Factorization konusunu anlatmıştık. Oradan okuyarak MF hakkında genel bilgi edinebilirsiniz. Bu yazıda bunu Keras ile bunu nasıl yapacağımızı inceleyeceğiz. Direkt kodlar üzerinden ilerleyelim.
İlgili kütüphaneleri import edelim.
Elimizde Ratings verisi bulunuyor. Bu veri setinde kullanıcıların filmlere verdikleri puan bilgisi var.
Birazdan da değineceğimiz embedding matrixlerin oluşturulması için N(user count) , M(movie count) değerlerini hesaplayalım. Kullanmayacağımız timestamp sütununu drop edelim.
Eğitimi yapmak için veriyi shuffle ile karıştırıp, train test olarak 2 parçaya ayıralım.
Latent feature değerimizi K=10 olarak belirledik. Her bir kullancı yada film 10 uzunluğunda vektör ile gösterilecek. mu değeri bir önceki yazıda da bahsettiğimiz gibi ortalama puan değeridir.
Embedding Katmanı
Embedding katmanı Kerasta bulunan bir katmandır. Genellikle NLP projelerinde kullanılır. Embedding katmanını one-hot-encoding gösterime iyi bir alternatif olarak düşünebiliriz. Eğer text datası ile çalışıyorsak modele direkt olarak text verisini gönderemeyiz. Öncelikle bu text verisini sayısal değerlere dönüştürmemiz gerekiyor. Bunun için one hot encoding kullanabiliriz. Örneğin 10 bin kelimenin olduğu bir text verisinde. Bir kelimeyi [00000000001…..000] şeklinde göstermek durumunda kalacaktır. Ancak Embedding ile her bir kelimeyi sabit sayılı bir vektör ile gösterebiliriz.
Örneğin : Embedding(input_dim=10000,output_dim=10,input_length=20) Burada input_dim : Toplam kelime sayısı, output_dim : her bir kelimenin gösterileceği vektör boyutu, input length her bir cümlenin boyutudur.
“Selam” kelimesi -> [ 0.04502351 0.00151128 0.01764284 -0.0089057 -0.04007018
0.02874336 0.02772436 0.00842067 -0.01229819, -0.03157005] Yukarıdaki gibi gösterilir.
Embedding Matrix her kelimenin bizim belirlediğimiz boyutta sayı ile (vektör) ile gösterilmiş matris şeklidir. Bizde kullanıcıları ve filmleri ayrı ayrı embedding matrixlerde göstereceğiz.
Modeli Oluşturalım
Modele userId ve movieId bilgilerini u ve m input katmanları ile göndereceğiz.
Burada Embedding katmanında girilen idler feature vektörlere çevirilecek.
Embedding(N,K) -> N: Toplam kullanıcı sayısı (Vocabulary Size gibi düşünebiliriz. K : Latent Feature Size
Her bir kullanıcı 10 uzunluğunda vektör ile gösterilecek. (1,10) u_bias ve m_bias embedding katmanları önceki yazıda da bahsettiğimiz gibi bias değerleri bunları da modele ekleyeceğiz. (1) Dot(axes=2)([u_embedding, m_embedding]) ilgili kullanıcı(1,10) ve ilgili film(1,10) vektörlerinin çarpımı ile scaler bir değer elde ederiz. Bu değere : Add()([x, u_bias, m_bias]) katmanı ile bias değerlerini ekleriz ve ratings değerini hesaplarız.
Loss fonksiyon olarak mean_squared_error kullanacağız. Optimizer olarak da SGD tercih ettik. Buradaki hyperparametreleri değiştirebilirsiniz.
Model.fit ile eğitimi başlatıyoruz. Konuyu anlatmak için modeli sadece 10 epoch eğitiyorum. Bu sebeple sonuçlar pek anlamlı olmayabilir ancak siz daha uygun parametreler ile daha uzun süre eğitirseniz daha iyi sonuçlar alabilirsiniz.
MSE ve loss değerlerini matplotlib ile grafik ile gösteriyoruz.
Her yeni kullanıcı geldiğinde modeli eğitmek yerine eğitilmiş modelin katmanlarını kullanarak gelen yeni userın embedding vektörünü hesaplayıp bu değere göre rating hesabı yapıp öneride bulunabiliriz.
Test setinden random bir user alıyoruz. Bu kullanıcının izlediği film listesini alıyoruz. Modelin ilk embedding katmanını kullanıcının izlediği filmleri gönderiyoruz. Bu şekilde kullanıcı için embedding matrixi hesaplayacağız.
Movie embedding için eğitilmiş modelin embedding katmanından movie embedding değerini alıyoruz. Matris çarpımı yaptığımızda da bu kullanıcını tüm filmler için verdiği puanları hesaplamış oluruz. Bu değerlere göre kullanıcıya önerilerde bulunabiliriz.
Görüldüğü gibi MF modeli oluşturmak zor olmamakla birlikte doğru parametreler ile modeli eğitirsek başarı oranı çok daha yüksek olacaktır.