-
Notifications
You must be signed in to change notification settings - Fork 150
Description
Hello, I have try to extend your ccfnet to cross-domain, but unfortunately, I find my model didn't work as good as ccfnet in single area. More specifically, the test RMSE is always high, I guess it may be suffering overfitting. As I have posted below, can you give me some instructions to help me better my code?
By the way, I just did what your paper said, spliting the Movielens movies into two disjointed set to simulate two area.
`def build_model(user_cf_feature_1, user_cf_feature_2, user_attr_feature_1, user_attr_feature_2, user_attr_rank,
item_cf_feature_1, item_cf_feature_2, item_attr_feature_1, item_attr_feature_2, item_attr_rank,
ratings_1, ratings_2, layer_size,
W_user, W_item_1, W_item_2,
W_user_attr, W_item_attr_1, W_item_attr_2,
lamb, lr, mu_1, mu_2):
layer_cnt = len(layer_size)
with tf.name_scope('View_1'):
hiddens_user_1 = []
hiddens_item_1 = []
hiddens_user_1.append(user_attr_feature_1)
hiddens_item_1.append(item_attr_feature_1)
b_user_list_1 = []
b_item_list_1 = []
W_user_list_1 = []
W_item_list_1 = []
for i in range(layer_cnt):
with tf.name_scope('layer_'+str(i)):
b_user_list_1.append(tf.Variable(tf.truncated_normal([layer_size[i]]), name='user_bias_1'))
b_item_list_1.append(tf.Variable(tf.truncated_normal([layer_size[i]]), name='item_bias_1'))
if i == 0:
W_user_list_1.append(tf.Variable(
tf.truncated_normal([user_attr_rank, layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_user_1'))
W_item_list_1.append(tf.Variable(
tf.truncated_normal([item_attr_rank, layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_item_1'))
user_middle = tf.matmul(user_attr_feature_1, W_user_list_1[i]) + b_user_list_1[i]
item_middle = tf.matmul(item_attr_feature_1, W_item_list_1[i]) + b_item_list_1[i]
else:
W_user_list_1.append(tf.Variable(
tf.truncated_normal([layer_size[i-1], layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_user_1'))
W_item_list_1.append(tf.Variable(
tf.truncated_normal([layer_size[i-1], layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_item_1'))
user_middle = tf.matmul(hiddens_user_1[i], W_user_list_1[i]) + b_user_list_1[i]
item_middle = tf.matmul(hiddens_item_1[i], W_item_list_1[i]) + b_item_list_1[i]
hiddens_user_1.append(tf.identity(user_middle, name='factor_user_1')) # identity ,sigmoid
hiddens_item_1.append(tf.identity(item_middle, name='factor_item_1'))
factor_user_1 = hiddens_user_1[layer_cnt]
factor_item_1 = hiddens_item_1[layer_cnt]
with tf.name_scope('View_2'):
hiddens_user_2 = []
hiddens_item_2 = []
hiddens_user_2.append(user_attr_feature_2)
hiddens_item_2.append(item_attr_feature_2)
b_user_list_2 = []
b_item_list_2 = []
W_user_list_2 = []
W_item_list_2 = []
for i in range(layer_cnt):
with tf.name_scope('layer_'+str(i)):
b_user_list_2.append(tf.Variable(tf.truncated_normal([layer_size[i]]), name='user_bias_2'))
b_item_list_2.append(tf.Variable(tf.truncated_normal([layer_size[i]]), name='item_bias_2'))
if i == 0:
W_user_list_2.append(tf.Variable(
tf.truncated_normal([user_attr_rank, layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_user_2'))
W_item_list_2.append(tf.Variable(
tf.truncated_normal([item_attr_rank, layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_item_2'))
user_middle = tf.matmul(user_attr_feature_2, W_user_list_2[i]) + b_user_list_2[i]
item_middle = tf.matmul(item_attr_feature_2, W_item_list_2[i]) + b_item_list_2[i]
else:
W_user_list_2.append(tf.Variable(
tf.truncated_normal([layer_size[i-1], layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_user_2'))
W_item_list_2.append(tf.Variable(
tf.truncated_normal([layer_size[i-1], layer_size[i]],
stddev=1/math.sqrt(float(layer_size[i])), mean=0), name='W_item_2'))
user_middle = tf.matmul(hiddens_user_2[i], W_user_list_2[i]) + b_user_list_2[i]
item_middle = tf.matmul(hiddens_item_2[i], W_item_list_2[i]) + b_item_list_2[i]
hiddens_user_2.append(tf.identity(user_middle, name='factor_user_2')) # identity ,sigmoid
hiddens_item_2.append(tf.identity(item_middle, name='factor_item_2'))
factor_user_2 = hiddens_user_2[layer_cnt]
factor_item_2 = hiddens_item_2[layer_cnt]
preds_1 = (tf.reduce_sum(tf.multiply(user_cf_feature_1, item_cf_feature_1), 1) +
tf.reduce_sum(tf.multiply(factor_user_1, factor_item_1), 1)) + mu_1
preds_2 = (tf.reduce_sum(tf.multiply(user_cf_feature_2, item_cf_feature_2), 1) +
tf.reduce_sum(tf.multiply(factor_user_2, factor_item_2), 1)) + mu_2
square_error = tf.sqrt(0.5*tf.reduce_mean(tf.squared_difference(preds_1, ratings_1)) +
0.5*tf.reduce_mean(tf.squared_difference(preds_2, ratings_2)))
loss = square_error
for i in range(layer_cnt):
loss = loss + lamb*(
tf.reduce_mean(tf.nn.l2_loss(W_user)) +
tf.reduce_mean(tf.nn.l2_loss(W_item_1)) +
tf.reduce_mean(tf.nn.l2_loss(W_item_2)) +
tf.reduce_mean(tf.nn.l2_loss(W_user_attr)) +
tf.reduce_mean(tf.nn.l2_loss(W_item_attr_1)) +
tf.reduce_mean(tf.nn.l2_loss(W_item_attr_2)) +
tf.reduce_mean(tf.nn.l2_loss(W_user_list_1[i])) +
tf.reduce_mean(tf.nn.l2_loss(W_item_list_1[i])) +
tf.reduce_mean(tf.nn.l2_loss(b_user_list_1[i])) +
tf.reduce_mean(tf.nn.l2_loss(b_item_list_1[i])) +
tf.reduce_mean(tf.nn.l2_loss(W_user_list_2[i])) +
tf.reduce_mean(tf.nn.l2_loss(W_item_list_2[i])) +
tf.reduce_mean(tf.nn.l2_loss(b_user_list_2[i])) +
tf.reduce_mean(tf.nn.l2_loss(b_item_list_2[i]))
)
tf.summary.scalar('square_error', square_error)
tf.summary.scalar('loss', loss)
merged_summary = tf.summary.merge_all()
train_step = tf.train.GradientDescentOptimizer(lr).minimize(loss)
return train_step, square_error, loss, merged_summary`