def model_fn(labels, features, mode, params): tf.set_random_seed(2019) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] single_cate_feats = cate_feats[:, 0:params.cate_field_size] multi_cate_feats = cate_feats[:, params.cate_field_size:params.cate_field_size + params.multi_feats_size] attention_cate_feats = cate_feats[:, params.cate_field_size + params.multi_feats_size:] # init_embedding feats_emb = my_layer.emb_init(name='feats_emb', feat_num=params.cate_feats_size, embedding_size=params.embedding_size) # single_category -> embedding single_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats) single_cate_emb = tf.reshape(single_cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # attention attention_emb = attention_alg(params, feats_emb, multi_cate_feats, single_cate_feats, attention_cate_feats) # multi_category -> embedding multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats) # deep input dense if len(params.multi_feats_range) > 0: dense = tf.concat([cont_feats, vector_feats, single_cate_emb, multi_cate_emb, attention_emb], axis=1, name='dense_vector') else: dense = tf.concat([cont_feats, vector_feats, single_cate_emb, attention_emb], axis=1, name='dense_vector') # deep len_layers = len(params.hidden_units) for i in range(0, len_layers): dense = tf.layers.dense(inputs=dense, units=params.hidden_units[i], activation=tf.nn.relu) out = tf.layers.dense(inputs=dense, units=1) score = tf.identity(tf.nn.sigmoid(out), name='score') model_estimator_spec = op.model_optimizer(params, mode, labels, score) return model_estimator_spec
def model_fn(labels, features, mode, params): use_deep = True use_fm = True tf.set_random_seed(2019) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] single_cate_feats = cate_feats[:, 0:params.cate_field_size] multi_cate_feats = cate_feats[:, params.cate_field_size:] cont_feats_index = tf.Variable([[i for i in range(params.cont_field_size)]], trainable=False, dtype=tf.int64, name="cont_feats_index") index_max_size = params.cont_field_size + params.cate_feats_size fm_first_order_emb = my_layer.emb_init(name='fm_first_order_emb', feat_num=index_max_size, embedding_size=1) feats_emb = my_layer.emb_init(name='feats_emb', feat_num=index_max_size, embedding_size=params.embedding_size) with tf.name_scope('fm_part'): input_field_size = params.cont_field_size + params.cate_field_size + len(params.multi_feats_range) cont_index_add = tf.add(cont_feats_index, params.cate_feats_size) # FM_first_order [?, input_field_size] # cont first_cont_emb = tf.nn.embedding_lookup(fm_first_order_emb, ids=cont_index_add) first_cont_emb = tf.reshape(first_cont_emb, shape=[-1, params.cont_field_size]) first_cont_mul = tf.multiply(first_cont_emb, cont_feats) # single_cate first_single_cate_emb = tf.nn.embedding_lookup(fm_first_order_emb, ids=single_cate_feats) first_single_cate_emb = tf.reshape(first_single_cate_emb, shape=[-1, params.cate_field_size]) # multi_cate first_multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, fm_first_order_emb, multi_cate_feats) # concat cont & single_cate & multi_cate first_order_emb = tf.concat([first_cont_mul, first_single_cate_emb, first_multi_cate_emb], axis=1) first_order = tf.nn.dropout(first_order_emb, params.dropout_keep_fm[0]) # FM_second_order [?, embedding_size] # cont second_cont_emb = tf.nn.embedding_lookup(feats_emb, ids=cont_index_add) second_cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_size, 1]) second_cont_emb = tf.multiply(second_cont_emb, second_cont_value) # single_cate second_single_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats) # multi_cate second_multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats) second_multi_cate_emb = tf.reshape(second_multi_cate_emb, shape=[-1, len(params.multi_feats_range), params.embedding_size]) # concat cont & single_cate & multi_cate second_order_emb = tf.concat([second_cont_emb, second_single_cate_emb, second_multi_cate_emb], axis=1) sum_emb = tf.reduce_sum(second_order_emb, 1) sum_square_emb = tf.square(sum_emb) square_emb = tf.square(second_order_emb) square_sum_emb = tf.reduce_sum(square_emb, 1) second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb) second_order = tf.nn.dropout(second_order, params.dropout_keep_fm[1]) # FM_res [?, self.input_field_size + embedding_size] fm_res = tf.concat([first_order, second_order], axis=1) with tf.name_scope('deep_part'): # single_cate single_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats) single_cate_emb = tf.reshape(single_cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # multi_cate multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats) deep_res = tf.concat([cont_feats, vector_feats, single_cate_emb, multi_cate_emb], axis=1, name='dense_vector') # deep len_layers = len(params.hidden_units) for i in range(0, len_layers): deep_res = tf.layers.dense(inputs=deep_res, units=params.hidden_units[i], activation=tf.nn.relu) with tf.name_scope('deep_fm'): if use_fm and use_deep: feats_input = tf.concat([fm_res, deep_res], axis=1) feats_input_size = input_field_size + params.embedding_size + params.hidden_units[-1] elif use_fm: feats_input = fm_res feats_input_size = input_field_size + params.embedding_size elif use_deep: feats_input = deep_res feats_input_size = params.hidden_units[-1] glorot = np.sqrt(2.0 / (feats_input_size + 1)) deep_fm_weight = tf.Variable( np.random.normal(loc=0, scale=glorot, size=(feats_input_size, 1)), dtype=np.float32) deep_fm_bias = tf.Variable(tf.random_normal([1])) out = tf.add(tf.matmul(feats_input, deep_fm_weight), deep_fm_bias) score = tf.identity(tf.nn.sigmoid(out), name='score') model_estimator_spec = op.model_optimizer(params, mode, labels, score) return model_estimator_spec
def model_fn(labels, features, mode, params): tf.set_random_seed(2019) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] single_cate_feats = cate_feats[:, 0:params.cate_field_size] multi_cate_feats = cate_feats[:, params.cate_field_size:] cont_feats_index = tf.Variable([[i for i in range(params.cont_field_size)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_index_add = tf.add(cont_feats_index, params.cate_feats_size) index_max_size = params.cont_field_size + params.cate_feats_size feats_emb = my_layer.emb_init(name='feats_emb', feat_num=index_max_size, embedding_size=params.embedding_size) # cont_feats -> Embedding with tf.name_scope("cont_feat_emb"): ori_cont_emb = tf.nn.embedding_lookup(feats_emb, ids=cont_index_add, name="ori_cont_emb") cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_size, 1], name="cont_value") cont_emb = tf.multiply(ori_cont_emb, cont_value) cont_emb = tf.reshape( cont_emb, shape=[-1, params.cont_field_size * params.embedding_size], name="cont_emb") # single_category -> Embedding with tf.name_scope("single_cate_emb"): cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats) cate_emb = tf.reshape( cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # multi_category -> Embedding with tf.name_scope("multi_cate_emb"): multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats) # deep input dense dense_input = tf.concat([cont_emb, vector_feats, cate_emb, multi_cate_emb], axis=1, name='dense_vector') # experts experts_weight = tf.get_variable( name='experts_weight', dtype=tf.float32, shape=(dense_input.get_shape()[1], params.experts_units, params.experts_num), initializer=tf.contrib.layers.xavier_initializer()) experts_bias = tf.get_variable( name='expert_bias', dtype=tf.float32, shape=(params.experts_units, params.experts_num), initializer=tf.contrib.layers.xavier_initializer()) # gates gate1_weight = tf.get_variable( name='gate1_weight', dtype=tf.float32, shape=(dense_input.get_shape()[1], params.experts_num), initializer=tf.contrib.layers.xavier_initializer()) gate1_bias = tf.get_variable( name='gate1_bias', dtype=tf.float32, shape=(params.experts_num, ), initializer=tf.contrib.layers.xavier_initializer()) gate2_weight = tf.get_variable( name='gate2_weight', dtype=tf.float32, shape=(dense_input.get_shape()[1], params.experts_num), initializer=tf.contrib.layers.xavier_initializer()) gate2_bias = tf.get_variable( name='gate2_bias', dtype=tf.float32, shape=(params.experts_num, ), initializer=tf.contrib.layers.xavier_initializer()) # f_{i}(x) = activation(W_{i} * x + b), where activation is ReLU according to the paper experts_output = tf.tensordot(dense_input, experts_weight, axes=1) use_experts_bias = True if use_experts_bias: experts_output = tf.add(experts_output, experts_bias) experts_output = tf.nn.relu(experts_output) # g^{k}(x) = activation(W_{gk} * x + b), where activation is softmax according to the paper gate1_output = tf.matmul(dense_input, gate1_weight) gate2_output = tf.matmul(dense_input, gate2_weight) user_gate_bias = True if user_gate_bias: gate1_output = tf.add(gate1_output, gate1_bias) gate2_output = tf.add(gate2_output, gate2_bias) gate1_output = tf.nn.softmax(gate1_output) gate2_output = tf.nn.softmax(gate2_output) # f^{k}(x) = sum_{i=1}^{n}(g^{k}(x)_{i} * f_{i}(x)) label1_input = tf.multiply(experts_output, tf.expand_dims(gate1_output, axis=1)) label1_input = tf.reduce_sum(label1_input, axis=2) label1_input = tf.reshape(label1_input, [-1, params.experts_units]) label2_input = tf.multiply(experts_output, tf.expand_dims(gate2_output, axis=1)) label2_input = tf.reduce_sum(label2_input, axis=2) label2_input = tf.reshape(label2_input, [-1, params.experts_units]) len_layers = len(params.hidden_units) with tf.variable_scope('ctr_deep'): dense_ctr = tf.layers.dense(inputs=label1_input, units=params.hidden_units[0], activation=tf.nn.relu) for i in range(1, len_layers): dense_ctr = tf.layers.dense(inputs=dense_ctr, units=params.hidden_units[i], activation=tf.nn.relu) ctr_out = tf.layers.dense(inputs=dense_ctr, units=1) with tf.variable_scope('cvr_deep'): dense_cvr = tf.layers.dense(inputs=label2_input, units=params.hidden_units[0], activation=tf.nn.relu) for i in range(1, len_layers): dense_cvr = tf.layers.dense(inputs=dense_cvr, units=params.hidden_units[i], activation=tf.nn.relu) cvr_out = tf.layers.dense(inputs=dense_cvr, units=1) ctr_score = tf.identity(tf.nn.sigmoid(ctr_out), name='ctr_score') cvr_score = tf.identity(tf.nn.sigmoid(cvr_out), name='cvr_score') ctcvr_score = ctr_score * cvr_score ctcvr_score = tf.identity(ctcvr_score, name='ctcvr_score') score = tf.add(ctr_score * params.label1_weight, cvr_score * params.label2_weight) score = tf.identity(score, name='score') if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=score) else: ctr_labels = tf.identity(labels['label'], name='ctr_labels') ctcvr_labels = tf.identity(labels['label2'], name='ctcvr_labels') ctr_auc = tf.metrics.auc(labels=ctr_labels, predictions=ctr_score, name='auc') ctcvr_auc = tf.metrics.auc(labels=ctcvr_labels, predictions=ctcvr_score, name='auc') metrics = {'ctr_auc': ctr_auc, 'ctcvr_auc': ctcvr_auc} # ctr_loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(labels=ctr_labels, logits=ctr_out)) ctr_loss = tf.reduce_mean( tf.losses.log_loss(labels=ctr_labels, predictions=ctr_score)) ctcvr_loss = tf.reduce_mean( tf.losses.log_loss(labels=ctcvr_labels, predictions=ctcvr_score)) loss = ctr_loss + ctcvr_loss if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.AdamOptimizer(params.learning_rate) train_op = optimizer.minimize( loss=loss, global_step=tf.train.get_global_step()) else: train_op = None return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=metrics, train_op=train_op)
def model_fn(labels, features, mode, params): tf.set_random_seed(2019) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] single_cate_feats = cate_feats[:, 0:params.cate_field_size] multi_cate_feats = cate_feats[:, params.cate_field_size:] feats_emb = my_layer.emb_init(name='feats_emb', feat_num=params.cate_feats_size, embedding_size=params.embedding_size) # single_category -> Embedding cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats) cate_emb = tf.reshape(cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # multi_category -> Embedding multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats) # deep input dense dense_input = tf.concat([cont_feats, vector_feats, cate_emb, multi_cate_emb], axis=1, name='dense_vector') len_layers = len(params.hidden_units) with tf.variable_scope('ctr_deep'): dense_ctr = tf.layers.dense(inputs=dense_input, units=params.hidden_units[0], activation=tf.nn.relu) for i in range(1, len_layers): dense_ctr = tf.layers.dense(inputs=dense_ctr, units=params.hidden_units[i], activation=tf.nn.relu) ctr_out = tf.layers.dense(inputs=dense_ctr, units=1) with tf.variable_scope('cvr_deep'): dense_cvr = tf.layers.dense(inputs=dense_input, units=params.hidden_units[0], activation=tf.nn.relu) for i in range(1, len_layers): dense_cvr = tf.layers.dense(inputs=dense_cvr, units=params.hidden_units[i], activation=tf.nn.relu) cvr_out = tf.layers.dense(inputs=dense_cvr, units=1) ctr_score = tf.identity(tf.nn.sigmoid(ctr_out), name='ctr_score') cvr_score = tf.identity(tf.nn.sigmoid(cvr_out), name='cvr_score') ctcvr_score = ctr_score * cvr_score ctcvr_score = tf.identity(ctcvr_score, name='ctcvr_score') ctr_pow = 0.5 cvr_pow = 1 score = tf.multiply(tf.pow(ctr_score, ctr_pow), tf.pow(cvr_score, cvr_pow)) score = tf.identity(score, name='score') if mode == tf.estimator.ModeKeys.PREDICT: return tf.estimator.EstimatorSpec(mode=mode, predictions=score) else: ctr_labels = tf.identity(labels['label'], name='ctr_labels') ctcvr_labels = tf.identity(labels['label2'], name='ctcvr_labels') ctr_auc = tf.metrics.auc(labels=ctr_labels, predictions=ctr_score, name='auc') ctcvr_auc = tf.metrics.auc(labels=ctcvr_labels, predictions=ctcvr_score, name='auc') metrics = { 'ctr_auc': ctr_auc, 'ctcvr_auc': ctcvr_auc } # ctr_loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(labels=ctr_labels, logits=ctr_out)) ctr_loss = tf.reduce_mean(tf.losses.log_loss(labels=ctr_labels, predictions=ctr_score)) ctcvr_loss = tf.reduce_mean(tf.losses.log_loss(labels=ctcvr_labels, predictions=ctcvr_score)) loss = ctr_loss + ctcvr_loss if mode == tf.estimator.ModeKeys.TRAIN: optimizer = tf.train.AdamOptimizer(params.learning_rate) train_op = optimizer.minimize(loss=loss, global_step=tf.train.get_global_step()) else: train_op = None return tf.estimator.EstimatorSpec( mode=mode, loss=loss, eval_metric_ops=metrics, train_op=train_op)
def model_fn(labels, features, mode, params): tf.set_random_seed(2019) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] single_cate_feats = cate_feats[:, 0:params.cate_field_size] multi_cate_feats = cate_feats[:, params.cate_field_size:] cont_feats_index = tf.Variable([[i for i in range(params.cont_field_size)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_index_add = tf.add(cont_feats_index, params.cate_feats_size) index_max_size = params.cont_field_size + params.cate_feats_size feats_emb = my_layer.emb_init(name='feats_emb', feat_num=index_max_size, embedding_size=params.embedding_size) # cont_feats -> Embedding with tf.name_scope("cont_feat_emb"): ori_cont_emb = tf.nn.embedding_lookup(feats_emb, ids=cont_index_add, name="ori_cont_emb") cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_size, 1], name="cont_value") cont_emb = tf.multiply(ori_cont_emb, cont_value) autoint_cont = cont_emb cont_emb = tf.reshape( cont_emb, shape=[-1, params.cont_field_size * params.embedding_size], name="cont_emb") # single_category -> Embedding with tf.name_scope("single_cate_emb"): cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats) autoint_cate = cate_emb cate_emb = tf.reshape( cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # multi_category -> Embedding with tf.name_scope("multi_cate_emb"): multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats) autoint_multi_cate = tf.reshape( multi_cate_emb, shape=[-1, len(params.multi_feats_range), params.embedding_size]) # AutoInteracting with tf.name_scope("AutoInt"): autoint_input = tf.concat( [autoint_cont, autoint_cate, autoint_multi_cate], axis=1) for i in range(params.autoint_layer_num): autoint_input = my_layer.InteractingLayer( num_layer=i, att_emb_size=params.autoint_emb_size, seed=2020, head_num=params.autoint_head_num, use_res=params.autoint_use_res)(autoint_input) autoint_output = tf.layers.Flatten()(autoint_input) # deep input dense dense = tf.concat([cont_emb, vector_feats, cate_emb, multi_cate_emb], axis=1, name='dense_vector') # deep len_layers = len(params.hidden_units) for i in range(0, len_layers): dense = tf.layers.dense(inputs=dense, units=params.hidden_units[i], activation=tf.nn.relu) final_input = tf.concat([autoint_output, dense], axis=1) out = tf.layers.dense(inputs=final_input, units=1) score = tf.identity(tf.nn.sigmoid(out), name='score') model_estimator_spec = op.model_optimizer(params, mode, labels, score) return model_estimator_spec
def model_fn(labels, features, mode, params): tf.set_random_seed(2019) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] single_cate_feats = cate_feats[:, 0:params.cate_field_size] multi_cate_feats = cate_feats[:, params.cate_field_size:] cont_feats_index = tf.Variable([[i for i in range(params.cont_field_size)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_index_add = tf.add(cont_feats_index, params.cate_feats_size) index_max_size = params.cont_field_size + params.cate_feats_size feats_emb = my_layer.emb_init(name='feats_emb', feat_num=index_max_size, embedding_size=params.embedding_size) # cont_feats -> Embedding ori_cont_emb = tf.nn.embedding_lookup(feats_emb, ids=cont_index_add, name="ori_cont_emb") cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_size, 1], name="cont_value") cont_emb = tf.multiply(ori_cont_emb, cont_value) cont_emb = tf.reshape( cont_emb, shape=[-1, params.cont_field_size * params.embedding_size], name="cont_emb") # print(ori_cont_emb) # print(cont_value) # print(cont_emb) # single_category -> Embedding cate_emb = tf.nn.embedding_lookup(feats_emb, ids=single_cate_feats) cate_emb = tf.reshape( cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # print(cate_emb) # multi_category -> Embedding multi_cate_emb = my_layer.multi_cate_emb(params.multi_feats_range, feats_emb, multi_cate_feats) # deep input dense dense = tf.concat([cont_emb, vector_feats, cate_emb, multi_cate_emb], axis=1, name='dense_vector') # deep len_layers = len(params.hidden_units) for i in range(0, len_layers): dense = tf.layers.dense(inputs=dense, units=params.hidden_units[i], activation=tf.nn.relu) out = tf.layers.dense(inputs=dense, units=1) score = tf.identity(tf.nn.sigmoid(out), name='score') model_estimator_spec = op.model_optimizer(params, mode, labels, score) return model_estimator_spec