# 2、IRGAN介绍

IRGAN的整体训练流程如下：

### Pair-wise的情况

IRGAN在pairwise情况下是同样适用的，假设我有一堆带标记的document组合Rn = {<di，dj>|di > dj}。生成器G的任务是尽量生成正确的排序组合来混淆判别器D，判别器D的任务是尽可能区分真正的排序组合和生成器生成的排序组合。基于下面的式子来进行最大最小化博弈：

# 3、IRGAN的TF实现

### Generator

```self.user_embeddings = tf.Variable(tf.random_uniform([self.userNum,self.emb_dim],
minval=-initdelta,maxval=self.initdelta,
dtype =tf.float32))
self.item_embeddings = tf.Variable(tf.random_uniform([self.itemNum,self.emb_dim],
minval=-initdelta,maxval=self.initdelta,
dtype=tf.float32))
self.item_bias = tf.Variable(tf.zeros([self.itemNum]))

self.u = tf.placeholder(tf.int32)
self.i = tf.placeholder(tf.int32)
self.reward = tf.placeholder(tf.float32)

self.u_embedding = tf.nn.embedding_lookup(self.user_embeddings,self.u)
self.i_embedding = tf.nn.embedding_lookup(self.item_embeddings,self.i)
self.i_bias = tf.gather(self.item_bias,self.i)```

```self.all_logits = tf.reduce_sum(tf.multiply(self.u_embedding,self.item_embeddings),1) + self.item_bias
self.i_prob = tf.gather(
tf.reshape(tf.nn.softmax(tf.reshape(self.all_logits, [1, -1])), [-1]),
self.i)

self.gan_loss = -tf.reduce_mean(tf.log(self.i_prob) * self.reward) + self.lamda * (
tf.nn.l2_loss(self.u_embedding) + tf.nn.l2_loss(self.i_embedding) + tf.nn.l2_loss(self.i_bias)
)

### Discriminator

```self.user_embeddings = tf.Variable(tf.random_uniform([self.userNum,self.emb_dim],
minval=-self.initdelta,maxval=self.initdelta,
dtype=tf.float32))
self.item_embeddings = tf.Variable(tf.random_uniform([self.itemNum,self.emb_dim],
minval=-self.initdelta,maxval=self.initdelta,
dtype=tf.float32))
self.item_bias = tf.Variable(tf.zeros(self.itemNum))

self.u = tf.placeholder(tf.int32)
self.i = tf.placeholder(tf.int32)
self.label = tf.placeholder(tf.float32)

self.u_embedding = tf.nn.embedding_lookup(self.user_embeddings,self.u)
self.i_embedding = tf.nn.embedding_lookup(self.item_embeddings,self.i)
self.i_bias = tf.gather(self.item_bias,self.i)```

```self.pre_logits = tf.reduce_sum(tf.multiply(self.u_embedding, self.i_embedding), 1) + self.i_bias
self.pre_loss = tf.nn.sigmoid_cross_entropy_with_logits(labels = self.label,
logits = self.pre_logits) + self.lamda * (
tf.nn.l2_loss(self.u_embedding) + tf.nn.l2_loss(self.i_embedding) + tf.nn.l2_loss(self.i_bias)
)

D中还有很重要的一步就是，计算reward：

```self.reward_logits = tf.reduce_sum(tf.multiply(self.u_embedding,self.i_embedding),1) + self.i_bias
self.reward = 2 * (tf.sigmoid(self.reward_logits) - 0.5)```

### 模型训练

```for d_epoch in range(100):
if d_epoch % 5 == 0:
generate_for_d(sess,generator,DIS_TRAIN_FILE)
train_size = ut.file_len(DIS_TRAIN_FILE)
index = 1
while True:
if index > train_size:
break
if index + BATCH_SIZE <= train_size + 1:
input_user,input_item,input_label = ut.get_batch_data(DIS_TRAIN_FILE,index,BATCH_SIZE)
else:
input_user,input_item,input_label = ut.get_batch_data(DIS_TRAIN_FILE,index,train_size-index+1)
index += BATCH_SIZE

discriminator.u:input_user,discriminator.i:input_item,discriminator.label:input_label
})```

generate_for_d函数形式如下，其根据G的策略，生成一批样本。

```def generate_for_d(sess,model,filename):
data = []
for u in user_pos_train:
pos = user_pos_train[u]

rating = sess.run(model.all_rating,{model.u:[u]})
rating = np.array(rating[0]) / 0.2
exp_rating = np.exp(rating)
prob = exp_rating / np.sum(exp_rating)

neg = np.random.choice(np.arange(ITEM_NUM),size=len(pos),p=prob)
# 1:1 的正负样本
for i in range(len(pos)):
data.append(str(u) + '\t' + str(pos[i]) + '\t' + str(neg[i]))

with open(filename,'w') as fout:
fout.write('\n'.join(data))```

G的训练过程首先要通过D得到对应的reward，随后更新自己的策略：

```for g_epoch in range(50):
for u in user_pos_train:
sample_lambda = 0.2
pos = user_pos_train[u]

rating = sess.run(generator.all_logits,{generator.u:u})
exp_rating = np.exp(rating)
prob = exp_rating / np.sum(exp_rating)

pn = (1-sample_lambda) * prob
pn[pos] += sample_lambda * 1.0 / len(pos)

sample = np.random.choice(np.arange(ITEM_NUM), 2 * len(pos), p=pn)

reward = sess.run(discriminator.reward, {discriminator.u: u, discriminator.i: sample})
reward = reward * prob[sample] / pn[sample]

{generator.u: u, generator.i: sample, generator.reward: reward})```

294 篇文章104 人订阅

0 条评论

## 相关文章

### kmeans聚类理论篇K的选择（轮廓系数）

kmeans是最简单的聚类算法之一，但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans一般在数据分析前期使用，选取适当的k，将数据分类后，然后分类...

73650

67640

### 基于贝叶斯算法的文本分类算法

1、基本定义： 分类是把一个事物分到某个类别中。一个事物具有很多属性，把它的众多属性看作一个向量，即x=(x1,x2,x3,…,xn)，用x这个向量来代表这个...

32840

44760

37880

67860

12200

### 最全算法工程师面试题目整理(一)

1 基于每日用户搜索内容，假设只有少量已知商品的情况下，如何根据用户搜索内容获取平台内没有的新商品？ ? ? 答案：这是一条类似于分词“新词获取问题”，答案是...

45160

438110

6820