萬字入門推薦系統

最近一週我、強子、Y 哥三人,根據自身如何入門推薦系統,再結合三人分別在騰訊做廣告推薦、字節做視頻推薦、百度做信息流推薦的經歷,整理出了這份萬字入門推薦系統。內容十分詳細,涵蓋了推薦系統基礎、進階、實戰的全部知識點,並且每一塊都給出了我們自己看過且覺得高質量的參考資料,所以不管你是科班還是非科班,按照這條路線走下去,找到推薦系統相關工作是完全沒問題的。因爲內容過於全面詳細,即便你不從事推薦系統方向,只要是從事程序員,看完這篇文章也能有所收穫。不過要先強調一下,如果是沒有基礎且時間充足的同學,可以按部就班的學,如果有一定基礎或時間緊張,那就直接看核心知識。其中『 機器學習、深度學習、推薦算法理論知識、推薦系統實戰項目 』這四塊是核心知識,像數學、計算機基礎可以等到你需要的時候再反過頭來學習。在覈心知識中也有次重點,要學會有的放矢,哪些知識是次重點,我都會在後面一一說明。PS:文章中的思維導圖源文件和所有參考資料,有需要的同學可以本公衆號(毛小偉)回覆「推薦系統」即可獲取,後面碰到新的好資料,我也會同步更新。

本文框架目錄如下:

萬字入門推薦系統

數學

主要是微積分、線性代數、概率論這三門課。

微積分

通常情況下,機器學習需要得到一個函數(模型,或者說假設)來預測未來的數據。既然是函數,那自然就離不開微積分了。微積分爲我們研究函數的性質提供了理論依據,同時它也是學習概率論、最優化方法等後續課程的基礎,是整個高等數學的基石。

重點掌握函數的求導法則(特別是鏈式法則),以及泰勒公式。這對後續的梯度下降法,牛頓法,擬牛頓法等優化算法的推導至關重要!

線性代數

機器學習算法的輸入、輸出、中間結果通常爲向量、矩陣、張量。這些都屬於線性代數里的知識。

重點掌握向量、矩陣含義及其數學運算公式。

概率論

對於機器學習來說,概率論是一種重要的工具。如果將機器學習算法的輸入、輸出看作隨機變量 / 向量,則可以用概率論的觀點對問題進行建模。使用概率論的一個好處是可以對不確定性進行建模,這對於某些問題是非常有必要的。另外,它還可以挖掘變量之間的概率依賴關係,實現因果推理。

重點掌握常見概率分佈、概率公式。

總結

數學好是入門機器學習的優勢,但並非關鍵。因爲數學知識量太龐大了,花太多時間在其上,容易打擊學習積極性。另外做算法一般分兩種:理論模型和實際應用,前者的行業 title 是算法研究員,主要發 paper、提出新的模型或者優化方法,所以對於數學能力要求很高。後者的行業 title 是算法工程師,致力於把模型應用於數據上,攫取商業價值,對於數學能力要求並不高。往往大部分人都屬於後者,我個人也是後者。熟悉不同算法的應用場景、掌握模型落地工程技術,纔是我們更應該投入精力的地方。

參考資料:

  1. 《DeepLearning》,又名「花書」,被譽爲深度學習領域聖經。它前面有必備數學知識的介紹,講得挺不錯的。

  2. B 站搜索微積分、線性代數、概率論關鍵詞,會有很多教學視頻,隨便選取時長較短的看看即可。

計算機基礎

計算機基礎包含數據結構與算法、計算機組成原理、操作系統、計算機網絡、數據庫、五大課程。其中數據結構與算法是面試必考內容,大家都會花時間好好學。但是另外 4 門課,開發崗面試中一定會問,算法崗卻很少會問,再加上很多做算法的人是轉行過來,非計算機科班出身,大學期間沒有上過此類專業課。所以很多做算法的人計算機基礎比較薄弱。但是在我看來計算機基礎是很重要的。一是能提高我們計算機素養,二是增加工程代碼理解能力。所以後面我會針對這四門課程,出一個面向算法工程師的系列文章,做到讓大家對這些課程重點知識有個瞭解,同時又不會陷入細枝末節。這裏先給大家做個大概講解:

數據結構與算法

數據結構包含:數組、鏈表、棧、隊列、樹、散列表、圖。數據結構本質是描述數據與數據之間的關係

算法包含:排序、查找、五大經典算法(動態規劃、回溯、分支界限、分治、貪心)。計算機解決問題其實沒有任何奇技淫巧,它唯一的解決辦法就是窮舉。算法設計的本質無非就是先思考「如何窮舉」,然後再追求「如何聰明地窮舉」。「聰明的窮舉」分爲兩部分:「去掉重複的窮舉」、「去掉不必要的窮舉」。比如,備忘錄法,用數組保存求過的結果,用空間換時間,這就是去掉重複的窮舉;動態規劃根據最優子結構,使當前問題只與某幾個子問題有關,從而大大減少問題分解次數,這就是去掉不必要窮舉。

參考資料:

  1. 《劍指 offer》,準備過面試的人應該都知道這本書。

  2. 《大話數據結構》通俗易懂。剩下的就是多刷 LeetCode,多看別人的題解。

計算機組成原理

講解計算機組成結構。主要由 CPU(運算器、控制器),存儲器(內存、外存),IO 設備(輸入、輸出設備),總線這幾部分構成。如果把計算機比作人,那麼 CPU 是人的大腦,負責控制全身和運算;內存是人的記憶,負責臨時存儲;外存是人的筆記本,負責永久存儲;輸入設備是耳朵或眼睛或嘴巴,負責接收外部的信息存入內存;輸出設備是你的臉部(表情)或者屁股,負責輸出處理後的結果;以上所有的設備都通過總線連接,總線相當於人的神經

操作系統

是應用程序與硬件之間的管家:對下管理計算機硬件資源(CPU、存儲器、IO 設備)、對上管理應用程序。

內核(kernel)是直接控制硬件的。比如:內核控制硬件有 1000 種方式,導致直接調內核去操作硬件很麻煩,於是就封裝內核,向外提供了易於調用的接口,比如:桌面系統、shell 等。這些接口對非編程人員用戶還是不友好,於是編程人員用編程語言再對這些接口在進行封裝,就產生了應用程序。本質是封裝的思想。

我們學的編程語言到最後都是在調用操作系統內核 API。所以這也是爲什麼所有的語言都有不同操作系統版本,因爲每個操作系統的內核 API 是不同的。

參考資料:

  1. 《深入理解計算機系統》,配套視頻:https://www.bilibili.com/video/BV1cD4y1D7uR

  2. 《鳥哥的 Linux 私房菜》,Linux 是最常用的服務器系統,也是我們工作中最常接觸的。熟悉 Linux 常用命令很有必要。

計算機網絡

很多教材都是從五層模型(物理層、數據鏈路層、網絡層、傳輸層、應用層)講解。其實這樣講是比較晦澀難懂的,因爲很多東西我們都沒接觸過,很陌生。好的辦法是通過人類的語言系統進行類比。計算機網絡是計算機的語言系統,與人類語言系統的本質是一樣的。

人類語言系統構成:

  1. 詞彙

  2. 語法

  3. 聲帶 + 耳朵

  4. 傳播介質:空氣

以此類比到計算機網絡:

  1. 數據:計算機之間傳輸的信息

  2. 通信協議:決定數據的排列方式

  3. 網卡:數據發射器與接收器

  4. 傳播介質:光纖、網線、WIFI

此外還有人的身份證相當於 Mac 地址,家庭地址相當於 IP 地址等等。計算機網絡中的許多概念都可以用生活中人類是如何通信的進行類比。人類通信我們是非常熟悉的,所以非常有助於我們理解。

參考資料:

  1. 《計算機網絡自頂向下方法》這本書相比於其他計算機網絡書籍較通俗易懂,學習起來應該不太費勁。這本書重點章節是第 2、3、4、5、6 章,其他章節可以跳過。配套視頻:https://www.bilibili.com/video/BV1mb4y1d7K7

  2. 謝希仁的《計算機網絡》,是國內很有名的教材。

數據庫

數據庫就是我們存儲數據的工具。數據如何存儲與讀取,直接決定了整個系統的效率。常用的關係型數據庫是 MySQL,非關係型數據庫是 Redis

參考資料:

  1. 《SQL 必知必會》,快速掌握常用的 SQL 語法

  2. 一天學會 MySQL 數據庫:https://www.bilibili.com/video/BV1Vt411z7wy

機器學習

人工智能、機器學習、深度學習關係如下:

我們一般說機器學習都是指除了深度學習以外的機器學習,也稱爲傳統機器學習。雖然近幾年深度學習越來越火,但是很多領域還是在使用機器學習,並且學好機器學習,對於 AI 算法基礎和知識廣度都有很大提高。這裏可以先給大家羅列一些必備的基礎知識:

首先要知道一些基礎的術語和概念,比如有監督與無監督,訓練集,驗證集與測試集,經驗誤差與泛化誤差,方差與偏差,過擬合與欠擬合等,再比如比較重要的一些模型性能度量方法 (混淆矩陣,精確率,召回率,auc,roc 等), 再比如經典的評估方法 (留出,交叉驗證,自助等)

其次是經典的模型。機器學習模型非常多,全部掌握不現實,我給大家羅列幾個經典,也是面試中常考的模型:邏輯迴歸、SVM、樹模型、集成學習、樸素貝葉斯、K-Means 聚類、PCA。(EM、最大熵、概率圖這些考的少,能瞭解是加分項)。

在學習過程中,各個模型是相互聯繫的,不要孤立去分析單個模型。比如:邏輯迴歸,我認爲是最基礎、也最重要的模型:

  1. 邏輯迴歸 = 線性迴歸 + sigmoid 激活函數,從而將回歸問題轉換爲分類問題

  2. 邏輯迴歸 + 矩陣分解,構成了推薦算法中常用的 FM 模型

  3. 邏輯迴歸 + softmax,從而將二分類問題轉化爲多分類問題

  4. 邏輯迴歸還可以看做單層神經網絡,相當於最簡單的深度學習模型

通過邏輯迴歸由點及面,就能演化出如此多模型。再比如樹模型。我們把以決策樹爲基礎的一系列模型統稱爲樹模型,也是 AI 比賽中最常用的模型。

  1. 決策樹經歷了三次改進,ID3、C4.5、CART,主要區別在於一個根據信息增益劃分特徵、一個根據信息增益率、一個根據基尼指數。

  2. 隨機森林 = 決策樹 + Bagging 集成學習

  3. GBDT = 決策樹 + AdaBoost 集成學習

  4. XGB 是陳天奇 2014 年提出,相當於 GBDT 的工程改進版,在實用性和準確度上有很大提升。比如:使用泰勒二階展開近似損失函數,支持處理缺失值、在特性粒度上並行計算等等特性。

  5. LGB 是微軟 2016 年提出,對 XGB 進行了改進,使用單邊梯度採樣算法減少不必要的樣本;在尋找最優分割點時採用直方圖算法使計算代價更小;支持類別特徵...

  6. CGB 是 Yandex2017 年提出,對類別特徵進行了更完美的支持。

所以學習模型,要由點及面,層層遞進。這樣不僅方便理解,也有利於歸納總結,同時還能鍛鍊搭建知識體系的能力。

關於上面這些知識,整理一個系列幫助大家由點及面打通這塊知識,文章已寫了五篇,後面會陸續放出來。

實戰

我認爲最好的實戰方式就是參加 AI 比賽。這個過程中不僅能與高手同臺競技,如果獲獎還能拿到不菲的獎金(很多比賽獎金都是 10 萬以上)與榮譽。我之前參加了很多比賽,拿過冠軍和多個 top 10。對於我個人能力提升與找工作都有很大幫助。這裏推薦三個公衆號:kaggle 競賽寶典、Coggle 數據科學、第一次打比賽。他們會發布新比賽的通知與過往比賽的解決方案,非常值得學習。

再就是書籍:《機器學習算法競賽實戰》這本書是 Datawhale 成員,top 級競賽選手魚佬寫的。

參考資料:

  1. 如果是一個機器學習小白,那麼推薦兩個入門視頻, 吳恩達或者李宏毅的 ML 視頻(B 站上都有),先快速過一遍,瞭解機器學習是什麼。

  2. 如果有了一定的機器學習基礎,就需要去進階。建議是看書與高質量文章。推薦兩本書:周志華的《機器學習》、李航的《統計學習方法》這兩本書,可以好好先研究一本,注意這裏是研究,一本通了,另一本也就差不多。如果發現看一遍很難看懂,這是正常現象,隨着後面實踐經歷慢慢變多,再看一遍,會有很多新的感悟。再就是公衆號:Datawhale,裏面有很多高質量文章。

注意:學習過程中一定要跟着實戰,否則知識很難真正理解。

深度學習

前面也提到了,深度學習本屬於機器學習,但是鑑於其發展迅速、應用越來越廣泛,所以單獨拿出來說。深度學習每年新模型、新技術層出不窮,一味追求新技術不可取,要先打好基礎。比如:對於一個簡單的全連接神經網絡,包含訓練算法(正向傳播、反向傳播),激活函數(sigmoid、ReLU、Maxout、softmax 等),正則化(L1 和 L2、Dropout、提前早停等),優化算法(隨機梯度下降、Momentum、Adagrad、Adam 等)

掌握了基礎後,再根據自身領域學習相關的模型。大部分人找工作屬於這三個領域:

  1. 計算機視覺(CV):卷積神經網絡(CNN)及其改進。

  2. 自然語言處理(NLP):循環神經網絡(RNN)及其改進,Transformer、Bert 等。

  3. 推薦算法:Embeding、Wide & Deep 及其改進。

實戰

熟練使用 TensorFlow 或 pytorch 去實現訓練模型。通過官網的一些 demo 就可以快速的掌握一個深度學習框架的基本用法,然後在實際的應用中再去了解一些框架的高級用法,這個不需要花太多的時間單獨學習,應該邊用邊學習。

積累模型調參經驗,比如學習率,batchsize, 優化器對模型的影響,使用 tensorboard 可視化訓練過程的曲線,通過曲線分析訓練過程的相關問題,然後再調參或者調解網絡結構,在實踐的過程中要有意識的去總結一些經驗。

參考資料:

  1. 李沐《動手學深度學習》https://zh-v2.d2l.ai/

  2. 邱錫鵬《神經網絡與深度學習》https://nndl.github.io/

  3. 吳恩達《深度學習》https://www.bilibili.com/video/BV1FT4y1E74V

  4. 《DeepLearning》,又名「花書」,被譽爲深度學習領域聖經。

  5. TensorFlow、pytorch 官網是最好的參考資料。如果英語不好,那麼可以看看下面的資料:

  6. Pytorch 學習筆記:https://blog.csdn.net/wuzhongqiang/category_10024538.html

  7. 《30 天喫掉那隻 TensorFlow2》:https://github.com/lyhue1991/eat_tensorflow2_in_30_days

  8. 《20 天喫掉那隻 Pytorch》:https://github.com/lyhue1991/eat_pytorch_in_20_days

  9. PyTorch 深度學習快速入門教程:https://www.bilibili.com/video/BV1hE411t7RN

數據挖掘與分析

熟練使用相關工具包:numpy、pandas、matplotlib(seabron 是 matplotlib 的簡化版)、Scikit-Learn。完成數據的可視化、分析以及特徵工程。工具包的學習建議邊用邊學,可以先看一些中文教程整體瞭解一下工具包的使用。在具體使用的時候,如果忘記了可以去對應工具包的官網查看詳細的文檔。

除了熟悉數據分析工具以外,其實更需要的是數據分析的方法,我覺得最好的學習方式就是看開源競賽的方案,因爲在開源方案中,作者會寫很多他們分析問題的思路,以及對可視化結果給出的他們認爲的正確觀點。

參考資料:

英文教程首推官網,中文教程推薦 Datawhale 的開源項目

  1. numpy 中文教程:https://github.com/datawhalechina/powerful-numpy

  2. pandas 中文教程(這份文檔可能比官方文檔還適合學習):https://github.com/datawhalechina/joyful-pandas

  3. matplotlib 中文教程:https://github.com/datawhalechina/fantastic-matplotlib

  4. 《Hands-on-Machine-Learning-with-Scikit-Learn》用 sklearn 工具實現各種機器學習模型

大數據

在實際工業場景中,我們面臨的都是海量數據,也就是所謂的大數據。再用上面提到的 MySQL 數據庫、numpy、pandas 等工具是不行的。這個時候就需要專業的大數據處理工具:Hadoop、Spark 生態。有的同學想從這些生態的基本原理學起, 如果有時間,知其所以然是好的,但往往我們需要兼顧算法和大數據,時間並不是很充足,所以建議大數據這塊可以先掌握到會用的層次,當做工具即可。

常用的:首先是 Hive 查詢,也就是用 HQL 進行一些表數據的基礎查詢,這個和 SQL 有些類似,另外一個,就是 sparkSQL 以及 spark 的 DataFrame, 這些相關操作常用來做數據分析和處理,處理完畢之後,寫回到 Hive 表裏面。其次,遇到複雜的處理邏輯,就需要寫原生 spark 腳本去跑數據了。關於這塊知識,後面也會整理一篇文章。

參考資料:

這一塊實操性特別強,所以建議先看視頻,跟着視頻一步步來:

  1. 尚硅谷大數據 Hadoop 3.x:https://www.bilibili.com/video/BV1Qp4y1n7EN

  2. 尚硅谷大數據 Spark 教程從入門到精通:https://www.bilibili.com/video/BV11A411L7CK

  3. 推薦系統算法基礎 + 綜合項目實戰:https://www.bilibili.com/video/BV1qK4y1479r

推薦算法理論知識

終於到了核心部分。再次強調一下,上面的知識不要求全掌握,既不需要,也不現實。如果爲了快速入門,掌握機器學習、深度學習基礎後就可以直接進入這一節了。

在實際的工業推薦系統中,一般會有四個環節:

我梳理了這四個環節中用到的主流技術,整理成了如下導圖:

熱追推薦算法

上圖就是整個推薦算法的核心內容。這裏先放出這個導圖,一是讓大家對推薦算法有個整體框架,二是告訴大家後續文章的內容:打算通過解讀論文的形式,結合自身在工作中接觸的工業場景,把裏面的模型和知識點一一爲大家解讀。

這個系列我取名:"熱追" 推薦算法。主要包括以下四個部分:

召回粗排

召回的目的是根據用戶部分特徵,從海量物品庫快速找到小部分用戶感興趣的物品交給精排,重點是強調快。主要有兩大類召回方式,一類是策略規則,一類是監督模型 + embedding。其中策略規則,往往和業務場景是強相關,不同的場景會有不同的召回方式,對於這種 "特異性" 較強的知識,會放到後期講。目前打算先講解普適的方法,就是模型 + embedding。上圖梳理出了目前給用戶和物品打 embedding 的主流方法, 比如 FM 系列(FM,FFM 等), 用戶行爲序列,基於圖和知識圖譜系列,經典雙塔系列等。這些方法看似很多很複雜,其實本質上還是給用戶和物品打 embedding 而已,只不過考慮的角度方式不同。這一塊的內容,幾乎每個模型都對應着經典 paper,所以會採用解讀論文的方式給大家分享。在解讀的過程中,對於一些重要模型,會進行代碼復現,並應用到一些真實的實踐任務中。至於粗排,有時候召回環節返回的物品數量還是太多,怕精排速度跟不上,所以可以在召回和精排之間加一個粗排環節,通過少量用戶和物品特徵,簡單模型,來對召回的結果進行個粗略的排序,在保證一定精準的前提下,進一步減少往後傳送的物品數量,粗排往往是可選的。因此粗排用到的很多技術與召回重合,所以先暫且歸併到召回裏,等後面把整體的基礎知識都補充完畢了,再看情況要不要展開這塊。

精排

精排階段使用你能想到的任何特徵,可以上你能承受速度極限的複雜模型,儘可能精準地對物品進行個性化排序,強調準確性。這一塊關鍵技術主要分爲三大塊:

  1. CTR 預估:LR、FM 家族、自動特徵交叉的 DNN 家族。

  2. 多任務學習(Multi-Task Learning,也稱爲多目標學習)。多任務是很常見的,比如視頻推薦中,用戶喜歡、收藏、評論。而不同的任務可能會互相沖突,互相影響,造成模型學習起來十分困難。所以這一塊是重難點,也是很多大公司的研究重點,更是未來的一大發展趨勢。但好在這裏每個模型或者技術有對應 paper,所以和召回一樣,這裏依然可以利用解讀 paper 的方式,把這些模型和技術娓娓道來。

  3. 排序打分公式融合。

重排

考慮到上面的兩塊是核心,這塊沒有詳細的展開整理,並且這塊和業務場景策略強相關,很依賴工作經驗,目前瞭解的也不是很多。後續先解讀幾篇重排模型的經典論文,等學習了相關技術,再來不斷完善這塊。

冷啓動

冷啓動問題是指對於新用戶和新商品,他們沒有歷史交互數據,無法分析歷史喜好,這個時候我們應該如何做推薦。冷啓動技術會穿插到召回或者重排中,有時也會和上面推薦系統做成並行的兩路,專門應對冷啓動場景。

參考資料:

  1. 首先當然是後續自己寫的文章啦哈哈哈。主要是因爲搞算法的人學習模型都是參考論文,這也是爲什麼我後面分享這一塊內容都是以解讀論文的形式。

  2. 一定要推薦一本書籍的話,我選王喆的《深度學習推薦系統》。這本書高屋建瓴的介紹了推薦系統整體架構,發展歷史以及未來趨勢,還有各種推薦模型的演化之路,很適合前期用來當做科普。但是具體的模型並沒有深入講解,還是得自己去看論文解讀。

  3. 再就是一些我認爲很優秀的開源項目:

  4. 強子整理的 https://github.com/zhongqiangwu960812/AI-RecommenderSystem

  5. 我的另一個好友潛心整理,star 已過千 https://github.com/ZiyaoGeng/Recommender-System-with-TF2.0

推薦系統實戰項目

理論一定要與實踐結合,否則就是空中樓閣。爲此我們打造了一個新聞推薦項目:基於我們之前的開源項目(fun-rec:https://github.com/datawhalechina/fun-rec)做了一個完整升級。實現了從前端、後端、數據庫、推薦模型等整個流程。項目規劃圖如下:

新聞推薦系統

階段一

物料池的構建:

  1. Mysql 基礎及 python 調用(簡介、安裝、簡單的命令行基礎、python 如何調用 mysql 數據(增刪改查,排序))

  2. MongoDB 基礎及 python 調用

  3. Redis 基礎及 python 調用

  4. Scrapy 基礎及新聞爬取

  5. 新聞畫像構建(存入 MongoDB)

前端展示:

  1. Vue 簡介及基本使用(對於我們做推薦算法的,瞭解一些前後端交互之類的就夠了)

  2. 前後端如何交互

  3. 用戶註冊界面

  4. 新聞展示(內容、時間、點贊次數,收藏次數)

  5. 可以保留用戶的行爲(user_id, news_id, action(點贊、收藏、閱讀),time)

階段二

有了前端及物料池後,就需要設計簡單的冷啓動規則來收集用戶的行爲數據以及用戶的基本屬性特徵。這一部分數據可能需要參加開源學習的同學來一起幫忙完善這個數據集,這樣數據纔是有意義的。

  1. 收集數據

  2. 在服務器上部署數據收集的系統(新聞數據 + 用戶行爲數據)

  3. 冷啓動策略

  4. 冷啓動

  5. 用戶側

  6. 物品側

  7. 系統側

階段三

這個階段就是推薦算法大展身手的地方啦。我們可以把上一節學到的推薦算法,在這裏盡情嘗試,吹拉彈唱任你挑選。

  1. 離線評估指標

  2. 多路召回

  3. 特徵工程

  4. 規則類

  5. 模型類

  6. 召回評估

  7. 排序

  8. DeepFM

  9. 排序評估

  10. 規則 + 重排

階段四

最後就是一些運營類知識,保證系統的高可用性

  1. 推薦服務,前後端交互(flask)

  2. 任務調度

  3. 系統部署

  4. 規範類修改

結束語

本文作爲推薦系統的開篇,不僅講解了入門推薦系統所需前置知識、基礎、進階、實戰等全部知識點,還爲後續推薦算法理論知識與實戰項目定下計劃。希望大家多多關注交流,我會按時更新後續系列文章。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/aaOosZ57qJpIU6cma820Xw