目錄
第一章 綜述......................................................................................... 1
1.1 項目背景............................................................................... 1
1.2 應用場景............................................................................... 1
第二章 總體架構............................................................................... 3
2.1 算法概述............................................................................... 3
2.2 主要問題............................................................................... 6
第三章 推薦算法............................................................................... 8
3.1 相似新聞推薦...................................................................... 8
3.2 用戶畫像推薦.................................................................... 10
3.3 協同過濾推薦.................................................................... 12
第四章 總結回顧............................................................................. 15
第五章 附錄:.................................................................................. 17
第一章 綜述
1.1 項目背景
在過去傳統的門戶網站、互聯網產品等領域,存在基於編輯或者運營人員手動進行配置推送的信息推送,但這樣的方式效率低下,推薦效果有待商榷。隨着互聯網對大數據、算法模型的進一步應用,逐漸有算法機器替代人工進行推薦,並且達到諸如“千人千面”、“個性化”推薦的效果。
基於大數據的推薦系統,核心是基於基礎數據+算法模型+計算過程的技術流程,旨在幫助用戶解決在海量信息中、目的不是很明確的情況,快速獲取信息、主動篩選信息的痛點,以此來提升用戶的進一步轉化。其中,最核心的問題是要推的准、推的及時、推的恰到好處,否則就是反作用(信息冗余,客戶逆反心理)。
1.2 應用場景
很多耳熟能詳的推薦算法,解決的往往某種特定情況下的推薦機制問題,一般情況下,一個完整的推薦系統應該是復合了多種推薦算法,相互補充、相互完善,綜合來說,各種理論邏輯、算法機制是構建推薦系統的核心支撐。
在新聞推薦的時候,我們不僅要根據讀者興趣進行個性化推薦,同時需要考慮到興趣的遷移、興趣的提升,不能完全被興趣羈絆,在算法設計上就要打破這樣的桎梏,在興趣的周圍做一些嘗試,更要兼顧熱點新聞,當然,熱點新聞可能與興趣關系不大,綜合考慮多種場景,這樣才可能 是一個比較完善的新聞推薦系統。
故此,在客戶端我們可以簡單的做這樣的設計,看過這篇文章的人還看了、猜你喜歡、為你推薦等等這樣的場景。
第二章 總體架構

2.1 算法概述
1. 推薦算法概述-基於內容屬性相似的推薦
從原始數據依賴的層面來說,常見的有基於內容屬性的推薦機制,這種推薦邏輯很簡單,只是單純的依賴物品之間的屬性相似來構建推薦關系,容易理解,有些場景中是有一定效果的,但實際上很多時候會存在這幾種情況,導致了這種原始推薦失效。
u 如果用戶瀏覽當前的新聞本身就不是用戶的菜,甚至是一個非優質信息(當前主體不可控),再基於當前物品進行推薦就是個偽命題。
u 基於上面這條,即使當前主體是用戶的目標,但再推類似主體會造成信息冗余,即當前主體信息已經解決了用戶的問題。
所以,由於用戶行為的不可控,基於內容屬性相似的推薦,風險還是挺高的,這是導致了這種原始直接的機制並不會得到廣泛的推廣。但與亂推薦相比,還是有一定正向作用的,畢竟用戶瀏覽的主體是自身選擇的結果,本身用戶對於其選擇的信息主體是有一定偏好性的
2. 推薦算法概述-基於用戶畫像的推薦
基於物品本身屬性的推薦,與個性化是沒有確定關系,畢竟推薦候選集只跟物品主體有關,與用戶行為軌跡無關,嚴格來說算不了個性化。
而基於用戶畫像(基於用戶標簽)的推薦,則更大程度上依賴於用戶的畫像屬性來推薦,這就體現了用戶偏好信息,根據偏好信息來選擇候選集。
這是一種很通用的做法,並且在大規模數據集情況下,很多實際的產生過程中喜歡使用這種機制。而用戶的畫像,或者更具體點用戶的興趣標簽如何構建呢?其實就是依賴用戶累積的行為數據了,通過行為數據生成用戶的興趣標簽。
這看似是一種相對靠譜的做法,畢竟如果把用戶的愛好都分析清楚了,主動給用戶做推薦不就顯得很個性化了嗎?但在實際的場景中,還是有很多不足之處:
l 首先,並不是所有用戶的行為都足夠用來表征其興趣偏好的,即我們會高估用戶的行為集合,從而產生有偏差的畫像屬性,更甚者,如果用戶完全沒有行為怎么辦呢?
l 其次,通常來說,用戶的興趣愛好是會隨時間遷移而改變的,所以,把我用戶的興趣程度以及其變化並不是一個容易的事情,更何況用戶實際的選擇還會受很多因素影響,比如,我當前查找的一個信息並不是我之前掌握的信息,那意味着這些信息偏好在我的歷史軌跡中都體現不出來,那單純的通過我的興趣去推薦就顯得不靠譜了。
但不管怎么說,根據用戶的偏好來做推薦,大方向肯定是沒有問題的。
3. 推薦算法概述-基於協同過濾的推薦
協同過濾,作為推薦領域典型案例的存在,它不會去研究物品的本身屬性,甚至也沒有空去構建用戶的畫像標簽,正如他的名字描述的一樣,他嚴重依靠於用戶的行為以及其周邊用戶的協同行為。舉個例子,為一個用戶推薦信息,那么我只需要參考其周邊用戶在看什么信息,就給他推薦什么信息就好了。
重點在於,如何限定周邊這個范圍,比如根據兩個用戶的行為,去構建相關關系,從而判斷用戶之間的相似程度,把相似用戶的行為推薦給當前用戶,這就是協同中典型的基於用戶推薦。
而如果以新聞推薦為維度,以用戶的瀏覽記錄為向量,則可以構建新聞的相似度量,針對於每一個待推薦選項,用戶的歷史軌跡就是其向量構成,就可以判斷該用戶歷史的軌跡信息與當前的待選新聞的向量相關度了,從而判斷是否要推薦,這就是基於物品的協同邏輯。
與基於用戶畫像的推薦對比,這種推薦有一定幾率可以發現新物品,即並不嚴格依賴用戶的興趣。舉個例子,假設幾個信息的層級是ABC,並且ABC是層級遞進關系,並不是同一個東西,對於一個用戶來說,他掌握的是A,則意味着他的興趣偏好大多偏向於A,根據興趣標簽,其實是很難推薦這種遞進相關的信息。
但是,如果其他用戶的學習軌跡都是A->B->C這種軌跡,這意味着ABC三者之間本身就有前后潛在邏輯關系存在的,基於協同,即可為該用戶在掌握A的基礎上,推薦BC的內容,這也是基於興趣所做不到的地方。
當前,基於協同行為的推薦,除了基於物品還有基於用戶,還有其他諸如基於模型的協同,典型如最近鄰模型、基於矩陣分解、以及基於圖關系模型的構建的推薦機制。
2.2 主要問題
1. 冷啟動問題的解決
所謂冷啟動,即在推薦系統初期時,沒有任何用戶與物品的交集信息,即無用戶的行為軌跡,無法通過類似協同或者用戶偏好等方式進行推薦,這種時候,我們就稱推薦系統處於冷啟動狀態。
這種情況,我們需要盡快的累積起第一批用戶行為軌跡。我們可以通過基於內容的推薦,或者做一些其他類似的操作,快速有效的進行物品推薦。一段時間后,累積到一定的用戶行為時,整個系統就能夠正常使用協同過濾等方式進行推薦了。
但是,針對於新加入的用戶,或者新加入的物品,同樣也是出於冷啟動狀態的,這個時候,我們通過需要對這種物品或者用戶做特殊的處理。
除了基於內容屬性的推薦,我們還有其他的一些策略用於彌補這種行為數據不足的情況,比如典型的熱度模型,推薦熱點信息這種行為雖然low,但是從整體的反饋來看,還是有一定效果的,此外,還可以根據一些統計學上的結論,進行基於統計分析結論的推薦。
除此之外,我們也可以通過其他渠道收集用戶的數據,比如用戶注冊的時候所填寫的個人資料,這些都是可以作為推薦的原始依賴數據。
2. 馬太效應
馬太效應或者說長尾效應,即熱者愈熱,實際舉例來說就是,在實際的購買場景中,由於你推薦的次數越多,部分優質的商品購買或者點擊的次數就越多,形成的用戶購買軌跡就越多,所以得到的推薦機會就越多,進而產生的推薦也越多,變得越熱。
隨着不斷迭代,子子孫孫無窮盡也,這樣得到推薦的商品就會集中在少部分商品中,而大部分長尾商品是沉寂的,一個推薦系統如果長時間處於長尾效應中,造成推薦疲勞,其推薦效果就會減弱。
所以,一個好的推薦系統,要考慮到適當的挖掘長尾商品,通過真的個性化,把適當的長尾商品送到真正需要他們的人手里,在實際的操作過程中,我們可以適當的進行熱度降權,從而讓一些中下層的商品得到更多的曝光機會,當然前提是保證點擊率的情況下。
另外一個場景會形成馬太效應的是熱度模型,即我們的熱度榜單,長時間的高居榜首,一定會獲得更多的點擊,而點擊越多其熱度越高,但我們的信息是需要保持新鮮度的,不然點擊率遲早會下架的。
所以,我們使用一些機制讓處於頭部的商品或者信息降權,時間衰減是一個比較通用的做法,即隨着時間的遷移,其整體熱度會不斷的下降,至於說下降的方式,速率就看模型的設計了。
第三章 推薦算法
3.1 相似新聞推薦

圖 整體技術架構
- 相似計算的過程
相似的計算有很多算法可以選擇,每一種都有各自的特點以及適用的場景。相似計算中使用最多的有歐式距離、余弦相似等,余弦相似也就是余弦夾角可以有效規避個體相同認知中不同程度的差異表現,更注重維度之間的差異,而不注重數值上的差異,而歐式距離則是對個體異常數值會比較敏感。
這意味着,在我們需要區分異常樣本時,使用距離計算會更恰當,聚個栗子,比如電商領域中高價值與低價值用戶的區分,其實我們核心是想把他們的差異性拉大的,得以體現出對比,這個時候使用余弦就是不合理的。
在回歸到距離上說,市面上除了歐式距離,還有好幾種距離度量,諸如馬氏、曼哈頓距離等等,其實其度量側重都是不一樣的,我們需要結合實際的場景去使用。還有更偏向於相關度量的皮爾森相關系數等。
- 計算矩陣過大的問題
按照標准流程,假設有1萬條新聞,則對於每條新聞來說,需要與其他新聞計算與其的相似度或者相關度,然后再排個序,取TopN形成自身的待推薦列表。那么,簡單的數學題來了10000*10000=10000萬次計算,這顯然是不合理的。
所以,優化這個過程是必然的。核心思想其實就是初篩,把不同層級把關系不大的直接刪掉,省掉計算相似的過程,節省資源。如何篩選?一個比較常見的做法是,尋找核心關鍵影響因素,保證關鍵因素的相關性。
比如,在相似新聞推薦過程中,先按照頻道進行初篩,已經過濾掉很多數據,然后對目標數據集進行倒排索引,其實已經能把大部分相關度很低的候選集給過濾掉,對於整體計算量級來說,計算復雜度直接下降。
- 多影響因子權重權衡(暫時不予考慮)
基於屬性計算相似,從整體上來看,其實一般主體都不止一個屬性,那么計算相關的時候到底看那個屬性呢?或者說哪些屬性應該占有更高的權重,哪些因素是次要因素。
比如在電影推薦的過程中,電影標簽只是其中的一個維度,其他的還有定影的類別、年代、導演等其他的因子。
回到常規問題,如何確定影響權重是個操作難題。最簡單並且實際上還挺有效的一種方式就是專家評判法,即通過權威經驗來划定影響因子的權重,還有就是通過標注的樣本進行反向擬合每種因素的占比權重。除此之外還有一些其他學術上的方法,包括什么主成分分析法,層次分析法,還有什么熵權法,其實都是找因子影響能力的主次關系。
最終確定好了影響因素,在實際上線回收到數據之后,依然是需要逐步的進行權重影響調整的,我們可以通過結果的樣本數據,進行LR的回歸擬合,尋找最合適的權重配比。
3.2 用戶畫像推薦

基於用戶畫像的個性化推薦策略
業務處理的邏輯是,先根據行為數據,抽取用戶瀏覽的新聞,然后根據做瀏覽的新聞的標簽,映射到用戶,進行用戶畫像的構建,最后根據新聞標簽結合用戶畫像為用戶進行信息推薦。注意,這里與之前的實例不同的是,我們是基於用戶進行推薦的,而上個實例是在瀏覽某個內容的時候,進行相關內容推薦,這里以及進化到了根據人進行推薦了。
這里要重點介紹標簽及其權重的提取:
TF-IDF算法(term frequency–inverse document frequency):TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份
文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。
如何理解“字詞的重要性”,以及“正比增加”與“反比下降”?
(1)“字詞的重要性”:因為查找的是文本的關鍵詞,所以要將文本中最“重要”,或者做最能體現文本內容獨特性的那些詞語找出來。
(2)“正比增加”:如果一個詞在文本中出現的次數越多,那么我們就越有理由認為該詞就屬於文本的關鍵詞之一。
(3)“反比下降”:但是有些詞如“中國”、“社會”、“媒體”等詞,可能是在各個新聞里都容易出現的高頻率詞,針對這樣的詞,我們就需要以一種方式降低它對於單獨文檔內容的獨特性貢獻。即若一個詞在整個語料庫的所有文檔里都有出現,那么在計算單個文檔的關鍵詞時,我們就會相應地調整該詞屬於文檔關鍵詞的可能性。
- 用戶畫像注意的問題
基於用戶畫像的推薦機制在實際操作中,其實還有很多需要考慮的地方,並沒有想象中簡單。
首先,用戶的行為並沒有我們想象中靠譜。一方面用戶的行為數據,有時候並不是其興趣特點所表現,這點很顯然,比如如果系統把一些信息故意放在很顯眼的位置,那么對於一般用戶來說,不點也得點了,所以就會造成這種用戶數據其實是不那么靠譜的。另一方面是如果用戶產生了行為數據,但是行為數據並不足夠多,那么這個時候其實這些行為數據是有置信度的考量的,行為數據不夠產生的描述是有可能形成偏差的,再根據有偏差的數據去做推薦,那結果只能是更離譜了。
其次,用戶興趣時效性問題,用戶的興趣是有一定時效性的。舉個例子,我在一年前瀏覽新聞的記錄,還適合放到現在做我的畫像分析嗎?不一定的,因為我的興趣可能已經隨時間偏移了,過去我所喜歡的東西,現在我已經不喜歡了。
所以,在一般實際操作的過程中,一定需要分辨用戶的興趣數據的有效性,一般情況下,我們會進行長期興趣和短期興趣的區分,人在一定時間內其興趣是固定的,並且在一些很短暫的時間段內,比如一兩天、甚至是一天內,其關注點是有一定意義的,這個時候其短期興趣就生效了。
所以,我們在實際操作的時候,長期興趣、短期興趣的具體的應用就需要結合實際的場景的區分了,已經我們需要注意原始數據是否適合做興趣描述的來源數據,是否已經失效。
最后,冷啟動的問題。所有涉及到行為數據的推薦算法,都繞不開冷啟動的問題,即一個用戶是個新手,沒有任何行為記錄留下,這意味着我們就無法分析其畫像了,這個時候就稱之為該用戶的冷啟動。在前面,我們有提到過一些解決冷啟動的機制,比如基於內容推薦,進行熱點內容推薦(比如把最熱門的一些新聞推給該用戶,還比如根據整體數據做關聯推薦這個后面再講,方式很多,效果不一,需要根據具體情況來看了,再不行就想辦法在用戶注冊的時候盡可能的收集用戶的靜態數據,再根據用戶的靜態畫像數據來推薦,總比亂推的好。
3.3 協同過濾推薦

圖4技術架構模塊流程圖
通過上面的學習,我們大致認識到了一個點,那就是如果要達到推薦個性化的目的,核心還是用戶的行為數據,只有用戶各自的行為數據才能反饋其與其他人所不一樣的特性,從而有針對性的進行推薦。按上個章節的原話,大致就是這樣的:
實際上基於用戶畫像的個性化推薦依然是有缺陷的,比如他不會做用戶興趣的升級,而實際上一些知識本身就是具有一定的階梯性的。
舉個例子就很容易理解了,比如,你對大數據的東西很感興趣,於是系統根據你的興趣偏好天天給你推Hadoop、大數據各種技術框架等信息,在某個時間段可能是合理,比如我對大數據領域已經熟知了呢?你還給我天天推送大數據相關的信息。
而我實際上是需要尋求大數據關聯的信息,甚至是升級的信息,比如基於大數據的機器學習、數據挖掘相關的東西,這個機制是無法做到這一層的。
換句話說,基於用戶畫像的推薦,無法發現新知識(跟你之前的興趣愛好相對比),推薦的候選集永遠圈定在你的興趣標簽維度內,做不到認知的升級,而實際上認知是會進行升級的,特別是隨着你捕獲的知識信息越多的情況下,你就越會對更上層的其他知識感興趣,不斷的深入下去。
而基於協同過濾的推薦,或多或少能解決一點這類問題,最起碼能夠結合本身用戶的行為,讓你觸達新的知識信息,並且這種遞進是通過協同關系得到的,意味着是大部分人的共同選擇,所以還是具有一定合理性的。
協同過濾又分為基於用戶的協同(UserCF)、基於物品的協同(ItemCF),以及基於模型的協同(ModelCF)。在這里,我們主要用的是基於用戶的協同過濾推薦(UserCF)。
基於用戶的協同過濾,即我們希望通過用戶之間的關系來達到推薦新聞的目的,於是,給某用戶推薦新聞,即轉換為尋找為這個用戶尋找他的相似用戶,然后相似用戶喜的瀏覽的新聞,也可能是這個用戶喜歡的新聞。
計算相似算法,一般來講分為兩種,距離和余弦夾角,有些時候,也可以添加一個維度,帶有喜好程度的描述,比如對於某條新聞打多少分的這種表現形式。這樣的話,針對於后一種情況,我們就需要在求在計算相似度時,加入程度的權重考量。
第四章 總結回顧
目前很多主流推薦系統都是基於用戶的畫像、興趣愛好推薦的(這是一種相對靠譜,又容易在大規模用戶場景中使用的策略),你越是被他推薦的東西牽着走,你后續就會越陷入其中,最終導致了你所獲取的信息一直都是圈定在某個范圍內的,這就是所謂的“信息繭房”。
其實要形成信息繭房一方面是由於推薦機制導致的,另一方面跟場景也是有很大關系的,比如如果用戶被你所推薦的東西所推動,那么就容易陷入這種狀態,如果用戶獲取信息的渠道有多種(比如導航、搜索等等),那么就不那么容易。
典型如今日頭條,如果在前期你不小心點擊了一些比較low的內容,然后它就越給你推類似的文章,結果你越看,它就越推,於是你所看到的東西都是一大坨類似離譜八卦了。從直觀的角度看,今日頭條重度依賴於用戶的閱讀行為,而頭條又是一個重推薦場景的產品,所以會相對容易陷入“信息繭房”的這種情況。
從目前看,頭條解決這個問題的途徑是,給出熱度頻道,這個邏輯一定程度上降低用戶的興趣偏愛分析,這樣用戶能夠接觸到信息面就會更廣,進而促使用戶能夠調整其興趣,不斷的更新其興趣。
單純從轉化的角度看來,短期內可能對於系統側來說是正向的,因為他才不會關注到底是不是“信息繭房”,他只關注轉化有沒有提升,但長期來說,對於用戶就是一種損害。所以,我們在考慮設計推薦策略算法的時候,多多少少都會考慮推薦的新穎性。
但新穎性這東西就是一個雙刃劍,新的東西意味着不確定,不確定意味着可能低的轉化,所以好的推薦系統一定是在確保你興趣的同時,又會考慮新穎,並且這是一種順其自然的推薦信息主體的過渡,構建起你偏好信息與新信息之間的關聯性,讓你同樣有欲望去點擊那些新的東西,不過這就很難是了。
第五章 附錄:
Hbase數據庫(實時流處理結果)

Hive數據倉庫(歷史數據)

