显式利用用户画像的多兴趣建模

280 阅读3分钟

显式利用用户画像的多兴趣建模

目前在多兴趣建模中,用户侧的特征包括用户基础画像特征(年龄、性别、地域等)、用户在当前场景的静态兴趣画像特征(短期兴趣画像、长期兴趣画像)、交互的历史正向行为序列特征(正向物料id序列、正向物料类目序列、正向行为间隔序列等)。不论是基础画像、静态兴趣画像,都称为用户画像,经过Embedding层之后,与用户序列特征经过兴趣编码层提取后的兴趣Embedding拼接后进入最后的MLP。这里直接简单的拼接应该有更有效的方式来处理,有一篇paper使用attention的方式较好的结合了兴趣Embedding和用户画像Embedding。

论文地址:dl.acm.org/doi/pdf/10.…

整体结构

在这里插入图片描述

多兴趣编码前

用户序列在输出多兴趣编码层之前,对序列每个正向行为的Embedding和用户画像计算attention分数,即计算每个正向行为和用户画像的相关性。然后attention分数乘到行为的Embedding上面,即对用户画像相关程度高的行为进行强化,对用户还行相关程度低的行为降权弱化,这个操作类似于对用户序列进行去噪。

其中计算attention分数的方式如下,这里也是用到了一个网络,论文中称为user-guided attention Network,ei\mathbf e_i是用户序列Embedding,eu\mathbf e_u是用户画像Embedding,[ei,eu][\mathbf e_i, \mathbf e_u]表示用户画像Embedding和行为Embedding拼接成一个Embedding,WiT\mathbf W^T_i是学习的参数,aia_i是attention分数。

ai=sigmoid(W2TReLU(W1T[ei,eu]+b1)+b2)a_i = sigmoid(\mathbf W^T_2ReLU(\mathbf W^T_1[\mathbf e_i, \mathbf e_u] + \mathbf b_1) + b_2)

计算出的attention分数再乘回到序列Embedding上面,作为兴趣编码层的输入(如果是capsule编码,则计算方式如下) zj=i=1TaicijWjejz_j = \sum_{i=1}^T a_ic_{ij} \mathbf W_j \mathbf e_j

多兴趣编码后

经过多兴趣编码之后,产生的多个兴趣向量,需要再度与用户画像进行兴趣精调,即用产生的兴趣向量和用户画像向量再次计算相关性,对相关性高的兴趣进行强化。论文中称这部分为IR Unit。

假设编码出了KK个兴趣向量,vk\mathbf v_k表示一个兴趣向量,eu\mathbf e_u表示用户画像Embedding,ok\mathbf o_k表示最终的兴趣向量。精调过程如下

ok=MLP([ok,eu])    k=1,2,...,K\mathbf o_k = MLP([\mathbf o_k, \mathbf e_u]) \ \ \ \ k=1,2,...,K

不得不说,利用用户画像的这个方式挺有效的。兴趣编码之前,对每个行为序列根据用户画像进行去噪提纯;兴趣编码之后,对每个兴趣向量根据用户画像进行精调。

其他策略

这个paper还提出了一个hard negetive策略 使用argmax从用户兴趣向量池Ou\mathbf O_u中选择出和目标物料et\mathbf e_t最匹配的兴趣向量ok\mathbf o_k

ok=Ou[argmax(OuTet)]\mathbf o_k = \mathbf O_u[argmax(\mathbf O_u^T \mathbf e_t)] 那么基于这个用户兴趣ok\mathbf o_k,最可能的交互物料xtx_t可以由最大化p(xtu)p(x_t|u)得到

p(xtu)=exp(okTet)jIexp(okTej)p(x_t|u) = \frac {exp(\mathbf o_k^T \mathbf e_t)} {\sum_{j \in I} exp(\mathbf o_k^T \mathbf e_j)} 这里面兴趣向量ok\mathbf o_k是和正向物料xtx_t最相关的,计算负样本中的xjx_j的相关性也是用这个兴趣向量来计算的,训练和推断时有个较大的gap,因为oko_k和目标物料xtx_t明显相关,但是和其他物料xtx_t明显无关。因此可以构造hard negetive,argmax操作不仅仅包括正向物料,也报告负向物料,即选出每个物料最相关的兴趣向量,不论这个物料是正向的还是负向的。

ok(q)=Ou[argmax(OuTeq)]\mathbf o_k^{(q)} = \mathbf O_u[argmax(\mathbf O_u^T \mathbf e_q)]

p(xtu)=exp((ok(t))Tet)jIexp((ok(j))Tej)p(x_t|u) = \frac {exp(\mathbf (o_k^{(t)})^T \mathbf e_t)} {\sum_{j \in I} exp(\mathbf (o_k^{(j)})^T \mathbf e_j)}

损失函数如下: L=uUxtIulog(p(xtu))L = \sum_{u \in U} \sum_{x_t \in I_u} -\log (p(x_t|u))