萬字入門推薦系統!

數據分析那些事
20 min readNov 24, 2021

作者:毛小偉

最近看到了一篇入門推薦系統的乾貨文章,文章首發於微信平台,推薦給大家,希望對想入門推薦方向的朋友有幫助。

最近根據自身如何入門推薦系統,再結合自身工作的經歷,整理出了這份萬字入門推薦系統。內容十分詳細,涵蓋了推薦系統基礎、進階、實戰的全部知識點,並且每一塊都給出了我們自己看過且覺得高質量的參考資料,所以不管你是科班還是非科班,按照這條路線走下去,找到推薦系統相關工作是完全沒問題的。因為內容過於全面詳細,即便你不從事推薦系統方向,只要是從事程式設計師,看完這篇文章也能有所收穫。

不過要先強調一下,如果是沒有基礎且時間充足的同學,可以按部就班的學,如果有一定基礎或時間緊張,那就直接看核心知識。其中『 機器學習、深度學習、推薦算法理論知識、推薦系統實戰專案 』這四塊是核心知識,像數學、計算機基礎可以等到你需要的時候再反過頭來學習。在核心知識中也有次重點,要學會有的放矢,哪些知識是次重點,我都會在後面一一說明。

本文框架目錄如下:

萬字入門推薦系統

數學

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

微積分

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

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

線性代數

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

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

機率論

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

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

總結

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

參考資料:

  • 《DeepLearning》,又名「花書」,被譽為深度學習領域聖經。它前面有必備數學知識的介紹,講得挺不錯的。
  • B站搜尋微積分、線性代數、機率論關鍵詞,會有很多教學影片,隨便選取時長較短的看看即可。

計算機基礎

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

資料結構與演算法

資料結構包含:陣列、連結串列、棧、佇列、樹、散列表、圖。資料結構本質是描述資料與資料之間的關係

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

參考資料:

  • 《劍指offer》,準備過面試的人應該都知道這本書。
  • 《大話資料結構》通俗易懂。剩下的就是多刷LeetCode,多看別人的題解。

計算機組成原理

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

作業系統

是應用程式與硬體之間的管家:對下管理計算機硬體資源(CPU、儲存器、IO裝置)、對上管理應用程式。

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

我們學的程式語言到最後都是在呼叫作業系統核心API。所以這也是為什麼所有的語言都有不同作業系統版本,因為每個作業系統的核心API是不同的。

參考資料:

  • 《深入理解計算機系統》,配套影片:https://www.bilibili.com/video/BV1cD4y1D7uR
  • 《鳥哥的Linux私房菜》,Linux是最常用的伺服器系統,也是我們工作中最常接觸的。熟悉Linux常用命令很有必要。

計算機網路

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

人類語言系統構成:

1、詞彙
2、語法
3、聲帶+耳朵
4、傳播介質:空氣

以此類比到計算機網路:

1、資料:計算機之間傳輸的資訊
2、通訊協議:決定資料的排列方式
3、網絡卡:資料發射器與接收器
4、傳播介質:光纖、網線、WIFI

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

參考資料:

  • 《計算機網路自頂向下方法》這本書相比於其他計算機網路書籍較通俗易懂,學習起來應該不太費勁。這本書重點章節是第2、3、4、5、6章,其他章節可以跳過。配套影片:https://www.bilibili.com/video/BV1mb4y1d7K7
  • 謝希仁的《計算機網路》,是國內很有名的教材。

資料庫

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

參考資料:

機器學習

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

我們一般說機器學習都是指除了深度學習以外的機器學習,也稱為傳統機器學習。雖然近幾年深度學習越來越火,但是很多領域還是在使用機器學習,並且學好機器學習,對於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級競賽選手魚佬寫的。

參考資料:

  • 如果是一個機器學習小白,那麼推薦兩個入門影片, 吳恩達或者李宏毅的ML影片(B站上都有),先快速過一遍,瞭解機器學習是什麼。
  • 如果有了一定的機器學習基礎,就需要去進階。建議是看書與高質量文章。推薦兩本書:周志華的《機器學習》、李航的《統計學習方法》這兩本書,可以好好先研究一本,注意這裡是研究,一本通了,另一本也就差不多。如果發現看一遍很難看懂,這是正常現象,隨著後面實踐經歷慢慢變多,再看一遍,會有很多新的感悟。再就是公眾號: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視覺化訓練過程的曲線,透過曲線分析訓練過程的相關問題,然後再調參或者調解網路結構,在實踐的過程中要有意識的去總結一些經驗。

參考資料:

資料探勘與分析

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

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

參考資料:

英文教程首推官網,中文教程推薦Datawhale的開源專案

大數據

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

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

參考資料:

這一塊實操性特別強,所以建議先看影片,跟著影片一步步來:

推薦算法理論知識

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

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

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

召回粗排

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

精排

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

•CTR預估:LR、FM家族、自動特徵交叉的DNN家族。
多工學習(Multi-Task Learning,也稱為多目標學習)。多工是很常見的,比如影片推薦中,使用者喜歡、收藏、評論。而不同的任務可能會互相沖突,互相影響,造成模型學習起來十分困難。所以這一塊是重難點,也是很多大公司的研究重點,更是未來的一大發展趨勢。但好在這裡每個模型或者技術有對應paper,所以和召回一樣,這裡依然可以利用解讀paper的方式,把這些模型和技術娓娓道來。
排序打分公式融合。

重排

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

冷啟動

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

參考資料:

  • 首先當然是後續自己寫的文章啦哈哈哈。主要是因為搞演算法的人學習模型都是參考論文,這也是為什麼我後面分享這一塊內容都是以解讀論文的形式。
  • 一定要推薦一本書籍的話,我選王喆的《深度學習推薦系統》。這本書高屋建瓴的介紹了推薦系統整體架構,發展歷史以及未來趨勢,還有各種推薦模型的演化之路,很適合前期用來當做科普。但是具體的模型並沒有深入講解,還是得自己去看論文解讀。
  • 再就是一些我認為很優秀的開源專案:
    •強子整理的 https://github.com/zhongqiangwu960812/AI-RecommenderSystem
    •我的另一個好友潛心整理,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、收集資料
a、在伺服器上部署資料收集的系統(新聞資料+使用者行為資料)
b、冷啟動策略

2、冷啟動
a、使用者側
b、物品側
c、系統側

階段三

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

1、離線評估指標
2、多路召回
a、特徵工程
b、規則類
c、模型類
3、召回評估
4、排序
a、DeepFM
b、排序評估
5、規則+重排

階段四

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

1、推薦服務,前後端互動(flask)
2、任務排程
3、系統部署
4、規範類修改

結束語

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

作者:毛小偉

來源:https://mp.weixin.qq.com/s/aaOosZ57qJpIU6cma820Xw

文章推薦

上“低程式碼”半年,30名程式設計師被裁,CTO離職

零基礎 SQL 資料庫小白,從入門到精通的學習路線與書單

16張高畫質思維導圖講清楚統計學

--

--

數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/