Item2Vec:最直接的迁移 ====================== Word2Vec在自然语言处理领域的成功,自然引发了一个问题:能否将这种基于序列的学习方法直接应用到推荐系统中?Item2Vec给出了肯定的答案。 从词语到物品的映射 ------------------ Item2Vec :cite:`barkan2016item2vec` 的核心洞察在于发现了用户行为数据与文本数据的结构相似性。在文本中,一个句子由多个词语组成,词语之间的共现关系反映了语义相似性。类似地,在推荐系统中,每个用户的交互历史可以看作一个“句子”,其中包含的物品就是“词语”。如果两个物品经常被同一个用户交互,那么它们之间就存在相似性。 这种映射关系可以表示为: - **词语** → **物品** - **句子** → **用户交互序列** - **词语共现** → **物品共同被用户交互** 模型实现 -------- Item2Vec直接采用Word2Vec的Skip-Gram架构,但在序列构建上有所简化。给定数据集\ :math:`\mathcal{S} = \{s_1, s_2, \ldots, s_n\}`\ ,其中每个\ :math:`s_i`\ 包含用户\ :math:`i`\ 交互过的所有物品,Item2Vec将每个用户的交互历史视为一个集合而非序列,忽略了交互的时间顺序。 优化目标函数与Word2Vec保持一致: .. math:: \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}) 其中\ :math:`l_i`\ 表示物品,\ :math:`m`\ 是上下文窗口大小,\ :math:`P(l_{i+j} | l_{i})`\ 采用与Word2Vec相同的softmax形式计算。 代码实践 -------- Item2Vec的实现可以直接调用gensim库 :cite:`rehurek_lrec` 的Word2Vec模型。核心在于将用户交互序列作为训练语料: .. raw:: latex \diilbookstyleinputcell .. code:: python 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``\ 就是前面提到的数据集\ :math:`\mathcal{S}`\ ,其中每个用户的交互历史被视为一个“句子”,物品ID对应“词语”。训练完成后,每个物品都得到一个稠密的向量表示。 下面训练Item2Vec并评估召回效果。 .. raw:: latex \diilbookstyleinputcell .. code:: python from funrec import run_experiment run_experiment('item2vec')