admin 管理员组

文章数量: 887021

session

文章目录

  • 介绍
  • 模型介绍
  • NARM
    • global encoder
    • local encoder
    • final model
  • STAMP
    • short-term memory
    • long-term memory
    • final model
  • 比较

介绍

现在有很多地方都需要推荐系统,比如网购平台、音乐平台、影视平台等等。一个应用如果能更准确地进行内容推送,那么自然用户的黏性会更强,有更强的竞争力。
但是现在出现了一个问题,我们以往做的一些工作都是基于用户历史记录进行的推荐,现在由于隐私政策的问题,有时候我们不能得到用户的长历史,我们能拿到手的只有用户当前在网页/app里面的行为,这个短历史我们就叫session。
举个例子,当你下载淘宝的软件之后,在没有登陆的情况下搜索你想要的东西,这个时候淘宝对你一无所知。你先点击了adidas的一件上衣,又点击了nike的一条裤子,然后又点击了李宁的一件上衣,这三个click就组成了你当前的一个session。我们要做的就是基于这三个点击对你下次想点击的东西进行预测,通过这个模型,我们可能会给你推荐安踏的衣服,或者adidas的另一版型的衣服。
总而言之,这个session-based方法可以在不侵犯用户隐私的情况下仍然进行有一定质量的推荐,值得我们进行研究。

模型介绍

从大体上来看,session-based recommendationo有两种分支,一种是把session看作一个sequence,利用诸如处理流数据的RNN模型得到隐层向量,并基于此搭建预测模型。

另一种则是基于图神经网络GNN的方法,通过构建有向图,利用GNN的方法学习表达向量,基于此进行预测。

今天要介绍的两个都是属于第一类的模型

NARM

每一个商品实际上都可以用一个id进行标识,这个和NLP任务里面把每一个单词都转化成id的思路是一样的。那么类似的,我们也可以有每一个商品的embedding,以此为基础把数据喂到RNN里面。

这个模型其实很简单,编码上分为两部分,Global encoder 和 Local Encoder。

global encoder

通过我们上面提到的与NLP任务类似的地方,我们这里为了方便理解可以把这个session看作一句话的等价,我们先通过word2id把商品转化为了id,得到了他们的embedding,然后把他们送进RNN里面。

在这篇文章里,作者使用的是GRU。

说起来fancy,但是这个global encoder得到的第一部分编码实际上就是RNN最后的隐层向量而已。
c t g = h t c_t^g=h_t ctg​=ht​

local encoder

这个地方使用到了attention。

对于session里面的每一个商品,他的attention权重是:
α t j = v T σ ( A 1 h t + A 2 h j ) \alpha_{tj} = v^T\sigma(A_1h_t + A_2h_j) αtj​=vTσ(A1​ht​+A2​hj​)
这里 A 1 , A 2 , v A_1,A_2,v A1​,A2​,v都是参数, h t h_t ht​表示最后一个隐层,实际上就是刚才提的global encoder得到的东西,而 h j h_j hj​则是第j个商品的地方GRU拿到的隐层向量。

这个encoder最终得到的向量表示:
c t l = ∑ j = 1 t α t j h j c_t^l=\sum_{j=1}^t \alpha_{tj}h_j ctl​=j=1∑t​αtj​hj​

final model

最终的向量表示就是把两个encoder得到的向量拼在一起,
c t = [ c t g ; c t l ] c_t = [c_t^g ; c_t^l] ct​=[ctg​;ctl​]
对于当前的session,我们可以直接拿到他们的embedding矩阵:
E ∈ R n × e m b e d s i z e E \in \mathbb{R}^{n \times embed \;size} E∈Rn×embedsize
最终的得分向量计算如下:
S = E B c t , B ∈ R e m b e d × h i d d e n ∗ 2 S = EBc_t, \; B \in \mathbb{R}^{embed\times hidden*2} S=EBct​,B∈Rembed×hidden∗2
这里B是参数

这个最终的得分作者没有送到softmax里进行归一化,而是直接送到了cross entropy loss里面去计算loss。

STAMP

在这里你会看到和NARM很多类似的东西,但是叫法不一样,也可以理解对吧(笑)。但是在这个模型里,没有用到RNN来计算隐层向量,一切都是直接从embedding拿向量来做的。

short-term memory

这个短期记忆就是上面的global encoder,把session里面所有商品的embedding按照出现顺序排成一个矩阵,最后一个商品的embedding就是这个short0-term memory。

long-term memory

这里多了一个向量:
m s = 1 t ∑ i = 1 t x i m_s = \frac{1}{t}\sum_{i=1}^tx_i ms​=t1​i=1∑t​xi​
这里的 x i x_i xi​代表每个商品的embedding,换言之这个向量就是当前session里面所有商品embedding的均值。

上面提到的短期记忆
m t = x t m_t = x_t mt​=xt​
就是最后一个商品的embedding。

这里的attention权重是这样计算的:
α i = W 0 σ ( W 1 x i + W 2 x t + W 3 m s + b ) \alpha_i = W_0\sigma(W_1x_i + W_2x_t+W_3m_s+b) αi​=W0​σ(W1​xi​+W2​xt​+W3​ms​+b)

通过加权求和我们得到了这个部分的表示向量:
m a = ∑ i = 1 t α i x i m_a = \sum_{i=1}^t\alpha_ix_i ma​=i=1∑t​αi​xi​

final model

把短期和长期记忆 m t , m a m_t, m_a mt​,ma​分别送进两个线性层,得到了中间向量 h t , h s h_t, h_s ht​,hs​

最终每一个商品的预测得分是:
z i ^ = σ ( < h s , h t , x i > ) , 1 ≤ i ≤ ∣ V ∣ \hat{z_i} = \sigma(<h_s, h_t, x_i>), 1 \leq i \leq |V| zi​^​=σ(<hs​,ht​,xi​>),1≤i≤∣V∣
这里看似内积的符号是文中自己定义的,代表着把三个向量每个位置都乘起来,再把乘完之后的向量每个位置加起来。用公式表达就是:
< a , b , c > = ∑ i = 1 d a i b i c i <a,b,c> = \sum_{i=1}^d a_ib_ic_i <a,b,c>=i=1∑d​ai​bi​ci​
最后的预测就是把这些得分送到softmax里面过一下。

比较

这两个模型看起来非常的相像,两个都用最后一个位置的向量作为当前的表示,用attention加权平均的方法对整体得到一个表示,最终都使用一种类似内积的方法得到每个商品的评分。

但是这两个模型还是有本质上的不同的,最大的点就在于STAMP没有像之前那些论文那样非要使用RNN先对embedding进行初步的处理,而是直接使用了embedding的向量进行处理。

这点和Attention is all you need这篇文章的意义很类似,都是仅仅基于embedding和attention的机制搭建的模型。这种文章出来最大的意义就是说明了基于RNN进行处理的方法是有局限性的,换句话说RNN对于session内容的处理是完全可以被替代甚至丢弃的。我想这也是为什么慢慢后面的学者会把目光放在GNN上面。

本文标签: session