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保持一致:
其中\(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')