Chapter 10
2.2.2. Item2Vec:最直接的迁移
2.2.2. Item2Vec:最直接的迁移¶
Word2Vec在自然语言处理领域的成功,自然引发了一个问题:能否将这种基于序列的学习方法直接应用到推荐系统中?Item2Vec给出了肯定的答案。
2.2.2.1. 从词语到物品的映射¶
Item2Vec (Barkan and Koenigstein, 2016) 的核心洞察在于发现了用户行为数据与文本数据的结构相似性。在文本中,一个句子由多个词语组成,词语之间的共现关系反映了语义相似性。类似地,在推荐系统中,每个用户的交互历史可以看作一个“句子”,其中包含的物品就是“词语”。如果两个物品经常被同一个用户交互,那么它们之间就存在相似性。
这种映射关系可以表示为:
-
词语 → 物品
-
句子 → 用户交互序列
-
词语共现 → 物品共同被用户交互
2.2.2.2. 模型实现¶
Item2Vec直接采用Word2Vec的Skip-Gram架构,但在序列构建上有所简化。给定数据集(\mathcal{S} = {s_1, s_2, \ldots, s_n}),其中每个(s_i)包含用户(i)交互过的所有物品,Item2Vec将每个用户的交互历史视为一个集合而非序列,忽略了交互的时间顺序。
优化目标函数与Word2Vec保持一致:
(2.2.3)¶[\mathcal{L} = \sum_{s \in \mathcal{S}} \sum_{l_{i} \in s} \sum_{-m \leq j \leq m, j \neq 0} \log P(l_{i+j} | l_{i})] 其中(l_i)表示物品,(m)是上下文窗口大小,(P(l_{i+j} | l_{i}))采用与Word2Vec相同的softmax形式计算。
2.2.2.3. 代码实践¶
Item2Vec的实现可以直接调用gensim库 (Řehůřek and Sojka, 2010) 的Word2Vec模型。核心在于将用户交互序列作为训练语料:
def fit(self, train_hist_movie_id_list): # train_hist_movie_id_list: 用户交互序列列表 # 每个元素是一个用户的物品ID序列 self.model = Word2Vec( train_hist_movie_id_list, vector_size=self.model_config["EmbDim"], # 嵌入维度 window=self.model_config["Window"], # 上下文窗口大小 min_count=self.model_config["MinCount"], # 最小出现次数 workers=self.model_config["Workers"], # 并行线程数 )
这里的train_hist_movie_id_list就是前面提到的数据集(\mathcal{S}),其中每个用户的交互历史被视为一个“句子”,物品ID对应“词语”。训练完成后,每个物品都得到一个稠密的向量表示。
下面训练Item2Vec并评估召回效果。
from funrec import run_experiment
run_experiment('item2vec')
+---------------+--------------+-----------+----------+----------------+---------------+ | hit_rate@10 | hit_rate@5 | ndcg@10 | ndcg@5 | precision@10 | precision@5 | +===============+==============+===========+==========+================+===============+ | 0.0082 | 0.0049 | 0.0036 | 0.0025 | 0.0008 | 0.001 | +---------------+--------------+-----------+----------+----------------+---------------+
Table Of Contents
-
2.2.2. Item2Vec:最直接的迁移 2.2.2.1. 从词语到物品的映射
-
2.2.2.2. 模型实现
-
2.2.2.3. 代码实践
codePrevious 2.2.1. Word2Vec:序列建模的理论基础 Next 2.2.3. EGES:用属性信息增强序列
