Matrix Factorization Part 1— Öneri Sistemleri

Mustafa Serdar Konca
9 min readMay 9, 2023

--

Selamlar, sizlerle bugün Matrix Factorization konusunda zero to hero olmaya çalışacağız :)

Yazıda öneri sistemlerinde önemli bir yer tutan matrix factorization konusunu en temelden, çok basit bir şekilde ele alıp ileri seviyelere götürmeye çalıştım.

Konuyu iki part olarak ele almak istedim. İlk part’ta olayı biraz daha high-level ele alıp konuyu felsefi anlamda anlatmaya çalıştım.

İkinci part’ta ise olaylara biraz daha derinlemesine girip daha karmaşık ve teknik terimlere değiniyorum.

Haydi o zaman vakit kaybetmeden başlayalım…

Photo by Venti Views on Unsplash

Netflix tarafından yapılan açıklamalara göre platformun ücretli abone sayısı, son üç aylık periyotta 1.75 milyon artarak, Mart 2023 itibari ile 232.5 milyon oldu. İçerik sayısının ise dünya çapında 17.000'den fazla olduğu düşünülüyor.

Peki 17 binden fazla içerik ve 232 milyon kullanıcı arasından bu yazıyı okuyan sana başarılı bir şekilde dizi, film önerilerini Netflix nasıl yapabiliyor?

İşte bu sorunun cevaplarından birisi ve yazımızın konusu matrix factorization’a değinmek istiyorum.

Matrix Factorization Nedir?

En temelde Matrix Factorization, recommendation sistemlerinde kullanılan bir collaborative filtering çeşididir. Matrix Factorization’da User — Item Matrisini daha küçük boyutlu ve içerisinde latent featurelar barındıracak şekilde 2 matrise ayırıyoruz.

Hemen bu havalı terimleri duyunca kaygıya düşmeyin, tüm bu kavramları yazının ilerleyen kısmında çok basit bir şekilde açıklamaya çalışacağız :)

Eğer collaborative filtering, User-Item Matris’i hakkında herhangi bir fikriniz yoksa aşağıdaki öneri sistemlerine giriş yazıma göz atabilirsiniz. Bu yazıda öneri sistemleri hakkındaki bu gibi kavramları en basit şekilde açıklamaya çalıştım.

Hayali Netflix Evrenimiz

Bizler tekrar Netflix evrenimize denecek olursak bu evrende Ana, Betty, Carlos ve Dana isimlerinde kullanıcılarımızın ve 5 adet de içeriğimizin var olduğunu düşünelim. Kullanıcılarımız bu içerikleri 0 ile 5 arasında bir skor ile oylayabiliyorlar.

Genel anlamda kullanıcılar ve onların muhtemel yapabilecekleri oylamalar

Örnek olarak Ana Movie 5'e 4 yıldız verdi ve tabloda Ana için M5 kısmına 4 yazdık. Diğer tüm kullanıcılar da tüm içerikler için bu işlemi yapar ise yukarıdaki tabloyu elde etmiş oluruz.

Bu noktada araya girecek olursam eğer insanların genel olarak davranışlarını düşünecek olursak aşağıdaki resimlerden hangisi gibi bir davranış gözlemlemiş oluruz?

İnsan Davranışları Örnekleri

Yukarıda sorduğumuz soruya yanıt ararken sırayla tabloları inceleyelim? Acaba hangisi gerçek bir Netflix oylama tablosu olabilir?

İlk tablo en az olası gözüküyor. Çünkü tüm kullanıcıların tüm filmlere aynı değeri vermesi pek de muhtemel gözükmüyor.

Sondaki tabloda ise kullanıcılar veya filmlerin oylama değerleri arasında hiçbir ortak payda bulunmuyor. Bu da pek fazla realistik durmuyor çünkü gerçek dünya problemlerinde filmler veya kullanıcılar birbirlerine benzer, insan insana benzer, birbirleri arasında ortak birer patern olması muhtemeldir. Ne yazık ki sondaki tabloda değerler random bir şekilde verilmiş gibi duruyor.

Geriye kalan ortadaki tablo için ise aralarındaki en realistik duruma sahip tablo denebilir.

Peki neden burda en realistik olabilecek tabloyu inceliyoruz, bunu yapmaktaki amacımız ne?

Bu sayede aslında herhangi bir öneri sisteminin verideki hangi ortak paternlere dikkat ettiğini, bizlere verideki nasıl bir bağlam ile öneriler sunabildiğini anlayabilmemiz yönünden önemli.

Ortadaki tablonun neden en realistik tablo olduğunu açıklamamız gerekirse birinci ve üçüncü satırdaki kullanıcıların oylamaları aynıdır. Demek ki bu iki kullanıcının seyir zevkleri birbirleri ile benzer olabilir. Ve neredeyse bütün sistemlerde az veya çok ortak seyir zevklerine sahip kullanıcıları gözlemlememiz muhtemeldir.

Bir diğer örnek ise M1 ve M4'nin aynı olmasıdır. Büyük bir ihtimalle bu iki film konusu, içeriği veya başka özellikleri noktasında çok benzer filmler ve kullanıcılar bu iki filme aynı puanları vermişler. Örnek vermek gerekirse M1 “How I Met Your Mother” ve M4 ise “Friends” olabilir. Zaten yazımın başında bahsettiğimiz gibi M1 ve M4 filmleri polisiye ile alakalı filmler.

How I Met Your Mother ve Friends Oyuncuları

Ortada bulunan tablonun gerçeğe en yakın olduğunu gösteren bir diğer ilginç durum ise aşağıdaki resimde de bahsi geçen olaydır.

Yukarıda bahsettiğimiz durumu burada resim ile beraber açıklayacak olursak B ve C satırlarındaki kullanıcıların her film için yapmış oldukları puanları topladığımızda D kullanıcısının verdiği puanlara eşit çıktığını gözlemleriz.

Yani belki de D kullanıcısı; B ve C kullanıcılarının sevdikleri kategorilerin her ikisini de seviyor olabilir.

Yukarıda bir öneri sistemi verisinin nasıl olabileceği ve aslında bu veride yakalanabilecek muhtemel paternleri konuştuk. Şimdi sırada filmlere verilmiş olunan bu puanları tahmin etme kısmını inceleyeceğiz.

İlk olarak basit bir noktadan başlayacak olursak aşağıdaki resimde bulunan duruma bir göz atalım.

Böyle bir skorlama tablosunda Carlos’un M4 için vermesi olası puanı tahmin etmek çok da zor olmayacaktır ve çok büyük bir olaslılıkla Carlos da M4 için 3 puanını verecektir.

O zaman gelin bu işlemi biraz daha karmaşık bir tabloda yapmaya çalışalım.

Burada ise şunu söyleyebiliriz, Ana ve Carlos ilk dört filme aynı puanları verdiğine göre benzer film zevklerine sahiplerdir bundan mütevellit büyük bir ihtimalle Carlos da Ana gibi M5'e 1 puan verecektir. Çünkü daha önceki filmlere aynı puanları vermişler.

Bu tarz kompleks olmayan durumları tahmin etmek görece daha kolay ama eğer çok daha karmaşık bir durum için bu işlemleri matematiksel olarak nasıl yapabiliriz?

Bu sorunun cevabı ise ise Matrix Factorization’da yatıyor.

Factorization (Faktorizasyon) Nedir?

24 sayısını düşünelim. 24 sayısı aslında 6 ve 4'ün çarpımından oluşmaktadır. Yani 24 bizlerin 4 ve 6'ya göre büyük sayısıdır ama aslında 6 adet 4'ten veya 4 adet 6'dan yani iki küçük sayının çarpımından oluşmaktadır.

İşte tam bu noktada Matrix Factorization da tam olarak 6 x 4 = 24 gibi bir durumu icra ediyor. 24 gibi bizlerin elinde büyük kompleks bir matriksimiz var biz ise bu matriksi this ve that yani 6 ve 4 gibi daha az kompleks, basit matriksler halinde ifade edebiliyoruz. Ve arzu ettiğimiz zaman this and that matriksleri bizlere büyük matriksi verebiliyor.

Şimdi ise öneri sistemlerinde bu iki küçük matriksi nasıl oluşturabileceğimizi anlatmaya başlayalım.

Bu işlem için özniteliklerden (features) faydalanacağız. Bu öznitelikler yukarıdaki resimde de görebileceğiniz gibi aklınıza gelebilecek bir çok şey olabilir.

Bu öznitelikleri nasıl kullandığımızı yakından inceleyecek olursak, Dana’nın komedi ve aksiyon öznitelikleri hakkındaki tutumunu ve bu tarz filmlere vermiş olduğu skorlamayı bildiğimizi farz edelim. İlerleyen kısımda bunları nasıl elde ettiğimize de değineceğiz.

Yukarıdaki resimde bahsi geçen köpek balıkları ile ilgili filmin komedi türü için puanı bir ve aksiyon türü için ise 3' tür, Dana ile hem komedi hem de aksiyon türlerinden filmleri sevmektedir. O zaman şunu diyebiliriz ki büyük bir ihtimal ile 1 + 3' den Dana bu filme 5 üzerinden 4 yıldız verebilir. Tabiki bu noktada konunun anlaşılabilmesi için çok basit bir şekilde bu kanıya vardık.

Şimdi bu işlemi daha genel bir case üzerinde düşünelim.

Yukarıdaki resimde ise tüm filmlerimizin ilgili türlerdeki puanları ve kullanıcılarımızın bu kategorileri sevip sevmediği bilgileri var. Ana, ilk film için komedi türünü sevdiği için 3 puanı alıyor, aksiyon türünü sevmediği için ise 1 puanı alamıyor ve muhtemel olarak ilk film için 3 yıldız vermiş oluyor.

Bahsettiğimiz bu işlemi her film ve her kullanıcı için yaparsak artık elimizde tüm kullanıcıların tüm filmler için muhtemel olarak hangi puanları verebilecekleri hakkında yukarıdaki gibi bir tablomuz olacaktır.

Bu işlem aslında size daha önce bahsettiğimiz bir şeyi anımsattı mı?

Faktorizasyon dediğinizi duyar gibiyim :)

Buradaki 6 ve 4 gibi iki sayısı yani bizlerin iki küçük tablosundan büyük tablomuzu elde etmiş olduk.

Sonuç olarak yukardaki resimdeki gibi ortada yer alan büyük tabloyu elde edebildik. En basit şekilde Matrix Factorization böyle çalışıyor diyebiliriz.

Peki neden böyle bir işlem yapmak durumundayız? Direkt ortadaki büyük matriksi alıp işlemlerimizi gerçekleştiremez miydik?

Evet direkt ortadaki büyük matriksimiz ile işlemlerimizi gerçekleştirebilirdik ama matrix factorization’ı uygulamamızın bizlere belli başlı faydaları var. Gelin biraz da bunlara değinelim:

Depolama

Depolama yönünden faydasını ana, temel bir fayda olarak lanse etmesek de dolaylı yoldan bizlere çok güzel bir fayda sağlamakta.

Yazımın başlangıç kısmında verdiğimiz matriks örneğinde hafıza durumu çok önemli bir problem değildi çünkü çok büyük olmayan veri seti üzerinde anlamsal yönü kuvvetli, basit bir anlatım yapmaya çalışmıştık. Lakin gerçek hayat verileri veya küresel çapta bir şirket olan Netflix’in gerçek verilerini düşündüğünüz zaman veri setlerimizin devasa olacağını unutmayalım.

Bu durumu ve matrix factorizationun bize sağladığı faydayı görebilmemiz için 2000 kullanıcılı ve 1000 filme sahip aslında çok da büyük olmayan bir matriksi düşünelim.

Peki bu matrike eğer bizler matrix factorization yapmamış olsaydın kaç adet oylama, entires sayımız olacaktı?

2000 Users x 1000 Movies’den tam olarak 2 milyon oylama (entries) olacaktı.

Bir de eğer matrix factorization yapmış olsaydık nasıl bir durum elde edecektik bunu da gözlemleyelim.

100 adet Features belirledik ve bu durumda iki küçük matriks elde ettik. User feature smatriks’inden 2000 x 100'den iki yüz bin ve movies features matriks’inden ise 1000 x 100'den yüz bin toplam üç yüz bin entries’mız olacaktır.

Başlangıçta hafızada iki milyon entires tutmak yerine aynı amaca hizmet eden üç yüz bin entries tutarak işimizi halletmiş olduk. Peki akıllara şu soru gelebilir:

Nasıl bu entries sayımız azalmış oldu, bazı verilerden ödün mü verdik?

Yazımızın başlarında da bahsettiğimiz gibi ve yukarıdaki resimden de anlaşılabileceği gibi kırmızı büyük matrikste arzu ettiğimiz, ulaşmak istediğimiz tüm oylama durumlarına iki küçük matriksi kullanarak ulaşabiliyoruz. Bu yüzden herhangi bir veri kaybımız olmadı.

Lütfen arkadaşlar bir veri bilimci kolunu kaybeder ama verisini kaybetmez :)

Sonuç olarak yukarıdaki işlemi 2 milyon datayı tutmak yerine 300 bin veriyi tutarak başarabilmiş olduk.

Evet arkadaşlar bu sihir değil, sağolsun biraz Lineer Cebir :)

Part 1'in sonuna geldik , bu kısımda konuya bir temel atmak ve çok high level bir giriş yapmak istedim bence hiç ara vermeden yazının ikinci kısmına da bir göz atın çünkü bence o kısım çok daha zevkli ve konuya derinlemesine giriş yaptığımız part.

Sağlıkla kalın, verileriniz bol, modelleriniz ise sorunsuz olsun :)

ikinci partta görüşmek üzere.

Kaynakça

--

--