看完就懂,五千字長文帶你領略推薦系統

TechFlow2019發表於2020-10-29

最近有一些小夥伴給我留言說非常想要我開一個推薦系統專題,其實我也有過這個想法,一直沒動筆主要有兩個原因。第一個原因是擔心自己水平不夠,班門弄斧或者是誤導了一些讀者。第二個原因是,我的確不知道這個專題應該怎麼寫。但是讀者有求,總得回應不是,所以咬著牙寫了本文。

文章有點長,但是乾貨不少,希望大家能夠耐心讀完。

推薦、廣告、搜尋三兄弟

網際網路行業當中有這麼一句話,叫做:搜尋、廣告、推薦三兄弟。這句話是說這三個領域或者是三個方向的技術棧非常接近,甚至可以說是相差無幾,可以自由轉化。比如我也是今年才轉到的推薦team,之前在廣告組。轉崗的時候只做了一件事,就是和老闆說我要轉崗,去推薦。

你可能會很好奇,為什麼會這樣?這三個也不是一回事吧?從表面上來看的確不是一回事,但是從本質上起是一樣的。我簡單畫一個架構圖,最最簡單的那種。

這張圖我相信誰都能看懂,推薦系統也好廣告系統也罷或者是搜尋系統也一樣,本質上都只做了一件事,就是根據資訊從內容庫裡取得合適的內容給到使用者。這句話有兩個關鍵點,第一個關鍵點是根據資訊,第二個關鍵點是合適的內容。這三個系統本質上就是圍繞著這兩個關鍵點在運作。

舉個例子,搜尋系統,大家首先會想到搜尋引擎比如某度。搜尋引擎的使用場景是什麼?很簡單就是我們輸入搜尋詞,搜尋引擎返回我們想要的網頁。我們在淘寶搜尋,其實也是一個搜尋引擎。我們一樣是輸入搜尋詞,淘寶返回我們想要的商品。在這個例子當中,資訊主要成分就是使用者的搜尋詞,合適的內容呢,某度的內容是網頁,淘寶的內容就是商品。

廣告系統其實也是一樣的, 我們在搜某度的時候有時候會彈出一些沒羞沒臊的小網站。這些網站也不是憑空來的,其實也是引擎搜出來的,只是在廣告系統裡,這裡的合適的內容就變成了合適(能賺錢)的廣告。

你可能又會問了,我開啟淘寶的時候啥也沒輸入啊,推薦系統自動就幫我篩選了一批商品,怎麼能說推薦和廣告是一樣的呢?

的確,我們開啟電商網站的時候,什麼也沒輸就能看到商品,開啟抖音什麼也沒幹就能看到小姐姐。但是這並不意味著網站什麼資訊也沒有,它其實有的資訊有很多。比如你之前的消費記錄、點選記錄、建立賬號的時候填寫的個人資訊等等。推薦系統其實可以理解成使用的這些隱藏資訊來進行的“搜尋”,本質上一樣是資訊的檢索。

也就是說我們站在更高的角度來看,搜尋、推薦、廣告其實本質上都是搜尋引擎。只是搜尋的形式不一樣,搜尋的目標不一樣,所以會拆分成幾個團隊來做。

具體多說一點,比如廣告的目標是盈利,承擔電商公司的大部分收入,不僅要讓你點廣告,還要讓你點比較金貴的廣告,賺錢的期望要最大。搜尋的目標一般是準確性和質量,就是當使用者搜尋的時候搜出來的結果首先質量要高,和搜尋詞要匹配,不能搜什麼都出小姐姐。推薦的目標一般是點選率,因為沒什麼推薦準不準確一說,主要還是讓使用者能夠點,讓使用者多看看。

搜尋、推薦、廣告只是形式不同,目標不同,具體的做法上也會有一些差異,但核心的邏輯都是一樣的,稱為三兄弟並沒有什麼不妥,推薦系統搞明白了,廣告、搜尋也都差不多了,就是那麼回事,大同小異,吹牛都會更有信心一點。

推薦系統架構

我們把廣告和搜尋先放在一邊,主要來看推薦系統。推薦只是表象,其實核心還是搜尋,推薦的目標是搜尋出那些你可能還沒看過,但是你可能感興趣的東西。

這裡面關鍵點就是使用者的興趣,也是推薦的難點。它不像是搜尋,使用者會輸入搜尋詞,意圖很明確。我搜乒乓拍就是要看乒乓拍,你給我出別的結果都不對。推薦不是,使用者什麼都沒有輸入,我們要盲猜。當然也不是真盲猜,其實也是根據使用者之前的行為猜。所以有些上古時期的推薦相關的書籍當中會說推薦系統分為兩種,一種是基於使用者行為的推薦,一種是純內容的推薦。

怎麼說呢,這樣劃分當然是沒錯,但是有些落伍了。現在人工智慧時代,啥都要智慧,講究千人前面。純內容的推薦基本上已經看不到了,可能在一些小場景當中還有在使用。除此之外基本上清一色的基於使用者行為的推薦了,如果你找工作說我精通純內容的推薦,估計面試官就直接讓你出門左拐了。如果你開公司和投資人說,我們這個專案的特點就是基於內容推薦做得好但是沒有千人前面,估計投資人也出門左拐了。

這其實是挺悲哀的一點,網上的資料都比較古老,想要鑽研只能在實際的應用場景當中學習領悟。對於想要自學成才的少年來說不是很友好。

扯遠了,我們回到主題。我們推薦的時候,主要是根據使用者的內容。這裡面也有兩個問題,第一個問題是新使用者怎麼辦,我之前從來沒逛過淘寶,或者現在還沒登陸,難道我開啟首頁就什麼也看不見嗎?這肯定不行。第二個問題是也不能純基於行為,比如我之前點過乒乓拍,你就全給我推薦乒乓拍,那肯定也不行,一點新鮮感都沒有。

其實這樣類似的問題還有很多,說白了只有一點,就是我們不能一根筋,就只用一種策略來推薦。要採取多種策略,比如熱門的商品選一些,比如使用者之前點過的商品選一些,使用者之前經常看但是沒買的商品選一些,比如使用者之前感興趣的類目下的商品選一些,感興趣的店面下的商品選一些……

光選還不行,選了這麼多商品,我們怎麼展示呢?總不能一排一排展示吧,肯定要把使用者最有可能點的放在前面,把次要一點的放在後面。問題是使用者可不可能點並沒有一個明確的指標,所以針對這個問題,我們只能把它交給模型,用一個模型來預測使用者會不會點選這個商品,他的點選率有多高。

我們把上面的這些邏輯整理一下,可以發現推薦的過程主要分為兩個步驟。第一個步驟是選商品學名叫召回(recall),第二個步驟是排序。一般來說還有第三個步驟,夾在這兩個步驟中間,叫做過濾。因為多種召回策略可能會召回到一些非法違禁的商品,或者是重複的商品,我們需要過濾掉,防止使用者看到引起反感。

這樣我們就可以畫出完整的推薦系統的架構了:

我們之前介紹過的以及網上到處充斥著的協同過濾演算法,其實只是召回策略當中的一個。所以協同過濾其實不能算是推薦演算法(可能上古時期算),現在只能算是推薦策略的一種。

所以如果你看到什麼培訓班或者是課程上面說手把手教你做一個推薦系統,然後點進去看看講來講去都只有協同過濾,什麼tfidf的話,趁早找他退錢。並不是這些東西不重要,而是這些內容已經不是推薦系統的重點了,僅僅學會這些其實真的一點用也沒有(可能那種十幾個人的公司有用)。

技術分析

到這裡,我們已經清楚了,推薦系統可以分為這麼三個模組,其實廣告、搜尋也差不多,也是這麼三個模組,只是模組當中的實現邏輯不太一樣。我們簡單說說這三個模組當中的邏輯。

召回

在網際網路公司當中召回相關的工作崗位其實不多,工作量也比較少。這並不是它不重要,而是它實在沒有太多可做的。目前電商行業除了一些頂級的公司會用上一些先進的方法之外,其他公司可能還是在用一些比較古老的策略,比如熱門商品召回、協同過濾召回等等。

主要有這麼幾個原因,一個原因是受到業務的限制比較深,不僅行業之間沒有共通性,甚至不同的公司也不一定可以用同一套方案。比如音樂推薦和商品推薦,召回的邏輯肯定不一樣,再比如淘寶和唯品會的面向人群以及商品情況也都不同,使用者習慣可能也不一樣,也不一定就能夠使用同一套方案。

另外一個原因是召回這一塊承載的流量比較大,很難經得起大的折騰。比如每一個使用者到了首頁都會看到商品推薦,基本上首頁的流量就等於推薦系統的流量。所以召回引擎一定要保證效率和效能,因為後面的排序是效能開銷的大頭,所以前面要儘可能地留出空間,給後面的系統使用。

我們拍拍腦袋可能會想到很多看起來很不錯的策略,但是實際上這些策略並沒有這麼簡單,因為我們面向的可能是一個海量的內容庫,比如電商公司裡面上億甚至十億的商品。再好的策略可能都得打個問號,究竟能不能抗住這麼大的流量?

最後一個原因是一些先進的手段要求很高,並不是什麼公司都有條件用。舉個例子,比如召回當中有一個比較先進的方法叫做向量召回。也就是把一個商品使用神經網路對映成一個向量,然後根據使用者之前的行為召回一些相似度很高的向量。由於神經網路的泛化效能比較好,我們可以召回出一些普通的方法召回不了的優質商品。但問題是這種方案對於資料的準確性以及模型的效能要求很高,別人用起來效果出色,是因為別人的資料質量高,系統成熟。對於中小型公司而言,這兩條是很難保證的,所以一些聽起來特別牛叉的方案可能只有大公司在用。

結合這麼幾點,會得到一個結論,就是對於中小型公司的召回策略來說,其實基本上可以認為是固定的。可能也會有些改進,但是很有限。他們也很難招到水平非常高的架構師,讓整個系統升級換代。並且也沒有人能保證升級換代一定會有更好的效果。

過濾

過濾就更沒有什麼好說的了,過濾的業務導向性更強,基本上不具有普適性。一些特殊的情況可能只有這個公司和這個產品能遇到,換個公司換個產品就完全不一樣了。

所以過濾層基本上都是做著類似補丁的活,當然這其中也可能會用到一些比較高階的技術。比如一些反作弊或者是風控的策略,再比如一些檢測非法、鑑黃的模型等等。但是這些高階的做法一般也是大公司才有,小公司裡一般都是樸素的策略,能用就行。

排序

這麼一通分析一下,很明顯推薦的核心在於排序。實際上也的確如此,如果我們去翻翻各大期刊的paper,裡面充斥著的也都是各種各樣的排序策略以及排序優化方案。這也是最需要演算法工程師的地方,也是演算法工程師就業的主要崗位。

演算法工程師主要做什麼呢?當然還是老一套了,調整引數、做幾個新的特徵、訓練模型。看起來很無聊對不對,其實也很無奈,因為演算法工程師往往接觸不到完整的系統,實際上整個系統也是半定型的,很少會有重構或者是調整的機會。對於下游的召回以及過濾接觸一般也不會太多,能看到的只有自己的模型和資料,也就是這麼一畝三分地。雖然是一畝三分地,但是裡面可以做的事情可不少,需要做新的資料,需要分析舊的資料,如果效果不好得分析原因,得嘗試一些新的方案。很簡單的事情來來回回就可以做幾個月,這是非常正常的。

你可能會問,難道就不會用一些更高階的方法,照paper上實現一下模型,獲得更好的效果嗎?

對不起,可能會讓你失望了,這樣的機會的確有,但是並不多。先不說這些paper列舉出來的結果和使用的資料有沒有水分,就算沒有水分,也不代表它能適合所有的場景。可能只在它的資料場景才有效,在我們的場景就未必適用。再者,別人能用的方案不代表其他公司也能用得了,就拿itemvec來說,有幾家公司有能力對上億的商品集訓練出效果很好準確的embedding的?DIN是好,沒點體量和技術能力的公司是真的無福消受。退一萬步來說,即使真的有用,帶來的提升也是非常非常小的,可能還不如挖掘一個厲害一點的特徵,或者是找一找資料中的trick。

從整體上來說,排序這一塊的確是最有技術含量也是最需要模型效果的。但是從實際的工作上來說,它依然是骨感的,可能遠不像大家想的做科研那樣高大上和性感。

一點感想

說到推薦系統,我們可能會首先想到各種各樣的演算法,但實際上演算法嚴格說起來並不是推薦系統的核心。因為paper都是公開的,業內的先進的做法也都不是祕密。但為什麼有的公司的推薦就做的非常好,有的就做不起來呢?

歸根結底還是系統與架構的原因,推薦系統需要承受海量的流量,需要海量的資料訓練,沒有一套優秀的架構是玩不轉的,這才是真正技術的核心,考驗一家公司以及架構師的地方。這也是為什麼一些中小型公司不給力的原因,他們既沒有足夠的計算資源去支撐這樣的系統,也招聘不到足夠優秀的架構師來升級系統設計,能做的事情自然就非常有限了。

所以如果大家對推薦系統感興趣的話,閉門造車是不行的。最好還是要去規模比較大的公司,這樣才能接觸到業內最前沿的做法。並且也不能只關注演算法和模型,最好能站在高角度望一望整個系統的架構,這也是最值錢也是最能提升我們能力的地方。

今天的文章就到這裡,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支援吧~(點贊、關注、轉發

原文連結,求個關注

本文使用 mdnice 排版

- END -

{{uploading-image-207509.png(uploading...)}}

相關文章