论文笔记(A Neural Influence Diffusion Model for Social Recommendation)

神经影响传播模型为了社交推荐

原文链接:A Neural Influence Diffusion Model for Social Recommendation, SIGIR’19
原理:社交网络上应用GNN提取朋友对用户的影响+候选项对用户历史交互项的注意力影响=用户向量,用户向量和项向量的内积预测评分。

摘要

准确的user 和 item的嵌入学习时建立一个成功的推荐系统的关键。协同过滤CF提供了一种从用户项的交互历史中学习user和item嵌入的方式,但这样的话系统的性能将会被用户行为数据的稀疏性而限制。随着在线社交网络的出现,社交推荐系统可以利用用户邻居的表现去缓解数据稀疏性的问题,从而更好的模拟user和item的嵌入。
我们认为,对于一个社交平台的每一个用户来说,他潜在的嵌入是受其信任用户的影响的,而这些信任用户又受信任用户的社会关系的影响随着社交影响递归的在社交网络中传播和扩散,每个用户的嵌入会在每次的递归过程中变化
然而,目前的社交推荐模型仅仅是利用每个用户的本地邻居(应该指的是直接相连的邻居)来开发静态模型,而没有模拟全球社交网络中的递归扩散,导致推荐性能不佳。
在本文中,我们提出了一个深度影响传播模型,以激发用户如何受递归社会扩散过程的影响。对于每个用户,扩散过程开始于融合了相关特性和捕获了潜在行为表现的免费用户潜在向量的一个初始嵌入。我们提出的模型的核心思想是,我们设计了一个分层的影响传播结构来模拟用户的潜在嵌入是如何随着社会扩散过程的继续而发展的。

问题定义

user set:U ( |U|=M )
item set:V ( |V|=N )
user-item interaction matrix:R ∈ R M×N
user-user directed graph:G = [U , S ∈ R M×M ]
user attributes matrix:X ∈ R d1×M
item attributes matrix:Y ∈ R d2×N
定义【社交推荐】:
Given a rating matrix R, a social network S, and associated real-valued feature matrix X and Y of users and items, our goal is to predict users’ unknown preferences to items as: Rˆ = f (R, S, X, Y), where Rˆ ∈ R M×N denotes the predicted preferences of users to items.

模型结构

模型的整体框架如下:
在这里插入图片描述

Embedding Layer

用 P ∈ RD×M 和 Q ∈ RD×N 分别表示 users 和 items 的free embeddings,他们捕获了用户和项协作的潜在表示,给定用户和项的索引,embedding layer 根据索引从矩阵 P 和 Q 中得到用户潜在向量 pa 和项潜在向量 qi

Fusion Layer

对于每个用户 a,融合层将用户潜在向量 pa 和用户特征向量 xa 作为输入,输出用户 a 的融合嵌入 h0a,融合嵌入从不用类型的输入数据中捕获了用户最初的兴趣。(项操作类似)我们用一层全连接层来模拟融合层:
在这里插入图片描述在这里插入图片描述

Influence Diffusion Layers

对于每个用户 a,用 hka 表示他在影响传播部分第 k 层的潜在嵌入,通过将第 k 层的输出输入到第 k+1 层,将会把用户 a 的潜在嵌入更新为hk+1a
在这里插入图片描述在这里插入图片描述
hkSa :平均池化操作,就是将用户 a 在 k 层信任的所有用户向量取平均来进行表示。
在给定 K 的情况下,最终会得到用户 a 在第 K 层的潜在嵌入 hKa

Predict Layer

用户 a 的潜在表示由两部分组成:社交传播层输出的嵌入 hKa 和 历史行为的表示(历史交互 items 的平均表示)。
最终的预测由 user 最终潜在向量和 item 潜在向量的内积计算得到。
在这里插入图片描述

模型训练

pair-wise ranking based loss function在这里插入图片描述

总结

1、要理解在社交传播层不是水波纹那样一圈一圈的计算(比如我之前写过的 pipple network),而是整体进行递归的计算。是典型 neural graph network 的那种计算方式。
2、作者所说的社交网络的动态影响其实只是区别于之前一些工作中直接将邻居(信任用户)向量进行简单的平均池化操作而言,作者的方法考虑递归的考虑了这些邻居的向量表示,让邻居的向量表示也像当前用户向量的计算方式那样计算。这里用到的社交网络其实也是静态的,并没有随着时间的变化而改变,比如下一个时刻用户信任了别的用户,信任网络可能随着时间而扩大。
3、对于信任用户的信任程度方面,没有考虑不同用户的重要程度,更没有考虑用户在购买不同物品时对不同用户的不同信任程度。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是使用Python实现NEURAL NETWORKS Uplift model for multiple correlated responses WITH LOWRANK REGULARIZATION的代码示例: ```python import numpy as np import pandas as pd import tensorflow as tf from sklearn.model_selection import train_test_split # 导入数据集 data = pd.read_csv('data.csv') X = data.drop(['response', 'treatment'], axis=1).values y = data['response'].values t = data['treatment'].values # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test, t_train, t_test = train_test_split(X, y, t, test_size=0.2) # 定义常量 n_features = X.shape[1] n_components = 5 alpha = 0.01 # 定义占位符 X_ph = tf.placeholder(tf.float32, shape=[None, n_features], name='X') y_ph = tf.placeholder(tf.float32, shape=[None], name='y') t_ph = tf.placeholder(tf.float32, shape=[None], name='t') # 定义神经网络模型 hidden_layer_1 = tf.layers.dense(X_ph, 64, activation=tf.nn.relu) hidden_layer_2 = tf.layers.dense(hidden_layer_1, 32, activation=tf.nn.relu) y_pred = tf.layers.dense(hidden_layer_2, 1, activation=tf.nn.sigmoid) # 定义损失函数 treated = tf.cast(tf.equal(t_ph, 1), tf.float32) control = 1 - treated uplift = tf.reduce_mean((y_pred * treated - y_pred * control)) mse = tf.reduce_mean(tf.square(y_pred - y_ph)) lowrank = tf.reduce_sum(tf.svd(tf.transpose(hidden_layer_1), compute_uv=False)) loss = mse - alpha * uplift + alpha * lowrank # 定义优化器 optimizer = tf.train.AdamOptimizer(learning_rate=0.001) train_step = optimizer.minimize(loss) # 定义会话 sess = tf.Session() sess.run(tf.global_variables_initializer()) # 训练模型 for i in range(100): _, loss_value, uplift_value, mse_value, lowrank_value = sess.run([train_step, loss, uplift, mse, lowrank], feed_dict={X_ph: X_train, y_ph: y_train, t_ph: t_train}) print('Epoch %d - Loss: %.4f, Uplift: %.4f, MSE: %.4f, Lowrank: %.4f' % (i, loss_value, uplift_value, mse_value, lowrank_value)) # 预测响应变量的值 y_train_pred = sess.run(y_pred, feed_dict={X_ph: X_train}) y_test_pred = sess.run(y_pred, feed_dict={X_ph: X_test}) # 计算控制组和干预组之间的差异 uplift_train = np.mean(y_train_pred[t_train == 1] - y_train_pred[t_train == 0]) uplift_test = np.mean(y_test_pred[t_test == 1] - y_test_pred[t_test == 0]) # 输出结果 print('Train uplift: %.2f' % uplift_train) print('Test uplift: %.2f' % uplift_test) ``` 请注意,这只是一个简单的示例,实际实现可能涉及更多的数据预处理和模型调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值