note

  • Comirec-SA基于attention的多兴趣建模,论文中先通过attention提取单一兴趣,再推广到多兴趣建模。另外使用贪心算法优化带有准确度+多样性的目标函数。
  • DR把MIND的attention换成argmax(还有初始化方式不同、序列胶囊到兴趣胶囊用可学习权重矩阵替代的不同),SR则本质是多头注意力进行多兴趣建模。
  • torch.einsum(Einstein summation convention,即爱因斯坦求和约定)可以写tensor运算和更高维度tensor写法更加简洁,如用torch.einsum("bij, bjk -> bik", batch_tensor_1, batch_tensor_2)进行batch内矩阵乘法运算。
  • 注意力机制中最后对第一个维度seq进行sofjtmax归一化,即使得seq维度的元素之和为1。因为对于固定序列中不存在的位置负无穷mask掉了,所以缺失的位置经过softmax归一化后的数值为0。Softmax⁡(xi)=exp⁡(xi)∑jexp⁡(xj)\operatorname{Softmax}\left(x_i\right)=\frac{\exp \left(x_i\right)}{\sum_j \exp \left(x_j\right)} Softmax(xi)=jexp(xj)exp(xi)

文章目录

  • note
  • 一、Comirec模型概览
    • 1.1 Notation
    • 1.2 模型框架
    • 1.3 model training
  • 二、Comirec-SA模型
    • 2.0 数据集划分
    • 2.1 基于Attention的单一兴趣建模
    • 2.2 基于Attention的多兴趣建模
      • (1)K-Q-V注意力
        • 1)自注意力机制
        • 2)计算 K-Q-V 注意力(矩阵形式):
    • 2.3 多样性控制
  • 三、代码实践
    • 3.1 MultiInterest_SA类定义
    • 3.2 einsum函数的用法
    • 3.3 Comirec-SA类定义
  • 时间安排
  • Reference

一、Comirec模型概览

第一部分和task5差不多,是同一篇论文Comirec-SA用self-attentive method代替之前DR多兴趣抽取层,

Comirec:Controllable Multi-Interest Framework for Recommendation
论文链接:https://arxiv.org/abs/2005.09347

Comirec是阿里发表在KDD 2020上的一篇工作,这篇论文对MIND多行为召回进行了扩展:

  • 一方面改进了MIND中的动态路由算法,
  • 另一方面提出了一种新的多兴趣召回方法,同时对推荐的多样性层面也做出了一定的贡献,通过一种贪心的做法,在损失较小的推荐效果的情况下可以显著的提高推荐的多样性(感觉非常非常牵强,我们这里就不介绍这个了),从而极大的提高用户的使用体验,可以更进一步的探索用户的潜在兴趣。

1.1 Notation

假设一个用户集合 u∈Uu \in \mathcal{U}uU 和一个物品集合 i∈Ii \in \mathcal{I}iI, 对于每一个用户, 定义用户序列 (e1(u),e2(u),…,en(u))\left(e_1^{(u)}, e_2^{(u)}, \ldots, e_n^{(u)}\right)(e1(u),e2(u),,en(u)), 根据时间先后顺序排序,其中et(u)e_t^{(u)}et(u) 记录了第 ttt 个物品与用户交互。

1.2 模型框架


Comirec流程:

  • 用户历史交互item ids经过embedding layer转为item embeddings;
  • 把刚才的item embedding经过多兴趣抽取层(这里是self-attentive模块),得到K个interest embeddings;
  • training:和之前MIND说的做法一样(取内积最大值),即选出与target item embedding最接近的interest embeddings,基于多分类任务,使用负采样sampled softmax loss;
  • serving(predict):对于每个用户的K个interest embedding进行top-N检索,即召回K X N个item。
  • aggregation module:将K X N个item送入该模块得到N个item(选内积分数最高的N个,和MIND做法一致):f(u,i)=max⁡1≤k≤K(ei⊤vu(k))f(u, i)=\max _{1 \leq k \leq K}\left(\mathbf{e}_i^{\top} \mathbf{v}_u^{(k)}\right) f(u,i)=1kKmax(eivu(k))

1.3 model training

和1.1说的一样,某用户经过多兴趣提取层后得到K个interest embeddings后,从中找出和target item i(即下面embedding为eie_iei)最接近,即内积最大的一个interest embeeding,方法如下vu=Vu[:,argmax⁡(Vu⊤ei)],\mathbf{v}_u=\mathbf{V}_u\left[:, \operatorname{argmax}\left(\mathbf{V}_u^{\top} \mathbf{e}_i\right)\right], vu=Vu[:,argmax(Vuei)],
和之前一样是结合负采样的最大似然法(后面代码用少量数据,直接交叉熵损失函数)。给出一个训练样本 (u,i)(u, i)(u,i), 用户embedding vu\mathbf{v}_uvu, 和物品embedding ei\mathbf{e}_iei,则用户与物品交互的似然函数:
Pθ(i∣u)=exp⁡(vu⊤ei)∑k∈Iexp⁡(vu⊤ek)P_\theta(i \mid u)=\frac{\exp \left(\mathbf{v}_u^{\top} \mathbf{e}_i\right)}{\sum_{k \in I} \exp \left(\mathbf{v}_u^{\top} \mathbf{e}_k\right)} Pθ(iu)=kIexp(vuek)exp(vuei)
目标为最小化该似然函数:
loss =∑u∈U∑i∈Iu−log⁡Pθ(i∣u)\text { loss }=\sum_{u \in \mathcal{U}} \sum_{i \in I_u}-\log P_\theta(i \mid u) loss=uUiIulogPθ(iu)

二、Comirec-SA模型

2.0 数据集划分

原论文是按照8:1:1划分训练集、验证集、测试集(按照用户划分,更具泛化能力)。

  • 训练样本:全部点击序列(e1(u),e2(u),…,ek(u),…,en(u))\left(e_1^{(u)}, e_2^{(u)}, \ldots, e_k^{(u)}, \ldots, e_n^{(u)}\right)(e1(u),e2(u),,ek(u),,en(u)),用前(n-1)个item预测第n个;
  • 验证集合测试集则是使用用户前80%的点击序列作为模型输入,然后预测后面的点击序列。
  • 在验证集合测试集中的用户是从未在训练集中出现过的。

2.1 基于Attention的单一兴趣建模

  • 将用户的行为序列计作 H∈Rd×nH \in \mathbb{R}^{d \times n}HRd×n,

    • 这里的 nnn 表示用户行为序列的长度,
    • ddd 表示Embedding向量的维度,
    • 这里的 HHH 就代表着用户行为序列中所有Item的Embedding向量,
  • 这里引入两个可学习参数 W1∈Rda×d,w2∈RdaW_1 \in \mathbb{R}^{d_a \times d}, w_2 \in \mathbb{R}^{d_a}W1Rda×d,w2Rda, 通过引入Attention机制进行加权求和,凸显重要性高的特征。

在我们的Comirec-SA中, 我们的特征重要性 (也就是我们学习出来的Attention Score) 是针对序列中每个Item的Attention Score, 在有了Attention Score之后就可以对序列中的|tem进行加权求和得到序列的单一兴趣表征了。单一兴趣建模时的Attention Score计算:
a=softmax⁡(w2Ttanh⁡(W1H))Ta=\operatorname{softmax}\left(w_2^T \tanh \left(W_1 H\right)\right)^T a=softmax(w2Ttanh(W1H))T

  • a∈Rna \in \mathbb{R}^naRn, 这里的 aaa 就是我们对序列的Attention Score(权重向量), 再将 aaa 与序列的所有Item的Embedding进行加权求和就可以得到单一兴趣的建模。

2.2 基于Attention的多兴趣建模

可以把 1.11.11.1单一兴趣建模中的 w2∈Rdaw_2 \in \mathbb{R}^{d_a}w2Rda 扩充至 W2∈Rda×KW_2 \in \mathbb{R}^{d_a \times K}W2Rda×K(可训练化参数), 这里是因为在输入embedding中加入了可训练的position embedding,其维度和item embedding的维度一样都是ddd

Attention Score的计算公式就变成:
A=softmax⁡(W2Ttanh⁡(W1H))TA=\operatorname{softmax}\left(W_2^T \tanh \left(W_1 H\right)\right)^T A=softmax(W2Ttanh(W1H))T
其中:

  • A∈Rn×KA \in \mathbb{R}^{n \times K}ARn×K,
  • 权重W2∈Rda×KW_2 \in \mathbb{R}^{d_a \times K}W2Rda×K
  • K是兴趣向量个数

这时我们可以通过如下式子得到用户的多兴趣表征:
Vu=HAV_u=H A Vu=HA
其中:

  • Hd×n\mathbf{H}^{d \times n}Hd×n:用户行为序列的embedding矩阵,其中nnn为用户行为序列的长度,ddd为item embedding维度;
  • Vu∈Rd×KV_u \in \mathbb{R}^{d \times K}VuRd×K, 即为 K\mathrm{K}K 个兴趣表征, 其核心代码如下:
class MultiInterest_SA(nn.Layer):def __init__(self, embedding_dim, interest_num, d=None):super(MultiInterest_SA, self).__init__()self.embedding_dim = embedding_dimself.interest_num = interest_numif d == None:self.d = self.embedding_dim*4self.W1 = self.create_parameter(shape=[self.embedding_dim, self.d])self.W2 = self.create_parameter(shape=[self.d, self.interest_num]) def forward(self, seq_emb, mask = None):'''seq_emb : batch,seq,embmask : batch,seq,1'''H = paddle.einsum('bse, ed -> bsd', seq_emb, self.W1).tanh()mask = mask.unsqueeze(-1)A = paddle.einsum('bsd, dk -> bsk', H, self.W2) + -1.e9 * (1 - mask)A = F.softmax(A, axis=1)A = paddle.transpose(A,perm=[0, 2, 1])multi_interest_emb = paddle.matmul(A, seq_emb)return multi_interest_emb

首先来回顾单头和多头的注意力:

(1)K-Q-V注意力

1)自注意力机制

自注意力是指键(K)、查询(Q)和值(V)来自同一数据来源,即 K=Q=V。

Transformer 以特定方式执行此操作:
x1,x2,⋯,xTx_{1}, x_{2}, \cdots, x_{T}x1,x2,,xT 是 Transformer 编码器的输入向量, 其中 xi∈Rdx_{i} \in R^{d}xiRd, 则键 (K)(K)(K) 、查询 (Q)(Q)(Q) 、值 (V)(V)(V) 是:
ki=Kxiqi=Qxivi=Vxi\begin{aligned} k_{i} &=K x_{i} \\ q_{i} &=Q x_{i} \\ v_{i} &=V x_{i} \end{aligned} kiqivi=Kxi=Qxi=Vxi

  • 其中: 矩阵 K∈Rd×d;Q∈Rd×d;V∈Rd×dK \in R^{d \times d} ; Q \in R^{d \times d} ; V \in R^{d \times d}KRd×d;QRd×d;VRd×d
  • 这些矩阵允许将x向量的不同方面用于三个角色的每一个。

2)计算 K-Q-V 注意力(矩阵形式):

X=[x1,x2,⋯,xT]∈RT×d\mathrm{X}=\left[x_{1}, x_{2}, \cdots, x_{T}\right] \in \mathrm{R}^{\mathrm{T} \times \mathrm{d}}X=[x1,x2,,xT]RT×d 是输入向量的串联(拼接), 其中:

  • XK∈RT×d,XQ∈RT×d,XV∈RT×dX K \in R^{T \times d}, X Q \in R^{T \times d}, X V \in R^{T \times d}XKRT×d,XQRT×d,XVRT×d
  • 输出定义为: output = softmax⁡(XQ(XK)T×XV)\operatorname{softmax}\left(X Q(X K)^{\mathrm{T}} \times X V\right)softmax(XQ(XK)T×XV)
  • 即计算过程:首先, 在一个矩阵乘法中取查询和键的点积, 得到: XQ(XK)TX Q(X K)^{\mathrm{T}}XQ(XK)T;其次, 对上述结果进行 softmax 计算, 再乘以矩阵 XVX VXV, 得到: softmax⁡(XQ(XK)T)×XV\operatorname{softmax}\left(X Q(X K)^{\mathrm{T}}\right) \times X Vsoftmax(XQ(XK)T)×XV ,如下图的(a)。

如果想一次查询(Q)句子中的多个位置:
对于单词 i\mathrm{i}i, self-attention 只 “看” xiTQTKxjx_{i}^{T} Q^{T} K x_{j}xiTQTKxj 分数高的地方, 即单头注意力, 见上图的(b) 。但是, 若出于不同的原因想要关注不同的 j\mathrm{j}j,则可通过多个 Q、K、V\mathrm{Q} 、 \mathrm{~K} 、 \mathrm{~V}QKV 矩阵来定义多个注意力 “头”

令: Ql,Kl,Vl∈Rd×d/hQ_{l}, K_{l}, V_{l} \in R^{d \times d / h}Ql,Kl,VlRd×d/h, 其中 hhh 是注意力头的数量, lll 的范围从 1 到 hhh,则: 每个注意力头独立地计算注意力:output l=softmax⁡(XQlKlTXT)∗XVl\text { output }_{l}=\operatorname{softmax}\left(X Q_{l} K_{l}^{T} X^{T}\right) * X V_{l} outputl=softmax(XQlKlTXT)XVl

其中:output l∈Rd/h_{l} \in R^{d / h}lRd/h

然后合并所有头的输出:output =Y[output 1,…,output h] \text { output }=Y \text { [output }_{1}, \ldots, \text { output }_{h} \text { ] } output=Y[output1,,outputh]

其中: Y∈Rd×dY \in R^{d \times d}YRd×d

因此, 每个头都可以 “看” 不同的事物, 并以不同的方式构建值 ( V\mathrm{V}V ) 向量。多头注意力和单头自注意力有相同的计算量。最简单的多头注意力,即两头注意力(如上图的c)。

2.3 多样性控制

为了强化推荐item的多样性,作者将item的类别作为衡量多样性的基础。

问题定义:给定从用户 uuuKKK 个兴趣中检索到一个集合 M\mathcal{M}M, 有 K⋅NK \cdot NKN 个物品, 找到一个输出集合 S\mathcal{S}S, 有 NNN 个 物品 (Top-N) , 使预定义的值函数Q(u,S)Q(u, \mathcal{S})Q(u,S)最大化。

(1)多样性:作者使用g(i,j)g(i, j)g(i,j)用来衡量两个Item i, j之间的多样性:
g(i,j)=σ(CATE(i)≠CATE(j))g(i, j)=\sigma(C A T E(i) \neq C A T E(j)) g(i,j)=σ(CATE(i)=CATE(j))

  • CATE(i)C A T E(i)CATE(i) 表示物品 iii 的类别
  • σ\sigmaσ 为指示函数,这里就是如果两个item的类别不相同,那么其结果就是 1 , 反之就是 0
  • 可以看出如果一个推荐集合中两两Item的多样性得分大的话, 那么可以认为这个推荐结果中的Item的类别分布较为分散, 也就可以认为推荐结果的多样性较高了,

(2)推荐精度:当推荐结果的多样性较高的时候, 往往推荐的精度就会下降, 这是一个Trade Off,可以构造如下的目标函数(包含多样性指标和推荐精度指标):Q(u,S)=∑i∈Sf(u,i)+λ∑i∈S∑j∈Sg(i,j)Q(u, \mathcal{S})=\sum_{i \in \mathcal{S}} f(u, i)+\lambda \sum_{i \in \mathcal{S}} \sum_{j \in \mathcal{S}} g(i, j) Q(u,S)=iSf(u,i)+λiSjSg(i,j)

  • 通过 λ\lambdaλ 来控制这两部分的占比, λ\lambdaλ 越大则多样性更强,同事准确度会降低;
  • 作者这里提出使用一种贪心的做法来进行目标函数的优化, 优化流程如下:

三、代码实践

3.1 MultiInterest_SA类定义

如上面介绍的SA运算:
A=softmax⁡(W2Ttanh⁡(W1H))TA=\operatorname{softmax}\left(W_2^T \tanh \left(W_1 H\right)\right)^T A=softmax(W2Ttanh(W1H))T
可以得到 A∈Rn×KA \in \mathbb{R}^{n \times K}ARn×K, 这时我们可以通过如下式子得到用户的多兴趣表征:
Vu=HAV_u=H A Vu=HA
注意:

  • 两个维度不同的tensor也可以“做加减法”(指的是代码中的写法), 比如[256, 20, 4]的tensor-[256, 20, 1]的tensor,后者会减在全部(4个)第2维度之上。
  • 下面这里的paddle.einsum函数在tf和torch中都有,einsum(Einstein summation convention,即爱因斯坦求和约定)可以写tensor运算和更高维度tensor写法更加简洁。torch版本的多兴趣抽取层SA代码如下。
  • 最后对第一个维度seq进行sofjtmax归一化,即使得seq维度的元素之和为1。因为对于固定序列中不存在的位置负无穷mask掉了,所以缺失的位置经过softmax归一化后的数值为0。Softmax⁡(xi)=exp⁡(xi)∑jexp⁡(xj)\operatorname{Softmax}\left(x_i\right)=\frac{\exp \left(x_i\right)}{\sum_j \exp \left(x_j\right)} Softmax(xi)=jexp(xj)exp(xi)
class MultiInterest_SA(nn.Module):def __init__(self, embedding_dim, interest_num, d=None):super(MultiInterest_SA, self).__init__()self.embedding_dim = embedding_dimself.interest_num = interest_numif d == None:self.d = self.embedding_dim*4# self.W1 = self.create_parameter(shape=[self.embedding_dim, self.d])# self.W2 = self.create_parameter(shape=[self.d, self.interest_num])self.W1 = Parameter(torch.Tensor(self.embedding_dim, self.d))self.W2 = Parameter(torch.Tensor(self.d, self.interest_num))def forward(self, seq_emb, mask = None):'''seq_emb : batch,seq,embmask : batch,seq,1'''H = torch.einsum('bse, ed -> bsd', seq_emb, self.W1).tanh()mask = mask.unsqueeze(-1)  #  (batch, seq) -> (batch, seq, 1)# einsum 爱因斯坦求和约定# (batch_size, seq_len, interest_num) - (batch_size, seq_len, 1)负无穷,# 两个维度不同可以做减法, 比如[256, 20, 4]-[256, 20, 1],后者会减在4个 全部之上A = torch.einsum('bsd, dk -> bsk', H, self.W2) + -1.e9 * (1 - mask)A = F.softmax(A, dim=1)A = torch.transpose(A, 2, 1)multi_interest_emb = torch.matmul(A, seq_emb)return multi_interest_emb

3.2 einsum函数的用法

einsum(Einstein summation convention,即爱因斯坦求和约定)的用法:

  • cik=∑jaijbjkc_{i k}=\sum_j a_{i j} b_{j k}cik=jaijbjk 的写法如下:
c = np.dot(a, b)                 # 常规
c = np.einsum('ij,jk->ik', a, b) # einsum
  • 再比如 ckl=∑i∑jaijkbijlc_{\mathrm{kl}}=\sum_{\mathrm{i}} \sum_{\mathrm{j}} \mathrm{a}_{\mathrm{ijk}} \mathrm{b}_{\mathrm{ijl}}ckl=ijaijkbijlc = np.einsum('ijk,jkl->kl', a, b)
import torch# 1. 张量转置
A = torch.randn(3, 4, 5)
B = torch.einsum("ijk->ikj", A)
print(A.shape, "\n", B.shape, "\n", "======")  # (3, 4, 5) ; (3, 5, 4)# 2. 取对角元素
A = torch.randn(5, 5)
B = torch.einsum("ii->i", A)
print(A.shape, "\n", B.shape, "\n", "======")# 3. 求和降维
A = torch.randn(4, 5)
B = torch.einsum("ij->i", A)
print(A.shape, "\n", B.shape, "\n", "======")# 4. 哈达玛积(两个矩阵维度相同)
A = torch.randn(3, 4)
B = torch.randn(3, 4)
C = torch.einsum("ij, ij->ij", A, B)
print(A.shape, "\n", B.shape, "\n", C.shape, "\n", "======")# 5. 向量内积
A = torch.randn(10)
B = torch.randn(10)
#C=torch.dot(A,B)
C = torch.einsum("i,i->",A,B)# 6. 向量外积
A = torch.randn(10)
B = torch.randn(5)
#C = torch.outer(A,B)
C = torch.einsum("i,j->ij",A,B)# 7. 矩阵乘法
A = torch.randn(5,4)
B = torch.randn(4,6)
#C = torch.matmul(A,B)
C = torch.einsum("ik,kj->ij",A,B)# 8. 张量缩并
A = torch.randn(3,4,5)
B = torch.randn(4,3,6)
#C = torch.tensordot(A,B,dims=[(0,1),(1,0)])
C = torch.einsum("ijk,jih->kh",A,B)# 9. batch矩阵乘法
batch_tensor_1 = torch.arange(2 * 4 * 3).reshape(2, 4, 3)
batch_tensor_2 = torch.arange(2 * 3 * 4).reshape(2, 3, 4)
torch.bmm(batch_tensor_1, batch_tensor_2)  # [2, 4, 4]
torch.einsum("bij, bjk -> bik", batch_tensor_1, batch_tensor_2) # [2, 4, 4]

3.3 Comirec-SA类定义

这部分和之前DR的类时一样的,改动的部分都体现在MultiInterest_SA上了。

class ComirecSA(nn.Layer):def __init__(self, config):super(ComirecSA, self).__init__()self.config = configself.embedding_dim = self.config['embedding_dim']self.max_length = self.config['max_length']self.n_items = self.config['n_items']self.item_emb = nn.Embedding(self.n_items, self.embedding_dim, padding_idx=0)self.multi_interest_layer = MultiInterest_SA(self.embedding_dim,interest_num=self.config['K'])self.loss_fun = nn.CrossEntropyLoss()self.reset_parameters()def calculate_loss(self,user_emb,pos_item):all_items = self.item_emb.weightscores = paddle.matmul(user_emb, all_items.transpose([1, 0]))return self.loss_fun(scores,pos_item)def output_items(self):return self.item_emb.weightdef reset_parameters(self, initializer=None):for weight in self.parameters():paddle.nn.initializer.KaimingNormal(weight)def forward(self, item_seq, mask, item, train=True):if train:seq_emb = self.item_emb(item_seq)  # Batch,Seq,Embitem_e = self.item_emb(item).squeeze(1)multi_interest_emb = self.multi_interest_layer(seq_emb, mask)  # Batch,K,Embcos_res = paddle.bmm(multi_interest_emb, item_e.squeeze(1).unsqueeze(-1))k_index = paddle.argmax(cos_res, axis=1)best_interest_emb = paddle.rand((multi_interest_emb.shape[0], multi_interest_emb.shape[2]))for k in range(multi_interest_emb.shape[0]):best_interest_emb[k, :] = multi_interest_emb[k, k_index[k], :]loss = self.calculate_loss(best_interest_emb,item)output_dict = {'user_emb': multi_interest_emb,'loss': loss,}else:seq_emb = self.item_emb(item_seq)  # Batch,Seq,Embmulti_interest_emb = self.multi_interest_layer(seq_emb, mask)  # Batch,K,Emboutput_dict = {'user_emb': multi_interest_emb,}return output_dict

时间安排

任务信息 截止时间 完成情况
11月14日周一正式开始
Task01:Paddle开发深度学习模型快速入门 11月14、15、16日周三 完成
Task02:传统序列召回实践:GRU4Rec 11月17、18、19日周六 完成
Task03:GNN在召回中的应用:SR-GNN 11月20、21、22日周二 完成
Task04:多兴趣召回实践:MIND 11月23、24、25、26日周六 完成
Task05:多兴趣召回实践:Comirec-DR 11月27、28日周一 完成
Task06:多兴趣召回实践:Comirec-SA 11月29日周二 完成

Reference

[1] 多兴趣召回实践:Comirec-SA
论文:Controllable Multi-Interest Framework for Recommendation
链接:https://arxiv.org/abs/2005.09347
[2] 推荐场景中召回模型的演化过程. 京东大佬
[3] 原论文作者代码:https://github.com/THUDM/ComiRec/blob/a576eed8b605a531f2971136ce6ae87739d47693/src/train.py
[4] https://github.com/ShiningCosmos/pytorch_ComiRec/blob/main/ComiRec.py
[5] https://wangxiaocs.github.io/
[6] 推荐算法炼丹笔记:阿里序列化推荐算法ComiRec
[7] einsum is all you needed
[8] Understanding PyTorch einsum
[9] 矩阵操作万能函数 einsum 详细解析(通法教你如何看懂并写出einsum表达式)
[10] Sparse-Interest Network for Sequential Recommendation .AAAI 2021
[11] torch_rechub代码复现:https://github.com/datawhalechina/torch-rechub/blob/main/torch_rechub/models/matching/comirec.py

单头注意力机制:
Attention(Q,K,V)=QKTdk∗VAttention(Q,K,V)=\frac{QK^T}{\sqrt{d_k}}*VAttention(Q,K,V)=dk

QKTV
多头注意力机制:
MultiHead(Q,K,V)=Concat(head1,...,headh)∗WOMultiHead(Q,K,V)=Concat(head_1,...,head_h)*W^OMultiHead(Q,K,V)=Concat(head1,...,headh)WO
其中:
headi=Attention(Q∗WiQ,K∗WiK,V∗WiV)head_i=Attention(Q*W_i^Q,K*W_i^K,V*W_i^V)headi=Attention(QWiQ,KWiK,VWiV)

【序列召回推荐】(task6)多兴趣召回Comirec-SA相关推荐

  1. 【序列召回推荐】(task2)序列召回GRU4Rec模型

    学习总结: 一般的RNN模型我们的输入和输出是什么,我们对RNN输入一个序列 X = [ x 1 , x 2 , . . . , x n ] X = [x^1,x^2,...,x^n] X=[x1,x ...

  2. MIND多兴趣召回实战(一)

    这周又是居家办公,难得有时间可以好好儿梳理下之前的工作.今天想和大家聊聊我们在MIND多兴趣召回上面的一些实战经验. 背景 目前,深度学习U2I推荐召回模型已经在业内得到了广泛的应用与研究.大多数U2 ...

  3. 推荐系统多兴趣召回最新进展

    作者 | Y_yongqaing1 整理 | NewBeeNLP 推荐系统的传统召回方法是每个用户仅生成一个向量,会导致召回结果被最近的兴趣所主导.多兴趣召回方法旨在为每个用户生成多个向量,从而更精准 ...

  4. 【序列建模】DIN深度兴趣网络

    [序列建模]DIN深度兴趣网络 通过用户的历史行为序列刻画用户兴趣的广泛性,是推荐系统比较大的一个难点,用户历史行为序列建模的研究经历了从Pooling.RNN到attention.capsule再到 ...

  5. 推荐系统[二]:召回算法超详细讲解[召回模型演化过程、召回模型主流常见算法(DeepMF/TDM/Airbnb Embedding/Item2vec等)、召回路径简介、多路召回融合]

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...

  6. 数值计算方法在计算机的应用,数值计算方法在计算机科学中的应用和误差序列实验推荐.doc...

    数值计算方法在计算机科学中的应用和误差序列实验推荐 数值计算方法在计算机科学中的应用和误差序列实验 [摘要]计算数学也叫做数值计算方法或数值分析.主要内容包括代数方程.线性代数方程组.微分方程的数值解 ...

  7. DeepMatch :用于推荐广告的深度召回匹配算法库

    今天介绍一下我们的一个开源项目DeepMatch,提供了若干主流的深度召回匹配算法的实现,并支持快速导出用户和物品向量进行ANN检索.非常适合同学们进行快速实验和学习,解放算法工程师的双手! 目前支持 ...

  8. 【推荐实践】模型化召回在陌陌社交推荐的探索和应用.pdf(附下载链接)

    今天给大家带来MOMO吴保鑫所做的分享<模型化召回在陌陌社交推荐的探索和应用.pdf>,本次分享共包含如下四大部分: 1.陌陌社交场景概述: 2.模型化召回技术简介: 3.模型化召回在陌陌 ...

  9. AI比赛-推荐系统(一)-新闻推荐03:多路召回【用不同策略分别召回部分候选集,然后把候选集混在一起供后续排序模型使用】【①、YoutubeDNN双塔召回;②、基于物品召回;③、基于用户召回】【天池】

    所谓的"多路召回"策略,就是指采用不同的策略.特征或简单模型,分别召回一部分候选集,然后把候选集混合在一起供后续排序模型使用,可以明显的看出,"多路召回策略"是 ...

最新文章

  1. 在用的虚拟服务器减少内存,降低虚拟服务器内存使用率
  2. dedecms怎么改php版本_PHP程序员进阶之路
  3. 教你制作U盘,内存卡,硬盘等等等的漂亮背景
  4. 如何看待阿里巴巴推荐的Python400集视频?零基础入门学习Python
  5. HTML网页设计水平线像素,细节决定成败之网页设计中1像素的妙用
  6. displaytag.properties
  7. AI头发笔刷_1500款设计字体,海量PS笔刷,icon模板免费送!还为设计发愁吗?
  8. Excel VBA小程序 -使用VBA实现VLOOKUP函数查询?
  9. ubuntu 16.04 系统安装保留原home分区
  10. 三级指标 主成分分析_一文看懂主成分分析(PCA)
  11. 【Hadoop】Hadoop Snappy 安装 (Ubuntu 16.04)
  12. Ant design-05 表单多选的组件
  13. 大型网站架构演变过程、大并发服务器架构
  14. python爬虫实战之多线程爬取前程无忧简历
  15. 共享经济跨界创新,共享办公掀起风潮
  16. HKUST DDM面试
  17. 西工大c语言程序设计,西工大18春《C语言程序设计》平时作业
  18. html更改纵坐标数值,excel折线图纵坐标轴数值与实际值不一致该怎么办?折线图怎么修改纵坐标...
  19. unity3D 2019.3版本开发的扫雷
  20. idea修改批量替换快捷键_idea替换快捷键,批量处理对象的操作

热门文章

  1. 浪潮服务器安装xp系统,浪潮ERP软件安装xp操作系统的电脑无法互相访问的解决方案 | 浪潮888博客...
  2. AI批量导出SVG格式图片
  3. TryHackMe-Binex
  4. MBR分区结构、DPT分区表、EBR扩展引导
  5. 代理刷网页点击量-点到为止 2014-03-11 09:40
  6. html中判断数组是否为空,jquery如何判断数组是否为空?
  7. 【数字化十大预测】德勤发布《2019科技、传媒和电信行业预测》
  8. remote: The project you were looking for could not be found. 解决git clone不下来的方法之一
  9. 对三亚旅游资源的数量、质量及其结构状况评价
  10. 论文阅读笔记(15):Deep Subspace Clustering with Data Augmentation,深度子空间聚类+数据增强