如果你工作在推薦、搜索領域,我強烈你學習、掌握FM演算法。我不敢說它是最簡單的(FM的確很簡單),但是作為一個推薦演算法調參工程師,掌握FM一定是性價比最高的。我推崇FM演算法的原因,有以下三點。
功能齊全
眾所周知,推薦演算法有三個應用領域:召回、粗排、精排。推薦演算法千千萬,但是有的演算法只能用於召回,有的演算法只能用於排序。像FM這樣實現三個領域全覆蓋的多面手,目前為止,孤陋寡聞的我尚不知道有第二個。
但是需要強調的是,我們不能只訓練一個FM排序模型 ,然後直接拿這個排序模型用於召回。儘管都是基於FM演算法,但是FM召回與排序,有以下不同:
- 使用的特徵不同。
- FM召回,由於未來要依賴Faiss進行線上檢索,所以不能使用user與doc的交叉特徵。只有如此,我們才能獨立計算user embedding與doc embedding
- FM排序,則沒有這方面的限制,可以使用user與doc的交叉特徵。是的,你沒看錯。因為FM所實現自動二階交叉,僅能代表「共現」。但是user與doc之間還有其他形式的交叉,比如user tag與doc tag之間的重合度,喂入這樣的交叉,對於排序性能提升,仍然有很大幫助。
- 使用的樣本不同。
- 訓練FM做排序時,必須使用「曝光未點擊」這樣的「真負」樣本。
- 訓練FM做召回時,起碼不能只使用「曝光未點擊」做負樣本。大部分的負樣本必須通過隨機採樣得到。箇中原因見我的文章《負樣本為王:評Facebook的向量化召回演算法》。
- 使用的Loss不同
- FM排序時,由於負樣本是真實的,可以採用CTR預估那樣的point-wise loss
- FM召回時,由於負樣本是隨機採樣得到的,存在一定的雜訊,最好採用BPR, hinge這樣的pair-wise loss。
性能優異
推薦系統的兩大永恆主題,「記憶」與「擴展」,FM也能實現全覆蓋。
- FM存在一階項,實際就是LR,能夠「記憶」高頻、常見模式
- FM存在feature embedding。如我在《無中生有:論推薦演算法中的Embedding思想》據說,Embedding是提升推薦演算法「擴展性」的法寶。FM通過feature embedding,能夠自動挖掘低頻、長尾模式。在這一點上,基於embedding的二階交叉,並不比DNN的高階交叉,遜色多少。
便於上線
現在深度學習是推薦領域的寵兒,LR/FM/GBDT這樣的傳統機器學習演算法,不招人待見。
DNN雖然性能優異,但是它有一個致命缺點,就是上線困難。訓練的時候,各位調參俠,把各種酷炫的結構,什麼attention, transformer, capsule,能加上的都給它加上,看著離線指標一路上漲,心裡和臉上都樂開了花,卻全然無視旁邊的後端工程師恨得咬緊了牙根。模型越複雜,離線和線上指標未必就更好,但是線上的時間開銷肯定會增加,輕則影響演算法與後端的同事關係(打工人何苦為難打工人),重則你那離線指標完美的模型壓根沒有上線的機會。雖說,目前已經有TF Serving這樣的線上serving框架,但是它也不是開箱即用的,也需要一系列的性能調優,才能滿足線上的實時性要求。
所以,如果你身處一個小團隊,後端工程人員的技術能力不強,DNN的線上實時預測,就會成為一個難題,這個時候,FM這樣的傳統機器學習演算法,就凸顯出其優勢。
- FM排序,雖然理論上需要所有特徵進行二階交叉,但是通過公式化簡,可以在 O(n)的時間複雜度下完成。n是樣本中非零的特徵數目,由於推薦系統中的特徵非常稀疏,所以預測速度是非常快的。
- 召回,由於候選集巨大,對於實時性的要求更高。很多基於DNN的召回演算法,由於無法滿足線上實時生成user embedding的需求,只能退而離線生成user embedding ,對於用戶實時興趣的捕捉大打折扣。FM召回,這時就顯現其巨大的優勢。事先把doc embedding計算好,存入Faiss建立索引,user embedding只需要把一系列的feature embedding相加就可以得到,再去faiss中進行top-k近鄰搜索。FM召回,可以實現基於用戶最新的實時興趣,從千萬量級候選doc中完成實時召回。
總結與參考
由於以上優點,我心目中,將FM視為推薦、搜索領域的"瑞士軍刀"。風頭上雖然不及DNN那麼搶眼,但是論在推薦系統中發揮的作用,絲毫不比DNN遜色,有時還能更勝一籌。FM有如此眾多的優點,優秀的調參俠+打工人,還等什麼,還不趕快學起來。想迅速掌握FM,我推薦如下參考文獻:
- 掌握FM原理,推薦讀美團的博客《深入FFM原理與實踐》。FFM的部分可以忽略,在我看來,FFM更像是為了Kaggle專門訓練的比賽型選手,損失了FM的很多優點。這就好比,奧運會上的射擊冠軍,未必能夠勝任當狙擊手一樣。
- FM用於召回,推薦讀《推薦系統召回四模型之:全能的FM模型》。注意,如我所述,FM雖然萬能,但是FM排序與FM召回,在特徵、樣本、Loss都存在不同,不可能訓練一個FM排序就能直接拿來做召回。這一點,《全能FM》一文沒有提到,需要讀者特別注意。
- 如果想親手實踐,可以嘗試alphaFM。該項目只不過是作者八小時之外的課外作品,卻被很多公司拿來投入線上實際生產環境,足見該項目性能之優異和作者功力之深厚,令人佩服。強烈建議不滿足只當「調參俠」的同學,通讀一遍alphaFM的源代碼,一定收穫滿滿。
阿里工程師小姐姐分享9種常用的、較為簡單的機器學習演算法。
這裡給出解釋和實現,題主可以通過一些實際案例去進一步理解和熟悉演算法。ヾ(?°?°?)??
(點擊頭像關注我們,後續解鎖更多阿里工程師一線實戰分享)
————————————————————————————————————————————
一、簡介
根據機器學習的任務或應用情況的不同,我們通常把機器學習分為三大類:
(1)監督學習(Supervised Learning,SL)
這類演算法的工作原理是使用帶標籤的訓練數據來學習輸入變數X 轉化為輸出變數 Y 的映射函數,換句話說就是求解方程 Y=f(X) 中的 f 。
進一步地,監督學習又可細分為如下三類:
- 回歸(Regression):預測一個值,如預測降雨量、房價等,較基礎的演算法有:Linear Regression
- 分類(Classification):預測一個標籤,如預測「生病」或「健康」,圖片上是哪種動物等,較基礎的演算法有:Logistic Regression、Naive Bayes、K-Nearest Neighbors(KNN)
【另】:集成(Ensembling)也可以歸類為監督學習的一種,它將多個單獨較弱的機器學習模型的預測結合起來,以產生更準確的預測,較基礎的演算法有Bagging with Random Forests、Boosting with XGBoost
(2)非監督學習(Unsupervised Learning,UL)
這類演算法的工作原理是從無標籤的訓練數據中學習數據的底層結構。進一步地,非監督學習又可細分為如下三類:
- 關聯(Association):發現集合中項目同時出現的概率,如通過分析超市購物籃,發現啤酒總是和尿片一起購買(啤酒與尿片的故事),較基礎的演算法有:Apriori
- 聚類(Clustering):對數據進行分組,以便組內對象比組間對象更相似,較基礎的演算法有:K-Means
- 降維(Dimensionality Reduction):減少數據集的變數數量,同時保證重要的信息不被丟失。降維可以通過特徵提取方法和特徵選擇方法來實現,特徵提取是執行從高維空間到低維空間的轉換,特徵選擇是選擇原始變數的子集,較基礎的演算法有:PCA
(3)強化學習(Reinforcement Learning,DL)
讓agent根據當前環境狀態,通過學習能夠獲得最大回報的行為來決定下一步的最佳行為。
二、實現
以上列出的演算法都是簡單常用的,基於scikit-learn可以僅用幾行代碼就完成模型訓練、預測、評估和可視化。
關於演算法的原理知乎上有很多精彩的回答,這裡不會贅述,僅給出代碼的實現與可視化。
(1)Linear Regression 它為變數 X 分配最佳權重,以創建一條直線或一個平面或更高維的超平面,使得預測值和真實值之間的誤差最小化。
具體原理參考:
化簡可得:用人話講明白線性回歸LinearRegression?zhuanlan.zhihu.com
下面以一元線性回歸為例,給出代碼實現。