1.推薦演算法業務入門
- 搜尋和推薦
搜尋是人找物,而推薦是物找人。搜尋一般用來滿足使用者比較明確的需求,而推薦則可以用來滿足使用者相對模糊的需求。
大家熟悉的推薦系統包括 抖音短影片、今日頭條新聞推薦、網易雲音樂每日推薦、淘寶京東的猜你喜歡推薦、B站的影片推薦等等。
大家熟悉的搜尋系統包括 谷歌百度搜尋、淘寶京東的商品搜尋欄、知乎問題搜尋欄、以及脈脈上的找人搜尋等等。
搜尋有一定的使用門檻,使用者需要輸入關鍵詞,至少要會打字吧,並相對準確地描述自己的興趣。
但推薦幾乎沒有使用門檻,使用者只要會重新整理就可以了,每次重新整理都會出來新的東西。
完成一個最簡單的推薦系統的方法就是每次請求都保證能出新的東西,也就是隨機不重複推薦。
但搜尋不能這麼簡單,你一定出來的要是和輸入相關的東西,不然就不叫搜尋了。
一個較理想的推薦系統可以做到千人千面,根據使用者偏好個性化地進行推薦。
2.推薦系統的價值
推薦系統是連線生產者和消費者的中間媒介。它對於生產者、消費者、以及平臺都有各自的價值。
以抖音短影片為例,生產者指的是影片創者,消費者是刷影片的使用者,平臺指的是抖音公司團隊。
- 對消費者:幫助消費者便捷地獲取資訊。
- 對生產者:幫助生產者獲取流量曝光和使用者增長。
- 對平臺:平臺可以透過賣廣告賺取收益。
一般來說說,使用者使用時長越長,平臺就可以插入更多的廣告。所以,推薦系統常常以使用者使用時常為核心最佳化指標。
對於生產者,推薦系統非常重要的一點特性是要具備長尾效應,即頭部的作者能獲得主要的曝光,但中小創作者也必須要能夠獲得一定的流量。
否則大部分的作者創作積極性被打壓掉之後,平臺會慢慢死掉。
我們可以看到發展比較好的推薦系統的長尾都做的非常好,像抖音、B站、快手,捧紅了非常多的草根創作者。
這一點是非常重要的。
3.推薦系統架構
如何來搭建一個推薦系統呢?
第一步,我們得知道有哪些東西可以推薦吧。這就需要一個索引池,裡面儲存了可能被推薦的全量內容的id以及它們的一些特徵。對於有些有時效性的內容,比如新聞,我們在其> 時間過期之後,要從索引池中拿掉。同時,透過稽核與控制索引池中的內容,我們可以確保不犯致命錯誤,不推薦涉黃涉非的內容給使用者。
第二步,當使用者透過登入APP或者重新整理操作觸發了一個獲取推薦資訊的請求的時候,我們得知道這個使用者當前有啥喜好吧。這就需要一個特徵服務,獲取使用者的年齡性別地域等屬
性特徵,以及根據使用者之前的瀏覽點贊等記錄計算的行為特徵,由於使用者的喜好可能變化較快且需求較高,我們需要搭建服務以保證高效能。
第三步,我們得確定把索引池中哪個內容或者哪些內容推薦給使用者吧。這就需要一個排序模組,其目的是將索引池中所有內容按照使用者可能的喜好程度進行排序。如果索引池非常> 大,排序模組通常會進一步分成 召回和排序兩個階段,有些推薦系統還會在它們中間加上一個粗排階段。此外,排序模組中通常還會使用一些打壓保送重排的策略來對模型預測
結果進行一些人為干預。
第四步,現在我們已經確定把哪些內容推薦給使用者了,那趕緊推吧! 且慢,我們還有一個展示邏輯。許多時候我們最終呈現給使用者的是圖文的混排,或者內容和廣告的混排,這個> 時候需要設計適當的展示邏輯給到前端。
Congratulations! 經過 物料索引,特徵服務,排序模組,展示邏輯 這樣4步,我們終於成功地把東西推給使用者了。現在我們是不是就可以收工,坐等數錢就行了呢?Too
young too Naive, 還有無窮無盡的監控和迭代呀。
第五步,為了監控我們的推薦是否有效,我們需要搭建日誌系統,記錄推送前後一切資訊。這些資訊包括推送前獲取的特徵、模型的排序結果 以及 推送後使用者的行為反饋。透過> 對比排序結果和使用者反饋我們可以計算點選率以及瀏覽時長評估指標,並且形成新的訓練資料來讓排序模組繼續訓練。
第六步,為了進一步迭代最佳化我們的推薦系統,我們需要做AB測試實驗,並分析實驗結果,這就需要一個分析系統,分析系統基於日誌系統的資料。AB測試一般把使用者隨機進行劃> 分為對照組(A組,不新增改進點)和實驗組(B組,新增改進點),透過對比AB之間的差異,來展示我們所加的改進點是否有效。推薦系統的迭代一般是這麼個流程,設計改進idea->> 做線下實驗->上AB試試->有效就推廣到全量。
4.召回粗排精排
推薦系統架構中的排序模組,一般會分成 召回、粗排、精排三個階段。這幾個階段,可以比喻成索引庫全部item爭奪最終展示機會的初賽,複賽 和 決賽。
召回(recall)就好像是初賽,比較簡單,效率優先。
一開始我們的索引庫中可能有數萬數十萬的item,這些item都是有資格被展示的,如果我們直接上覆雜模型對這麼多item進行排序,效能是很差的。所以我們可以先設計方法簡
單效能高效(例如雙塔模型,LR,FM以及各種規則策略)的召回模組來挖掘出原則上任何使用者有可能感興趣的東西,召回的輸出一般在幾千這樣的量級。為什麼這個環節叫做召回
呢,因為這個環節不在乎你把多少錯誤的東西放進來,但是非常在乎你沒有把對的東西放進來(漏召回)。
實踐中,召回一般都會做多路召回策略。第一種召回,是非個性化的。比如對於新使用者,我們要確保用最高質量的影片把他們留住,那麼我們可以劃一個"精品池"出來,作為一路> 召回。第二種召回,是i2i,即item-to-item。根據使用者的歷史item,來找相似的item。比如說我們把使用者過去點過讚的影片拿出來,去找畫面上,BGM上,或者使用者行為結構
上相似的影片。第三種召回是u2i,即純粹從user和item的關係出發。雙塔就是一個典型的u2i。在使用者請求過來的時候,計算出user的embedding,然後去一個事先存好的item > embedding的空間,尋找最相似的一批拿出來。由於要實時計算user特徵,它的負擔要大於前面兩者,但這種召回個性化程度最高,一般會作為主路召回。
粗排(pre-rank)就好像是複賽,中等難度,平衡精效。
召回的輸出有數千,直接上精排的話可能還是比較慢,我們可以使用一些中等複雜的模型(例如MLP,DeepFM) 對召回輸出的幾千個item進行初步的排序,輸出幾百個到最終的精
排環節。起到在召回和精排之間進行精度和效率的平衡。粗排環節不是必須的,如果索引庫中的候選的item數量很少,甚至召回環節也可不要。
精排(rank)就好像是決賽,瘋狂難度,精度優先。
精排是最純粹的排序,也是最純粹的機器學習模組。它的目標只有一個,就是根據手頭所有的資訊輸出最準的預測。精排的輸入只有幾百個,模型就可以非常複雜(例如DCN啊,
各種序列模型DIEN啊, 什麼Transformer啊, 什麼MMOE啊),是一個純粹的追求模型精度的環節。這個環節也是學術界各種相關的論文paper研究得最多的部分。
召回->粗排->精排 實際上是計算壓力從大到小,模型複雜度從小到大的一個過程。
5.打壓保送重排
在模型之外,在推薦的整個過程中還穿插著許多策略(規則)環節來輔助。
這些策略有些是為了推薦的結果更好,有些則是為了某種長期規劃或者營利訴求。
推薦系統中常用到的一些策略包括以下三種。
1,打壓。 有政策風險或者與平臺風格不符合的內容需要打壓。
2,保送。 常見的是營收原因(金主爸爸掏錢了)需要保送。此外,對於新內容,常常有一定的保送流量,以確保長尾效應,維持平臺活力。
3,重排。 重排一是確保最終推薦內容的多樣性,二是防止重複推薦使用者最近瀏覽過的內容。
6.推薦系統的侷限性
儘管各個推薦系統平臺都把自己的模型和演算法吹得天花亂墜,但實際上模型和演算法對於推薦系統的成功的貢獻是有限的,並且具有它的侷限性。
主要體現在以下幾點。
1,優質內容是根本。沒有足夠多使用者喜愛的優質內容,推薦系統的模型演算法再厲害也是無用武之地的。如果內容足夠優質,非常簡單的推薦演算法就能夠起到很好的效果。
2,存在使用者資訊繭房。推薦系統存在著過分迎合使用者偏好的傾向,讓使用者沉浸在一些短期的感覺刺激中浪費許多時間,這對使用者的長期價值可能是負的。
3,模型自己學自己。推薦系統的模型學習的資料是有偏的,都是曾經被模型選中的樣本才有可能受到使用者點贊喜歡獲得正反饋成為正樣本。雖然大部分推薦系統對新內容都有一
些隨機流量,但絕大部分樣本都沒有足夠多的流量來進行評估。可能相同的內容換個id重新再發一遍就能獲得多得多的流量,這裡面存在著很大的隨機性。