天天看點

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

轉自:http://www.sohu.com/a/157884400_470008

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

本文是大資料雜談 7 月 13 日社群公開課分享整理,也是第四範式主題月的第二堂公開課内容。

今天想和大家分享,如何使用大規模機器學習解決真實的業務問題。我們今天會以機器學習中的一個典型場景為例來講解,即基于大規模機器學習模型的推薦系統。

推薦系統的本質是什麼?

比如說我們看到手機淘寶首頁,往下一拉,就能看到各種各樣推薦的商品;比如說百度,它會給我們推薦廣告,在某種程度上他的工作方式也很像推薦系統;再比如說今日頭條,今日頭條從數十萬的新聞中選出會被我們看到的數十個新聞,這也是推薦系統。

盡管我們在生活中會已經見過非常多的推薦系統,但是在用機器學習搭建推薦系統之前,我們還是應當先思考一下,推薦系統要解決的到底是個什麼樣的問題?

推薦系統在本質上是一個資訊檢索的系統。它和搜尋最大的差別是,搜尋是主動式的,根據關鍵詞和引擎參數、搜尋引擎召回、機器學習排序,決定給你看到的是哪些内容。而我們看到的推薦系統,在大多數情況下是沒有主動輸入的(有時會有一些簡單的回報動作),是被動出現的。

推薦系統是利用上下文,根據目前使用者所處的環境,根據資訊的特點來決定給你推薦什麼内容和商品。而在我們進一步去想之前,我們要問自己一個問題,就像上節課田老師講的一樣,推薦系統的目标是什麼,什麼才是一個好的推薦系統,要優化的名額是什麼。

推薦系統的名額是什麼?

推薦系統是個産品,産品當然是想方設法讓使用者去喜歡的,或者至少是不讨厭的。因而,我們需要把喜歡和讨厭這兩件事情定義出來。同時我們畢竟不是使用者肚子裡的蛔蟲,我們隻能用我們可以測量到的資料來描述喜歡和讨厭兩件事情。并用這些資料來決定我們做什麼和不做什麼。

比如說:我是個電商,使用者表達對一個推薦商品喜歡的方式是:點選、收藏、加購物車、甚至購買下單、分享到社交平台上等等。使用者讨厭一個推薦商品的方式,就是會投訴、會提意見。因而我們要預防一些很可能會讓使用者讨厭的推薦結果:比如說推薦成人用品和内衣,尤其是在上班時間;比如推薦使用者剛剛買過的商品,等等。

我們一定能為一個推薦系統去定義名額,我們可以給這些名額分輕重緩急,看能用什麼順序實作。現在我用的名額可能有點投機取巧,我用的是點選率。而真實的名額考慮的是很多的,僅僅考慮點選率的模型,可能會出現标題黨,如果是電商就可能會出現一堆 9 塊 9 包郵,這可能不是我們業務想要的。

另外即使隻考慮點選率,我們也知道其實我們推薦的是一個清單,清單的品質不完全是由單一的商品決定的,而是整個清單的組合、順序、多樣性所決定的。是以真實的業務中,我們會考慮用更複雜的目标,比如 MAP 來評價一個推薦清單的品質。

但沒關系,今天我們就用點選率作為試點,介紹如何用機器學習來搭建推薦系統的完整過程。

推薦系統的 y 和 x

第一步, 我們已經知道機器學習模型需要預測的就是優化目标,點選率;那我們把使用者的點選行為需要記錄下來。這樣一來,對于機器學習來說,我們已經有 y 了

第二步,我們需要定義好 x,也就是特征。

一般來說推薦系統的特征體系由 3 個部分組成:使用者特征、内容特征、上下文特征。

使用者特征:包括但不限于使用者姓名、性别、年齡、注冊時間、收貨位址、常用區域等使用者特征

内容特征:包括但不限于以及商品、内容的标題分詞、内容的 TF-IDF、内容來源、内容管道、内容生産者等等

那麼上下文特征, 是代表使用者目前時空狀态、最近一段時間的行為抽象的特征。比如說使用者目前的 GPS 坐标,大家可能覺得奇怪, GPS 坐标怎麼用來推薦呢?其實很簡單,地球一圈是 4 萬公裡,GPS 一圈是 360°,一度大概是 100 公開。如果我們把 GPS 坐标儲存到小數點後一位,組合起來,這樣的特征就是 10*10 公裡的格子,這就代表了一個有泛化能力的使用者的位置。

位置是一個非常強的特征,如果我們更進一步,做到了 1 公裡,顯然我們可以相信,在中關村地區,大家的偏好是有共性的,而在金融街,大家的喜好也是有共性的。當大家的資料足夠多的時候,落在同一個格子裡的人會非常多,GPS 就會成為非常重要的特征。

另外是 IP 位址,比如最近浏覽的内容、最近購買的商品,這些都會構成上下文特征。是以我們就是在使用者特征、内容特征和上下文特征的基礎上,預測使用者對目前内容的點選率。

推薦系統的樣本構造和資料拼接

一個成熟的推薦系統,它可能有非常複雜的樣本構造方法,今天用了比較簡單的方法,讓問題變得簡單。另外,一個成熟的推薦系統,它可能會有多個名額和業務邊界條件。

那麼接下來:基于已知的 x 和 y,我們要為機器學習構造樣本。什麼是一條樣本?一個樣本代表機器學習預測的一個最小粒度的事件。當你把一條内容展現給使用者,使用者點選或不點選,這就代表了一個最小粒度的事件,就是一條樣本。再比如說我們給使用者展示了 10 條新聞,使用者對應每個新聞點選或者不點選,就是 10 條樣本。

在樣本采集後,就要考慮資料怎麼收集和拼接了。在拼接的時候要注意的是,假如是為了優化點選率,我不光要把使用者特征、上下文特征收集起來,我還要把點選率拼回到當時那一條樣本請求上去。是以系統一定要有這樣的考慮,記錄下時間和拼接的 ID ,同時還要考慮剛才說的三類特征是處于實時變化當中的,日志也是實時産生的,而不是後面去拿的,因為這樣做很可能會出現問題。 資料一旦出問題,是非常難以 debug 的。給大家舉個栗子,有一家公司,BAT 之一,他的推薦系統過去幾年 85% 的效果提升來源是把之前有問題的資料給修複了,做對了。

推薦系統的場景思考

樣本構造還需要考慮場景的問題,比如說我們會遇到一個問題,螢幕的大小是不一樣的,同樣展示 10 條新聞,我怎麼知道使用者有沒有看到它。如果沒有看到就不應該作為一條樣本。這時候就有兩種解決方案,第一種解決方案是把使用者真正看到的納入進來,因為前端是你設計的,是以你會知道哪些内容是使用者的可見範圍内。 當然這會讓用戶端變得更重一些。

第二種是一個比較簡單的方法,把内容的位置作為一個特征。因為我們知道,同樣是一螢幕展現 10 行内容,即便是一樣的内容,使用者也會選擇一個他舒服的位置去點,這個可能是偏中上的位置。是以當新聞在第三個位置被點選的時候,這可能是一個容易被點選的位置,但不一定代表這個新聞比其他新聞要好。那我們怎麼辦?我們就要通過某些手段,把這些偏置吸收掉,是以我們會把位置、螢幕大小等作為特征,通過特征工程的方法來吸收這個偏差,變成無偏的模型。

這時候有些人可能會問,這不是穿越嗎?因為在給出預測的時候,是不知道内容最終的位置資訊的。但這相當于把偏差的鍋由位置來背了,這是機器學習推薦系統中的一個政策。

剛才我們已經構造好特征了,現在給大家講怎麼模組化。大家可能會認為,前面的部分是快的,真正做機器學習,做特征工程、模型調參等,這些是慢的。但是今天我們會看到,在成熟的工業界裡面,其實前面要花的時間會多很多,後面的内容在成熟的工具下會變得簡單。

在先知上完成推薦系統的模組化流程

我們會從一個真實的案例出發,雖然我們做了很多的推薦系統的案例,但畢竟不能把客戶的資料給大家看,是以我們用了一份公開的資料,這份資料和我們之前講的場景是相似的。這份資料來自于 Kaggle,叫做 Criteo 點選率預估比賽。

資料預覽

首先我們看資料的樣子,第 1 列 col_1 代表的是廣告有沒有被點選,1 代表被點選,0 代表沒有被點選。然後我們看第 2 列到第 14 列,都是數值型的特征,因為這份資料已經被匿名化了,是以我們可能也不知道這些數值代表什麼意思,也許是這個使用者的 PV,或者标簽的權重,不過我們也不需要知道。然後看第 15 列到 40 多列,這些都是離散的特征,這些特征都做了哈希化,都做了匿名處理。

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

這個資料有 3000 萬行 40 多列,按照我們傳統的做法,進行特征工程以及 one-hot 編碼後,會有 4000 多萬個特征。真實的業務資料中,訓練資料體積會更大,往往達到上億,同時原始特征數量會達到上百,因為為了好的個性化效果,我們會使用諸如 GPS 坐标、手機型号、ip 位址、最近浏覽内容等等精細化的特征,并進行非常極緻的特征工程,這樣的模型在特征工程之後的特征數會達到數億甚至幾百億。這樣規模的機器學習訓練,挑戰的不僅是算法,更是如何在成本可承受的計算資源上進行訓練和實時預估。

開發這樣一個規模的可以并行運作的系統的挑戰更加大,即使 BAT 這樣的大公司也會養一個百人的團隊,隻為了做好機器學習模型訓練和預估的工程實作。下面我們會看到利用第四範式的先知平台去做這件事情,會大大降低我們開發和運維一個線上機器學習系統的成本,讓我們更加聚焦在業務本身。下面我們會看到在先知平台上對這份資料的模組化會非常簡單。

資料拆分

首先我們把這份資料拆成了訓練集和測試集,以 9:1 的方式。當然這可能是不太合适的拆分方法,因為真正訓練一個機器學習模型,它的拆分是按照時間排序後再拆的,就是用前面的時間來訓練模型,然後用這個模型來預測點選。這樣訓練和測試在時間上是正交的,那麼模型如果在這種實驗設計下有好的效果,這個效果就會有時間平移性,上線後就會有好的效果。當然,為什麼我們在這裡沒有使用按照時間排序拆分的方式,是因為參考了一篇論文的做法(https://arxiv.org/abs/1703.04247),這樣同樣的做法結果可比。在真實的業務中,不建議大家按照這種方式來處理資料。

特征工程、模型選擇和評估

然後就是做特征工程了,一般來說大家可能覺得很難,但隻需要告訴電腦哪個是 Label,其他的直接預設配置就好了。但天下沒有免費的午餐,特征簡單處理,我們要有更強的模型,是以我們用了線性分型分類器。

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

一般來說,推薦系統中會有離散特征和連續特征,當我們用邏輯回歸這種寬的離散線性模型的時候,我就會遇到一個很大的問題,就是我需要對特征進行分段,這樣才能學到連續特征的非線性結構。比如說使用者年齡對點選率的影響,它并不是線性上升的,它可能會上升到 30 歲,然後就下降了,甚至有更複雜的模式,這些是非線性的特性。是以我們可以用機器對連續的特征做自動搜尋分段,這樣的預處理效率就大大提高了。線性分形分類器就是做的這樣的事情,基本上我花了不到 5 分鐘,就跑出了 0.796 的 AUC。

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

AUC 代表了一個模型對樣本的排序能力。如果這是一個完美的排序,點選率高的 100% 排到了點選率低的前面,那 AUC 就是 1。如果是随機瞎排,那 AUC 就是 0.5。是以 AUC 越接近于 1,就代表了整體的排序能力越強。現在的 AUC 是 0.796,比論文的 0.801 稍微差一點,我隻做了這麼點就到了這個成績,我覺得還是可以的。

當然這裡進一步說一下,評估上線的時候,不能隻是看 AUC。例如說,我要看的是 User AUC,或者每一刷的 AUC,因為模型的排序能力,一部分來自于對每個使用者個性化的識别能力,另一部分來自于對使用者本身的識别能力。比如說有些使用者就是什麼都愛點,什麼都點,而有些使用者基本隻看标題不點開。我們把這樣的人分開,對個性化推薦是有幫助的。是以我最終應該看的是,在每一個使用者身上的 AUC,甚至是每一次展現的 AUC,當然先知也提供了工具,就不多贅述了。特征組合

但我還是想讓這個模型更好,怎麼辦呢?在做推薦系統的時候,特征工程最重要的處理方法是特征組合。比如說有兩個特征,一個是性别,另一個是新聞的色情等級。我們可能會注意到,男同志比較喜歡火爆的新聞,女同志可能正好相反。我把色情等級作為一個特征,可能兩邊的喜好不同導緻最終這個特征整體對點選率的影響和一個随機數一樣,它就不是好的特征,沒有預測能力。

但如果我把這些特征組合起來,我就對這些空間有更細緻的分割能力,我就會做出很好的效果。性别、使用者 ID 和新聞色情等級組合起來,是新聞推薦非常有用的特征。進一步說,假如我們有 100 個特征,那麼特征兩兩組合的空間,就是 一萬個,這是個很大的工作量。

傳統的手段是,通過業務經驗和實驗去篩選好的組合。但是工具可以幫我們做得更快更好,先知的 FeatureGo 功能,可以通過一系列的配置和優化目标設定,自動搜尋出好的特征組合,大大節省我們的工作時間,讓人的工作由機器來完成。然後我就跑了 FeatureGo,找到了 18 和 28,33 和 34 這些組合特征就不錯。而如果計算資源足夠,那你還可以搜尋 3 階的特征,這是由人來做非常難的事情。

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

在用機器完成自動特征組合後,調參其實也可以自動化的。我們知道機器學習就像煉丹,煉丹就是調參,調參就是在參數空間裡,根據我們的經驗去搜尋一下,看什麼參數是好的。我們也有好的工具,可以自動搜尋到好的參數。當把這些設定好之後,我就去睡覺了。第二天醒來後發現,這個模型的 AUC 達到了 0.802,已經超過了論文的效果。由于這篇論文還是今年比較有名的論文,我還是很滿意的。

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?
【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

模型上線

設計好模型後,一般是用 Restful API 的模式服務的。比方說根據這個 API,就可以給不同的内容進行打分,打分後根據倒排後的結果,響應推薦的内容。

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

當然,一個完整的推薦系統,不僅僅需要機器學習排序,還需要相應的元件。比方說我要有物料庫,把商品的特征維護起來,這需要一個高性能的緩存和資料庫,能夠增删查改,能夠進行特征的初步生成。我還需要一個日志系統,日志系統通過唯一性的辨別,把實時的請求和後續的回報 Label 記錄并拼接起來。我還需要一個自學習的系統,機器學習的模型每天都是要更新的,如果拿 7 天前學到的模型去推今天的商品,那豈不是用前朝的劍斬本朝的官,效果一定不好,是以我們還需要自學習,或者是增量的線上學習,來保證模型捕捉到最新的使用者偏好和市場情況。

然後我們還需要後續的預測,比方說我的内容有好幾十萬,我并不是拿好幾十萬給機器學習去預估,我會用啟發式的方法,比如說 CF、熱度、Tag 比對等召回政策先生成候選集,然後才進入到機器學習排序。召回政策同樣使得我們有更大的能力去影響機器學習排序的結果,比如我們可以過濾掉一些我們明知道不好的内容或者增加我們認為好的内容的權重或出現比例。在機器學習排序後,我們也需要對結果進行去重、多樣化和随機化,最後才做成一個好的推薦系統。

今天和大家介紹的是,我們如何利用機器學習去搭建一個推薦系統的排序環節。總結起來是這麼幾個點:第一個是如何使用機器學習來剖析一個問題,我們用了推薦系統的例子。第二個是我們如何構造一個推薦系統的樣本、資料并進行模組化,當我們有一個非常好的機器學習工具的時候,我們可以把精力聚焦在業務上,在怎麼找到好的資料上,以及在怎麼定義好的目标和規劃上。第三我們描述了機器學習系統是如何和其他系統發揮作用的,機器學習就像發動機,汽車當然需要發動機,但隻有發動機車是跑不起來的,你還需要周邊的配件,這是系統化的工程。在這方面我們已經做了一些工作,我們既有發動機,也就是先知平台,大家可以在這裡試用 https://prophet.4paradigm.com,我們也有整車,就是整個推薦系統的解決方案。我們很高興和大家分享這樣的技術和能力,謝謝大家。

答疑環節

Q1: 針對制造業,有哪些已經比較好的案例可以幫助客戶改進營運,品質或生産的。Kaggle 上有沒有案例可以參考學習?

周開拓:制造業,有很多的問題都很适合機器學習去解決。比如說所有的制造業企業成本很大一部分來自于庫存和物流。是否可以利用企業的大量資料,來預測到分地區、分時間的銷量。如果你預測的準,就可以大大降低企業的成本,優化他們的營運。我忘了 kaggle 哪個具體的比賽了,但是你在 kaggle 上搜尋 inventory 應該可以找到。

Q2: 推薦系統,都有哪些方案解決冷啟動問題,百萬級使用者的推薦系統,一般用什麼樣的架構

周開拓:推薦系統冷啟動是個很大的話題,可能這裡隻能給大家一些簡單的例子。冷啟動分為使用者的冷啟動和整個推薦系統的冷啟動,整個推薦系統的冷啟動就是在搭建推薦系統之前,我能否已經收集了一些使用者行為的資料,如果有的話,可以構造一些弱一點的模型,比如說用 CF、SVD、熱度這樣的方法對内容做一些初步的排序和篩選,同時配合一些簡單的基于 query 的政策,比如最新、最熱、最多評價等等先構造一個差一點但是比随機強很多的推薦清單。如果資料基礎更好,也可以用其他場景的資料來構造 label、樣本來進行模組化。而使用者的冷啟動,歸根結底就是在使用者進入産品之後,盡快有效地擷取他的資訊,一方面可以通過産品的手段來實作,一方面可以通過第三方資料合作的方式來實作,比如說這個人如果是微網誌注冊的話,如果你能夠收集到一些公開的微網誌資料,就會對冷啟動很有幫助。關于架構的話,剛才已經介紹很多了,您可以參考。

Q3: 講解中提到對連續特征分段,比如使用者年齡對點選率的影響,是否可以詳細解釋下呢,技術原理和方法?

周開拓:就是如果年齡是一個你可以取到的特征,那麼我們這個模型就應該能描述年齡對于點選率的影響。如果你直接把年齡作為特征,那麼對于線性模型來說隻能夠學習到線性的關系。是以你會把年齡分段,就是你認為年齡 =18 歲有 w1 的影響,年齡 =19 歲有 w2 的影響,以此類推。而分段怎麼分,會決定你的這個特征是否能夠有很好的預測能力。這通過我們的線性分形分類器可以得到很好的解決。

Q4: 樣本采集過後是怎麼來發現有問題的資料呢?另外資料修複的措施有些什麼呢?

周開拓:那首先看是什麼問題,先看看問題的原因是什麼?比如說舉個栗子,你發現點選率突然異常地高,那你應該想想是日志系統挂掉了,還是因為有爬蟲在攻擊你們的産品。你找到問題産生的原因以後,再想想這個問題對你的推薦系統影響的程度,因為問題很多,不是每個都能夠馬上解決。有時候,資料根本無法修複,這是本身業務形态導緻的資料系統性偏差,你可以用模型或者構造更精妙的特征的方法來解決他。

Q5: 老師剛才講到因為修複了資料問題而提升了 85% 的準确性,請問資料都是有那些問題需要我們注意?

周開拓:資料首先要注意的就是,用于訓練和預測的是兩條資料流,這兩條資料流是不是一緻的,因為隻要是人開發的系統,即使你自己重新寫兩遍,因為上下遊依賴的種種東西,它就可能不一緻,就可能出毛病。這是最重要的,一緻性的問題是最重要的。另外你用于訓練的資料,是否符合他要預測的場景的那個時空狀态下采集到的狀态情況?我們見過一些客戶自己做推薦系統,用了錯誤的方法,采集了錯誤的資料,盡管線下訓練效果很好,線上實施的結果卻遠遠低于預期。這是最大的風險之一。

Q6: 特征組合的方式是什麼?怎麼拼接在一起?

周開拓:特征組合其實很簡單,比如一個特征叫做身高,分高矮,一個特征區分窮富,還有一個特征叫做帥和不帥。那麼高富帥就是一個組合特征,他對人的描述能力就強于之前任何一個單獨的特征。

Q7: 在時間非常重要的情況下如何判斷一個模型是不是過拟合了?

周開拓: 過拟合其實很容易判斷,首先你的實驗設計在時間上一定要是正交的,就是你用 1-7 号的資料訓練的話,要用 8 号的資料做驗證。那麼如果驗證集上的表現差,而訓練集上的表現好,那可能是不是就是穿越了。另外你會對驗證名額,比如 auc 比如 logloss 有一些經驗性的判斷,當一個模型的名額值大大超過你的經驗的時候,風險就比較大。

Q8: 請問你這邊機器自動調參是怎麼實作的呢?

周開拓:機器調參和人本質沒什麼差別,就是快很多而已。通過設定搜尋的參數空間範圍,以及啟發式的搜尋方式來找到在空間裡優的參數組合。

Q9: 請問線上學習用的是什麼算法?用的是跟離線訓練一樣的特征嗎?auc 能達到多少?一直在訓練的模型最後會過拟合嗎?

周開拓:線上學習的主要好處是快,而不是準。當然有一些特征因為工程的原因,線上不好收集到,就沒法用了。AUC 取決于具體問題。一直在訓練的模型可能出現的問題就是新增的增量樣本對于模型的影響越來越小,學不動了,這時可以考慮做一些措施。

作者介紹

周開拓,第四範式網際網路業務負責人。畢業于北京大學數學系,曾在傳統媒介、制造業、電商等不同領域從事機器學習算法應用。在加入第四範式前負責淘寶網的推薦算法政策。對如何在現實的商業環境中用機器學習算法驅動業務富有經驗。

下期預告:打造機器學習的基礎架構平台

講師介紹:

陳迪豪,第四範式先知平台架構師,曾在小米科技和 UnitedStack 擔任基礎架構研發工程師。活躍于 OpenStack、Kubernetes、TensorFlow 等開源社群,實作了 Cloud Machine Learning 雲深度學習平台,Github 賬号 https://github.com/tobegit3hub。

主題:

本節課将介紹關于機器學習的基礎架構平台,如何讓機器學習任務更高效、更安全地運作在統一的分布式計算平台上。從單機版到分布式、從 IOE 到雲計算、從 CPU 到 GPU,基礎架構技術在不斷革新,使用合适的基礎架構平台可以讓機器學習發揮更大的效益,真正應用到實際場景中。

【推薦系統】2017年,你還在用使用者畫像和協同過濾做推薦系統嗎?

機器學習的最小可用産品:人工智能應用的靈活開發

繼續閱讀