Sequential Recommender System based on Hierarchical Attention Network

本文中提出了两层次的注意力网络,第一层是根据历史购买的项目表示来学习用户的长期偏好,.第二种方法通过耦合用户的长期和短期偏好来输出最终的用户表示。

注意机制可以自动地为用户分配不同的影响(权重)来捕捉动态属性,而层次结构则将用户的长短特征结合在一起。首先将用户和项目生成低维的特征,然后利用注意层计算用户长期集合中项目的不同权重,然后用权值压缩项目向量,生成用户的长期表示。在这个之后,我们使用另一个attention 层将用户的序列行为和长期表达结合起来。在两个注意网络中,用户嵌入向量作为上下文信息,计算不同用户的不同权重。为了学习这些参数,我们采用了贝叶斯个性化排序优化准则来生成一对损失函数。

 

模型部分

|u|,|v|是用户和项目的总数,对于每一个 U的序列行为表示为Lu = {Su1 , Su2 , ..., SuT },T是时间步数的总长,

表示在时间t 处用户的行为所对应的项目集合。对于固定的时间t,项目集合可以表示用户u在时间t处的短期喜好。用户在时间t之前购买的商品,可以反映出用户的长期喜好。

 

 

根据用户偏好的以下特点。1)用户偏好在不同的时间阶段是动态的。2)不同的项目对下一个项目有不同的影响。3)对于不同的用户,相同的项目可能对下一个项目的预测产生不同的影响。

 

首先对user和item建立一个低维的向量表达,而不是直接用index来表达。在此之后,通过两层结构来学习每个用户的混合表示,这种结构将长期和短期的首选项结合在一起。

 

Embedding layer

先将用户和项目的one-hot 的ID表达通过全连接层分别映射到低维空间中。

表示映射为k维向量。

 

很有意思的一个思想  矩阵分解可以看做是一个两层的神经网络,第一层为用户和项目构造低维的embedding,然后在第二层中应用内积。通过矩阵因式分解嵌入只捕获低层次、双线性和静态表示,

Long-term Attention-based Pooling Layer

它首先计算给定用户的长期项集中每个项的重要性,然后聚合这些项的嵌入以形成长期用户偏好表示

attention的网络结构是

其中,

和是模型的参数,

先将

中 的item对应的低维向量送入到一个多层感知机中,得到隐藏的表达h1j,函数

表示了一个激活函数,在这里我们使用了relu函数提高非线性能力。用Softmax函数度量注意评分αj作为h1j和u之间的归一化相似度,这样表明了项目j对用户u的重要性。

最终,计算用户的长期表达为以注意分数加权的项目embedding之和。

c

Long- and Short-term Attention-based Pooling Layer.

利用注意力模型为长期特征和短期项目集中的项目embedding表达分配权重,捕捉用户的高层表达。(本文中可能一个用户在一个时间t内有N个行为)

 

在获得正则化的注意力分数哦,混合的用户表达被计算为

 

是长期表达的权重值。

计算用户喜好  

用传统的潜在因素模型来计算用户对项目J的喜好,

我们模型的目的是在给定用户长短期项目集合的情况下提供一个项目排序的列表。所以我们更在乎项目排序顺序而不是项目的喜好分数。

按照BPR优化准则,我们提出了一种成对排序的目标函数。我们假设用户相对于其他的未观测项目来说更喜欢下一个购买的项目,所以定义一个排序,对于项目j和项目k来说,

j是用户u下一个购买的项目,K是通过引导抽样生成的一个未观察到的项。对于每一个观察我们生成一组成对偏好顺序,我们训练我们的模型通过最大化后验概率,(MAP)

是模型的参数,

是逻辑函数,

是用户U和项目V的embedding集合,

是attention网络的权重,

是正则项参数。

`实验部分

预处理

将用户一天的记录看成一个session来表示用户的短期特征,并且删除只有一个item的session。随机选择上个月百分之二十的session作为测试,其他的用作训练。我们随机地在每个session中保留一个item用作下一个item的预测。

度量准则

recall@N AUC

 

 

 

 

 

 

 

 

 

在使用Keras构建神经网络时,可以通过在Sequential模型中添加Attention层来实现注意力机制。 首先,需要导入相关的库: ``` from keras.layers import Input, Dense, LSTM, concatenate, Activation, Masking from keras.models import Model from keras import backend as K ``` 接下来,创建一个Attention层的类: ``` class AttentionLayer(Layer): def __init__(self, **kwargs): super(AttentionLayer, self).__init__(**kwargs) def build(self, input_shape): self.W = self.add_weight(name='att_weight', shape=(input_shape[-1], 1), initializer='normal') self.b = self.add_weight(name='att_bias', shape=(input_shape[1], 1), initializer='zeros') super(AttentionLayer, self).build(input_shape) def call(self, x): e = K.tanh(K.dot(x, self.W) + self.b) a = K.softmax(e, axis=1) output = x * a return K.sum(output, axis=1) def compute_output_shape(self, input_shape): return (input_shape[0], input_shape[-1]) ``` 该类继承自Keras的Layer类,重写了build和call方法。在build方法中初始化权重矩阵W和偏置向量b,利用Keras的add_weight方法实现。在call方法中,计算出每个时间步的注意力权重a,对输入进行加权求和并返回。 最后,在Sequential模型中加入Attention层: ``` model = Sequential() model.add(LSTM(128, input_shape=(20, 100), return_sequences=True)) model.add(AttentionLayer()) model.add(Dense(64, activation='relu')) model.add(Dense(1, activation='sigmoid')) ``` 这里以LSTM作为示例,先在LSTM层后加入Attention层,再通过Dense层输出结果。注意,Attention层需要在return_sequences=True时使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值