Öneri seçiminin kalitesi ve hızı üzerinde nasıl çalışıyoruz?

Adım Pavel Parkhomenko, makine öğrenimi geliştiricisiyim. Bu yazımda Yandex.Zen hizmetinin yapısından bahsetmek ve uygulanmasıyla önerilerin kalitesinin artırılmasını mümkün kılan teknik iyileştirmeleri paylaşmak istiyorum. Bu yazıdan, milyonlarca belge arasından kullanıcı için en uygun olanı yalnızca birkaç milisaniyede nasıl bulacağınızı öğreneceksiniz; yeni belgelerin vektörlerini onlarca dakika içinde alması için büyük bir matrisin (milyonlarca sütun ve on milyonlarca satırdan oluşan) sürekli ayrıştırılmasının nasıl yapılacağı; video için iyi bir vektör temsili elde etmek amacıyla kullanıcı makalesi matris ayrıştırmasının nasıl yeniden kullanılacağı.

Öneri seçiminin kalitesi ve hızı üzerinde nasıl çalışıyoruz?

Öneri veritabanımız, çeşitli formatlarda milyonlarca belge içerir: platformumuzda oluşturulan ve harici sitelerden alınan metin makaleler, videolar, anlatımlar ve kısa gönderiler. Böyle bir hizmetin geliştirilmesi çok sayıda teknik zorlukla ilişkilidir. Bunlardan bazıları:

  • Bilgi işlem görevlerini bölün: tüm ağır işlemleri çevrimdışı yapın ve 100-200 ms'den sorumlu olmak için modellerin yalnızca hızlı uygulamasını gerçek zamanlı olarak gerçekleştirin.
  • Kullanıcı işlemlerini hızla dikkate alın. Bunun için tüm olayların anında tavsiye verene iletilmesi ve modellerin sonuçlarına etki etmesi gerekmektedir.
  • Feed'i, yeni kullanıcıların davranışlarına hızla uyum sağlayacak şekilde yapın. Sisteme yeni katılan kişiler, geri bildirimlerinin önerileri etkilediğini hissetmelidir.
  • Yeni bir makaleyi kime önereceğinizi hızla anlayın.
  • Sürekli yeni içeriklerin ortaya çıkmasına hızla yanıt verin. Her gün onbinlerce makale yayınlanıyor ve bunların çoğunun sınırlı bir ömrü var (mesela haberler). Onları filmlerden, müzikten ve diğer uzun ömürlü ve yaratılması pahalı içeriklerden ayıran şey budur.
  • Bilgiyi bir etki alanından diğerine aktarın. Bir öneri sistemi metin makaleleri için eğitilmiş modeller içeriyorsa ve buna video eklersek, yeni içerik türünün daha iyi sıralanması için mevcut modelleri yeniden kullanabiliriz.

Bu sorunları nasıl çözdüğümüzü anlatacağım.

Adayların seçimi

Sıralama kalitesinde neredeyse hiç bozulma olmadan, incelenmekte olan belge sayısı birkaç milisaniye içinde binlerce kez nasıl azaltılabilir?

Birçok ML modelini eğittiğimizi, bunlara dayalı özellikler oluşturduğumuzu ve belgeleri kullanıcı için sıralayan başka bir model eğittiğimizi varsayalım. Her şey yoluna girecek, ancak bu belgelerden milyonlarca varsa ve önerilerin 100-200 ms'de oluşturulması gerekiyorsa, tüm belgeler için tüm işaretleri gerçek zamanlı olarak alıp hesaplayamazsınız. Görev, milyonlarca arasından kullanıcı için sıralanacak belirli bir alt kümeyi seçmektir. Bu aşamaya genellikle aday seçimi denir. Bunun için çeşitli gereksinimler var. İlk olarak, sıralamanın kendisine mümkün olduğu kadar çok zaman kalması için seçimin çok hızlı gerçekleşmesi gerekiyor. İkinci olarak, sıralama için belge sayısını büyük ölçüde azalttık, kullanıcıyla ilgili belgeleri mümkün olduğunca eksiksiz korumalıyız.

Aday seçimi prensibimiz gelişti ve şu anda çok aşamalı bir şemaya ulaştık:

Öneri seçiminin kalitesi ve hızı üzerinde nasıl çalışıyoruz?

Öncelikle tüm belgeler gruplara ayrılır ve her gruptan en popüler belgeler alınır. Gruplar siteler, konular, kümeler olabilir. Her kullanıcı için geçmişine göre kendisine en yakın gruplar seçilir ve onlardan en iyi belgeler alınır. Ayrıca gerçek zamanlı olarak kullanıcıya en yakın olan belgeleri seçmek için kNN indeksini kullanırız. Bir kNN dizini oluşturmak için çeşitli yöntemler vardır; bizimki en iyi sonucu verdi HNSW (Hiyerarşik Gezinilebilir Küçük Dünya grafikleri). Bu, milyonlarca veri tabanından bir kullanıcı için en yakın N vektörü birkaç milisaniyede bulmanızı sağlayan hiyerarşik bir modeldir. Öncelikle tüm belge veritabanımızı çevrimdışı olarak indeksliyoruz. Dizinde arama oldukça hızlı çalıştığından, birkaç güçlü yerleştirme varsa, birkaç dizin oluşturabilir (her yerleştirme için bir dizin) ve bunların her birine gerçek zamanlı olarak erişebilirsiniz.

Her kullanıcı için hâlâ on binlerce belgemiz var. Bu, tüm özellikleri saymak için hala çok fazla, bu nedenle bu aşamada, daha az özelliğe sahip, hafif, ağır bir sıralama modeli olan hafif sıralamayı kullanıyoruz. Görev, ağır bir modelin en üstte hangi belgelerin bulunacağını tahmin etmektir. Ağır modelde yani sıralamanın son aşamasında en yüksek tahmine sahip belgeler kullanılacaktır. Bu yaklaşım, kullanıcı için dikkate alınan belge veritabanını on milisaniyede milyonlardan binlere indirmenize olanak tanır.

Çalışma zamanında ALS adımı

Bir tıklamanın hemen ardından kullanıcı geri bildirimleri nasıl dikkate alınır?

Önerilerdeki önemli bir faktör, kullanıcı geri bildirimlerine verilen yanıt süresidir. Bu özellikle yeni kullanıcılar için önemlidir: Bir kişi öneri sistemini yeni kullanmaya başladığında, çeşitli konularda kişiselleştirilmemiş bir belge beslemesi alır. İlk tıklamayı yaptığı anda bunu hemen dikkate alıp onun ilgi alanlarına uyum sağlamanız gerekiyor. Tüm faktörleri çevrimdışı olarak hesaplarsanız, gecikme nedeniyle hızlı bir sistem yanıtı imkansız hale gelecektir. Bu nedenle kullanıcı eylemlerinin gerçek zamanlı olarak işlenmesi gerekir. Bu amaçlar doğrultusunda, kullanıcının vektör temsilini oluşturmak için çalışma zamanında ALS adımını kullanırız.

Tüm belgeler için bir vektör temsilimiz olduğunu varsayalım. Örneğin, ELMo, BERT veya diğer makine öğrenimi modellerini kullanarak bir makalenin metnine dayalı olarak çevrimdışı yerleştirmeler oluşturabiliriz. Aynı uzaydaki kullanıcıların sistemdeki etkileşimlerine dayalı vektör temsilini nasıl elde edebiliriz?

Kullanıcı-belge matrisinin oluşumu ve ayrıştırılmasının genel ilkesiM kullanıcımız ve n belgemiz olsun. Bazı kullanıcılar için belirli belgelerle ilişkileri bilinmektedir. Daha sonra bu bilgiler bir mxn matrisi olarak temsil edilebilir: satırlar kullanıcılara, sütunlar ise belgelere karşılık gelir. Kişi belgelerin çoğunu görmediğinden matris hücrelerinin çoğu boş kalacak, diğerleri ise dolu olacaktır. Her etkinlik için (beğenme, beğenmeme, tıklama) matriste bir değer sağlanır - ancak beğenmenin 1'e ve beğenmemenin -1'e karşılık geldiği basitleştirilmiş bir model düşünelim.

Matrisi ikiye ayıralım: P (mxd) ve Q (dxn), burada d, vektör temsilinin boyutudur (genellikle küçük bir sayı). Daha sonra her nesne d boyutlu bir vektöre karşılık gelecektir (kullanıcı için - P matrisindeki bir satır, bir belge için - Q matrisindeki bir sütun). Bu vektörler karşılık gelen nesnelerin yerleştirmeleri olacaktır. Bir kullanıcının bir belgeyi beğenip beğenmeyeceğini tahmin etmek için yerleştirmelerini çoğaltmanız yeterlidir.

Öneri seçiminin kalitesi ve hızı üzerinde nasıl çalışıyoruz?
Bir matrisi ayrıştırmanın olası yollarından biri ALS'dir (Alternatif En Küçük Kareler). Aşağıdaki kayıp fonksiyonunu optimize edeceğiz:

Öneri seçiminin kalitesi ve hızı üzerinde nasıl çalışıyoruz?

Burada rui u kullanıcısının i belgesi ile etkileşimidir, qi i belgesinin vektörüdür, pu u kullanıcısının vektörüdür.

Daha sonra ortalama kare hatası açısından en uygun kullanıcı vektörü (sabit belge vektörleri için), ilgili doğrusal regresyonun çözülmesiyle analitik olarak bulunur.

Buna "ALS adımı" denir. Ve ALS algoritmasının kendisi, matrislerden birini (kullanıcılar ve makaleler) dönüşümlü olarak düzeltip diğerini güncelleyerek en uygun çözümü bulmamızdır.

Neyse ki kullanıcının vektör temsilini bulmak, çalışma zamanında vektör talimatlarını kullanarak yapılabilecek oldukça hızlı bir işlemdir. Bu hile, sıralamada kullanıcı geri bildirimlerini anında dikkate almanızı sağlar. Aday seçimini geliştirmek için aynı yerleştirme kNN indeksinde de kullanılabilir.

Dağıtılmış İşbirliğine Dayalı Filtreleme

Artımlı dağıtılmış matris çarpanlarına ayırma nasıl yapılır ve yeni makalelerin vektör temsilleri nasıl hızlı bir şekilde bulunur?

Öneri sinyallerinin tek kaynağı içerik değildir. Bir diğer önemli kaynak ise işbirlikçi bilgilerdir. İyi sıralama özellikleri geleneksel olarak kullanıcı-belge matrisinin ayrıştırılmasıyla elde edilebilir. Ancak böyle bir ayrıştırma yapmaya çalışırken sorunlarla karşılaştık:

1. Milyonlarca belgemiz ve on milyonlarca kullanıcımız var. Matris tamamen tek bir makineye sığmaz ve ayrışma çok uzun zaman alacaktır.
2. Sistemdeki içeriğin çoğunun ömrü kısadır: belgeler yalnızca birkaç saatliğine alakalı kalır. Bu nedenle vektör temsillerinin mümkün olduğunca çabuk oluşturulması gerekmektedir.
3. Belge yayınlandıktan hemen sonra bir ayrıştırma oluşturursanız, yeterli sayıda kullanıcının bunu değerlendirmek için zamanı olmayacaktır. Bu nedenle vektör gösterimi büyük olasılıkla çok iyi olmayacaktır.
4. Bir kullanıcı beğenir veya beğenmezse, bunu ayrıştırmada hemen dikkate almamız mümkün olmayacaktır.

Bu sorunları çözmek için kullanıcı-belge matrisinin sık aralıklarla artan güncellemelerle dağıtılmış bir ayrıştırmasını uyguladık. Tam olarak nasıl çalışır?

Diyelim ki N makineden oluşan bir kümemiz var (N yüzlercedir) ve bunlar üzerinde tek bir makineye sığmayan bir matrisin dağıtılmış ayrıştırmasını yapmak istiyoruz. Sorun, bir yandan her makinede yeterli veri olacak, diğer yandan hesaplamaların bağımsız olmasını sağlayacak şekilde bu ayrıştırmanın nasıl gerçekleştirileceğidir.

Öneri seçiminin kalitesi ve hızı üzerinde nasıl çalışıyoruz?

Yukarıda açıklanan ALS ayrıştırma algoritmasını kullanacağız. Bir ALS adımının dağıtılmış bir şekilde nasıl yürütüleceğine bakalım; geri kalan adımlar benzer olacaktır. Diyelim ki sabit bir belge matrisimiz var ve bir kullanıcı matrisi oluşturmak istiyoruz. Bunu yapmak için onu satırlarla N parçaya böleceğiz, her parça yaklaşık olarak aynı sayıda satır içerecektir. Her makineye karşılık gelen satırların boş olmayan hücrelerinin yanı sıra belge yerleştirme matrisini (tamamen) göndereceğiz. Boyutu çok büyük olmadığından ve kullanıcı-belge matrisi genellikle çok seyrek olduğundan, bu veriler normal bir makineye sığacaktır.

Bu numara, sabit matrisi birer birer değiştirerek model yakınsayana kadar birkaç dönem boyunca tekrarlanabilir. Ancak o zaman bile matrisin ayrıştırılması birkaç saat sürebilir. Ve bu, yeni belgelerin yerleştirmelerini hızlı bir şekilde almanız ve modeli oluştururken hakkında çok az bilgi bulunanların yerleştirmelerini güncellemeniz gerektiği sorununu çözmez.

Hızlı artımlı model güncellemelerinin kullanıma sunulması bize yardımcı oldu. Diyelim ki şu anda eğitilmiş bir modelimiz var. Eğitiminden bu yana kullanıcılarımızın etkileşime girdiği yeni makalelerin yanı sıra eğitim sırasında çok az etkileşime giren makaleler de oldu. Bu tür makalelerin yerleştirmelerini hızlı bir şekilde elde etmek için, modelin ilk büyük eğitimi sırasında elde edilen kullanıcı yerleştirmelerini kullanırız ve sabit bir kullanıcı matrisi verilen belge matrisini hesaplamak için bir ALS adımı yaparız. Bu, yerleştirmeleri oldukça hızlı bir şekilde (belge yayınlandıktan sonraki birkaç dakika içinde) almanıza ve çoğunlukla yeni belgelerin eklemelerini güncellemenize olanak tanır.

Önerilerde bulunmak için insan eylemlerini anında hesaba katmak için çalışma zamanında çevrimdışı olarak elde edilen kullanıcı yerleştirmelerini kullanmayız. Bunun yerine bir ALS adımı yapıyoruz ve gerçek kullanıcı vektörünü alıyoruz.

Başka bir etki alanı alanına aktarma

Bir videonun vektör temsilini oluşturmak için metin makalelerine ilişkin kullanıcı geri bildirimleri nasıl kullanılır?

Başlangıçta yalnızca metin makaleleri önerdik, dolayısıyla algoritmalarımızın çoğu bu tür içeriğe göre uyarlandı. Ancak diğer içerik türlerini eklerken modelleri uyarlama ihtiyacıyla karşı karşıya kaldık. Bir video örneğini kullanarak bu sorunu nasıl çözdük? Bir seçenek tüm modelleri sıfırdan yeniden eğitmektir. Ancak bu uzun zaman alıyor ve bazı algoritmalar, hizmetteki ömrünün ilk anlarında yeni bir içerik türü için henüz gerekli miktarda mevcut olmayan eğitim örneğinin boyutunu talep ediyor.

Biz diğer tarafa gittik ve video için metin modellerini yeniden kullandık. Aynı ALS numarası, videoların vektör temsillerini oluşturmamıza da yardımcı oldu. Metin makalelerine dayalı olarak kullanıcıların vektör temsilini aldık ve video görüntüleme bilgilerini kullanarak bir ALS adımı gerçekleştirdik. Böylece videonun vektör temsilini kolayca elde ettik. Çalışma zamanında, metin makalelerinden elde edilen kullanıcı vektörü ile video vektörü arasındaki yakınlığı hesaplıyoruz.

Sonuç

Gerçek zamanlı bir öneri sisteminin temelini geliştirmek birçok zorluğu içerir. Bu verileri etkili bir şekilde kullanmak için verileri hızlı bir şekilde işleyip ML yöntemlerini uygulamanız gerekir; minimum sürede kullanıcı sinyallerini ve yeni içerik birimlerini işleyebilen karmaşık dağıtılmış sistemler oluşturmak; ve diğer birçok görev.

Tasarımını anlattığım mevcut sistemde kullanıcıya yönelik önerilerin kalitesi, kullanıcının faaliyeti ve hizmette kalma süresiyle birlikte artıyor. Ancak elbette asıl zorluk burada yatıyor: içerikle çok az etkileşimi olan bir kişinin çıkarlarını sistemin hemen anlaması zordur. Yeni kullanıcılara yönelik önerileri geliştirmek temel hedefimizdir. Bir kişiyle alakalı içeriğin onun akışına daha hızlı girmesi ve alakasız içeriğin gösterilmemesi için algoritmaları optimize etmeye devam edeceğiz.

Kaynak: habr.com

Yorum ekle