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(features, labels, mode, params): tf.set_random_seed(2019) cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] feats_emb = my_layer.emb_init(name='feats_emb', feat_num=params.cate_feats_size, embedding_size=params.embedding_size) # category -> Embedding cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats) cate_emb = tf.reshape( cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # deep input dense dense = tf.concat([vector_feats, 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
def model_fn(labels, features, mode, params): tf.set_random_seed(2020) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] cont_feats_index = tf.Variable( [[i for i in range(params.cont_field_count)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size) feats_size = params.cont_field_count + params.cate_emb_space_size feats_emb = my_layer.emb_init(name='feats_emb', feat_num=feats_size, embedding_size=params.embedding_size) cont_emb = tf.nn.embedding_lookup( feats_emb, ids=cont_feats_index) # None * F * embedding_size cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1]) embeddings = tf.multiply(cont_emb, cont_value) cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats) embeddings = tf.concat([embeddings, cate_emb], axis=1) if params.multi_feats_type == 'dense': for name_topN in params.multi_cate_field_list: dense_embedding = tf.nn.embedding_lookup( feats_emb, ids=features[name_topN[0]]) # None, topN, embedding_size dense_embedding = tf.reduce_sum(dense_embedding, axis=1) # None, 1 dense_embedding = tf.reshape(dense_embedding, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, dense_embedding], axis=1) else: # sparse for name_topN in params.multi_cate_field_list: sparse_embedding = tf.nn.embedding_lookup_sparse( feats_emb, sp_ids=features[name_topN[0]], sp_weights=None, combiner='sum') # None * embedding_size sparse_embedding = tf.reshape(sparse_embedding, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, sparse_embedding], axis=1) deep_emb = tf.reshape( embeddings, shape=[-1, params.total_field_count * params.embedding_size]) # deep len_layers = len(params.hidden_units) for i in range(0, len_layers): deep_emb = tf.layers.dense(inputs=deep_emb, units=params.hidden_units[i], activation=tf.nn.relu) out = tf.layers.dense(inputs=deep_emb, 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(2020) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] cont_feats_index = tf.Variable([[i for i in range(params.cont_field_count)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size) feats_size = params.cont_field_count + params.cate_emb_space_size feats_emb = my_layer.emb_init(name='feats_emb', feat_num=feats_size, embedding_size=params.embedding_size) # cont_feats cont_emb = tf.nn.embedding_lookup(feats_emb, ids=cont_feats_index) # None * F * embedding_size cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1]) embeddings = tf.multiply(cont_emb, cont_value) # cate_feats cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats) embeddings = tf.concat([embeddings, cate_emb], axis=1) # multi_cate_feats for name_topN in params.multi_cate_field_list: multi_cate_emb = tf.nn.embedding_lookup(feats_emb, ids=features[name_topN[0]]) # None, topN, embedding_size multi_cate_emb = tf.reduce_sum(multi_cate_emb, axis=1) # None, embedding_size multi_cate_emb = tf.reshape(multi_cate_emb, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, multi_cate_emb], axis=1) # target-attention 1vN (e.g. item_cat1 & user_click_cat1) for k_v in params.target_att_1vN_list: item_feat = tf.split(cate_feats, params.cate_field_count, axis=1)[k_v[1]] user_feat = features[k_v[0]] nonzero_len = tf.count_nonzero(user_feat, axis=1) item_emb = tf.nn.embedding_lookup(feats_emb, ids=item_feat) # [B, 1, H] item_emb = tf.reshape(item_emb, shape=[-1, params.embedding_size]) # [B, H] user_emb = tf.nn.embedding_lookup(feats_emb, ids=user_feat) # [B, T, H]) att_1vN_emb = my_layer.attention(item_emb, user_emb, nonzero_len) # [B, 1, H] embeddings = tf.concat([embeddings, att_1vN_emb], axis=1) # target-attention NvN (e.g. item_tags & user_click_tags) for k_v in params.target_att_NvN_list: item_feat = features[k_v[1]] user_feat = features[k_v[0]] nonzero_len = tf.count_nonzero(user_feat, axis=1) item_emb = tf.nn.embedding_lookup(feats_emb, ids=item_feat) # [B, N, H] user_emb = tf.nn.embedding_lookup(feats_emb, ids=user_feat) # [B, T, H]) att_NvN_emb = my_layer.attention_multi(item_emb, user_emb, nonzero_len) # [B, 1, H] embeddings = tf.concat([embeddings, att_NvN_emb], axis=1) # deep embeddings = tf.layers.flatten(embeddings) len_layers = len(params.hidden_units) for i in range(0, len_layers): embeddings = tf.layers.dense(inputs=embeddings, units=params.hidden_units[i], activation=tf.nn.relu) out = tf.layers.dense(inputs=embeddings, 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:] 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]) # aid -> attention aid = vector_feats[:, -112:-96] user_click_aids = vector_feats[:, -96:] user_click_aids = tf.reshape(user_click_aids, shape=[-1, 6, 16]) user_click_aids_len = tf.constant( 6, shape=[user_click_aids.get_shape().as_list()[0]]) attention_emb = attention(aid, user_click_aids, user_click_aids_len) attention_emb = tf.reshape(attention_emb, shape=[-1, 16]) # deep input dense dense = tf.concat([cont_feats, vector_feats, 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): tf.set_random_seed(2020) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] cont_feats_index = tf.Variable([[i for i in range(params.cont_field_count)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size) feats_size = params.cont_field_count + params.cate_emb_space_size weights = dict() weights["feats_emb"] = tf.get_variable(name='feats_emb', shape=[feats_size, params.embedding_size], initializer=tf.glorot_normal_initializer()) weights["feats_bias"] = tf.get_variable(name='feats_bias', shape=[feats_size, 1], initializer=tf.glorot_normal_initializer()) with tf.name_scope('fm_part'): # FM_first_order [?, total_field_count] first_cont_emb = tf.nn.embedding_lookup(weights["feats_bias"], ids=cont_feats_index) # [None, F, 1] first_cont_emb = tf.reshape(first_cont_emb, shape=[-1, params.cont_field_count]) first_order = tf.multiply(first_cont_emb, cont_feats) first_cate_emb = tf.nn.embedding_lookup(weights["feats_bias"], ids=cate_feats) first_cate_emb = tf.reshape(first_cate_emb, shape=[-1, params.cate_field_count]) first_order = tf.concat([first_order, first_cate_emb], axis=1) for name_topN in params.multi_cate_field_list: dense_embedding = tf.nn.embedding_lookup(weights["feats_bias"], ids=features[name_topN[0]]) # [None, topN, 1] dense_embedding = tf.reduce_sum(dense_embedding, axis=1) # [None, 1] first_order = tf.concat([first_order, dense_embedding], axis=1) # FM_second_order [?, embedding_size] second_cont_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=cont_feats_index) # [None, F, embedding_size] second_cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1]) embeddings = tf.multiply(second_cont_emb, second_cont_value) second_cate_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=cate_feats) embeddings = tf.concat([embeddings, second_cate_emb], axis=1) # [None, F, embedding_size] for name_topN in params.multi_cate_field_list: dense_embedding = tf.nn.embedding_lookup(weights["feats_emb"], ids=features[name_topN[0]]) # [None, topN, embedding_size] dense_embedding = tf.reduce_sum(dense_embedding, axis=1) # [None, embedding_size] dense_embedding = tf.reshape(dense_embedding, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, dense_embedding], axis=1) # target-attention 1vN (e.g. item_cat1 & user_click_cat1) for k_v in params.target_att_1vN_list: item_feat = tf.split(cate_feats, params.cate_field_count, axis=1)[k_v[1]] user_feat = features[k_v[0]] nonzero_len = tf.count_nonzero(user_feat, axis=1) item_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=item_feat) # [B, 1, H] item_emb = tf.reshape(item_emb, shape=[-1, params.embedding_size]) # [B, H] user_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=user_feat) # [B, T, H]) att_1vN_emb = my_layer.attention(item_emb, user_emb, nonzero_len) # [B, 1, H] embeddings = tf.concat([embeddings, att_1vN_emb], axis=1) # target-attention NvN (e.g. item_tags & user_click_tags) for k_v in params.target_att_NvN_list: item_feat = features[k_v[1]] user_feat = features[k_v[0]] nonzero_len = tf.count_nonzero(user_feat, axis=1) item_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=item_feat) # [B, N, H] user_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=user_feat) # [B, T, H]) att_NvN_emb = my_layer.attention_multi(item_emb, user_emb, nonzero_len) # [B, 1, H] embeddings = tf.concat([embeddings, att_NvN_emb], axis=1) sum_emb = tf.reduce_sum(embeddings, 1) sum_square_emb = tf.square(sum_emb) square_emb = tf.square(embeddings) square_sum_emb = tf.reduce_sum(square_emb, 1) second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb) # FM_res [?, total_field_count + embedding_size] fm_res = tf.concat([first_order, second_order], axis=1) with tf.name_scope('deep_part'): deep_res = tf.layers.flatten(embeddings) 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'): input_size = params.total_field_count + params.embedding_size + params.hidden_units[-1] # FM_res->total_field_count+embedding_size, Deep_res->hidden_units[-1] weights["concat_emb"] = tf.get_variable(name='concat_emb', shape=[input_size, 1], initializer=tf.glorot_normal_initializer()) weights["concat_bias"] = tf.get_variable(name='concat_bias', shape=[1], initializer=tf.constant_initializer(0.01)) feats_input = tf.concat([fm_res, deep_res], axis=1) out = tf.add(tf.matmul(feats_input, weights["concat_emb"]), weights["concat_bias"]) y = tf.nn.sigmoid(out) model_estimator_spec = op.model_optimizer(params, mode, labels, y) return model_estimator_spec
def model_fn(features, labels, mode, params): use_deep = True use_fm = True tf.set_random_seed(2019) cate_feats = features["cate_feats"] vector_feats = features["vector_feats"] 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 + params.multi_field_size # FM_first_order [?, input_field_size] # cate first_cate_emb = tf.nn.embedding_lookup(fm_first_order_emb, ids=cate_feats) first_cate_emb = tf.reshape(first_cate_emb, shape=[-1, params.cate_field_size]) first_order = tf.nn.dropout(first_cate_emb, params.dropout_keep_fm[0]) # FM_second_order [?, embedding_size] # cate second_order_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats) 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]) print("fm_second_order:", second_order) # FM_res [?, self.input_field_size + embedding_size] fm_res = tf.concat([first_order, second_order], axis=1) with tf.name_scope('deep_part'): # category -> Embedding cate_emb = tf.nn.embedding_lookup(feats_emb, ids=cate_feats) cate_emb = tf.reshape(cate_emb, shape=[-1, params.cate_field_size * params.embedding_size]) # dense input deep_res = tf.concat([vector_feats, 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): 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) 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(2020) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] cont_feats_index = tf.Variable( [[i for i in range(params.cont_field_count)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size) feats_size = params.cont_field_count + params.cate_emb_space_size weights = dict() weights["feats_emb"] = tf.get_variable( name='feats_emb', shape=[feats_size, params.embedding_size], initializer=tf.glorot_normal_initializer()) weights["feats_bias"] = tf.get_variable( name='feats_bias', shape=[feats_size, 1], initializer=tf.glorot_normal_initializer()) with tf.name_scope('fm_part'): # FM_first_order [?, total_field_count] first_cont_emb = tf.nn.embedding_lookup( weights["feats_bias"], ids=cont_feats_index) # [None, F, 1] first_cont_emb = tf.reshape(first_cont_emb, shape=[-1, params.cont_field_count]) first_order = tf.multiply(first_cont_emb, cont_feats) first_cate_emb = tf.nn.embedding_lookup(weights["feats_bias"], ids=cate_feats) first_cate_emb = tf.reshape(first_cate_emb, shape=[-1, params.cate_field_count]) first_order = tf.concat([first_order, first_cate_emb], axis=1) if params.multi_feats_type == 'dense': for name_topN in params.multi_cate_field_list: dense_embedding = tf.nn.embedding_lookup( weights["feats_bias"], ids=features[name_topN[0]]) # [None, topN, 1] dense_embedding = tf.reduce_sum(dense_embedding, axis=1) # [None, 1] first_order = tf.concat([first_order, dense_embedding], axis=1) else: # sparse for name_topN in params.multi_cate_field_list: sparse_embedding = tf.nn.embedding_lookup_sparse( weights["feats_bias"], sp_ids=features[name_topN[0]], sp_weights=None, combiner='sum') # [None, 1] first_order = tf.concat([first_order, sparse_embedding], axis=1) # FM_second_order [?, embedding_size] second_cont_emb = tf.nn.embedding_lookup( weights["feats_emb"], ids=cont_feats_index) # [None, F, embedding_size] second_cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1]) embeddings = tf.multiply(second_cont_emb, second_cont_value) second_cate_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=cate_feats) embeddings = tf.concat([embeddings, second_cate_emb], axis=1) # [None, F, embedding_size] if params.multi_feats_type == 'dense': for name_topN in params.multi_cate_field_list: dense_embedding = tf.nn.embedding_lookup( weights["feats_emb"], ids=features[name_topN[0]]) # [None, topN, embedding_size] dense_embedding = tf.reduce_sum( dense_embedding, axis=1) # [None, embedding_size] dense_embedding = tf.reshape( dense_embedding, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, dense_embedding], axis=1) else: # sparse for name_topN in params.multi_cate_field_list: sparse_embedding = tf.nn.embedding_lookup_sparse( weights["feats_emb"], sp_ids=features[name_topN[0]], sp_weights=None, combiner='sum') # [None, embedding_size] sparse_embedding = tf.reshape( sparse_embedding, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, sparse_embedding], axis=1) autoint_emb = embeddings with tf.name_scope("AutoInt"): for i in range(params.autoint_layer_count): autoint_emb = my_layer.InteractingLayer( num_layer=i, att_emb_size=params.autoint_emb_size, seed=2020, head_num=params.autoint_head_count, use_res=params.autoint_use_res )( autoint_emb ) # [None, F, head*autoint_emb_size] 令head*autoint_emb_size=embedding_size embeddings = tf.concat([embeddings, autoint_emb], axis=1) sum_emb = tf.reduce_sum(embeddings, 1) sum_square_emb = tf.square(sum_emb) square_emb = tf.square(embeddings) square_sum_emb = tf.reduce_sum(square_emb, 1) second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb) # print(second_order) # FM_res [?, total_field_count + embedding_size] fm_res = tf.concat([first_order, second_order], axis=1) # deep_res including autoint deep_res = tf.layers.flatten(embeddings) wide = deep_res # wide including autoint 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) # fm & deep & wide feats_input = tf.concat([fm_res, deep_res, wide], axis=1) out = tf.layers.dense(inputs=feats_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
def model_fn(labels, features, mode, params): tf.set_random_seed(2020) cont_feats = features["cont_feats"] cate_feats = features["cate_feats"] cont_feats_index = tf.Variable( [[i for i in range(params.cont_field_count)]], trainable=False, dtype=tf.int64, name="cont_feats_index") cont_feats_index = tf.add(cont_feats_index, params.cate_emb_space_size) feats_size = params.cont_field_count + params.cate_emb_space_size weights = dict() weights["feats_emb"] = tf.get_variable( name='feats_emb', shape=[feats_size, params.embedding_size], initializer=tf.glorot_normal_initializer()) weights["feats_bias"] = tf.get_variable( name='feats_bias', shape=[feats_size, 1], initializer=tf.glorot_normal_initializer()) with tf.name_scope('fm_part'): # FM_first_order [?, total_field_count] first_cont_emb = tf.nn.embedding_lookup( weights["feats_bias"], ids=cont_feats_index) # [None, F, 1] first_cont_emb = tf.reshape(first_cont_emb, shape=[-1, params.cont_field_count]) first_order = tf.multiply(first_cont_emb, cont_feats) first_cate_emb = tf.nn.embedding_lookup(weights["feats_bias"], ids=cate_feats) first_cate_emb = tf.reshape(first_cate_emb, shape=[-1, params.cate_field_count]) first_order = tf.concat([first_order, first_cate_emb], axis=1) if params.multi_feats_type == 'dense': for name_topN in params.multi_cate_field_list: dense_embedding = tf.nn.embedding_lookup( weights["feats_bias"], ids=features[name_topN[0]]) # [None, topN, 1] dense_embedding = tf.reduce_sum(dense_embedding, axis=1) # [None, 1] first_order = tf.concat([first_order, dense_embedding], axis=1) else: # sparse for name_topN in params.multi_cate_field_list: sparse_embedding = tf.nn.embedding_lookup_sparse( weights["feats_bias"], sp_ids=features[name_topN[0]], sp_weights=None, combiner='sum') # [None, 1] first_order = tf.concat([first_order, sparse_embedding], axis=1) # FM_second_order [?, embedding_size] second_cont_emb = tf.nn.embedding_lookup( weights["feats_emb"], ids=cont_feats_index) # [None, F, embedding_size] second_cont_value = tf.reshape(cont_feats, shape=[-1, params.cont_field_count, 1]) embeddings = tf.multiply(second_cont_emb, second_cont_value) second_cate_emb = tf.nn.embedding_lookup(weights["feats_emb"], ids=cate_feats) embeddings = tf.concat([embeddings, second_cate_emb], axis=1) # [None, F, embedding_size] if params.multi_feats_type == 'dense': for name_topN in params.multi_cate_field_list: dense_embedding = tf.nn.embedding_lookup( weights["feats_emb"], ids=features[name_topN[0]]) # [None, topN, embedding_size] dense_embedding = tf.reduce_sum( dense_embedding, axis=1) # [None, embedding_size] dense_embedding = tf.reshape( dense_embedding, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, dense_embedding], axis=1) else: # sparse for name_topN in params.multi_cate_field_list: sparse_embedding = tf.nn.embedding_lookup_sparse( weights["feats_emb"], sp_ids=features[name_topN[0]], sp_weights=None, combiner='sum') # [None, embedding_size] sparse_embedding = tf.reshape( sparse_embedding, shape=[-1, 1, params.embedding_size]) embeddings = tf.concat([embeddings, sparse_embedding], axis=1) sum_emb = tf.reduce_sum(embeddings, 1) sum_square_emb = tf.square(sum_emb) square_emb = tf.square(embeddings) square_sum_emb = tf.reduce_sum(square_emb, 1) second_order = 0.5 * tf.subtract(sum_square_emb, square_sum_emb) # print(second_order) # FM_res [?, total_field_count + embedding_size] fm_res = tf.concat([first_order, second_order], axis=1) with tf.name_scope('deep_part'): deep_res = tf.reshape( embeddings, shape=[-1, params.total_field_count * params.embedding_size]) 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'): input_size = params.total_field_count + params.embedding_size + params.hidden_units[ -1] # FM_res->total_field_count+embedding_size, Deep_res->hidden_units[-1] weights["concat_emb"] = tf.get_variable( name='concat_emb', shape=[input_size, 1], initializer=tf.glorot_normal_initializer()) weights["concat_bias"] = tf.get_variable( name='concat_bias', shape=[1], initializer=tf.constant_initializer(0.01)) feats_input = tf.concat([fm_res, deep_res], axis=1) out = tf.add(tf.matmul(feats_input, weights["concat_emb"]), weights["concat_bias"]) y = tf.nn.sigmoid(out) model_estimator_spec = op.model_optimizer(params, mode, labels, y) return model_estimator_spec