本篇開始我們來詳細講解各類推薦算法。這篇文章我們主要關注的是基於內容的推薦算法,它也是非常通用的一類推薦算法,在工業界有大量的應用案例。
本文會從什麼是基於內容的推薦算法、算法基本原理、應用場景、基於內容的推薦算法的優缺點、算法落地需要關注的點等5個方面來講解。希望讀者讀完可以掌握常用的基於內容的推薦算法的實現原理,並且可以基於本文的思路快速將基於內容的推薦算法落地到真實業務場景中。
一、什麼是基於內容的推薦算法
首先我們給基於內容的推薦算法下一個定義,讓讀者有初步的印象,後面更容易理解我們講的基於內容的推薦算法。
所謂基於內容的推薦算法(Content-Based Recommendations)是基於標的物相關信息、用戶相關信息及用戶對標的物的操作行爲來構建推薦算法模型,爲用戶提供推薦服務。這裏的標的物相關信息可以是對標的物文字描述的metadata信息、標籤、用戶評論、人工標註的信息等。用戶相關信息是指人口統計學信息(如年齡、性別、偏好、地域、收入等等)。用戶對標的物的操作行爲可以是評論、收藏、點贊、觀看、瀏覽、點擊、加購物車、購買等。基於內容的推薦算法一般只依賴於用戶自身的行爲爲用戶提供推薦,不涉及到其他用戶的行爲。
廣義的標的物相關信息不限於文本信息,圖片、語音、視頻等都可以作爲內容推薦的信息來源,只不過這類信息處理成本較大,不光是算法難度大、處理的時間及存儲成本也相對更高。
基於內容的推薦算法算是最早應用於工程實踐的推薦算法,有大量的應用案例,如今日頭條的推薦有很大比例是基於內容的推薦算法。
二、基於內容的推薦算法實現原理
基於內容的推薦算法的基本原理是根據用戶的歷史行爲,獲得用戶的興趣偏好,爲用戶推薦跟他的興趣偏好相似的標的物,讀者可以直觀上從下圖理解基於內容的推薦算法。
從上圖也可以看出,要做基於內容的個性化推薦,一般需要三個步驟,它們分別是:基於用戶信息及用戶操作行爲構建用戶特徵表示、基於標的物信息構建標的物特徵表示、基於用戶及標的物特徵表示爲用戶推薦標的物,具體參考下面圖2:
本節我們先簡單介紹一下怎麼基於上圖的步驟1、步驟2爲用戶做推薦(即步驟3中給用戶做推薦的核心思想),然後分別對這三個步驟加以說明,介紹每個步驟都有哪些方法和策略可供選擇。
1. 基於用戶和標的物特徵爲用戶推薦的核心思想
有了用戶特徵和標的物特徵,我們怎麼給用戶做推薦呢?我認爲主要的推薦思路有如下三個:
(1)基於用戶歷史行爲記錄做推薦
我們需要事先計算標的物之間的相似性,然後將用戶歷史記錄中的標的物的相似標的物推薦給用戶。
不管標的物包含哪類信息,一般的思路是將標的物特徵轉化爲向量化表示,有了向量化表示,我們就可以通過 cosine餘弦相似度 計算兩個標的物之間的相似度了。
(2)用戶和標的物特徵都用顯式的標籤表示,利用該表示做推薦
標的物用標籤來表示,那麼反過來,每個標籤就可以關聯一組標的物,那麼根據用戶的標籤表示,用戶的興趣標籤就可以關聯到一組標的物,這組通過標籤關聯到的標的物,就可以作爲給用戶的推薦候選集。這類方法就是所謂的倒排索引法,是搜索業務通用的解決方案。
(3)用戶和標的物嵌入到同一個向量空間,基於向量相似做推薦
當用戶和標的物嵌入到同一個向量空間中後,我們就可以計算用戶和標的物之間的相似度,然後按照標的物跟用戶的相似度,爲用戶推薦相似度高的標的物。還可以基於用戶向量表示計算用戶相似度,將相似用戶喜歡的標的物推薦給該用戶,這時標的物嵌入是不必要的。
講清楚了基於內容的推薦的核心思想,那麼下面我們分別講解怎麼表示用戶特徵、怎麼表示標的物特徵以及怎麼爲用戶做推薦。
2. 構建用戶特徵表示
用戶的特徵表示可以基於用戶對標的物的操作行爲(如點擊、購買、收藏、播放等)構建用戶對標的物的偏好畫像,也可以基於用戶自身的人口統計學特徵來表達。有了用戶特徵表示,我們就可以基於用戶特徵爲用戶推薦與他特徵匹配的標的物。構建用戶特徵的方法主要有如下5種:
(1)用戶行爲記錄作爲顯示特徵
記錄用戶過去一段時間對標的物的偏好。拿視頻行業來說,如果用戶過去一段時間看了A、B、C三個視頻,同時可以根據每個視頻用戶觀看時長佔視頻總時長的比例給用戶的行爲打分,這時用戶的興趣偏好就可以記錄爲${(C,S_1),(B,S_2),(C,S_3)}$,其中$S_1$、$S_2$、$S_3$分別是用戶對視頻A、B、C的評分。
該方案直接將用戶歷史操作過的標的物作爲用戶的特徵表示,在推薦時可以將與用戶操作過的標的物相似的標的物推薦給用戶。
(2)顯式的標籤特徵
如果標的物是有標籤來描述的,那麼這些標籤可以用來表徵標的物。用戶的興趣畫像也可以基於用戶對標的物的行爲來打上對應的標籤。拿視頻推薦來舉例,如果用戶過去看了科幻和恐怖兩類電影,那麼恐怖、科幻就是用戶的偏好標籤了。
每個標的物的標籤可以是包含權重的,而用戶對標的物的操作行爲也是有權重的,從而用戶的興趣標籤是有權重的。
在具體推薦時,可以將用戶的興趣標籤關聯到的標的物(具備該標籤的標的物)推薦給用戶。
(3)向量式的興趣特徵
可以基於標的物的信息將標的物嵌入到向量空間中,利用向量來表示標的物,我們會在後面講解嵌入的算法實現方案。有了標的物的向量化表示,用戶的興趣向量就可以用他操作過的標的物的向量的平均向量來表示了。
這裏表示用戶興趣向量有很多種策略,可以基於用戶對操作過的標的物的評分以及時間加權來獲取用戶的加權偏好向量,而不是直接取平均。另外,我們也可以根據用戶操作過的標的物之間的相似度,爲用戶構建多個興趣向量(比如對標的物聚類,用戶在某一類上操作過的標的物的向量均值作爲用戶在這個類別上的興趣向量),從而更好地表達用戶多方位的興趣偏好。
有了用戶的興趣向量及標的物的興趣向量,可以基於向量相似性計算用戶對標的物的偏好度,再基於偏好度大小來爲用戶推薦標的物。
(4)通過交互方式獲取用戶興趣標籤
很多APP在用戶第一次註冊時讓用戶選擇自己的興趣標籤,一旦用戶勾選了自己的興趣標籤,那麼這些興趣標籤就是系統爲用戶提供推薦的原材料。具體推薦策略與上面的(3)一樣。
(5)用戶的人口統計學特徵
用戶在登陸、註冊時提供的關於自身相關的信息、通過運營活動用戶填寫的信息、通過用戶行爲利用算法推斷得出的結論,如年齡、性別、地域、收入、愛好、居住地、工作地點等是非常重要的信息。基於這些關於用戶維度的信息,我們可以將用戶特徵用向量化表示出來,向量的維度就是可獲取的用戶特徵數。
有了用戶特徵向量就可以計算用戶相似度,將相似用戶喜歡的標的物推薦給該用戶。
3. 構建標的物特徵表示
標的物的特徵,一般可以利用顯式的標籤來表示,也可以利用隱式的向量(當然one-hot編碼也是向量表示,但是不是隱式的)來刻畫,向量的每個維度就是一個隱式的特徵項。前面提到某些推薦算法需要計算標的物之間的相似度,下面我們在講標的物的各種特徵表示時,也簡單介紹一下標的物之間的相似度計算方法。順便說一下,標的物關聯標的物的推薦範式也需要知道標的物之間的相似度。下面我們從4個方面來詳細講解怎麼構建標的物的特徵表示。
(1)標的物包含標籤信息
最簡單的方式是將將標籤按照某種序排列,每個標籤看成一個維度,那麼每個標的物就可以表示成一個N維的向量了(N是標籤的個數),如果標的物包含某個標籤,向量在相應標籤的分量上的值爲1,否則爲0,即所謂的one-hot編碼。有可能N非常大(如視頻行業,N可能是幾萬、甚至幾十萬上百萬),這時向量是稀疏向量(一般標的物只有少量的幾個或者幾十個標籤),我們可以採用稀疏向量的表示來優化向量存儲和計算,提升效率。有了標的物基於標籤的向量化表示,很容易基於cosine餘弦計算相似度了。
實際上標籤不是這麼簡單的,有很多業務標籤是分級的,比如電商(如淘寶),有多級的標籤(見下面圖3),標籤的層級關係形成一顆樹狀結構,這時該怎麼向量化呢?最簡單的方案是隻考慮葉子節點的標籤(也是最低層級的標籤),基於葉子節點標籤構建向量表示。更復雜的方法,可以基於層級結構構建標籤表示及計算標的物相似度。
標籤可以是通過算法獲取的,比如通過NLP技術從文本信息中提取關鍵詞作爲標籤。對於圖片/視頻,它們的描述信息(標題等)可以提取標籤,另外可以通過目標檢測的方法從圖片/視頻中提取相關對象構建標籤。
標籤可以是用戶打的,很多產品在用戶與標的物交互時可以爲標的物打標籤,這些標籤就是標的物的一種刻畫。標籤也可是人工標註的,像Netflix在做推薦時,請了上萬個專家對視頻從上千個維度來打標籤,讓標籤具備非常高的質量。基於這麼精細優質的標籤做推薦,效果一定不錯。很多行業的標的物來源於第三方提供商,他們在入駐平臺時會被要求按照某些規範填寫相關標籤信息(比如典型的如電商)。
(2)標的物具備結構化的信息
有些行業標的物是具備結構化信息的,如視頻行業,一般會有媒資庫,媒資庫中針對每個節目會有標題、演職員、導演、標籤、評分、地域等維度數據,這類數據一般存在關係型數據庫中。這類數據,我們可以將一個字段(也是一個特徵)作爲向量的一個維度,這時向量化表示每個維度的值不一定是數值,但是形式還是向量化的形式,即所謂的 向量空間模型(Vector Space Model,簡稱VSM)。這時我們可以通過如下的方式計算兩個標的物之間的相似度。
假設兩個標的物的向量表示分別爲:
$V1=(p_1,p_2,p_3,\cdots\cdots,p_k),V2=(q_1,q_2,q_3,\cdots\cdots,q_k)$
這時這兩個標的物的相似性可以表示爲:
$sim(V1,V2)\sum\limits^k_{t=1}sim(p_t,q_t)$
其中$sim(p_t,q_t)$代表的是向量的兩個分量$p_t,q_t$之間的相似度。可以採用Jacard相似度等各種方法計算兩個分量之間的相似度。上面公式中還可以針對不同的分量採用不同的權重策略,見下面公式,其中$w_t$是第t個分量(特徵)的權重,具體權重的數值可以根據對業務的理解來人工設置,或者利用機器學習算法來訓練學習得到。
$sim(V1,V2)=\sum\limits^k_{t=1}w_t*sim(p_t,q_t)$
(3)包含文本信息的標的物的特徵表示
像今日頭條和手機百度APP這類新聞資訊或者搜索類APP,標的物就是一篇篇的文章(其中會包含圖片或者視頻),文本信息是最重要的信息形式,構建標的物之間的相似性有很多種方法。下面對常用的方法做一些講解說明。
a. 利用TF-IDF將文本信息轉化爲特徵向量
TF-IDF通過將所有文檔(即標的物)分詞,獲得所有不同詞的集合(假設有M個詞),那麼就可以爲每個文檔構建一個M維(每個詞就是一個維度)的向量,而該向量中某個詞所在維度的值可以通過統計每個詞在文檔中的重要性來衡量,這個重要性的度量就是TF-IDF。下面我們來詳細說明TF-IDF是怎麼計算的。
TF即某個詞在某篇文檔中出現的頻次,用於衡量這個詞在文檔中的重要性,出現次數越多的詞重要性越大,當然我們會提前將“的”、“地”、“啊”等停用詞去掉,這些詞對構建向量是沒有任何實際價值的,甚至是有害的。TF具體計算公式如下,$t_k$是第k個詞,$d_j$是第j個文檔,下式中分子是$t_k$在$d_j$中出現的次數,分母是$d_j$中詞的總個數。
$TF(t_k,d_j)={|t_k\in d_j|\over|d_j|}$
IDF代表的是某個詞在所有文檔中的“區分度”,如果某個詞只在少量幾個文檔中出現,那麼它包含的價值就是巨大的(所謂物以稀爲貴),如果某個詞在很多文檔中出現,那麼它就不能很好地衡量(區分出)這個文檔。下面是IDF的計算公式,其中N是所有文檔的個數,$n_k$是包含詞$t_k$的文檔個數,這個公式剛好跟前面的描述是一致的:稀有的詞區分度大。
$IDF(t_k)=\log {N\over n_k}$
有了上面對TF和IDF的定義,實際的TF-IDF就是上面兩個量的乘積:
$TF-IDF(t_k,d_j)=TF(t_k,d_j)*IDF(t_k)$
有了基於TF-IDF計算的標的物的向量表示,我們就很容易計算兩個標的物之間的相似度了(cosine餘弦相似度)。
b. 利用LDA算法構建文章(標的物)的主題
LDA算法是一類文檔主題生成模型,包含詞、主題、文檔三層結構,是一個三層的貝葉斯概率模型。 對於語料庫中的每篇文檔,LDA定義瞭如下生成過程(generative process):
[1] 對每一篇文檔,從主題分佈中抽取一個主題;
[2] 從上述被抽到的主題所對應的單詞分佈中抽取一個單詞;
[3] 重複上述過程直至遍歷文檔中的每一個單詞。
我們通過對所有文檔進行LDA訓練,就可以構建每篇文檔的主題分佈,從而構建一個基於主題的向量(每個主題就是向量的一個分量,而值就是該主題的概率值),這樣我們就可以利用該向量來計算兩篇文檔的相似度了。主題模型可以理解爲一個降維過程,將文檔的詞向量表示降維成主題的向量表示(主題的個數是遠遠小於詞的個數的,所以是降維)。想詳細瞭解LDA的讀者可以看參考文獻1、2。
c. 利用doc2vec算法構建文本相似度
doc2vec 或者叫做 paragraph2vec, sentence embeddings,是一種非監督式算法,可以獲得 句子、段落、文章的稠密向量表達,它是 word2vec 的拓展,2014年被Google的兩位大牛提出,並大量用於文本分類和情感分析中。通過doc2vec學出句子、段落、文章的向量表示,可以通過計算向量之間距離來表達句子、段落、文章之間的相似性。
這裏我們簡單描述一下doc2vec的核心思想。doc2vec受word2vec啓發,由它推廣而來,我們先來簡單解釋一下word2vec的思路。
word2vec通過學習一個唯一的向量表示每個詞,每個詞向量作爲矩陣W中的一列(W是所有詞的詞向量構成的矩陣),矩陣列可以通過詞彙表爲每個詞做索引,排在索引第一位的放到矩陣W的第一列,如此類推。將學習問題轉化爲通過上下文詞序列中前幾個詞來預測下一個詞。具體的模型框架如下圖:
簡單來說,給定一個待訓練的詞序列$w_1,w2,w2,\dots,w_T$,詞向量模型通過極大化平均對數概率
${1\over T}\sum\limits^{T-k}{t=k}\log p(w_t | w{t-k},\dots,w_{t+k})$
將預測任務通過softmax變換看成一個多分類問題
$p(w_k|w_{t-k},\dots,w_{t+k})={e^{y_{w_t}}\over\sum\nolimits_ie^{y_i}}$
上式中$y_i$是詞i的歸一化的對數概率,具體用下式來計算,其中U、b是參數,h是通過詞向量的拼接或者平均來構建的
$y=b+Uh(w_{t-k},\dots,w_{t+k};W)$
word2vec算法隨機初始化詞向量,通過隨機梯度下降法來訓練神經網絡模型,最終得到每個詞的向量表示。
doc2vec類似地,每個段落/文檔表示爲向量,作爲矩陣D的一列,每個詞也表示爲一個向量,作爲矩陣W中的一列。將學習問題轉化爲通過上下文詞序列中前幾個詞和段落/文檔來預測下一個詞。將段落/文檔和詞向量通過拼接或者平均來預測句子的下一個詞(下圖是通過“the”、“cat”、“sat”及段落id來預測下一個詞“on”)。在訓練的時候我們固定上下文的長度,用滑動窗口的方法產生訓練集。段落向量/句向量 在上下文中共享。
對算法原理感興趣的讀者可以看看參考文獻3、4、5。工程實現上有很多開源框架有word2vec或者doc2vec的實現,比如gensim中就有很好的實現,作者公司就用gensim來做word2vec嵌入用於相似視頻的推薦業務中,效果非常不錯,讀者可以參考https://radimrehurek.com/gensim/models/doc2vec.html。
(4)圖片、音頻、或者視頻信息
如果標的物包含的是圖片、音頻或者視頻信息,處理起來會更加複雜。一種方法是利用它們的文本信息(標題、評論、描述信息、利用圖像技術提取的字幕等文本信息等等,對於音頻,可以通過語音識別轉化爲文本)採用上面(3)的技術方案獲得向量化表示。對於圖像或者視頻,也可以利用openCV中的PSNR和SSIM算法來表示視頻特徵,也可以計算視頻之間的相似度。另外一種可行的方法是採用圖像、音頻處理技術直接從圖像、視頻、音頻中提取特徵進行向量化表示,從而容易計算出相似度。總之,圖片、圖像、音頻都可以轉化爲NLP問題或者圖像處理問題(見下面圖6),通過圖像處理和NLP獲得對應的特徵表示,從而最終計算出相似度,這裏不詳細講解。
4. 爲用戶做個性化推薦
有了上面用戶和標的物的特徵表示,剩下就是基於此爲用戶做個性化推薦了,一般有5種方法和策略,下面我們來一一講解。這裏的推薦就是完全個性化範式的推薦,爲每個用戶生成不一樣的推薦結果。
(1)採用跟基於物品的協同過濾類似的方式推薦
該方法採用基於用戶行爲記錄的顯式特徵表示用戶特徵,通過將用戶操作過的標的物最相似的標的物推薦給用戶,算法原理跟基於物品的協同過濾類似,計算公式甚至是一樣的,但是這裏計算標的物相似度是基於標的物的自身信息來計算的,而基於物品的協同過濾是基於用戶對標的物的行爲矩陣來計算的。
用戶u對標的物s的喜好度sim(u,s)可以採用如下公式計算,其中S是所有用戶操作過的標的物的列表,$score(u,s_i)$是用戶u對標的物$s_i$的喜好度,$sim(s_i,s)$是標的物$s_i$與s的相似度。
$sim(u,s)=sum_{s_i\in S}score(u,s_i)*sim(s_i,s)$
有了用戶對每個標的物的相似度,基於相似度降序排列,就可以取topN推薦給用戶了。
除了採用上面的公式外,我們在推薦時也可以稍作變化,採用 最近鄰方法(K-Nearest Neighbor, KNN)。對於用戶操作/喜歡過的每個標的物,通過 kNN 找到最相似的k個標的物。
$Rec(u)=sum_{s_i\in U}{s_j|s_j\in kNN(s_i)}$
其中$Rec(u)$是給用戶u的推薦,$kNN(s_i)$是標的物$s_i$最近鄰(最相似)的k個標的物。
(2)採用跟基於用戶協同過濾類似的方法計算推薦
如果我們獲得了用戶的人口統計學向量表示或者基於用戶歷史操作行爲獲得了用戶的向量化表示,那麼我們可以採用跟基於用戶的協同過濾方法相似的方法來爲用戶提供個性化推薦,具體思路如下:
我們可以將與該用戶最相似的用戶喜歡的標的物推薦給該用戶,算法原理跟基於用戶的協同過濾類似,計算公式甚至是一樣的。但是這裏計算用戶相似度是基於用戶的人口統計學特徵向量表示來計算的(計算用戶向量cosine餘弦相似度)或者是基於用戶歷史行爲嵌入獲得的特徵向量來計算的,而基於用戶的協同過濾是基於用戶對標的物的行爲矩陣來計算用戶之間的相似度。
用戶u對標的物s的喜好度sim(u,s)可以採用如下公式計算,其中U是與該用戶最相似的用戶集合,$score(u_i,s)$是用戶$u_i$對標的物s的喜好度,$sim(u,u_i)$是用戶$u_i$與用戶u的相似度。
$sim(u,s)=\sum_{u_i\in U}sim(u,u_i)*score(u_i,s)$
有了用戶對每個標的物的相似度,基於相似度降序排列,就可以取topN推薦給用戶了。
與前面一樣我們也可以採用最近鄰方法(K-Nearest Neighbor, KNN)。通過 kNN 找到最相似的k個用戶,將這些用戶操作/喜歡過的每個標的物推薦給用戶。
$Rec(u)=\sum_{u_i\in kNN(u)}{s_j\in A(u_i)}$
其中$Rec(u)$是給用戶u的推薦,$kNN(U)$是用戶相似的k個用戶。$A(u_i)$是用戶$u_i$操作/喜歡過的標的物的集合。
(3)基於標的物聚類的推薦
有了標的物的向量表示,我們可以用kmeans等聚類算法將標的物聚類,有了標的物的聚類,推薦就好辦了。從用戶歷史行爲中的標的物所在的類別挑選用戶沒有操作行爲的標的物推薦給用戶,這種推薦方式是非常直觀自然的。電視貓的個性化推薦就採用了類似的思路。具體計算公式如下,其中$Rec(u)$是給用戶u的推薦,H是用戶的歷史操作行爲集合,Cluster(s)是標的物s所在的聚類。
$Rec(u)=\sum\limits_{s\in H}{t\in Cluster(s)~&~t\neq s}$
(4)基於向量相似的推薦
不管是前面提到的用戶的顯示的興趣特徵(利用標籤來衡量用戶興趣)或者是向量式的興趣特徵(將用戶的興趣投影到向量空間),我們都可以獲得用戶興趣的向量表示。
如果我們獲得了用戶的向量表示和標的物的向量表示,那麼我們就可以通過向量的cosine餘弦相似度計算用戶與標的物之間的相似度。一樣地,有了用戶對每個標的物的相似度,基於相似度降序排列,就可以取topN推薦給用戶了。
基於向量的相似的推薦,需要計算用戶向量與每個標的物向量的相似性。如果標的物數量較多,整個計算過程還是相當耗時的。同樣地,計算標的物最相似的K個標的物,也會涉及到與每個其他的標的物計算相似度,也是非常耗時的。整個計算過程的時間複雜度是$O(N*N)$,其中N是標的物的總個數。
上述複雜的計算過程可以利用Spark等分佈式計算平臺來加速計算。對於T+1級(每天更新一次推薦結果)的推薦服務,利用Spark事先計算好,將推薦結果存儲起來供前端業務調用是可以的。
另外一種可行的策略是利用高效的向量檢索庫,在極短時間(一般幾毫秒或者幾十毫秒)內爲用戶索引出topN最相似的標的物。目前FaceBook開源的FAISS庫(https://github.com/facebookresearch/faiss)就是一個高效的向量搜索與聚類庫,可以在毫秒級響應查詢及聚類需求,因此可以用於個性化的實時推薦。目前國內有很多公司將該庫用到了推薦業務上。
FAISS庫適合稠密向量的檢索和聚類,所以對於利用LDA、Doc2vector算法構建向量表示的方案是實用的,因爲這些方法構建的是稠密向量。而對於TF-IDF及基於標籤構建的向量化表示,就不適用了,這兩類方法構建的都是稀疏的高維向量。
(5)基於標籤的反向倒排索引做推薦
該方法在 《推薦系統產品與算法概述》 這篇文章中也簡單做了介紹,這裏再簡單說一下,並且給出具體的計算公式。基於標的物的標籤和用戶的歷史興趣,我們可以構建出用戶基於標籤興趣的畫像及標籤與標的物的倒排索引查詢表(熟悉搜索的同學應該不難理解)。基於該反向索引表及用戶的興趣畫像,我們就可以爲用戶做個性化推薦了。該類算法其實就是基於標籤的召回算法。
具體推薦過程是這樣的(見下面圖7):從用戶畫像中獲取用戶的興趣標籤,基於用戶的興趣標籤從倒排索引表中獲取該標籤對應的標的物,這樣就可以從用戶關聯到標的物了。其中用戶的每個興趣標籤及標籤關聯到的標的物都是有權重的。
假設用戶的興趣標籤及對應的標籤權重如下,其中$T_i$是標籤,$S_i$是用戶對標籤的偏好權重。
${(T_1,S_1),(T_2,S_2),(T_3,S_3),\dots,(T_k,S_k)}$
假設標籤$T_1,T_2,T_3,\dots,T_k$關聯的標的物分別爲
$\begin{aligned}&T_1\leftrightarrow{(O_{11},w_{11}),(O_{12},w_{12}),(O_{13},w_{13}),\dots,(O_{1p_1},w_{1p_1})}\&T_2\leftrightarrow{(O_{21},w_{21}),(O_{22},w_{22}),(O_{23},w_{23}),\dots,(O_{2p_2},w_{2p_2})}\&\dots\dots\&T_k\leftrightarrow{(O_{k1},w_{k1}),(O_{k2},w_{k2}),(O_{k3},w_{k3}),\dots,(O_{kp_k},w_{kp_k})}\end{aligned}$
其中$O_{ij}$、$w_{ij}$分別是標的物及對應的權重,那麼
$\begin{aligned}U&=\sum^k_{i=1}S_iT_i\&=\sum^k_{i=1}S_i{(O_{i1},w_{i1}),(O_{i2},w_{i2}),\dots,(O_{ip_i},w_{ip_i})}\&=\sum^k_{i=1}\sum^{p_i}{j=1}S_i*w{ij}*O_{ij}\end{aligned}$
上式中U是用戶對標的物的偏好集合,我們這裏將標的物$O_ij$看成向量空間的基,所以有上面的公式。不同的標籤可以關聯到相同的標的物(因爲不同的標的物可以有相同的標籤),上式中最後一個等號右邊需要合併同類項,將相同基前面的係數相加。合併同類項後,標的物(基)前面的數值就是用戶對該標的物的偏好程度了,我們對這些偏好程度降序排列,就可以爲用戶做topN推薦了。
到此我們介紹完了基於內容的推薦算法的核心原理,那麼這些算法是怎麼應用到真實的產品中的呢?有哪些可行的推薦產品形態?這就是下節的主要內容。
三、基於內容的推薦算法應用場景
基於內容的推薦是最古老的一類推薦算法,在整個推薦系統發展史上具有舉足輕重的地位。雖然它的效果可能沒有協同過濾及新一代推薦算法好,但是它們還是非常有應用價值的,甚至是必不可少的。基於內容的推薦算法主要用在如下幾類場景。
1. 完全個性化推薦
就是基於內容特徵來爲每個用戶生成不同的推薦結果,我們常說的推薦系統就是指這類推薦形態。上面一節第四部分已經完整地講解了怎麼爲用戶做個性化推薦,這裏不再贅述。
2. 標的物關聯標的物推薦
標的物關聯標的物的推薦也是工業界最常用的推薦形態,大量用於真實產品中。
上一節第三部分講了很多怎麼構建標的物之間相似度的方法,其實這些方法可以直接用來做標的物關聯標的物的推薦,只要我們將與某個標的物最相似的topN的標的物作爲關聯推薦即可。
3. 配合其他推薦算法
由於基於內容的推薦算法在精準度上不如協同過濾等算法,但是可以更好的適應冷啓動,所以在實際業務中基於內容的推薦算法會配合其他算法一起服務於用戶,最常用的方法是採用級聯的方式,先給用戶協同過濾的推薦結果,如果該用戶行爲少沒有協同過濾推薦結果,就爲該用戶推薦基於內容的推薦算法產生的推薦結果。
4. 主題推薦
如果我們有標的物的標籤信息,並且基於標籤系統構建了一套推薦算法,那麼我們就可以將用戶喜歡的標籤採用主題的方式推薦給用戶,每個主題就是用戶的一個興趣標籤。通過一些列主題的羅列展示,讓用戶從中篩選自己感興趣的內容(見下面圖8)。Netflix的首頁大量採用基於主題的推薦模式。主題推薦的好處是可以將用戶所有的興趣點按照興趣偏好大小先後展示出來,可解釋性強,並且讓用戶有更多維度的自由選擇空間。
當然,在真實產品中可以採用比下面圖8這種簡單標籤直接展示更好的方式。具體來說,我們可以爲每個標籤通過人工編輯生成一句更有表達空間的話(如武俠標籤,可以採用“江湖風雲再起,各大門派齊聚論劍”這樣更有深度的表述),具體前端展示時映射到人工填充的話而不是直接展示原來的標籤。
5. 給用戶推薦標籤
另外一種可行的推薦策略是不直接給用戶推薦標的物,而是給用戶推薦標籤,用戶通過關注推薦的標籤,自動獲取具備該標籤的標的物。除了可以通過推薦的標籤關聯到標的物獲得直接推薦標的物類似的效果外,間接地通過用戶對推薦的標籤的選擇、關注進一步獲得了用戶的興趣偏好,這是一種可行的推薦產品實現方案。
四、基於內容的推薦算法的優勢與缺點
基於內容的推薦算法算是一類比較直觀易懂的算法,目前在工業級推薦系統中有大量的使用場景,在本節我們對基於內容的推薦算法的優缺點加以說明,方便讀者在實踐中選擇取捨,構建適合業務場景的內容推薦系統。
1. 優點
基於上面的介紹,基於內容的推薦算法是非常直觀的,具體來說,它有如下6個優點。
(1)可以很好的識別用戶的口味
該算法完全基於用戶的歷史興趣來爲用戶推薦,推薦的標的物也是跟用戶歷史興趣相似的,所以推薦的內容一定是符合用戶的口味的。
(2)非常直觀易懂,可解釋性強
基於內容的推薦算法基於用戶的興趣爲用戶推薦跟他興趣相似的標的物,原理簡單,容易理解。同時,由於是基於用戶歷史興趣推薦跟興趣相似的標的物,用戶也非常容易接受和認可。
(3)可以更加容易的解決冷啓動
只要用戶有一個操作行爲,就可以基於內容爲用戶做推薦,不依賴其他用戶行爲。同時對於新入庫的標的物,只要它具備metadata信息等標的物相關信息,就可以利用基於內容的推薦算法將它分發出去。因此,對於強依賴於UGC內容的產品(如抖音、快手等),基於內容的推薦可以更好地對標的物提供方進行流量扶持。
(4)算法實現相對簡單
基於內容的推薦可以基於標籤維度做推薦,也可以將標的物嵌入向量空間中,利用相似度做推薦,不管哪種方式,算法實現較簡單,有現成的開源的算法庫供開發者使用,非常容易落地到真實的業務場景中。
(5)對於小衆領域也能有比較好的推薦效果
對於冷門小衆的標的物,用戶行爲少,協同過濾等方法很難將這類內容分發出去,而基於內容的算法受到這種情況的影響相對較小。
(6)非常適合標的物快速增長的有時效性要求的產品
對於標的物增長很快的產品,如今日頭條等新聞資訊類APP,基本每天都有幾十萬甚至更多的標的物入庫,另外標的物時效性也很強。新標的物一般用戶行爲少,協同過濾等算法很難將這些大量實時產生的新標的物推薦出去,這時就可以採用基於內容的推薦算法更好地分發這些內容。
2. 缺點
雖然基於內容的推薦實現相對容易,解釋性強,但是基於內容的推薦算法存在一些不足,導致它的效果及應用範圍受到一定限制。主要的問題有如下4個:
(1)推薦範圍狹窄,新穎性不強
由於該類算法只依賴於單個用戶的行爲爲用戶做推薦,推薦的結果會聚集在用戶過去感興趣的標的物類別上,如果用戶不主動關注其他類型的標的物,很難爲用戶推薦多樣性的結果,也無法挖掘用戶深層次的潛在興趣。特別是對於新用戶,只有少量的行爲,爲用戶推薦的標的物較單一。
(2)需要知道相關的內容信息且處理起來較難
內容信息主要是文本、視頻、音頻,處理起來費力,相對難度較大,依賴領域知識。同時這些信息更容易有更大概率含有噪音,增加了處理難度。另外,對內容理解的全面性、完整性及準確性會影響推薦的效果。
(3)較難將長尾標的物分發出去
基於內容的推薦需要用戶對標的物有操作行爲,長尾標的物一般操作行爲非常少,只有很少用戶操作,甚至沒有用戶操作。由於基於內容的推薦只利用單個用戶行爲做推薦,所以更難將它分發給更多的用戶。
(4)推薦精準度不太高
基於工業界的實踐經驗,相比協同過濾算法,基於內容的推薦算法精準度要差一些。
五、算法落地需要關注的重要問題
基於內容的推薦算法雖然容易理解,實現起來相對簡單,但在落地到真實業務場景中,有很多問題需要思考解決。下面這些問題是在落地基於內容推薦算法時必須思考的,這裏將他們列舉出來,並提供一些簡單的建議,希望可以幫到讀者。
1. 內容來源的獲取
對於基於內容的推薦來說,有完整的、高質量的內容信息是可以構建精準的推薦算法的基礎,那我們有哪些方法可以獲取內容來源呢?下面這些策略是主要獲取內容(包括標的物內容和用戶相關內容)來源的手段。
(1)標的物“自身攜帶”的信息
標的物在上架時,第三方會準備相關的內容信息,如天貓上的商品在上架時會補充很多必要的信息。對於視頻來說,各類metadata信息也是視頻入庫時需要填充的信息。我們要做的是增加對新標的物入庫的監控和審覈,及時發現信息不全的情況並做適當處理。
(2)通過爬蟲獲取標的物相關信息
通過爬蟲爬取的信息可以作爲標的物信息的補充,特別是補充上面(1)不全的信息。有了更完整的信息就可以獲得更好的特徵表示。
(3)通過人工標註數據
往往人工標註的數據價值密度高,通過人工精準的標註可以大大提升算法推薦的精準度。但是人工標註成本太大。
(4)通過運營活動或者產品交互讓用戶填的內容
通過抽獎活動讓用戶填寫家庭組成、興趣偏好等,在用戶開始註冊時讓用戶填寫興趣偏好特徵,這些都是獲取內容的手段。
(5)通過收集用戶行爲直接獲得或者預測推斷出的內容
通過請求用戶GPS位置知道用戶的活動軌跡,用戶購物時填寫收貨地址,用戶綁定的身份證和銀行卡等,通過用戶操作行爲預測出用戶的興趣偏好,這些方法都可以獲得部分用戶數據。
(6)通過與第三方合作或者產品矩陣之間補充信息
目前中國有大數據交易市場,通過正規的數據交易或者跟其他公司合作,在不侵犯用戶隱私的情況下,通過交換數據可以有效填補自己產品上缺失的數據。
如果公司有多個產品,新產品可以藉助老產品的巨大用戶基數,將新產品的用戶與老產品用戶關聯起來(id-maping或者賬號打通),這樣老產品上豐富的用戶行爲信息可以賦能給新產品。
2. 怎麼利用負反饋
用戶對標的物的操作行爲不一定代表正向反饋,有可能是負向的。比如點開一個視頻,看了不到幾秒就退出來了,明顯表明用戶不喜歡。有很多產品會在用戶交互中直接提供負向反饋能力,這樣可以收集到更多負向反饋。下面是今日頭條和百度APP推薦的文章,右下角有一個小叉叉(見下面圖9中紅色圈圈),點擊後展示上面的白色交互區域,讀者可以勾選幾類不同的負向反饋機制。
負向反饋代表用戶強烈的不滿,因此如果推薦算法可以很好的利用這些負向反饋就能夠大大提升推薦系統的精準度和滿意度。基於內容的推薦算法整合負向反饋的方式有如下幾種:
(1) 將負向反饋整合到算法模型中
在構建算法模型中整合負向反饋,跟正向反饋一起學習,從而更自然地整合負向反饋信息。
(2) 採用事後過濾的方式
先給用戶生成推薦列表,再從該推薦列表中過濾掉與負向反饋關聯的或者相似的標的物。
(3) 採用事前處理的方式
從待推薦的候選集中先將與負向反饋相關聯或者相似的標的物剔除掉,然後再進行相關算法的推薦。
3. 興趣隨時間變化
用戶的興趣不是一成不變的,一般用戶的興趣是隨着時間變化的,那怎麼在算法中整合用戶的興趣變化呢?可行的策略是對用戶的興趣根據時間衰減,最近的行爲給予最大的權重。還可以分別給用戶建立短期興趣特徵和長期興趣特徵,在推薦時既考慮短期興趣又考慮長期興趣,最終推薦列表中整合兩部分的推薦結果。
對於新聞資訊等這類時效性強的產品,能夠整合用戶的實時興趣變化可以大大提升用戶體驗,這也是現在信息流類推薦產品大行其道的原因。
4. 數據清洗
基於內容的推薦算法依賴於標的物相關的描述信息,這些信息更多的是以文本的形式存在,這就涉及到自然語言處理了,文本中可能會存在很多歧義、符號、髒數據,我們需要事先對數據進行很好的處理,才能讓後續的推薦算法產生好的效果。
5. 加速計算與節省資源
在實際推薦算法落地時,我們會事先爲每個標的物計算N(=50)個最相似的標的物,事先將計算好的標的物存起來,減少時間和空間成本,方便後續更好地做推薦。同時也可以利用各種分佈式計算平臺和快速查詢平臺(如Spark、FAISS庫等)加速計算過程。另外,算法開發過程中儘量做到模塊化,對業務做抽象封裝,這可以大大提升開發效率,並且可能會節省很多資源。
6. 怎麼解決基於內容的推薦越推越窄的問題
前面提到基於內容的推薦存在越推越窄的缺點,那怎麼避免或者減弱這種影響呢?當然用協同過濾等其他算法是一個有效的方法。另外,我們可以給用戶做興趣探索,爲用戶推薦興趣之外的特徵關聯的標的物,通過用戶的反饋來拓展用戶興趣空間,這類方法就是強化學習中的EE方法。如果我們構造了標的物的知識圖譜系統,我們就可以通過圖譜拓展標的物更遠的聯繫,通過長線的相關性來做推薦,同樣可以有效解決越推越窄的問題。
7. 工程落地技術選型
本篇文章主要講的是基於內容的推薦系統的算法實現原理,具體工程實踐時,需要考慮到數據處理、模型訓練、分佈式計算等技術,當前很多開源方案可以使用,常用的如Spark mllib,scikit-learn,Tensorflow,pytorch,gensim等,這些工具都封裝了很多數據處理、特徵提取、機器學習算法,我們可以基於第二節的算法思路來落地實現。
8. 業務的安全性
除了技術外,在推薦產品落地中還需要考慮推薦的標的物的安全性,避免推薦反動、色情、標題黨、低俗內容,這些就需要基於NLP或者CV技術對文本或者視頻進行分析過濾。如果是UGC平臺型的產品,還需要考慮怎麼激勵優質內容創作者,讓好的內容得到更多的分發機會,同時對產生劣質內容的創作者採取一定的懲罰措施,比如限制發文頻率、禁止一段時間的發文權限等。
寫在最後
本文作者基於自己的實踐經驗總結了常用的基於內容的推薦算法及落地場景,並對基於內容的推薦算法的優缺點及實踐過程中需要關注的問題進行了分析討論。基於內容的推薦算法一般用於推薦召回階段,通過內容特徵來爲用戶選擇可能喜歡的內容。
作者會在下兩篇講解內容推薦算法的具體案例,讓大家更好地理解掌握內容推薦算法。歡迎大家持續關注!
參考文獻:
- Latent Dirichlet Allocation
- LightLDA- Big Topic Models on Modest Computer Clusters
- Efficient Estimation of Word Representations in Vector Space
- Distributed Representations of Words and Phrases and their Compositionality
- Distributed Representations of Sentences and Documents
- Content-based recommender systems: State of the art and trends
- Content-based collaborative recommendation
- [2009] Content-based recommendation systems
相關閱讀: