Skip to content

About cross-domain-ccfnet #14

@Edogawa-Konan

Description

@Edogawa-Konan

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`  

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions