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')