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

「範式大學系列課程」第 13 篇文章: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 多列,這些都是離散的特徵,這些特徵都做了哈希化,都做了匿名處理。

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

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

數據拆分

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

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

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

一般來說,推薦系統中會有離散特徵和連續特徵,當我們用邏輯回歸這種寬的離散線性模型的時候,我就會遇到一個很大的問題,就是我需要對特徵進行分段,這樣才能學到連續特徵的非線性結構。比如說用戶年齡對點擊率的影響,它並不是線性上升的,它可能會上升到

30 歲,然後就下降了,甚至有更複雜的模式,這些是非線性的特性。所以我們可以用機器對連續的特徵做自動搜索分段,這樣的預處理效率就大大提高了。線性分形分類器就是做的這樣的事情,基本上我花了不到 5 分鐘,就跑出了 0.796 的

AUC。

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 階的特徵,這是由人來做非常難的事情。

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

模型上線

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

推薦系統相關組件

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

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

今天和大家介紹的是,我們如何利用機器學習去搭建一個推薦系統的排序環節。總結起來是這麼幾個點:第一個是如何使用機器學習來剖析一個問題,我們用了推薦系統的例子。第二個是我們如何構造一個推薦系統的樣本、數據並進行建模,當我們有一個非常好的機器學習工具的時候,我們可以把精力聚焦在業務上,在怎麼找到好的數據上,以及在怎麼定義好的目標和規划上。第三我們描述了機器學習系統是如何和其他系統發揮作用的,機器學習就像發動機,汽車當然需要發動機,但只有發動機車是跑不起來的,你還需要周邊的配件,這是系統化的工程。在這方面我們已經做了一些工作,我們既有發動機,也就是先知平台,大家可以在這裡試用 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 取決於具體問題。一直在訓練的模型可能出現的問題就是新增的增量樣本對於模型的影響越來越小,學不動了,這時可以考慮做一些措施。

作者介紹

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

先知試用版申請:prophet.4paradigm.com


推薦閱讀:

從智能手機演變格局,來看無人車軍備競賽
一階邏輯在知識圖譜的知識推演中作用,如何獲取一階邏輯? 華盛頓大學的Sherlock系統誰用過?
即使在嘈雜環境中,人類聽到自己的名字(或類似發音)都能迅速反應過來,語音識別技術有這樣的能力嗎?
如何評價人工智慧撰寫的同人小說《哈利·波特與看起來像一大坨灰燼的肖像》?

TAG:机器学习 | 人工智能 |