Öneri Sistemi
Recommendation System
Bir kullanıcının ilgileneceği ürünü, içeriği veya öğeyi geçmiş davranıştan ve benzer kullanıcılardan çıkarımla öneren sistem — Netflix, Spotify, Amazon, YouTube'un omurgası.
Öneri sistemleri, "milyon seçenek arasından bu kullanıcı için en alakalı 10'u" sorusunu çözer. Üç ana yaklaşım vardır:
- İçerik tabanlı (content-based): ürün özelliklerinden yola çıkar. Kullanıcı aksiyon filmleri sevmişse benzer özellikteki diğer aksiyonları önerir. Soğuk başlangıç problemine direnç güçlü; ama sürpriz öneri vermez. - İşbirlikçi süzme (collaborative filtering): "sana benzer kullanıcılar şunu sevdi" mantığı. User-based (benzer kullanıcıları bul) ya da item-based (sevdiğin ürünlerle birlikte beğenilenleri bul). Matrix factorization (SVD, ALS) bu ailenin klasiği. - Hibrit: ikisinin kombinasyonu — modern büyük platformlarda standart. Bunun üzerine derin öğrenme (Two-Tower modelleri, Transformer-based recommenders, sequence-aware modeller) eklenir.
Önerinin kalitesi sadece doğruluk değildir. Çeşitlilik (kullanıcıyı küçük bir kovukta hapsetme), yenilik (daha önce görmediği şeyler), şaşırtma (serendipity) ve adillik (filtre balonları, küçük yaratıcılara şans) hepsi metrik olarak izlenir. Tek bir "doğru tahmin" yerine listenin bütününün davranışsal kalitesi ölçülür.
İyi bir kitabevi tezgâhtarının yaptığı işe benzer. Sen bir polisiye almışsın; tezgâhtar bunu hafızasında tutar. Ertesi sefer geldiğinde ya senin daha önce sevdiğin yazarın yenisini önerir (içerik tabanlı), ya da "senin gibi polisiye sevenler son zamanlarda şu Japon yazarı keşfetti" der (işbirlikçi). İyi tezgâhtar bunu doğal dengeyle yapar — ne hep aynı yazarı önerir, ne de tamamen alakasız kitap.
Bir müzik servisinin "Sana özel" listesi şöyle çalışır:
1. Aday üretme (candidate generation): 50 milyon şarkı arasından kullanıcının vektör temsiline yakın 1000 aday şarkı, ANN (FAISS/HNSW) ile saniyede çekilir. 2. Sıralama (ranking): 1000 aday, kullanıcı + şarkı özelliklerini alan bir gradient boosting (veya ranking transformer) ile 0–1 arası skor alır. Skoru en yüksek 50 şarkı seçilir. 3. Re-ranking (yeniden sıralama): çeşitlilik (aynı sanatçıyı arka arkaya koyma), yenilik (daha önce dinlemediği şarkılara ağırlık), iş kuralları (yeni çıkmış şarkıyı tanıt) uygulanarak son 30 şarkı listelenir.
Üç aşamalı bu mimari (candidate / rank / re-rank) modern öneri sistemlerinin standardıdır. Eğitim verisi, kullanıcının önerilen şeylere verdiği örtük (tıkla, dinle, atla) ve açık (beğen, kaydet, paylaş) sinyallerden gelir.
import scipy.sparse as sp
from implicit.als import AlternatingLeastSquares
# Sparse matris: kullanıcı × ürün, hücreler = etkileşim sayısı
# Çok yüksek boyutlu, çoğu hücre boş — sparse formatı şart
user_item = sp.csr_matrix(...)
model = AlternatingLeastSquares(
factors=64,
regularization=0.01,
iterations=20,
use_gpu=False,
)
model.fit(user_item)
# Kullanıcı 42 için en alakalı 10 ürün
recs = model.recommend(42, user_item[42], N=10)
for item_id, score in recs:
print(f"item {item_id}: {score:.3f}")
# Benzer ürünleri de sorgulayabilirsin (item-item)
similar = model.similar_items(item_id=123, N=5)import torch
import torch.nn as nn
class TwoTower(nn.Module):
def __init__(self, n_users, n_items, dim=64):
super().__init__()
self.user_emb = nn.Embedding(n_users, dim)
self.item_emb = nn.Embedding(n_items, dim)
self.user_mlp = nn.Sequential(nn.Linear(dim, dim), nn.ReLU(), nn.Linear(dim, dim))
self.item_mlp = nn.Sequential(nn.Linear(dim, dim), nn.ReLU(), nn.Linear(dim, dim))
def forward(self, user_ids, item_ids):
u = self.user_mlp(self.user_emb(user_ids))
i = self.item_mlp(self.item_emb(item_ids))
# Skor = cosine benzerlik (veya iç çarpım)
return (u * i).sum(dim=-1)
# Eğitim sonrası ürün vektörleri ANN dizinine indekslenir,
# kullanıcı sorgusu canlıda milisaniyede en yakın N öğeye eşlenir.- Çok sayıda öğe (binlerce+) arasından kişiselleştirme yapılacaksa
- Kullanıcı etkileşim verisi (tıklama, izlenme, satın alma) bolsa
- Anasayfa, e-mail, push notification kişiselleştirilecekse
- Cross-sell, ilgili ürünler, 'bunu da beğenir misin' deneyimleri
- Az sayıda öğe varsa (10-50) — basit kurallar daha şeffaf ve etkili
- Yeterli etkileşim verisi yoksa — soğuk başlangıç problemleri
- Adillik ve çeşitlilik kritikse ve baseline modeli değerlendiremiyorsan
Filtre balonu / pekiştirme
Sistem sadece geçmişte beğenileni önerirse kullanıcı küçük bir kovuga sıkışır. Çeşitlilik ve serendipity metrikleri ile dengeleme şart.
Soğuk başlangıç
Yeni kullanıcı / yeni ürün için geçmiş etkileşim yoktur. Çözüm: içerik özelliklerine düşmek, popüler ürünleri göstermek, hızlı onboarding profil çıkarımı.
Offline metriklere takılmak
AUC, NDCG, MAP yüksek olabilir ama gerçek kullanıcı klikleri farklı çıkabilir. A/B test ile online metrik (CTR, conversion, retention) ölçmeden 'iyi model' diyemezsin.