深入理解:推薦系統中的召回與排序(一)
編輯導語:推薦系統通過對用戶行為喜好的預測進行信息過濾,進而為用戶瀏覽進行推薦行為。一方面,推薦系統可以提升用戶的信息閱讀體驗,另一方面,產品和平臺也有助于借此留存用戶、提高用戶轉化率。本篇文章里,作者對推薦系統中的召回和排序做了詳細介紹,讓我們來看一下。
2021年,距互聯網曾經的百團大戰已有近十年之久,隨著時間的不斷推進,技術發展也是日新月異。
從電商角度看,傳統的“人找貨”變成了“貨找人”;從內容角度看,由信息的主動獲取,到從海量信息中被動接收和挖掘有效信息。而這些都依賴于推薦系統。
對于用戶而言,它作為一種“信息過濾的手段”,能夠在當前信息過載的場景下,最大限度地提升用戶的使用效率,建立用戶對產品的信任和深度鏈接。
對于產品和公司而言,能夠極大地提升用戶活躍度與留存,提高用戶轉化率,這將為產品帶來巨大的商業價值。
記得最早將推薦系統應用到工業界的是Amazon(亞馬遜),僅僅是03年,它將傳統的協同過濾算法應用在“人貨匹配”的領域,開拓了電商的一條全新道路。如今的推薦系統經過技術的不斷更迭,變得更加AI化、智能化。機器學習與深度學習的發展不斷為其賦能,使“推薦”成為當今產品的標配。
我們進入AI的時代,產品和技術的邊界,未來將變得越來越模糊,某個層面講,有效策略的提出也往往依賴于對于技術的理解。本篇著重對于推薦模型中的召回和排序兩個模塊進行闡述。
一、整體框架
首先,如果要保證整個推薦系統的推薦精準度,需要依賴大量的基礎樣本數據,在離線條件下,將大量的樣本數據“喂”給推薦模型,推薦模型將會擬合出一套普適性的算法公式,從而當每一位用戶來到產品時,都能夠基于用戶數據帶入到算法公式中,在模型的輸出層得到一個結果。
這個結果是具有置信度的,將其推薦給用戶,隨著用戶不斷對推薦系統給出的結果進行反饋,用戶的特征也會變得越來越豐富,從而推薦精準度也會越來越高,促成一個良性循環。
推薦系統的大致結構如上圖所示,整體流程如下。
用戶來到推薦頁時,根據不同用戶的用戶數據、物品數據、所處的上下文信息等,從海量的候選物品集合中,分別經歷召回層、排序層、重排序層,拉回K個用戶最有可能喜歡的物品,形成最終的推薦列表(這里的物品為泛指,可以指商品、內容等)。
二、模塊構成
1. 用戶數據
第一類是用戶的自有屬性,包括年齡、性別、住址、職業、婚戀狀態、受教育程度、消費水平等。
第二類是用戶的行為數據,分為隱式反饋(如瀏覽、點擊、收藏、購買)和顯示反饋(如對物品的評分、評價)兩類,但其中隱式反饋要比顯示反饋更有價值,可用性更強。因為前者一定程度上能夠代表用戶真實的心理訴求,且數據量龐大,而后者數據較為稀疏。
第三類是用戶的關系數據,分為強關系(如互相關注)與弱關系(互相點贊、評論),關系數據一般也可用于召回策略。
2. 物品數據
一般代表物品的自有屬性,比如商品在入庫時,一定會有商品的分類、型號、標簽等;內容也會有分類、標簽、文章長度、關鍵詞等。除此之外還有一些統計類數據,例如商品/內容點擊率,歷史點贊數等等。
3. 上下文信息
描述推薦行為產生時的場景的信息,我們最常用的一般是時間(早中晚、節假日)和地點(基于LBS),此外還有天氣等等。
4. 候選物品集合
一個龐大的、集海量物品為一體的“大倉庫”。以電商為例,商品集可能是幾十萬量級甚至是百萬量級。此外,推薦系統的上限,一定程度上受制于候選集的數量。換句話說,候選集的數量決定了推薦系統的天花板。
5. 召回層
理想情況下,除去計算承受能力和計算速度的約束,那么我們可以直接略過召回層,直接對百萬量級的商品進行排序,然后反饋給用戶。
但這是不現實的,因此召回層的意義在于縮小對商品的計算范圍,將用戶感興趣的商品從百萬量級的商品中進行粗選,通過簡單的模型和算法將百萬量級縮小至幾百甚至幾十量級。這樣用戶才能有機會在毫秒的延遲下,得到迅速的商品反饋。
召回層的特點是:數據量大、速度響應快、模型簡單、特征較少。
6. 排序層
排序層的目的是得到精確的排序結果,也是推薦系統產生效果的重點,更是深度學習等應用的核心。從召回層召回的幾百個物品,進行精準排序,根據規則對每個商品賦予不同的得分,由高至低來排序。由于精確度的要求,排序層的模型一般比較復雜,所需要的特征會更多。
排序層的特點是:數據量少、排序精準、模型復雜、特征較多。
7. 重排序層
重排序層也可以稱之為業務排序層,這一環連接著排序層和即將給用戶展示的推薦列表。
物品在排序層排好序之后,不一定完全符合業務要求和用戶體驗,有時我們還需要兼顧結果的多樣性、流行度、新鮮度等指標,以及結果是否符合當前產品發展階段某些流量的傾斜策略等,實施特定的業務策略,來對當前已經排好序的物品進行再次排序。比如物品的提權、打散、隔離、強插等。
舉個實際的例子,一個內容平臺,假設有A、B、C三類內容,我們不想讓A類型的內容連續出現3次以上,就需要加一些干擾規則,將A類內容進行打散處理,使得用戶最終看到的推薦列表是符合業務上的預期的。
重排序的特點是:重業務需求、重用戶體驗。
三、經典的模型算法
這個部分簡單談談幾個我認為應用面非常廣泛且非常核心的模型算法(后續可能會繼續補充),在這里只做簡要介紹,不做太多公式上的說明。
1. 基于用戶的協同過濾(UserCF)
首先,UserCF基于這樣一個前提假設:喜歡相似物品的用戶之間,存在著相似的興趣偏好。
以電商為例,假設電商庫存中有a、b、c、d四件商品,平臺上一共有A、B、C、D、E五位用戶,根據用戶在平臺上的行為和動作,我們基本能夠獲取到每位用戶對于a、b、c、d四件商品大致的偏好程度。
如何衡量偏好程度呢?可以采用打分的方式,根據用戶對于物品的顯示反饋或隱式反饋,來綜合得出對于物品的打分,比如對商品點贊加1分,踩一下減1分,瀏覽商品加1分,收藏加2分,購買加3分(這里的打分方式只是用于說明問題,實際可能會略復雜一些),這樣就可以得出每個用戶對于每個物品的綜合打分。
但這里一定會存在用戶與某個物品尚未產生交互行為的情況,那么對應的分值就為“空”,也可以取0分或者是取縱向的平均分來代替空值。
最后得到如下圖的矩陣形式,這樣的矩陣也稱之為“共現矩陣”。
說回到UserCF,如果我們想預測用戶E對于物品c的偏好,那么基于UserCF的思想,就需要找到與用戶E最相似的用戶,因為前面已經做出了假設,與用戶E最相似的用戶對于物品c的評分最有可能是用戶E對于物品c的真實打分,其置信度是最高的。
那么可以通過用戶向量間余弦相似度的方式來尋找最相似的k個用戶,夾角越小,兩個用戶就越相似。
sim(i,j)=cos(i,j)
得到相似度之后,相似度就可以作為置信權重來綜合對k個相似用戶的打分,得到最終預測打分。
UserCF的應用場景和優缺點:
- 因為UserCF是基于用戶相似度的推薦,所以它具備了非常強的社交屬性,容易通過社交關系來傳播符合用戶口味的東西,因此它更適用于新聞推薦這樣的場景,一方面新聞內容具有實時性、熱點性,而UserCF更擅長于捕捉這一類的內容。另一方面,新聞內容的數量要遠遠多余用戶數量,因此計算向量相似度時,要比ItemCF的時間復雜度更低。
- 新用戶往往歷史行為數據非常稀疏,可能會得到【0,0,0,0,0,…..,1】這樣的向量,導致根據用戶相似度推薦的物品準確度和置信度會非常低。也就是說如果遇到低頻應用以及用戶冷啟動會比較麻煩,不太適用。
- 還有一種情況是,用戶數遠遠多于商品數,用戶數的不斷增長會導致用戶相似度矩陣難以維護,它用到的存儲空間的增長速度是呈指數級的。
2. 基于物品的協同過濾(ItemCF)
首先,ItemCF基于這樣一個前提假設:用戶對于不同物品間的偏好相似,那么物品間也是相似的。
它的原理與UserCF類似,還是上面那張圖,可以看作是UserCF的另一面。ItemCF采用縱向的向量,作為物品的表示向量,可以通過物品向量間余弦相似度的方式來尋找最相似的k個物品,夾角越小,兩個物品就越相似。
得到相似度之后,相似度就可以作為置信權重來綜合k個相似物品的打分,得到最終預測打分。
ItemCF的應用場景和優缺點:
- 因為UserCF有一些明顯的缺點,所以Amazon和Netflix最早應用的都是ItemCF,它相比用戶向量,物品的向量變化要更為穩定,因此廣泛用于電商和視頻推薦的領域,當用戶對某一類商品或某一類電影產生興趣時,此時給Ta推薦同類型的商品或電影是一個可靠的選擇。
- ItemCF不具備很強的泛化能力。當一個熱門商品出現后,它容易和大量的商品都具有相似性,導致推薦商品時,熱門商品的出現概率會非常高,形成了“頭部效應”,同樣也致使處于長尾的商品較難被挖掘,因為長尾商品的特征向量會非常稀疏。所以要想解決這個問題,需要后期添加一些干預策略在里面。
3. 矩陣分解(隱向量的表達)
矩陣分解算法是基于協同過濾進化而成的,它可以認為是一種以數學的方式來優化了協同過濾算法。
前面提到,協同過濾的計算核心是生成了“共現矩陣”,那么我們可以將這個共現矩陣繼續拆分,形成一個用戶矩陣和一個物品矩陣,也就是得到了用戶的隱向量和物品的隱向量,這樣就能夠用隱向量的距離來選取用戶感興趣的物品了。它的思想和embedding(下文會提到)非常相似,泛化能力極強。
共現矩陣中的每一個小單元中對應的評分,約等于,對應用戶矩陣中行向量與物品矩陣中列向量每個位置對應元素的乘積之和。
如上圖所示,共現矩陣是n×n維的,用戶矩陣是n×k維的(圖中k=2),物品矩陣是k×n維的。其中k值根據具體工程而定。其中k值越小,模型泛化能力越強。k值越大,模型泛化能力越差,但表達能力越強。
至于如何得到這樣的用戶矩陣和物品矩陣,采用的是機器學習中的梯度下降法,并且最小化損失函數,得到的最優近似解。具體不展開論述了。
4. 邏輯回歸(LR)
說到邏輯回歸算法,它實在是太經典了,而且應用非常非常廣泛,甚至可以說是深度學習神經網絡的基礎。在深度學習模型中,一般常作為神經網絡的輸出層。先看一下邏輯回歸的圖像:
可以看出,邏輯回歸可以將所有的輸入全部映射到0到1之間,因為0和1的存在,邏輯回歸可以廣泛應有于二分類問題。
在工業界,我們應用邏輯回歸模型,通常是將【0~1】這個值域轉化為對概率的預測,因為概率就是從0到1的。一個二分類問題就可以等價于,對于一個樣本是否是正樣本的概率(可以是點擊率CTR)進行預測,最后根據預測的概率值,從上至下來對推薦列表排序(有時在極限情況下,我們甚至可以認為,當輸入只要大于0時,輸出就為1;當輸入只要小于0時,輸出就為0,從而簡化模型)。
1)邏輯回歸的優勢
與傳統的協同過濾不同,協同過濾僅利用了用戶對物品的偏好特征,忽略了用戶特征、物品特征,以及場景特征。協同過濾會丟失掉大量的尚未利用的有效信息,導致給出的結果并不是最權威的。
邏輯回歸能夠很好避免這一點,它能夠將用戶、物品、上下文、歷史行為特征全部融入進模型中,并分別為每一組特征擬合出每一組權重,最后得到的結果更具有可信度。
2)邏輯回歸的推薦流程
- 獲取大量的樣本數據。將用戶屬性、物品屬性、時間、地點等特征全部轉換為數值型特征向量。
- 以點擊率CTR為優化目標,將所有的特征向量輸入進模型中,經過一段時間的訓練,為每一組特征擬合出一個權重參數。
- 模型上線時,每個用戶實時的數據特征,經過模型處理后,為物品得到用戶可能點擊的概率,根據概率由上至下排序,將反饋出一個推薦列表。
有些同學看到這可能會有疑問了,像用戶年齡、商品價格、文章點贊數這些,都可以很方便地轉換為數值型特征向量,可是像用戶ID、用戶性別、時間、地點呢?本身不是數值類型的屬性,是如何轉換的呢?
這其實涉及到one-hot編碼,以及multi-hot編碼。舉個例子,對于結構化的數據(比如性別、星期幾)都可以用向量的方式來表示,比如[1,0,0]可以代表一個男性,[0,1,0]可以代表一個女性,[0,0,1]可以代表性別未知;星期幾也是同理,一周有七天,就有七個維度,[1,0,0,0,0,0,0]就可以代表星期一,依此類推。
四、召回策略
1. 多路召回策略
在召回層這個階段,我們一方面希望能夠召回盡量多的物品,提升召回物品的豐富度。也就是說,我們希望召回的這些物品的覆蓋面盡可能全,這里有一個計算指標,叫做召回率。
另一方面,如果召回了特別多的物品,雖然滿足我們對召回覆蓋面的預期,但隨著物品數量增多,又會極大地影響計算機的計算速度。
在兩方面的權衡之下,我們通常采用一種方法叫做多路召回策略。但召回策略是強依賴于業務的,每個不同的產品處在不同的時期,所用到的召回策略也不盡相同。
多路召回策略簡單地說,就是采用了多種類型的小型策略,每一種小型策略分別從候選集中召回一定數量的物品,這樣我們就會得到召回物品的一個大的組合,進而將這個組合再交付到排序層進行排序。
多路召回的好處在于:
- 它依賴于小型策略的簡單模型的計算,能夠大幅降低響應時間;
- 多路的特點能夠同時應用多種小型策略,一定程度避免的單一策略召回所導致的精確度的缺陷。
2. 基于Embedding的召回
這種召回方法偏向于技術層面,我認為策略PM可以做一個大致了解,先簡單談談什么叫做Embedding。
Embedding可以等價類比為“向量化”或“向量映射”,是一種向量的映射方式。Embedding的作用就是將一個高維稀疏的特征向量映射(或者叫轉化)為一個低維稠密的特征向量,同時保留原有高維向量的顯著特征。Embedding是整個深度學習框架中不可或缺的第一個層級(其實就是用于特征轉換)。例如前面提到的“矩陣分解”,就可以看作是Embedding的一個變種。
那么什么是基于Embedding的召回呢?
這里有一個前提,就是說如果用戶特征與物品特征這兩者被抽象出的Embedding向量是相似的(向量離得最近),那么該用戶就越可能喜歡該物品,從而將該物品從候選集中召回。好了,那么問題就可以等價更該為:如何為用戶Embedding去尋找最相似的物品Embedding?
最傳統的計算方式是對用戶和物品的Embedding進行向量內積運算,這代表著需要對每一位用戶的Embedding,都要把候選集中的海量物品對應的Embedding向量都做一遍匹配計算,這意味著非常龐大的時間復雜度。
因此引申出了另一種方式去計算Embedding相似度,既然兩者同屬于一個向量空間,那么找到與用戶Embedding向量最相似的物品Embedding向量就可以理解為是:基于用戶向量去搜索與用戶向量最鄰近向量的過程,這種方式稱之為“局部敏感哈希(Locality Sensitive Hashing, LSH)”。
局部敏感哈希的原理我就不在這里贅述了,原理略微偏數學一些,可能與產品扯得越來越遠了,有興趣的同學可以查查百度。不過基于Embedding的召回方式是非常有實踐意義的,Youtube推薦系統在召回層就是利用了這個召回策略。
總的來說,它有幾個好處。
- 多路召回的小型策略(比如熱門排行、最近流行等)等信息都可以作為Embedding召回方法中的附加信息,帶入到向量中,所以也相當于具備了多路召回的能力。
- 基于Embedding的召回可以使得物品分值更具有連續性,因為多路召回策略中,各個小型策略近似可以認為是相互獨立的,所以不同召回策略下的候選集是不具備可比性的,無法決定每個小型策略放回候選集的大小。而Embedding召回可以把相似度作為唯一指標,能夠隨意限定召回的候選集大小。
五、排序策略
排序一直是推薦系統的核心部分,排序模塊目前一般使用機器學習和深度學習的技術來提供“千人千面”的排序結果,屬于典型的技術驅動的模塊。如前文所提,排序模塊分為兩大塊,一塊叫做排序層(機器學習),另一塊叫做重排序層(業務排序層)。
對于涉及機器學習和深度學習的排序層,它十分依賴于算法模型給出的排序結果。一般情況下通過優化模型和調參,或是輸入大量有價值的樣本數據,通過一段時間后的訓練基本可以達到一個較為穩定的水平。機器的表現固然很好,但最終的推薦列表是給用戶展示的,也會不可避免的出現各種各樣的問題。
舉個例子,一個視頻內容平臺,某一個秀身材的美女視頻我點進去看了一眼,或者我不小心誤觸進去了,那么同樣類型題材的視頻就會連續不斷地推給我。這不僅是算法越推越窄的問題,實際上是缺乏對新穎性和多樣性的考慮,缺乏對排序的干預處理。所以在推薦系統的開發之前就需要考慮它的適應性和可調整性。
排序主要是為了解決重要性的問題。排序越靠前的內容,對于用戶而言重要程度越高。對于業務和產品而言,不同時期、不同階段對于不同用戶給出的排序規則一定是不同的,下面介紹一些常用的排序策略。
1. 熱度策略
熱度算法一般是用來推薦比較熱門的內容,近期入庫且曝光點擊率高的,需要用多個維度分別賦予不同的權重來召回內容。公式大致如下,受制于一些因素,不宜公開特別詳細,可以簡單體會一下里面大概的思路即可。
內容熱度=[a*內容瀏覽量+b*(收藏量+分享數)-c*(舉報量+被踩量)]*點擊率倍數
2. 流行度降權
暢銷榜單上的熱門物品,其實更容易被推薦,尤其是使用ItemCF時,頭部效應會變得更加明顯,為了解決長尾曝光的能力,可以將熱門物品適當降權,讓長尾物品更有競爭力。如此,推薦系統給出的原始打分將會被再次修正。
流行度降權的一種計算方式如下所示,r(ui)是推薦系統給出的原始分值,M(i)是物品的銷量,a是一個可調節的參數,它的意義在于保護銷量小于a的物品不被降權。
當然除此之外還有更多其他函數可以使用,比如分段函數,我們可以根據銷量在不同的范圍,分別給定不同的降權系數。
3. 時間衰減
時間衰減的概念最早來源于牛頓冷卻定律,物體所損失熱的速率與周圍環境溫度差是成正比的。在內容實時性方面,針對缺乏實時性的內容,我們可以利用一個類似的時間衰減算法來給這類內容做降權處理。
如下所示,r(ui)是推薦系統給出的原始分值,t0-t代表當前時間與過去某一時刻的時間相差多久,b是控制衰減速度的參數,b越大衰減速度越慢,b越小衰減速度越快。
4. 內容打散
如何解決相同類型內容連續不斷的推薦給用戶的問題呢?其實最簡單的做法就是直接加入業務規則來限制。
比如曝光點擊率高的優先排序,此外同一類型的內容連續不得超過3個,若超過3個,就將這些內容之后第一個不屬于此分類的內容,強制插入到前面的結果中去。
這種做法一般比較麻煩且效果有限。一個比較好用的內容打散算法如下所示,它能夠拉大同類內容的區分度,從而使得不同的內容實現混插。其中V(k,j)代表推薦結果中,分類k中排序為j的商品的推薦分數。V(k,j)”代表最終修正后的推薦分數。u代表離散率,越接近于0,則離散性越強。
六、總結
首先很感謝你能耐心地看到這里,不過受制于篇幅所限,很多內容無法完整展開。
其實對于推薦系統而言,說復雜也復雜,說簡單其實把它看透了也是很容易理解的。
當然推薦系統的知識遠不止于此,作為一個產品上線時,如何進行評估推薦系統的好與壞?如何進行正確的AB測試來驗證策略手段是否正確?后續應該還會持續添加相關的內容,并且下一個主題想和大家聊一聊搜索相關的玩法。嚴格來講,搜索和推薦其實是不分家的,推薦可以個性化,那么搜索更是可以,因為它正是推薦的另一面。
本文由 @尋跡 原創發布于人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
請問還有再更新嘛,或者其他平臺有在更嘛~
作者是產品還是算法呀,寫得很不錯,條理清晰、深入淺出,??
期待下一篇
如何檢驗效果好不好,期待下一篇分享
我想問下上述幾種排序策略是重排序層的嗎?用戶偏好之類的是在排序層還是重排序層呢
剛接觸,收獲很多