Unified Pretraining for Recommendation via Task Hypergraphs
(WSDM 2024)
采用数据集:
源码:https://github.com/mdyfrank/UPRTH
一、提出问题
由于ID的不同,在一个数据集中的用户-物品交互记录的预训练结果(pretrain)很难转移到另外的数据集上,在另一方面,通过在一个数据集上的预训练和微调(finetune)很容易导致过平滑。在以往的推荐系统中,自然语言模型是一种预训练方式,不过这种方式带有偏见,只预测流畅和语法正确的文本从而进行推荐,不仅如此,将数据转化为纯文本也会引入不少的噪声。因此对于预训练框架来说,设计一个统一的学习模式,有效处理不同需求和任务之间的微小差别是非常重要的。
二、解决方案
提出了一个基于任务超图的统一预训练框架(URPTH),为了确保预训练中自监督学习任务的统一性,将所有任务归纳于在任务超图中预测节点是否属于对应超边,不仅如此,还设计一个TA层(Transitional Attention)去动态地学习预训练任务(次要)和推荐任务(主要)的关联程度,从而调节预训练任务带给主推荐任务的影响。
三、具体过程
1. Embedding Layer
Embedding表示为 E ∈ R d × ( ∣ U ∣ + ∣ I ∣ ) E\in R^{d\times (|U|+|I|)} E∈Rd×(∣U∣+∣I∣),初始embedding表示为 E t r e c u E^u_{t_{rec}} Etrecu和 E t r e c i E^i_{t_{rec}} Etreci,通过预训练阶段,先验知识(embedding)可以被下游推荐任务所利用。
2. 任务超图构建
对于每一个预训练任务,设计一个任务超图,将所有任务分为三大类,推荐、关系预测和节点属性预测。举例说明:对于推荐任务,如果多个用户共同购买一个物品,那么这些用户被一条超边所连接;对于关系预测,以物品节点来说,让一种同质关系本身作为一条超边,如果物品之间有某种同质关系,那么这些物品被一条超边所连接;对于属性预测,在一个分类任务中,属于一个类别的节点被一条超边所连接。
3. TA层
为了用各种各样的预训练任务来改善主推荐任务的效果,动态学习它们之间的关联度是非常重要的,因此设计一个TA层确保模型分配了合适的注意力给每一个任务,从而有效的使先验知识从预训练阶段转换到主推荐任务,接下来详细介绍通过预训练用户embedding从物品相关辅助任务中将知识转移到推荐任务的过程:
3.1 超边初始化
对于一个以物品节点构建的超边(超边上的点代表购买该物品的用户),通过聚合用户embedding来初始化超边的embedding:
e
t
r
e
c
ϵ
=
1
∣
N
ϵ
∣
∑
u
∗
∈
N
ϵ
e
t
r
e
c
u
∗
e^{\epsilon}_{t_{rec}}=\frac{1}{|N_{\epsilon}|}\sum_{u^*\in N_{\epsilon}}e^{u^*}_{t_{rec}}
etrecϵ=∣Nϵ∣1u∗∈Nϵ∑etrecu∗
其中,
e
t
r
e
c
ϵ
e^{\epsilon}_{t_{rec}}
etrecϵ表示超边
ϵ
\epsilon
ϵ的暂时表示,
N
ϵ
N_{\epsilon}
Nϵ表示与超边相连接的节点集合,
e
t
r
e
c
u
∗
e^{u^*}_{t_{rec}}
etrecu∗表示经过
l
l
l层TA层的用户embedding输入。
3.2 特定任务的特征变换(含注意力)
首先计算出用户偏好与每一个特定任务的注意力,然后生成融合通过该任务预训练的先验知识形成的超边embedding。
注意力计算:
a
t
ϵ
=
σ
(
∑
t
∈
T
α
t
i
⋅
e
t
i
)
a_t^{\epsilon}=\sigma(\sum_{t\in T}\alpha_t^i\cdot e_t^i)
atϵ=σ(t∈T∑αti⋅eti)
α t i = e x p ( e t r e c ϵ ⋅ e t i / d ) ∑ t ∗ ∈ T e x p ( e t r e c ϵ ⋅ e t ∗ i / d ) \alpha_t^i=\frac{exp(e^{\epsilon}_{t_{rec}}\cdot e^i_t/\sqrt{d})}{\sum_{t^*\in T}exp(e^{\epsilon}_{t_{rec}}\cdot e^i_{t^*}/\sqrt{d})} αti=∑t∗∈Texp(etrecϵ⋅et∗i/d)exp(etrecϵ⋅eti/d)
其中, a t ϵ a_t^{\epsilon} atϵ表示物品节点 i i i通过所有与之有关的预训练任务生成的基于预训练任务的embedding, α t i \alpha_t^i αti表示节点 i i i在任务 t t t中得到的注意力系数, e t i e_t^i eti表示经过特定预训练任务 t t t得到的节点 i i i的embedding, σ \sigma σ是一个激活函数。
得到最终的超边embedding表示为:
q
t
ϵ
=
e
t
r
e
c
ϵ
+
γ
a
t
ϵ
q^{\epsilon}_t=e^{\epsilon}_{t_{rec}}+\gamma a_t^{\epsilon}
qtϵ=etrecϵ+γatϵ
γ
\gamma
γ是一个超参数,控制预训练任务的影响。
3.3 节点更新
由于超边更新,对应的用户节点也要被更新:
e
t
r
e
c
′
u
=
1
∣
N
u
∣
∑
ϵ
∈
N
u
q
t
ϵ
e_{t_{rec}}^{\prime u}=\frac{1}{|N_u|}\sum_{\epsilon\in N_u}q^{\epsilon}_t
etrec′u=∣Nu∣1ϵ∈Nu∑qtϵ
N
u
N_u
Nu为与该用户连接的超边集合。
4. 预测与优化
预测采用内积:
y
t
r
e
c
(
u
,
i
)
=
e
t
r
e
c
u
⋅
e
t
r
e
c
i
y_{t_{rec}}^{(u,i)}=e_{t_{rec}}^u\cdot e_{t_{rec}}^i
ytrec(u,i)=etrecu⋅etreci
采用alignment损失优化:
L
r
e
c
=
∑
(
u
,
i
)
∈
D
r
∣
∣
e
t
r
e
c
u
−
e
t
r
e
c
i
∣
∣
2
L_{rec}=\sum_{(u,i)\in D_r}||e_{t_{rec}}^u-e_{t_{rec}}^i||^2
Lrec=(u,i)∈Dr∑∣∣etrecu−etreci∣∣2
D
r
D_r
Dr表示用户-物品交互。
对于基于超图构建的关系和属性预测,采用内积计算节点与超图的预测评分:
y
t
(
v
,
ϵ
)
=
e
(
v
,
t
)
⋅
e
t
ϵ
y_t^{(v,\epsilon)}=e_{(v,t)}\cdot e_t^{\epsilon}
yt(v,ϵ)=e(v,t)⋅etϵ
然后采用BPR损失优化:
L
t
=
∑
(
v
,
ϵ
,
ϵ
′
)
∈
D
a
−
l
o
g
σ
(
y
^
t
(
v
,
ϵ
)
−
y
^
t
(
v
,
ϵ
′
)
)
L_t=\sum_{(v,\epsilon,\epsilon ^\prime)\in D_a}-{\rm{log}}\sigma(\hat{y}_t^{(v,\epsilon)}-\hat{y}_t^{(v,\epsilon^\prime)})
Lt=(v,ϵ,ϵ′)∈Da∑−logσ(y^t(v,ϵ)−y^t(v,ϵ′))
最后的总的损失定义为:
L
=
β
⋅
L
r
e
c
+
(
1
−
β
)
⋅
∑
t
∈
T
L
t
+
λ
θ
∣
∣
θ
∣
∣
2
2
L=\beta\cdot L_{rec}+(1-\beta)\cdot\sum_{t\in T}L_t+\lambda_{\theta}||\theta||_2^2
L=β⋅Lrec+(1−β)⋅t∈T∑Lt+λθ∣∣θ∣∣22
四、实验结果
以其他的一些预训练框架(GCC、SGL-PreRec和AttriMask)对比。
以主流的推荐模型用和不用UPRTH框架作对比:
结果均表示本论文提出的预训练框架UPRTH是有效的。
五、pretrain task和downstream task
1. pretrain task
预训练表现在模型参数上,使得模型训练不需要再从0或者随机初始化开始训练,首先从大量的低成本数据中学习到其中的共性,再把其中的共性移植到特定的任务中,再使用相关领域的少量标注数据进行微调,可以大大提高训练效率(拿别人训练好的模型用)。
2. downstream task
即真正想解决的任务,通过一些公开的数据集进行预训练之后,通过微调,模型才可以用于下游任务。