做者/ 韓虹瑩
編輯/ Ein
首先談談我理解的推薦系統。算法
若是說推薦系統的定義是什麼,每本書每篇文章說的都不太同樣,協同過濾1992年就已經有了,三十年裏無數大佬分析了個性化推薦的緣起和意義,世界已經不須要多一我的的看法。可是,當全部人都說一件事情是正確的時候,咱們也要想清楚它爲何是正確的。架構
若是你問我推薦系統是什麼,我會告訴你,是信息到人的精準分發。那麼爲何在這個時代推薦系統才應運而生?古人不會須要信息精準分發,車馬信息都很慢,古人學富五車不過如今一個書包的信息量;惟有如今人才須要信息精準分發,信息太多時間太少,亂花漸欲迷人眼,因此咱們須要一個智能的系統,幫助你過來過濾信息,因此推薦系統是人和信息的橋樑。機器學習
固然,正如羅馬不是一天建成的同樣,在互聯網上搭個橋也是要演進的,最開始是個小木橋——門戶網站,用分類導航分發了信息;後來演化到了石板橋——搜索引擎,人能夠更精準的找信息;逐步的信息太多了,要變成信息找人,在這個過程當中,不管是信息的消費者,仍是信息的生產者,都遇到了未曾預見的困難,信息消費者找不到信息了,信息生產者沒法讓本身的信息展示在消費者眼前,有痛點就有需求,有需求就有產品,因而推薦系統做爲一個產品,恰到好處又必然的到來。凱文凱利在《必然》裏,把這個趨勢稱爲「過濾」:ide
進行過濾是必然的,由於咱們在不停地製造新東西。而在咱們將要製造的新東西中,首要的一點就是創造新的方式來過濾信息和個性化定製,以突顯咱們之間的差別。
人如何和信息相處,推薦系統既不是起點,恐怕也不會是終局,但它已是當前人們對於處理信息所能作的最好的實踐了。函數
推薦系統應該單獨做爲一個產品來看,他是一個什麼產品呢?做爲一個加工信息的產品,它必定要知足信息供需兩端的需求,纔有價值。學習
因此做爲一個推薦系統,要把本身定義在一個中間方的位置,能夠說 C 端用戶和產品經理都是你的用戶,兩端的需求都須要被知足,因此既須要你想技術方案,還須要你去想,你怎麼更好的知足兩端的需求,用戶只須要你精準的幫他找到信息。而對於產品方,須要挖掘想經過推薦系統得到什麼。大數據
對於用戶端(信息需求端),最迫切的需求是如何幫我精準的找到我須要的信息。優化
對於公司端(信息供應端),是爲了知足一些商業化的需求,好比吸引用戶,加強用戶黏性,提升用戶轉化率,好比資訊平臺,短視頻平臺,信息流平臺但願提高用戶活躍度,延長用戶停留時間,電商平臺但願提升用戶購買轉化率。網站
從上圖來看,一個完整的推薦系統包括數據部分和模型部分,數據部分主要依賴大數據離線或在線處理平臺,主要完成的工做包括數據的收集和 ETL 處理,生成推薦模型所須要的特徵數據。ui
推薦系統模型部分是主體,這部分要在提供推薦模型服務以前,完成模型的訓練,而後對輸入數據進行處理,經過不一樣的召回或排序策略,生成最後的輸出結果。一個常規的工業級推薦系統,在模型部分主要包括召回層,過濾層,排序層,也可根據業務須要判斷是否須要補充策略與算法層。
1. "召回層"
通常利用高效的召回規則、算法或簡單的模型,快速從海量的候選集中召回用戶可能感興趣的物品。
2. "過濾層"
通常根據特定場景業務需求,對召回的數據進行過濾。
3. "排序層"
利用排序模型對初篩的候選集進行精排序。
4. "補充策略與算法層"
也被稱爲"再排序層",能夠在將推薦列表返回用戶以前,爲兼顧結果的"多樣性" "流行度" "新鮮度"等指標,結合一些補充的策 略和算法對推薦列表進行必定的調整,最終造成用戶可見的推薦列表。
先來一個推薦算法發展的時間線
能夠從圖中看出,2016年是推薦系統從傳統機器學習模型到深度學習模型的轉折點,這一年微軟的 Deep Crossing ,谷歌的 Wide&Deep ,以及 FNN 、 PNN 等一大批 優秀的深度學習推薦模型相繼推出,繼而逐漸成爲推薦系統的主流。但傳統推薦模型仍然要被重視,第一它們是深度學習的基礎,不少東西都是一脈相承的,矩陣分解的隱向量思想在Embedding中繼續發展,FM中的核心思想——特徵交叉也在深度學習中繼續使用,邏輯迴歸能夠看作神經元的另外一種表現形式。第二這些算法的硬件要求低,結果可解釋性強,訓練容易,還是大量場景所適用的。
能夠從圖中看出,2016年是推薦系統從傳統機器學習模型到深度學習模型的轉折點,這一年微軟的 Deep Crossing ,谷歌的 Wide&Deep ,以及 FNN 、 PNN 等一大批 優秀的深度學習推薦模型相繼推出,繼而逐漸成爲推薦系統的主流。但傳統推薦模型仍然要被重視,第一它們是深度學習的基礎,不少東西都是一脈相承的,矩陣分解的隱向量思想在Embedding中繼續發展,FM中的核心思想——特徵交叉也在深度學習中繼續使用,邏輯迴歸能夠看作神經元的另外一種表現形式。第二這些算法的硬件要求低,結果可解釋性強,訓練容易,還是大量場景所適用的。
協同過濾是推薦系統領域應用最普遍的模型了,並且你們一說到推薦系統,就會直接關聯到協同過濾,並且是基於用戶的協同過濾 or 基於物品的協同過濾,其實從某種程度上理解,矩陣分解也是協同過濾的一種,基於用戶,商品的協同過濾屬於基於近鄰的協同過濾,從更大一點的範圍來講,大多數機器學習和分類算法能夠理解爲協同過濾的一個分支,協同過濾能夠看作是分類問題的泛化,正是由於這個緣由,適用於分類的許多模型也能夠經過泛化應用於協同過濾。
本節主要針對的,仍是普遍意義上理解的,基於近鄰的協同過濾,這類協同過濾,其實就是基於用戶-用戶,物品-物品的類似度計算。
當用戶須要個性化推薦時,能夠先找到與他類似其餘用戶(經過興趣、愛好或行爲習慣等,而後把那些用戶喜歡的而且本身不知道的物品推薦給用戶。
步驟:
基於物品的協同過濾算法簡稱,其簡單應用情景是:當一個用戶須要個性化推薦時,例如因爲他以前購買過金庸的《射鵰英雄傳》這本書,因此會給他推薦《神鵰俠侶》,由於其餘用戶不少都同時購買了這兩本書。
步驟:
計算類似度的方式有以下幾種:
①餘弦類似度,餘弦類似度( Cosine Similarity )衡量了用戶向量t和用戶向量j之間的向量夾角大小。 顯然,夾角越小,證實餘弦類似 度越大,兩個用戶越類似。
②皮爾遜相關係數,相比餘弦類似度,皮爾遜相關係數經過使用用戶平均分對各獨立評分進行修正,減少了用戶評分偏置的影響 。
關於矩陣分解,一種講法把它劃歸爲協同過濾,認爲他是基於模型的協同過濾,另外一種則認爲他是協同過濾的進化,其實這個到影響不大,矩陣分解是在協同過濾的基礎上,增長了隱向量的概念。
矩陣分解能夠解決一些鄰域模型沒法解決的問題:①物品之間存在關聯性,信息量不隨向量維度線性增長;②矩陣元素稀疏,計算結果不穩定,增減一個向量,結果差別很大。
矩陣分解把User矩陣和Item矩陣做爲未知量,用它們表示出每一個用戶對每一個item的預測評分,而後經過最小化預測評分跟實際評分的差別,學習出User矩陣和Item矩陣。也就是說,圖2中只有等號左邊的矩陣是已知的,等號右邊的User矩陣和Item矩陣都是未知量,由矩陣分解經過最小化預測評分跟實際評分的差別學出來的。
矩陣分解用到的用戶行爲數據分爲顯式數據和隱式數據兩種。顯式數據是指用戶對item的顯式打分,好比用戶對電影、商品的評分,一般有5分制和10分制。隱式數據是指用戶對item的瀏覽、點擊、購買、收藏、點贊、評論、分享等數據,其特色是用戶沒有顯式地給item打分,用戶對item的感興趣程度都體如今他對item的瀏覽、點擊、購買、收藏、點贊、評論、分享等行爲的強度上。咱們當前主要是隱式數據。
目標函數經過最小化預測評分和實際評分ruirui 之間的殘差平方和,來學習全部用戶向量和物品向量
求解方法:矩陣分解的方法也不止一種,有奇異值分解,梯度降低,交替最小二乘,這裏簡單列舉一個交替最小二乘的例子。
ALS(交替最小二乘法):先固定X 優化Y ,而後固定Y 優化X ,這個過程不斷重複,直到X 和Y 收斂爲止。
這裏舉一個,顯式矩陣中固定Y優化X的例子,另外固定X優化Y:
首先邏輯迴歸的想法很巧妙,把推薦系統的推薦問題看作了一個分類問題,爲何能夠這樣說呢?
邏輯迴歸能夠經過sigmoid 函數,將輸入特徵向量x=(x1,x2......xn)x=(x1,x2......xn),映射到(0,1)區間,以下圖所示:
邏輯迴歸有着不少優點:
但也有一些缺點:
正是因爲這個緣由,後面出現了POLY2模型,FM模型,FFM模型,接下來我一塊兒說明:
該模型對全部特徵進行了兩兩交叉(特徵 Xj1 和 Xjz),並對全部的 特徵組合賦予權重 Wh(j1,j2),本質上仍是一個線性模型:
FM與POLY2的主要區別是用兩個向量的內積(Wj1,Wj2) 取代了單一的權重係數Wh(j1,j2)。
FM這樣作的優點在於,隱向量的引人使 FM 能更好地解決數據稀疏性的問題,泛化能力大大提升。在工程方面, FM 一樣能夠用梯度降低法進行學習,使其不失實時性和靈活性 。
FFM 與 FM 的區別在於隱向量由原來的 Wj1 變成了 Wj1,f2,這意味着每一個特徵對應的不是惟一一個隱向量,而是一組隱向量,當特徵 xj1 與特徵 xj2 進行交叉時,xj1 會從 xj1 這一組隱向量中挑出與特徵xj2的域f2對應的隱向量 Wj1,f2 進行交叉,同理, xj2 也會用與 xj1的域f1對應的隱向量進行交叉。
這裏選取了幾個比較典型的推薦系統實現,他們分別屬於幾種推薦系統的典型場景
針對幾個大廠部分採用了一些深度學習的模型,這裏也調研對比了深度學習模型的特色和優劣勢
主要選用了用戶行爲數據,用戶行爲數據在推薦系統中有顯性反饋行爲和隱性反饋行爲兩種,在雲課堂場景下,用戶的評分屬於顯性行爲,用戶的購課,學習,作筆記等都屬於隱性行爲。對於這些行爲,咱們根據業務重要程度,都給出了初始分數,生成了用戶-課程的初始評分矩陣
評分矩陣簡單表示以下:
在個性化推薦系統搭建初期,因爲咱們是從0到1開始構建,因此並無選擇在初期選擇複雜的深度學習算法,以及構建豐富的用戶畫像,但願在初期快速構建一個MVP版本上線,後續逐步反思優化迭代
因此在算法選型上,咱們從下面三種方案中進行評估選擇
那麼咱們是如何進行取捨的?
關於方案一,若是但願方案一取得較好的效果,關鍵點在於依賴標籤體系的建設,只有標籤體系足夠完善,也就是說,推薦結果的好壞,是可預計的,強依賴於標籤體系的建設的。
關於方案二,它的缺點在於處理稀疏矩陣的能力較弱,而云課堂中用戶的學習行爲並不能算是高頻行爲,同時頭部效應明顯,而咱們但願的是經過個性化推薦系統,挖掘更多隱含的可能性,保留更多平臺上更多平時沒機會暴露的課程,顯然基於近鄰方式的協同過濾,不是一個很合適的選擇。而基於矩陣分解的方法能夠必定程度上加強稀疏矩陣的處理能力,同時引入隱向量,能夠從用戶行爲中挖掘更多的可能性。
咱們選用了基於ALS(交替最小二乘法)的矩陣分解模型做爲第一個實踐的算法,採用的是Spark MLlib提供的API。
在ALS模型的構建過程當中,須要調整以下幾個參數以取得最好的效果
對於上面幾個參數,分別調整了幾回參數,以MSE 和 RMSE 做爲評價指標
均方偏差( Mean Square Error , MSE)和均方根偏差( Root Mean Square Error , RMSE) 常常被用來衡量回歸模型的好壞。通常狀況下, RMSE 可以很好地反映迴歸模型預測值與真實值的偏離程度 。 但在實際應用時,若是存在個別偏離程度很是大的離羣點 , 那麼即便離羣點數量 很是少 , 也會讓這兩個指標變得不好 。
一個能夠落地的推薦系統,數據收集模塊,ETL模塊,特徵工程模塊,推薦算法模塊,Web服務模塊模塊是必不可少的,首先來一個總體架構圖:
接下來簡單對幾個模塊的實現進行說明:
1.《深度學習推薦系統》王喆
2.《推薦系統 原理與實踐》 Charu C. Aggarwal
-END-