索引
推薦系統(tǒng)為什么需要索引這一概念?
索引即指 物料的ID
我們可以根據(jù)這一ID去取到物料的各種屬性字段。(正排索引)
以特征為出發(fā)點去找具備這些特征的物料姐浮。(倒排索引)基本上都使用倒排索引。
索引的意義在于 通過構建索引生成召回的候選集
主要有三步:
step1:對物料的特征構建索引 獲取對應items的結果列表 (對 嚴格來說 只有第一步是涉及 索引 后面兩步算是索引的應用)
step2:對結果列表數(shù)據(jù)進行微運算 如 計算物料質量分 物料相關性等
step3:基于上訴的運算得分對物料進行綜合排序 最后返回結果給用戶
在真實的生產(chǎn)環(huán)境中 索引的設計模式 復雜且繁多 其中涉及了大量的 數(shù)據(jù)儲存技術蛛淋,查找算法,排序算法笋熬,文本處理技術十偶,甚至I/O技術菩鲜。
粗排的結果很大依賴于各路召回結果的排序 而各路召回中需要涉及到 索引 的構建 : 如果一條物料不在索引中 那么這條物料基本沒有召回的可能。
倒排索引
倒排索引 即 “關鍵詞——文檔” 形式的一種映射結構 有種基于 內容 去 表達 主體 的感覺惦积。
倒排索引創(chuàng)建索引的流程:
1) 首先把所有的原始數(shù)據(jù)進行編號接校,形成文檔列表
2) 把文檔數(shù)據(jù)進行分詞,得到很多的詞條狮崩,以詞條為索引蛛勉。保存包含這些詞條的文檔的編號信息。
搜索的過程:
當用戶輸入任意的詞條時睦柴,首先對用戶輸入的數(shù)據(jù)進行分詞诽凌,得到用戶要搜索的所有詞條,然后拿著這些詞條去倒排索引列表中進行匹配坦敌。找到這些詞條就能找到包含這些詞條的所有文檔的編號侣诵。
然后根據(jù)這些編號去文檔列表中找到文檔
有一篇文章講的不錯 : https://zhuanlan.zhihu.com/p/62892586
目前業(yè)界很少有 自己去構建 倒排索引的 有不少的開源的工具 比如 elasticsearch ,faiss狱窘。
faiss需重點學習杜顺。
召回
協(xié)同過濾(Collaborative Filtering Recommendation):基于用戶行為,考慮用戶的共同行為蘸炸。
基于內容的推薦(Content_based Recommendation):基于文本相關性躬络,考慮詞的共現(xiàn)狀況。
協(xié)同過濾必須要有用戶行為搭儒,基于內容的推薦可以不用考慮用戶行為
協(xié)同過濾包括UserCF , ItemCF等穷当。
UserCF: 找到跟TA喜好最相似的其他用戶,然后把這些用戶喜歡的商品推給TA淹禾。
ItemCF: 找到跟TA喜好最相似的商品膘滨,然后推給TA。
Content_Based: 根據(jù)內容元數(shù)據(jù)進行分析(沒有考慮用戶)稀拐,找到相似的內容進行推薦火邓。
具體參考這篇:協(xié)同過濾和基于內容推薦有什么區(qū)別?https://www.zhihu.com/question/19971859
以下本質上都是協(xié)同過濾的思想:
i2i:計算item-item相似度德撬,用于相似推薦铲咨、相關推薦、關聯(lián)推薦
u2i:基于矩陣分解蜓洪、協(xié)同過濾的結果纤勒,直接給u推薦i
u2u2i:基于用戶的協(xié)同過濾,先找相似用戶隆檀,再推薦相似用戶喜歡的item
u2i2i:基于物品的協(xié)同過濾摇天,先統(tǒng)計用戶喜愛的物品粹湃,再推薦他喜歡的物品
u2tag2i:基于標簽的泛化推薦,先統(tǒng)計用戶偏好的tag向量泉坐,然后匹配所有的Item为鳄,這個tag一般是item的標簽、分類腕让、關鍵詞等tag
除了傳統(tǒng)的召回方式外孤钦,也用深度學習模型進行召回。
召回代碼參考鏈接:
https://github.com/andjsmile/Match_Algorithm
Content Based
item2vec
LFM
Personal Rank
item_CF
https://github.com/Eleanoryuyuyu/RecommendRelative
DeepAutoEncoder
node2vec
FPGrowth
item2vec
基于圖的模型
基于鄰域的算法
隱語義模型
https://github.com/lpty/recommendation
基于協(xié)同過濾的模型(UserCF)
基于隱語義的模型(LFM)
基于圖的模型(Personal Rank)
前沿(深度學習)召回代碼參考鏈接:
https://github.com/shenweichen/DeepMatch
https://github.com/andjsmile/Match_Algorithm
https://github.com/Eleanoryuyuyu/RecommendRelative
https://github.com/lpty/recommendation
http://github.com/microsoft/recommenders
排序
推薦系統(tǒng)的排序模型需要自己構建正負樣本纯丸,在排序的前一步 我們得到了多個不同來源的召回隊列
系統(tǒng)將這些不同來源組合的候選物品集合組合成一個通用的候選庫 偏形,然后由單個模型對其進行打分并根據(jù)該分數(shù)進行排名
排序前期一般業(yè)務簡單 通常選取一個指標來重點優(yōu)化 ,當?shù)街衅诘臅r候 就會發(fā)現(xiàn)單一指標對整體的提升比較有限 觉鼻,這個時候往往會引入多目標排序來解決這些問題
排序有常用的三種模型框架: pointwise pairwise listwise
nlp中三者也很常見(learning to rank)俊扭,以query-document為例,pointwise是把單個文檔作為訓練樣本坠陈,而pairwise是把有偏序關系的文檔對作為訓練樣本统扳,listwise是把某個query下所有文檔的ranked list作為訓練樣本。
推薦系統(tǒng)中常用pointwise方法來做排序,更簡單直觀畅姊。
粗排代碼參考鏈接:
https://github.com/shenweichen/DeepMatch
精排代碼參考鏈接:
https://github.com/shenweichen/DeepCTR
資源匯總:
https://github.com/shenweichen/AlgoNotes
PID控制算法 (在流量控制以及廣告調價中應用廣泛)
proportion integration differentiation
比例,積分吹由,微分控制
即 當?shù)玫较到y(tǒng)的輸出后 將輸出經(jīng)過比例 積分 微分 3種運算方式
疊加到輸入中 從而控制系統(tǒng)的行為
可以這樣理解 p是控制現(xiàn)在 i是糾正曾經(jīng) d是掌控未來
用戶長短期興趣:
以下只是一些摘抄若未,與該主題有關的點:
Sequential Recommendation:主要致力于捕捉和解決用戶隨時變化的,動態(tài)的偏好倾鲫。
一個明顯的例子就是:買了手機的用戶粗合,下一步極有可能購買手機殼,耳機貼膜等等
現(xiàn)在各大頂會論文整體來講乌昔,對用戶長短期偏好的建模整體還是一個encoder-decoder的結構隙疚,
在這基礎上做一個long-term short-term的捕捉,然后基于seq2item監(jiān)督的訓練磕道。
基于seq2seq的訓練還不多供屉,看到阿里的一篇文章,
《Disentangled Self-Supervision in Sequential Recommenders》比較有意思
推薦系統(tǒng) 樣本劃分
Q1:負樣本應該如何采樣更合理婚肆?
A1:可以嘗試使用一定的規(guī)則篩選負樣本:
base策略:隨機抽取一定比例
策略1:在用戶未點擊的部分藻肄,選擇流行度高的作為負樣本(更有代表性)
策略2:在用戶未點擊的部分掏秩,刪除用戶近期已發(fā)生觀看行為的電影
策略3:在用戶未點擊的部分,統(tǒng)計相應的曝光數(shù)據(jù)哗魂,取Top作為負樣本(多次曝光仍無轉化)
Q2:正負比例有個大致的主流數(shù)值嗎?1漓雅?5录别?10朽色?
A2:建議交叉驗證后選擇合適的數(shù)值
Q3:測試集是否需要和訓練集保持相同的正負樣本比例?
A3:這個問題是不成立的组题,首先基于一個策略生成全部的樣本葫男,再根據(jù)時間軸人為切分成訓練集和測試集,并不是先生成訓練集往踢,再生成測試集腾誉。
推薦系統(tǒng) 樣本加權
轉自:https://zhuanlan.zhihu.com/p/281434497
主要思想是:樣本生而不平等,需要對不同的樣本不一樣的學習權重峻呕。
例如 點擊率 和 時長 兩個優(yōu)化目標利职,
我們在優(yōu)化點擊率的基礎上考慮時長長的結果更能排在前面,這樣的結果肯定是更好的瘦癌。
目前可以做的有 多目標猪贪,多目標可以單獨訓練兩個模型進行融合,也可以同時學習讯私。
也可以采用 樣本加權 的方式热押。 例如使用 時長加權, 希望在點擊排序模型中斤寇,將時長長的正例排在前面桶癣。
樣本加權的具體方式 可以見 https://zhuanlan.zhihu.com/p/281434497
多臂賭博機問題 (Multi-armed bandit problem, K-armed bandit problem, MAB),簡稱 MAB 問題娘锁。
bandit機制: https://blog.csdn.net/dengxing1234/ 大概就是用來解決mab問題的一種方法牙寞。使得效率盡量達到最高。
STEP1: 用有限的類別來表示用戶的每個興趣莫秆,也就是arm
STEP2: 經(jīng)過幾次實驗之后(推薦反饋)间雀,來計算新用戶對每個類別的感興趣概率。
STEP3: 經(jīng)歷 ‘選擇-評估-更新-選擇’ 的循環(huán)測試之后镊屎,理論上最終的選擇會越來越逼近用戶真正感興趣的類別惹挟。
ground truth : 在有監(jiān)督學習中,數(shù)據(jù)是有標注的缝驳,以(x, t)的形式出現(xiàn)连锯,其中x是輸入數(shù)據(jù),t是標注.正確的t標注是ground truth用狱, 錯誤的標記則不是
shared embedding:
1 多個相關聯(lián)的field共享一個embedding矩陣萎庭,減少了待優(yōu)化變量的數(shù)目,加速計算齿拂,也降低過擬合的風險
2 同一個embedding矩陣驳规,為多個field提供embedding向量,類似于“多任務學習”署海,使每個embedding向量有更多的訓練機會吗购,同時也要滿足多個field的需要医男,也降低了過擬合的風險