Exemplo n.º 1
0
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
Exemplo n.º 2
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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