[IJCAI 2022]Next Point-of-Interest Recommendation with Inferring Multi-step Future Preferences
介绍
文章做的问题是next point-of-interst(POI)。以前的工作只考虑以前和当前的信息,这篇会考虑未来的信息(预测打算去干嘛、喜好等)。
问题定义
用户\(U = \{u_1, u_2, \dots, u_{|U|}\}\),位置\(L=\{l_1, l_2, \dots, l_{|L|}\}\),位置的类别\(C=\{c_1, c_2, \dots, c_{|C|}\}\),时间戳\(T=\{t_1, t_2, \dots, t_24, t_{w_0}, t_{w_1}\}\),下标表示1到24小时和工作日/休息日标记。
拼在一起\(r=(u, l, c, g, t)\)表示u在t时去了c类型地理编码(经纬度)为g的l,再把这个人的轨迹做整合\(S^u=\{S^u_1, S^u_2, \dots, S^u_n\}\),最新的\(S^u_n=\{r_1, r_2, \dots, r_k\}\)被认为是当前行为\(S^u_{cur}\),剩下的为以前行为\(S^u_{past}\)。
研究的问题是,提供了\(S^u_{past}\)和\(S^u_{cur}\)后,推断出他未来\(t_{k+1},\dots, t_T\)的多步,并给出\(t_{k+1}\)的一组推荐。
模型
模型名为Context-aware Future Preference inference Recommender(CFPRec)
Past Preference Encoder
过去的任意一个r都可以拼出一个特征:
里面\(t \in \mathbb{R}^{2D}\)同时包含事件编码和工作日/休息日编码\(t = t_k \oplus t_{w_0}/t_{w_1}\)。
得到的\(E_{S^u_i}\)扔进transformer里:
\(E_{S^u_i}\)会乘三个不同的\(W\in \mathbb{R}^{5D \times 5D}\)得到\(Q,K,V\)。里面的\(F(\cdot)\)是softmax,\(\Delta^{dist} \in \mathbb{R}^{|S^u_i|\times |S^u_i|}\)表示空间关系矩阵,\(\Delta^{dist}_{i,j} = (1+dist(l_i, l_j))^{-1}\)。
补充说明一点,transformer里要除以\(\sqrt{d}\)的主要目的是控制内积别变太大,而至于为什么是\(\sqrt{d}\),要是假设Q和K中的元素均值为0,方差为1的话,那么它们的内积结果均值还会是0,方差为\(d\),所以除以一个\(\sqrt{d}\)来让方差变回1。参考资料
后面接的是一个多预测辅助任务:
首先随机mask掉\(S^u_i\)里的20%的r,把里面的数据随机掉:
\(r(u,l,c,g,t) \to r_m =(u, l_m, c_m, g_m, t_m)\)
然后做下面的预测:
- 位置\(\hat{l} = F(h_m, W_l)\)
- 位置类型\(\hat{c} = F(h_mW_c)\)
- 时间\(\hat{t} = F(h_mW_t)\)
这部分的loss:
Current Preference Encoder
先过Embedding再过LSTM,也就是把历史记录给整合了:
最后得到:
这样一整组的隐藏层特征。
Future Preference Extractor
Intra-sequence Attention Aggregation
过去的信息已经被编码为了:\(H_{S^u_i}=[h_1, h_2, \dots, h_{|S^u_i|}]\)
接下来只要用attention做聚合就可以预测未来的特征了:
其中\(t_f\)是未来时间的embedding。也就是将历史信息对比未来某个时间做attention,然后聚合出预测结果。
这里感觉有个bug,就是时间信息应该遵循越早的信息越无用的情况。这里单纯用attention来做有欠优化的嫌疑。
Inter-sequence Attention Aggregation
上一个是根据未来时间来做attention,来预测未来某个时间时,某用户的行为。这边这个是在有了多组(n-1)上面那个预测的轨迹后,再和用户自己做attention来整合这些结果:
里面的u就是动态用户embedding。最后就能得到多步的未来预测:
训练
现在已经得到了\(H_{S^u_n, f}=[H_{S^u_n}, H_f]\),再对这个结果做attention整合:
然后就可以进行预测:\(\hat{y} = F(h^uW_0)\)。
损失函数:\(L^{poi}=-\sum \log(\hat{y}_i),\ L= L^{poi}+\eta L^{aux}\)。
算法整体伪代码:
实验
数据集
实验结果
其中使用到的指标:
- HitRate@K(HR@K):前k个结果中命中的概率(真实标签的比率)
- NDCG@K:判断推荐的顺序和真实顺序的差距