推荐系统 之 DSIN

1. DSIN的由来

        作者认为呀,之前的所有模型,很大程度上都忽略了推荐还有一个非常重要的属性,那就是序列。所以在DEIN这个模型里面,为了更好地利用用户的历史行为,就把序列模型引进了推荐系统,用兴趣提取层来学习哥哥行为之间的关系,为了更有针对性的广告和用户兴趣的关系,又在兴趣提取层后面加入了注意力机制,和兴趣进化层网络。这么想就已经很完美了我觉得,但是阿里的大佬们更加贴近了用户的实际情况,他们发现用户在过去会有很多的历史行为,而且兴趣的方向都不是唯一的,有时候跨度非常大,那么在那么一大串商品里面一块找规律好像不太合理呀,于是,他们就想到 在一段时间内,用户的兴趣(点击的商品)往往都会非常相似,而DSIN相比于DEIN,提升点就是在这里了,DSIN不是把全部历史行为一起怼进去,而是选择一个时间段去学习。也就是认为,我当前时间段内的兴趣应该都是方向差不多的,所以模型学习起来才会更加事半功倍,相对应的广告推送才会更加精准,收益才会更大。

2. DSIN的网络架构

         不得不说,这个结构我当时看了人都傻了...怎么这么复杂呀。

        网络层级依次是:Session Division Layer(会话划分层),会话兴趣提取层,会话交互层以及会话兴趣局部激活层。

        下面我们就一个一个来学,当然,篇幅会比较长,因为涉及到了很多新的知识点。

3. 会话划分层

        为了更精确的抽取用户的会话兴趣,我们将用户行为序列 S = \left [ b_1,b_2,....b_N \right ] 划分为多个回话序列Q,其中第k个回话序列是:Q_k = \left [ b_{k1},b_{k2},b_{k3},...,b_{kT} \right ]

        其中T是代表当前这个会话序列里面总共有T个用户行为在,b_{ki} 就是当前第k个序列里面用户的第i个行为了。

        这里面是按照什么规则去将多个用户序列行为划分为同一个会话序列呢?都是按根据业务场景去设定的,30分钟,1个小时这样子。

4.会话兴趣提取层

        这个层是学习每个会话中各个行为之间的关系。同一会话的行为彼此密切相关,但是也有一些偶然行为偏离了会话兴趣的原始表达。为了捕获同一会话行为之间的内在关系,并且减少无关行为的影响,这里采用了multi-head self-attention,并且做了点改进。

        在Transformer里面,第一步得叫 Positional Encoding呀,第二步叫self-attention计算。

        在第一步Positional Encoding里面,做了点改进,叫Bias Encoding。在Transformer里面,作者除了计算Embedding外,还通过两个公式计算了每一个Embedding的位置,然后两个做累加。但在这里不是,因为我们除了要考虑商品在一个会话里面的顺序,还需要考虑会话之间的顺序,所以还需要对每一个会话添加一个Positional Encoding,称为Bias Encoding。

BE_{(k,t,c)} = W_k^K + w_t^T + W_c^C

BE \in R^{K*T*d_{model}}

        W^K 是会话的bias矩阵,K为会话总数,W_k^K为第k个分量,代表第k个会话的bias

        W^T 是会话里面时间位置层次上的偏置(位置信息),T为会话中时间序列的总数,W_t^T为第t个分量,代表会话中第t个位置的bias

        W^C 是会话里面用户Embedding维度层次上偏置,C等于d_{model}W_c^C也是第c个分量

        所以BE 就是一个矩阵,蕴含了每个会话,每个物品,每个Embedding位置的位置信息,经过Bias编码之后,用户的行为会话Q更新为:

Q = Q + BE

        这里的Q就是会话序列呀,一个Q里面有多个用户行为序列,每一个行为序列都对应一个Embedding向量,所以Q的维度是 [K, T, d_{model}],这个是总Q,里面有[Q_1,Q_2,...,Q_k]

        然后我们就把这每个会话序列都放进Transformer里面进行处理了,每个会话指的是(假如30分钟取一次用户行为片段)一个会话的维度是 T*d_{model}

        注意哈,我们现在拿到的一个会话Q矩阵是已经做完了Positional Encoding了。然后就去做哪个多头(角度)的注意力机制处理了,这里面有挺多细节的,建议看一下里面每一步操作都是代表什么意思 Transformer 编码流程细节  

        然后将第k个会话沿着Embedding维度方向去拆分成多个Head

Q_k = [Q_{k,1};...;Q_{k,h};...,Q_{k,H}]

        其中每一个head的维度都是\frac{1}{H}*d_{model}

        然后就是Transformer里面的操作了,也就是得到QKV矩阵后,进行QK^T的计算,以及和V的点积计算。然后再以行为单位做一个softmax处理。

         这个是一个head的计算,然后我们把所有head都拼接恰里,送到FFN里面去,得到最后的结果,得到一组输出的向量。

I_k^Q = FFN(Concat(head_1,...,head_H)W^O)

        然后我们最后对这组输出向量做一个池化操作,就能够把第k个对话的兴趣转成一个embedding向量了:

I_k = Avg(I_K^Q)

        最后,我们有K个会话,都走一遍这个Transformer网络,就会得到一个K*Embedding的矩阵了,代表的是某个用户K个会话里面的兴趣信息(不是第k个哈)。

有两点特别要注意的是:

1. 这K个会话是走同一个Transformer网络的,也就是在自注意力机制中不同的会话之间权重共享
2. 最后得到的这个矩阵,K这个维度上是有时间先后关系的,这为后面用LSTM学习这各个会话之间的兴趣向量奠定了基础。
 

5. 会话兴趣交互层 

        这里,用户的会话兴趣与上下文兴趣保持序列关系,所以我们应该可以捕捉到这种变化关系才对,所以作者想通过一个双向的LSTM来学习下会话兴趣之间的关系, 从而增加用户兴趣的丰富度,或许还能学习到演化规律。称为BI-LSTM

        BI-LSTM是一个双向的LSTN们就是从头到尾,然后从尾到头都过一遍lSTM,所以每隔时刻的隐藏状态的输出公式为:

        相加的两项分别是前向传播和反向传播对应的t时刻的hidden state,这里得到的隐藏层状态H_t, 我们可以认为是混合了上下文信息的会话兴趣。这里的\oplus是一个向量拼接的操作

6. 会话兴趣激活层

        我们可以看出这个激活层是有两个输入的,一个是做完BI-LSTM的隐层状态H_t,一个是做完平均池化的Embedding。

         第一个Atvitation Unit(黄色):

        X^I是候选商品的Embedding向量,I_K也是一个Embedding向量,然后W^I是一个维度Embedding*Embedding的矩阵,a_k^I 表示当前会话兴趣于候选商品之间的相似程度,最终的U^I是各个会话兴趣向量的加权线性组合。结果是一个1*Embedding 大小的向量

        第二个Atvitation Unit(蓝色):

        X^I是候选商品的Embedding向量,H_k是 混合了上下文信息的会话兴趣的Embedding(拼接起来的Hiddens)向量。W^I 是一个Hiddens*Embedding的矩阵,a_k^H 表示混合了上下文信息的当前会话兴趣与候选商品之间的相似性程度。最终的U^H 是各个混合了上下文信息的会话兴趣向量的加权线性组合,结果是一个 1* Hiddens大小的向量

7. 输出层

        将用户行为特征,物品特征以及上一层会话兴趣激活层得到的一个会话兴趣向量的加权组合,一个上下文信息会话兴趣加权组合,这四个东西都拼接起来。然后过两次 Relu,最后用交叉熵损失函数做Loss就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值