引言
在推薦系統領域,如何有效表征物品特征始終是核心挑戰。傳統協同過濾方法受限于稀疏性問題,直到2016年微軟研究院提出的Item2Vec方法,將自然語言處理中的Word2Vec技術創造性應用于物品表征學習,開啟了嵌入學習的新紀元。
Item2vec
脫胎于自然語言處理領域中的 word2vec
技術。word2vec 的核心目標是將文本中的單詞轉化為低維向量,使得語義相近的單詞在向量空間中距離相近。item2vec 則將這一思想拓展到了更廣泛的領域,它可以將任何類型的 “item”,如商品、電影、音樂、文章等,映射為低維向量,從而捕捉 item 之間的相似性和關聯性。這種向量表示為后續的數據分析、推薦系統、聚類等任務提供了堅實的基礎。
Word2vec核心思想
Word2Vec借鑒自然語言處理中的分布式假設:
“出現在相似上下文中的詞語具有相似語義”
將這一思想遷移到推薦場景:
- 用戶行為序列視作"句子"
- 單個物品視為"詞語"
- 共同出現的物品構成"上下文"
通過神經網絡學習物品的稠密向量表示,使得相似物品在向量空間中距離相近。
數學原理
1. Skip-Gram模型
給定長度為T的物品序列 w 1 , w 2 , . . . , w T w_1,w_2,...,w_T w1?,w2?,...,wT?,最大化對數似然:
1 T ∑ t = 1 T ∑ ? k ≤ j ≤ k , j ≠ 0 log ? p ( w t + j ∣ w t ) \frac{1}{T} \sum_{t=1}^T \sum_{-k \leq j \leq k,j\neq0} \log p(w_{t+j}|w_t) T1?t=1∑T??k≤j≤k,j=0∑?logp(wt+j?∣wt?)
其中k為上下文窗口大小,條件概率通過softmax計算:
p ( w j ∣ w i ) = exp ? ( u j T v j ) ∑ w = 1 W exp ? ( u i T v k ) p(w_j|w_i) = \frac{\exp(\mathbf{u_j}^T \mathbf{v_j})}{\sum_{w=1}^W \exp(\mathbf{u_i}^T \mathbf{v_k})} p(wj?∣wi?)=∑w=1W?exp(ui?Tvk?)exp(uj?Tvj?)?
2. 負采樣優化
為了解決計算量過大的問題,負采樣技術應運而生。負采樣通過將公式中的 Softmax 函數替換為
p ( w j ∣ w i ) = σ ( u j T v i ) ∏ k = 1 N σ ( ? u i k T v i ) p(w_j | w_i) = \sigma(u_j^T v_i)\prod_{k = 1}^{N}\sigma(-u_{i_k}^T v_i) p(wj?∣wi?)=σ(ujT?vi?)k=1∏N?σ(?uik?T?vi?)
其中:
其中, σ ( x ) = 1 1 + exp ? ( ? x ) \sigma(x) = \frac{1}{1 + \exp(-x)} σ(x)=1+exp(?x)1?, N N N是每個正樣本對應的負樣本數量。負樣本是從 unigram distribution 中按 3/4 次方采樣的。
P n ( w ) = f ( w ) 3 4 ∑ w ′ f ( w ′ ) 3 4 P_n(w) = \frac{f(w)^{\frac{3}{4}}}{\sum_{w'} f(w')^{\frac{3}{4}}} Pn?(w)=∑w′?f(w′)43?f(w)43??
其中: f ( w ) f(w) f(w)是詞 $w $ 在語料庫中的頻率。
- f ( w ′ ) f(w') f(w′) 是語料庫中每個詞 w ′ w' w′的頻率。
實驗證明,這種分布顯著優于普通的一元分布。負采樣大大減少了計算量,因為它只需要考慮少數幾個負樣本,而不是整個詞匯表,使得模型能夠在大規模數據上高效訓練。
3.處理單詞頻率不平衡:子采樣過程
在實際數據中,單詞的頻率往往存在很大差異,高頻詞出現的次數遠遠多于低頻詞。這種不平衡會影響模型的學習效果,因為模型可能會過度關注高頻詞,而忽略低頻詞的信息。為了解決這個問題,引入了子采樣過程。
給定輸入單詞序列,每個單詞w以概率p(discard|w)被丟棄
p ( d i s c a r d ∣ w ) = 1 ? p f ( w ) p(discard|w) = 1 -\sqrt{ \frac{p}{f(w)}} p(discard∣w)=1?f(w)p??
其中 f ( w ) f(w) f(w)是單詞w的頻率,p是預定閾值。
這樣的結果是:
1.頻率較低的詞會被保留,頻率較高的詞則可能會被丟棄
2.加速了學習過程因為他降低了高頻詞的數量,降低了計算量,還顯著改善了低頻詞的表示。通過子采樣,模型能夠更加平衡地學習高頻詞和低頻詞的特征,提高了模型的泛化能力。
Item2Vec 原理
在商品推薦中的應用 在傳統的基于協同過濾(Collaborative Filtering, CF)的推薦系統中,商品之間的相似性通常是基于用戶的行為數據來計算的。Item2Vec 通過將商品的購買歷史轉換為一個序列,類似于處理自然語言中的單詞序列,來學習商品的嵌入表示。通過學習商品間的相似度,推薦系統可以根據用戶的購買歷史推薦相似的商品。
序列 vs. 集合
與傳統的自然語言處理任務不同,Item2Vec 處理的是商品的集合(如用戶購買的商品列表),而不是一個有序的商品序列。因此,在訓練過程中,Item2Vec 會忽略商品順序的信息,認為同一集合中的商品是相似的,不考慮其出現的順序或時間。
訓練過程
Item2Vec 的訓練過程與 Skip-gram with Negative Sampling 類似,模型的輸入是用戶的商品購買集合,目標是最大化目標商品與其上下文商品之間的相似度。 對于一個包含 K K K 個商品的集合,Item2Vec 的目標函數可以表示為:
Objective = ∑ i = 1 K ∑ j ≠ i log ? p ( w j ∣ w i ) \text{Objective} = \sum_{i=1}^{K} \sum_{j \neq i} \log p(w_j | w_i) Objective=i=1∑K?j=i∑?logp(wj?∣wi?)
其中, w i w_i wi? 和 w j w_j wj? 是同一集合中的商品,模型的目標是學習每一對商品之間的相似度。
負采樣和子采樣代碼實現
負采樣
def get_negative_samples(word_prob, k = 5):"""從采樣分布中隨機抽取負樣本:param word_prob: 采樣分布, 字典形式, key為單詞索引, value為概率:param words: 單詞索引列表:param num_samples: 每個單詞的負樣本數量:return: 負樣本列表"""# 從采樣分布中隨機抽取負樣本word = list(word_prob.keys())prob = list(word_prob.values())negative_samples = np.random.choice(word, size=k, p=prob)return negative_samples
子采樣
def get_unigram_distribution(words,power):"""子采樣函數:param words: 單詞索引列表:param power: 次方:return: 采樣分布"""# 使用 collections.Counter 統計每個單詞的頻率word_counts = collections.Counter(words)total_words = len(words)# 計算每個單詞的頻率word_freq_power = {word: np.power(count / total_words, power) for word, count in word_counts.items()}word_sum = sum(word_freq_power.values())# 計算每個單詞的概率word_prob = {word: freq_power / word_sum for word, freq_power in word_freq_power.items()}return word_prob
結論
Item2Vec 利用 SGNS(Skip-gram with Negative sampling)
方法通過學習商品的嵌入向量來捕捉商品間的相似性,從而提升推薦系統的性能。它將商品看作是無序集合的元素,忽略了順序信息,但仍然能夠有效地通過計算商品間的相似度來進行推薦。在實際應用中,Item2Vec 為商品推薦系統提供了一種高效、準確的解決方案。
Reference
- Barkan, O., & Koenigstein, N. (2016). Item2Vec: Neural item embedding for collaborative filtering. Proceedings of the 10th ACM Conference on Recommender Systems (RecSys '16) , 143-150. DOI: 10.1145/2959100.2959167
- 王喆《深度學習推薦系統》