rec sys - 技術(shù)

索引
推薦系統(tǒng)為什么需要索引這一概念?

索引即指 物料的ID
我們可以根據(jù)這一ID去取到物料的各種屬性字段。(正排索引)
以特征為出發(fā)點去找具備這些特征的物料。(倒排索引)基本上都使用倒排索引。

索引的意義在于 通過構(gòu)建索引生成召回的候選集
主要有三步:
step1:對物料的特征構(gòu)建索引 獲取對應(yīng)items的結(jié)果列表 (對 嚴格來說 只有第一步是涉及 索引 后面兩步算是索引的應(yīng)用)
step2:對結(jié)果列表數(shù)據(jù)進行微運算 如 計算物料質(zhì)量分 物料相關(guān)性等
step3:基于上訴的運算得分對物料進行綜合排序 最后返回結(jié)果給用戶

在真實的生產(chǎn)環(huán)境中 索引的設(shè)計模式 復(fù)雜且繁多 其中涉及了大量的 數(shù)據(jù)儲存技術(shù),查找算法,排序算法,文本處理技術(shù),甚至I/O技術(shù)。
粗排的結(jié)果很大依賴于各路召回結(jié)果的排序 而各路召回中需要涉及到 索引 的構(gòu)建 : 如果一條物料不在索引中 那么這條物料基本沒有召回的可能。


倒排索引
倒排索引 即 “關(guān)鍵詞——文檔” 形式的一種映射結(jié)構(gòu) 有種基于 內(nèi)容 去 表達 主體 的感覺。

倒排索引創(chuàng)建索引的流程:
1) 首先把所有的原始數(shù)據(jù)進行編號,形成文檔列表
2) 把文檔數(shù)據(jù)進行分詞,得到很多的詞條,以詞條為索引。保存包含這些詞條的文檔的編號信息。

搜索的過程:
當用戶輸入任意的詞條時,首先對用戶輸入的數(shù)據(jù)進行分詞,得到用戶要搜索的所有詞條,然后拿著這些詞條去倒排索引列表中進行匹配。找到這些詞條就能找到包含這些詞條的所有文檔的編號。
然后根據(jù)這些編號去文檔列表中找到文檔

有一篇文章講的不錯 : https://zhuanlan.zhihu.com/p/62892586
目前業(yè)界很少有 自己去構(gòu)建 倒排索引的 有不少的開源的工具 比如 elasticsearch ,faiss。
faiss需重點學(xué)習(xí)。


召回

協(xié)同過濾(Collaborative Filtering Recommendation):基于用戶行為,考慮用戶的共同行為。
基于內(nèi)容的推薦(Content_based Recommendation):基于文本相關(guān)性,考慮詞的共現(xiàn)狀況。
協(xié)同過濾必須要有用戶行為,基于內(nèi)容的推薦可以不用考慮用戶行為
協(xié)同過濾包括UserCF , ItemCF等。
UserCF: 找到跟TA喜好最相似的其他用戶,然后把這些用戶喜歡的商品推給TA。
ItemCF: 找到跟TA喜好最相似的商品,然后推給TA。
Content_Based: 根據(jù)內(nèi)容元數(shù)據(jù)進行分析(沒有考慮用戶),找到相似的內(nèi)容進行推薦。
具體參考這篇:協(xié)同過濾和基于內(nèi)容推薦有什么區(qū)別?https://www.zhihu.com/question/19971859

以下本質(zhì)上都是協(xié)同過濾的思想:
i2i:計算item-item相似度,用于相似推薦、相關(guān)推薦、關(guān)聯(lián)推薦
u2i:基于矩陣分解、協(xié)同過濾的結(jié)果,直接給u推薦i
u2u2i:基于用戶的協(xié)同過濾,先找相似用戶,再推薦相似用戶喜歡的item
u2i2i:基于物品的協(xié)同過濾,先統(tǒng)計用戶喜愛的物品,再推薦他喜歡的物品
u2tag2i:基于標簽的泛化推薦,先統(tǒng)計用戶偏好的tag向量,然后匹配所有的Item,這個tag一般是item的標簽、分類、關(guān)鍵詞等tag

除了傳統(tǒng)的召回方式外,也用深度學(xué)習(xí)模型進行召回。

召回代碼參考鏈接:

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)

前沿(深度學(xué)習(xí))召回代碼參考鏈接:

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)的排序模型需要自己構(gòu)建正負樣本,在排序的前一步 我們得到了多個不同來源的召回隊列
系統(tǒng)將這些不同來源組合的候選物品集合組合成一個通用的候選庫 ,然后由單個模型對其進行打分并根據(jù)該分數(shù)進行排名

排序前期一般業(yè)務(wù)簡單 通常選取一個指標來重點優(yōu)化 ,當?shù)街衅诘臅r候 就會發(fā)現(xiàn)單一指標對整體的提升比較有限 ,這個時候往往會引入多目標排序來解決這些問題
排序有常用的三種模型框架: pointwise pairwise listwise

nlp中三者也很常見(learning to rank),以query-document為例,pointwise是把單個文檔作為訓(xùn)練樣本,而pairwise是把有偏序關(guān)系的文檔對作為訓(xùn)練樣本,listwise是把某個query下所有文檔的ranked list作為訓(xùn)練樣本。
推薦系統(tǒng)中常用pointwise方法來做排序,更簡單直觀。

粗排代碼參考鏈接:

https://github.com/shenweichen/DeepMatch

精排代碼參考鏈接:

https://github.com/shenweichen/DeepCTR

資源匯總:

https://github.com/shenweichen/AlgoNotes


PID控制算法 (在流量控制以及廣告調(diào)價中應(yīng)用廣泛)
proportion integration differentiation
比例,積分,微分控制
即 當?shù)玫较到y(tǒng)的輸出后 將輸出經(jīng)過比例 積分 微分 3種運算方式
疊加到輸入中 從而控制系統(tǒng)的行為

可以這樣理解 p是控制現(xiàn)在 i是糾正曾經(jīng) d是掌控未來


用戶長短期興趣
以下只是一些摘抄,與該主題有關(guān)的點:
Sequential Recommendation:主要致力于捕捉和解決用戶隨時變化的,動態(tài)的偏好。
一個明顯的例子就是:買了手機的用戶,下一步極有可能購買手機殼,耳機貼膜等等

現(xiàn)在各大頂會論文整體來講,對用戶長短期偏好的建模整體還是一個encoder-decoder的結(jié)構(gòu),
在這基礎(chǔ)上做一個long-term short-term的捕捉,然后基于seq2item監(jiān)督的訓(xùn)練。
基于seq2seq的訓(xùn)練還不多,看到阿里的一篇文章,
《Disentangled Self-Supervision in Sequential Recommenders》比較有意思


推薦系統(tǒng) 樣本劃分

Q1:負樣本應(yīng)該如何采樣更合理?
A1:可以嘗試使用一定的規(guī)則篩選負樣本:

base策略:隨機抽取一定比例
策略1:在用戶未點擊的部分,選擇流行度高的作為負樣本(更有代表性)
策略2:在用戶未點擊的部分,刪除用戶近期已發(fā)生觀看行為的電影
策略3:在用戶未點擊的部分,統(tǒng)計相應(yīng)的曝光數(shù)據(jù),取Top作為負樣本(多次曝光仍無轉(zhuǎn)化)

Q2:正負比例有個大致的主流數(shù)值嗎?1?5?10?
A2:建議交叉驗證后選擇合適的數(shù)值

Q3:測試集是否需要和訓(xùn)練集保持相同的正負樣本比例?
A3:這個問題是不成立的,首先基于一個策略生成全部的樣本,再根據(jù)時間軸人為切分成訓(xùn)練集和測試集,并不是先生成訓(xùn)練集,再生成測試集。


推薦系統(tǒng) 樣本加權(quán)

轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/281434497

主要思想是:樣本生而不平等,需要對不同的樣本不一樣的學(xué)習(xí)權(quán)重。

例如 點擊率 和 時長 兩個優(yōu)化目標,
我們在優(yōu)化點擊率的基礎(chǔ)上考慮時長長的結(jié)果更能排在前面,這樣的結(jié)果肯定是更好的。
目前可以做的有 多目標,多目標可以單獨訓(xùn)練兩個模型進行融合,也可以同時學(xué)習(xí)。
也可以采用 樣本加權(quán) 的方式。 例如使用 時長加權(quán), 希望在點擊排序模型中,將時長長的正例排在前面。

樣本加權(quán)的具體方式 可以見 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)督學(xué)習(xí)中,數(shù)據(jù)是有標注的,以(x, t)的形式出現(xiàn),其中x是輸入數(shù)據(jù),t是標注.正確的t標注是ground truth, 錯誤的標記則不是


shared embedding:

1 多個相關(guān)聯(lián)的field共享一個embedding矩陣,減少了待優(yōu)化變量的數(shù)目,加速計算,也降低過擬合的風(fēng)險

2 同一個embedding矩陣,為多個field提供embedding向量,類似于“多任務(wù)學(xué)習(xí)”,使每個embedding向量有更多的訓(xùn)練機會,同時也要滿足多個field的需要,也降低了過擬合的風(fēng)險

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容