特征组

简介

feature_group用于将一组特征在Embedding Lookup后聚合成一组,方便在模型中直接根据group_name获取获取一组特征的Embedding值。feature_group支持多组,也支持通过group_type配置多种类型的feature_group,包括WIDE,DEEP,SEQUENCE。

SEQUENCE

SEQUENCE: 序列特征组。其中feature_names实际分为querysequence部分,query对应feature_names中的非序列特征(IdFeature/RawFeature/ComboFeature等),sequence对应feature_names中的序列特征(SequenceIdFeature/SequenceRawFeature/SequenceFeature等)。序列特征组的特征经过Embedding后不做任何处理,开发者可以根据{{group_name}}.query{{group_name}}.sequence{{group_name}}.sequence_lengthEmbeddingGroup的输出字典中获取到相应的序列特征信息,从而进一步构建对序列特征的处理。

DEEP

DEEP: 深度特征组。其中feature_names只能包含非序列特征(IdFeature/RawFeature/ComboFeature等),但可以嵌套包含多个sequence_groups来配置序列特征,此处序列特征会走对应配置的sequence_encoders进行序列维度的池化,并和非序列特征Embedding拼接在一起,开发者可以根据group_name从EmbeddingGroup的输出字典中获取到相应的特征组Embedding。其中sequence_groups的配置方式同序列特征组,sequence_encoders目前包含DINEncoder和SimpleAttention两种:

  • DINEncoder: 该Encoder为DIN模型中使用的序列池化。 feature_groups_din.png 假设用户历史序列id为id=[id1, id2, …, idn],经过embedding后向量是ide=[ide1, ide2, …, iden]。其中序列池化是把用户历史行为的商品向量与候选广告商品向量做相减,相乘。后经过全连接层后得到每个商品的概率值score=[s1,s2,…sn] ,在对权重和向量乘积求和,得到池化向量。 如果此时的序列id包含,商品id,商品类目,等多种特征,此时sequence_groups中的query即当前广告的id,类目等特征向量,sequence即历史行为的广告id,类目等特征向量,所以querysequence的特征顺序应该对应起来。将多余的特征放在sequence_groups配置的最后。

  • SimpleAttention: 类似于DINEncoder,其中的scorequerysequence矩阵相乘,得到序列特征中对用的权重,然后对权重和向量乘积求和得到池化向量。由于要做矩阵相乘,要求querysequence的特征输数量和顺序一定相同。

  • PoolingEncoder: 对变长的sequence的Emebdding做池化,pooling_type支持mean和sum两种,常用于向量召回模型的user侧特征组

  • MultiWindowDINEncoder: 相比DINEncoder新增一个windows_len参数来设置分段的序列行为窗口长度,会对序列分段做TargetAttention,从而强化用户的长短期兴趣。

WIDE

WIDE: 广度特征组,主要用于WideAndDeep/DeepFM模型。其中feature_names只能包含非序列特征IdFeature/RawFeature/ComboFeature等,embedding_dim固定为4,不根据feature_group中的embedding_dim的配置变化而变化,开发者可以根据group_name从EmbeddingGroup的输出字典中获取到相应的特征组Embedding。不可以包含sequence_groups。

embedding_name_suffix(可选)

为feature_group内所有特征的embedding_name追加后缀,使不同feature_group即使引用相同特征也能使用独立的embedding表,无需为每个塔重复定义特征配置。

  • 不设置或为空:保持默认行为,相同embedding_name的特征跨feature_group共享embedding表。

  • 不同feature_group设置相同的embedding_name_suffix:仍共享同一embedding表。

  • 不同feature_group设置不同的embedding_name_suffix:使用各自独立的embedding表。

  • 当DEEP feature_group同时设置embedding_name_suffix和嵌套sequence_groups时,后缀会自动传递到嵌套的sequence_groups。SeqGroupConfig也支持embedding_name_suffix字段,在子sequence_group上显式设置该字段会覆盖父feature_group传递下来的值。

  • 当WIDE feature_group设置embedding_name_suffix时,最终embedding表名为<emb_name>_wide_<suffix>

配置样例

model_config {
    feature_groups {
        group_name: "only_sequence"
        feature_names: "int_0"
        feature_names: "cat_1"
        ...
        feature_names: "click_50__int_0"
        feature_names: "click_50__cat_1"
        group_type: SEQUENCE
    }
    feature_groups {
        group_name: "common_deep"
        feature_names: "int_0"
        feature_names: "int_1"
        ...
        feature_names: "cat_24"
        feature_names: "cat_25"
        group_type: DEEP
    }
    feature_groups {
        group_name: "deep"
        feature_names: "int_0"
        feature_names: "int_1"
        ...
        feature_names: "cat_24"
        feature_names: "cat_25"
        sequence_groups {
            group_name: "click_50"
            feature_names: "int_0"
            feature_names: "cat_1"
            ...
            feature_names: "click_50__int_0"
            feature_names: "click_50__cat_1"
            feature_names: "click_50__ts"
        }
        sequence_groups {
            group_name: "buy_50"
            feature_names: "int_0"
            feature_names: "cat_1"
            ...
            feature_names: "buy_50__int_0"
            feature_names: "buy_50__cat_1"
            feature_names: "buy_50__ts"
        }
        sequence_encoders {
            din_encoder {
                input: "click_50"
                attn_mlp {
                    hidden_units: [128, 64]
                    activation: "Dice"
                }
            }
        }
        sequence_encoders {
            simple_attention {
                input: "buy_50"
            }
        }
        group_type: DEEP
    }
    feature_groups {
        group_name: "wide"
        feature_names: "int_0"
        feature_names: "int_1"
        ...
        feature_names: "cat_24"
        feature_names: "cat_25"
        group_type: WIDE
    }
}

embedding_name_suffix 双塔不共享embedding

model_config {
    feature_groups {
        group_name: "tower_a"
        feature_names: "cat_a"
        feature_names: "cat_b"
        group_type: DEEP
        embedding_name_suffix: "tower_a"
    }
    feature_groups {
        group_name: "tower_b"
        feature_names: "cat_a"
        feature_names: "cat_b"
        group_type: DEEP
        embedding_name_suffix: "tower_b"
    }
}

embedding_name_suffix 嵌套sequence_group 覆盖/继承父group后缀

feature_groups {
    group_name: "deep"
    feature_names: "cat_a"
    group_type: DEEP
    embedding_name_suffix: "tower_a"
    sequence_groups {
        group_name: "click_seq"
        feature_names: "cat_a"
        feature_names: "click_seq__cat_a"
        embedding_name_suffix: "click_only"
    }
    sequence_groups {
        group_name: "buy_seq"
        feature_names: "cat_a"
        feature_names: "buy_seq__cat_a"
    }
    sequence_encoders {
        simple_attention { input: "click_seq" }
    }
    sequence_encoders {
        simple_attention { input: "buy_seq" }
    }
}