網易雲課堂個性化推薦實踐與思考

做者/ 韓虹瑩
編輯/ 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 基於物品的協同過濾,其實從某種程度上理解,矩陣分解也是協同過濾的一種,基於用戶,商品的協同過濾屬於基於近鄰的協同過濾,從更大一點的範圍來講,大多數機器學習和分類算法能夠理解爲協同過濾的一個分支,協同過濾能夠看作是分類問題的泛化,正是由於這個緣由,適用於分類的許多模型也能夠經過泛化應用於協同過濾。

本節主要針對的,仍是普遍意義上理解的,基於近鄰的協同過濾,這類協同過濾,其實就是基於用戶-用戶,物品-物品的類似度計算

基於用戶協同過濾

當用戶須要個性化推薦時,能夠先找到與他類似其餘用戶(經過興趣、愛好或行爲習慣等,而後把那些用戶喜歡的而且本身不知道的物品推薦給用戶。

步驟:

  • 準備用戶向量,在該矩陣中,理論上每一個用戶獲得一個向量
  • 向量維度是物品個數,向量是稀疏的,向量取值能夠是簡單的0或1
  • 用每一個用戶向量,兩兩計算用戶之間類似度,設定一個類似度閾值,爲每一個用戶保留與其最類似的用戶
  • 爲每一個用戶產生推薦結果

基於物品協同過濾

基於物品的協同過濾算法簡稱,其簡單應用情景是:當一個用戶須要個性化推薦時,例如因爲他以前購買過金庸的《射鵰英雄傳》這本書,因此會給他推薦《神鵰俠侶》,由於其餘用戶不少都同時購買了這兩本書。

步驟:

  • 構建用戶物品的關係矩陣,能夠是購買行爲,或購買後的評價,購買次數等
  • 兩兩計算物品類似度,獲得物品類似度矩陣
  • 產生推薦結果,典型的兩種形式:①爲某個物品推薦相關物品;②我的首頁的「猜你喜歡」

計算類似度的方式有以下幾種:

①餘弦類似度,餘弦類似度( 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:

  • 目標函數被拆解爲多個獨立目標函數,每一個用戶對應一個目標函數,用戶u的目標函數爲:
  • 該目標函數轉換爲矩陣形式。
  • 對目標函數J關於Xu求梯度,並令梯度爲零。

邏輯迴歸→POLY2→FM→FFM

首先邏輯迴歸的想法很巧妙,把推薦系統的推薦問題看作了一個分類問題,爲何能夠這樣說呢?

邏輯迴歸能夠經過sigmoid 函數,將輸入特徵向量x=(x1,x2......xn)x=(x1,x2......xn),映射到(0,1)區間,以下圖所示:

邏輯迴歸有着不少優點:

  • 數學含義上的支撐,邏輯迴歸的假設是因變量y服從Bernoulli分佈,很是符合咱們對於CTR模型的認識,相比之下線性迴歸模型假設y服從高斯分佈,這與咱們所理解的CTR預估模型(二分類問題)並不一致。
  • 可解釋性強,邏輯迴歸的簡單數學形式也很是符合人類對 預估過程的直覺認知
  • 工程化簡單,具備易於並行化,訓練簡單,訓練開銷小的特色

但也有一些缺點:

  • 表達能力不強,沒法進行特徵交叉、特徵篩選等操做,因此會形成一些信息的損失

正是因爲這個緣由,後面出現了POLY2模型,FM模型,FFM模型,接下來我一塊兒說明:

POLY2模型——特徵的「暴力」組合

該模型對全部特徵進行了兩兩交叉(特徵 Xj1 和 Xjz),並對全部的 特徵組合賦予權重 Wh(j1,j2),本質上仍是一個線性模型:

FM——隱向量的特徵交叉

FM與POLY2的主要區別是用兩個向量的內積(Wj1,Wj2) 取代了單一的權重係數Wh(j1,j2)。

  • FM爲每一個特徵學習了一個隱權重向量,特徵交叉時,使用兩個特徵隱向量的內積做爲交叉特徵的權重。
  • 引入隱向量的作法,與矩陣分解的思想殊途同歸,是從單純用戶-物品擴展到了全部特徵上。
  • 把POLY2模型 n^2的權重參數減小到了nk。

FM這樣作的優點在於,隱向量的引人使 FM 能更好地解決數據稀疏性的問題,泛化能力大大提升。在工程方面, FM 一樣能夠用梯度降低法進行學習,使其不失實時性和靈活性 。

FFM——特徵域

FFM 與 FM 的區別在於隱向量由原來的 Wj1 變成了 Wj1,f2,這意味着每一個特徵對應的不是惟一一個隱向量,而是一組隱向量,當特徵 xj1 與特徵 xj2 進行交叉時,xj1 會從 xj1 這一組隱向量中挑出與特徵xj2的域f2對應的隱向量 Wj1,f2 進行交叉,同理, xj2 也會用與 xj1的域f1對應的隱向量進行交叉。

模型演化的形象化表示

POLY2模型

FM模型

FFM模型

傳統機器學習算法比較

大廠如何玩轉推薦系統

大廠實踐比較

這裏選取了幾個比較典型的推薦系統實現,他們分別屬於幾種推薦系統的典型場景

深度學習算法比較

針對幾個大廠部分採用了一些深度學習的模型,這裏也調研對比了深度學習模型的特色和優劣勢

雲課堂的個性化推薦

特徵工程

主要選用了用戶行爲數據,用戶行爲數據在推薦系統中有顯性反饋行爲和隱性反饋行爲兩種,在雲課堂場景下,用戶的評分屬於顯性行爲,用戶的購課,學習,作筆記等都屬於隱性行爲。對於這些行爲,咱們根據業務重要程度,都給出了初始分數,生成了用戶-課程的初始評分矩陣

評分矩陣簡單表示以下:

算法選型

在個性化推薦系統搭建初期,因爲咱們是從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-

相關文章
相關標籤/搜索