From 6686079f93d916eef21bb266c6e76e7222c14aa2 Mon Sep 17 00:00:00 2001 From: Eric Ge Date: Thu, 31 Oct 2024 08:54:43 +0800 Subject: [PATCH] [feature]Add CIN module and Parallel DSSM model (#493) * match model supports backbone components * CIN module implementation * CIN module fix * CIN: add kernel/bias regularizer * add docs for parallel dssm model * add unit test for parallel dssm * fix CIN compatibility issue with tf1.x * fix tf.initializer issue * fix python2.7 string compatility issue --- docs/images/models/parallel_dssm.png | Bin 0 -> 98720 bytes docs/source/models/dssm_derivatives.md | 10 + easy_rec/python/layers/keras/__init__.py | 1 + easy_rec/python/layers/keras/interaction.py | 104 ++++ easy_rec/python/protos/keras_layer.proto | 1 + easy_rec/python/protos/layer.proto | 4 + easy_rec/python/test/train_eval_test.py | 7 + .../parallel_dssm_on_taobao_backbone.config | 589 ++++++++++++++++++ 8 files changed, 716 insertions(+) create mode 100644 docs/images/models/parallel_dssm.png create mode 100644 samples/model_config/parallel_dssm_on_taobao_backbone.config diff --git a/docs/images/models/parallel_dssm.png b/docs/images/models/parallel_dssm.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbd5025fab90617821c0211919a86095a1aa915 GIT binary patch literal 98720 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�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�ar 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%0A7~~i%#qSpdd$^qM899;d20d9EyTH`zN3%09yw- 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 xzdi785B%E$|MtMYJ@9W2{M!Tn{~p-dV?us#^OZ 0, 'parameter hidden_feature_sizes must be a list of int with length greater than 0' + + kernel_regularizer = params.get_or_default('kernel_regularizer', None) + self._kernel_regularizer = tf.keras.regularizers.get(kernel_regularizer) + bias_regularizer = params.get_or_default('bias_regularizer', None) + self._bias_regularizer = tf.keras.regularizers.get(bias_regularizer) + + def build(self, input_shape): + if len(input_shape) != 3: + raise ValueError( + 'Unexpected inputs dimensions %d, expect to be 3 dimensions' % + (len(input_shape))) + + hidden_feature_sizes = [input_shape[1] + ] + [h for h in self._hidden_feature_sizes] + tfv1 = tf.compat.v1 if tf.__version__ >= '2.0' else tf + with tfv1.variable_scope(self._name): + self.kernel_list = [ + tfv1.get_variable( + name='cin_kernel_%d' % i, + shape=[ + hidden_feature_sizes[i + 1], hidden_feature_sizes[i], + hidden_feature_sizes[0] + ], + initializer=tf.initializers.he_normal(), + regularizer=self._kernel_regularizer, + trainable=True) for i in range(len(self._hidden_feature_sizes)) + ] + self.bias_list = [ + tfv1.get_variable( + name='cin_bias_%d' % i, + shape=[hidden_feature_sizes[i + 1]], + initializer=tf.keras.initializers.Zeros, + regularizer=self._bias_regularizer, + trainable=True) for i in range(len(self._hidden_feature_sizes)) + ] + + super(CIN, self).build(input_shape) + + def call(self, input, **kwargs): + """Computes the compressed feature maps. + + Args: + input: The 3D input tensor with shape (b, h0, d), where b is batch_size, + h0 is the number of features, d is the feature embedding dimension. + + Returns: + 2D tensor of compressed feature map with shape (b, featuremap_num), + where b is the batch_size, featuremap_num is sum of the hidden layer sizes + """ + x_0 = input + x_i = input + x_0_expanded = tf.expand_dims(x_0, 1) + pooled_feature_map_list = [] + for i in range(len(self._hidden_feature_sizes)): + hk = self._hidden_feature_sizes[i] + + x_i_expanded = tf.expand_dims(x_i, 2) + intermediate_tensor = tf.multiply(x_0_expanded, x_i_expanded) + + intermediate_tensor_expanded = tf.expand_dims(intermediate_tensor, 1) + intermediate_tensor_expanded = tf.tile(intermediate_tensor_expanded, + [1, hk, 1, 1, 1]) + + feature_map_elementwise = tf.multiply( + intermediate_tensor_expanded, + tf.expand_dims(tf.expand_dims(self.kernel_list[i], -1), 0)) + feature_map = tf.reduce_sum( + tf.reduce_sum(feature_map_elementwise, axis=3), axis=2) + + feature_map = tf.add( + feature_map, + tf.expand_dims(tf.expand_dims(self.bias_list[i], axis=-1), axis=0)) + feature_map = tf.nn.relu(feature_map) + + x_i = feature_map + pooled_feature_map_list.append(tf.reduce_sum(feature_map, axis=-1)) + return tf.concat( + pooled_feature_map_list, axis=-1) # shape = (b, h1 + ... + hk) + + def get_config(self): + pass + + def _clone_initializer(initializer): return initializer.__class__.from_config(initializer.get_config()) diff --git a/easy_rec/python/protos/keras_layer.proto b/easy_rec/python/protos/keras_layer.proto index 04ece4eb6..2b8047064 100644 --- a/easy_rec/python/protos/keras_layer.proto +++ b/easy_rec/python/protos/keras_layer.proto @@ -36,5 +36,6 @@ message KerasLayer { TextEncoder text_encoder = 25; WeightedGate gate = 26; AITMTower aitm = 27; + CIN cin=28; } } diff --git a/easy_rec/python/protos/layer.proto b/easy_rec/python/protos/layer.proto index a0438f071..4f45a3d08 100644 --- a/easy_rec/python/protos/layer.proto +++ b/easy_rec/python/protos/layer.proto @@ -144,3 +144,7 @@ message AITMTower { optional MLP transfer_mlp = 2; optional bool stop_gradient = 3 [default = true]; } + +message CIN { + repeated int32 hidden_feature_sizes = 1; +} diff --git a/easy_rec/python/test/train_eval_test.py b/easy_rec/python/test/train_eval_test.py index 65f08c8d9..eecce2363 100644 --- a/easy_rec/python/test/train_eval_test.py +++ b/easy_rec/python/test/train_eval_test.py @@ -1267,6 +1267,13 @@ def test_dssm_senet_backbone_on_taobao(self): self._test_dir) self.assertTrue(self._success) + @unittest.skipIf(gl is None, 'graphlearn is not installed') + def test_parallel_dssm_backbone_on_taobao(self): + self._success = test_utils.test_single_train_eval( + 'samples/model_config/parallel_dssm_on_taobao_backbone.config', + self._test_dir) + self.assertTrue(self._success) + if __name__ == '__main__': tf.test.main() diff --git a/samples/model_config/parallel_dssm_on_taobao_backbone.config b/samples/model_config/parallel_dssm_on_taobao_backbone.config new file mode 100644 index 000000000..cee82fa27 --- /dev/null +++ b/samples/model_config/parallel_dssm_on_taobao_backbone.config @@ -0,0 +1,589 @@ +train_input_path: "data/test/tb_data/taobao_train_data" +eval_input_path: "data/test/tb_data/taobao_test_data" +model_dir: "experiments/parallel_dssm_taobao_ckpt" + +train_config { + log_step_count_steps: 200 + optimizer_config: { + adam_optimizer: { + learning_rate: { + exponential_decay_learning_rate { + # initial_learning_rate: 0.001 + initial_learning_rate: 0.0001 + decay_steps: 4000 + decay_factor: 0.5 + min_learning_rate: 0.00001 + } + } + } + use_moving_average: false + } + save_checkpoints_steps: 4000 + sync_replicas: false + num_steps: 100000 +} + +eval_config { + + metrics_set: { + recall_at_topk { + topk: 50 + } + } + metrics_set: { + recall_at_topk { + topk: 10 + } + } + metrics_set: { + recall_at_topk { + topk: 5 + } + } + metrics_set: { + recall_at_topk { + topk: 1 + } + } +} + +data_config { + input_fields { + input_name:'clk' + input_type: INT32 + } + input_fields { + input_name:'buy' + input_type: INT32 + } + input_fields { + input_name: 'pid' + input_type: STRING + } + input_fields { + input_name: 'adgroup_id' + input_type: STRING + } + input_fields { + input_name: 'cate_id' + input_type: STRING + } + input_fields { + input_name: 'campaign_id' + input_type: STRING + } + input_fields { + input_name: 'customer' + input_type: STRING + } + input_fields { + input_name: 'brand' + input_type: STRING + } + input_fields { + input_name: 'user_id' + input_type: STRING + } + input_fields { + input_name: 'cms_segid' + input_type: STRING + } + input_fields { + input_name: 'cms_group_id' + input_type: STRING + } + input_fields { + input_name: 'final_gender_code' + input_type: STRING + } + input_fields { + input_name: 'age_level' + input_type: STRING + } + input_fields { + input_name: 'pvalue_level' + input_type: STRING + } + input_fields { + input_name: 'shopping_level' + input_type: STRING + } + input_fields { + input_name: 'occupation' + input_type: STRING + } + input_fields { + input_name: 'new_user_class_level' + input_type: STRING + } + input_fields { + input_name: 'tag_category_list' + input_type: STRING + } + input_fields { + input_name: 'tag_brand_list' + input_type: STRING + } + input_fields { + input_name: 'price' + input_type: INT32 + } + + label_fields: 'clk' + batch_size: 4096 + num_epochs: 10000 + prefetch_size: 32 + input_type: CSVInput + + negative_sampler { + input_path: 'data/test/tb_data/taobao_ad_feature_gl' + num_sample: 1024 + num_eval_sample: 2048 + attr_fields: 'adgroup_id' + attr_fields: 'cate_id' + attr_fields: 'campaign_id' + attr_fields: 'customer' + attr_fields: 'brand' + item_id_field: 'adgroup_id' + } +} + +feature_config: { + features: { + input_names: 'pid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'adgroup_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cate_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10000 + } + features: { + input_names: 'campaign_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'customer' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'brand' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'user_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100000 + } + features: { + input_names: 'cms_segid' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'cms_group_id' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 100 + } + features: { + input_names: 'final_gender_code' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'age_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'pvalue_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'shopping_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'occupation' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'new_user_class_level' + feature_type: IdFeature + embedding_dim: 16 + hash_bucket_size: 10 + } + features: { + input_names: 'tag_category_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'tag_brand_list' + feature_type: TagFeature + separator: '|' + hash_bucket_size: 100000 + embedding_dim: 16 + } + features: { + input_names: 'price' + feature_type: IdFeature + embedding_dim: 16 + num_buckets: 50 + } +} +model_config:{ + model_name: "Parallel_DSSM" + model_class: 'MatchModel' + feature_groups: { + group_name: 'user_mlp_feature' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + feature_names: 'final_gender_code' + wide_deep:DEEP + } + feature_groups: { + group_name: 'user_dcn_feature' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + feature_names: 'final_gender_code' + wide_deep:DEEP + } + feature_groups: { + group_name: 'user_fm_feature' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + feature_names: 'final_gender_code' + wide_deep:DEEP + } + feature_groups: { + group_name: 'user_cin_feature' + feature_names: 'user_id' + feature_names: 'cms_segid' + feature_names: 'cms_group_id' + feature_names: 'age_level' + feature_names: 'pvalue_level' + feature_names: 'shopping_level' + feature_names: 'occupation' + feature_names: 'new_user_class_level' + feature_names: 'tag_category_list' + feature_names: 'tag_brand_list' + feature_names: 'final_gender_code' + wide_deep:DEEP + } + + feature_groups: { + group_name: "item_mlp_feature" + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + #feature_names: 'price' + #feature_names: 'pid' + wide_deep:DEEP + } + feature_groups: { + group_name: "item_dcn_feature" + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + #feature_names: 'price' + #feature_names: 'pid' + wide_deep:DEEP + } + feature_groups: { + group_name: "item_fm_feature" + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + #feature_names: 'price' + #feature_names: 'pid' + wide_deep:DEEP + } + feature_groups: { + group_name: "item_cin_feature" + feature_names: 'adgroup_id' + feature_names: 'cate_id' + feature_names: 'campaign_id' + feature_names: 'customer' + feature_names: 'brand' + #feature_names: 'price' + #feature_names: 'pid' + wide_deep:DEEP + } + + backbone { + blocks { + name: 'user_mlp' + inputs { + feature_group_name: 'user_mlp_feature' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [128, 32] + } + } + } + blocks { + name: 'user_dcn' + inputs { + feature_group_name: 'user_dcn_feature' + input_fn: 'lambda x: [x, x]' + } + recurrent { + num_steps: 3 + fixed_input_index: 0 + keras_layer { + class_name: 'Cross' + } + } + } + blocks { + name: 'user_dcn_out' + inputs { + block_name: 'user_dcn' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [32] + } + } + } + + blocks { + name: 'user_fm_feature' + inputs { + feature_group_name: 'user_fm_feature' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'user_fm' + inputs { + block_name: 'user_fm_feature' + input_slice: '[1]' + } + keras_layer { + class_name: 'FM' + } + } + + blocks { + name: 'user_cin_feature' + inputs { + feature_group_name: 'user_cin_feature' + } + input_layer { + only_output_3d_tensor: true + } + } + + blocks { + name: 'user_cin' + inputs { + block_name: 'user_cin_feature' + } + keras_layer { + class_name: 'CIN' + cin { + hidden_feature_sizes: [16, 16, 16] + } + } + } + + blocks { + name: 'item_mlp' + inputs { + feature_group_name: 'item_mlp_feature' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [128, 32] + } + } + } + blocks { + name: 'item_dcn' + inputs { + feature_group_name: 'item_dcn_feature' + input_fn: 'lambda x: [x, x]' + } + recurrent { + num_steps: 3 + fixed_input_index: 0 + keras_layer { + class_name: 'Cross' + } + } + } + blocks { + name: 'item_dcn_out' + inputs { + block_name: 'item_dcn' + } + keras_layer { + class_name: 'MLP' + mlp { + hidden_units: [32] + } + } + } + + blocks { + name: 'item_fm_feature' + inputs { + feature_group_name: 'item_fm_feature' + } + input_layer { + output_2d_tensor_and_feature_list: true + } + } + blocks { + name: 'item_fm' + inputs { + block_name: 'item_fm_feature' + input_slice: '[1]' + } + keras_layer { + class_name: 'FM' + } + } + blocks { + name: 'item_cin_feature' + inputs { + feature_group_name: 'item_cin_feature' + } + input_layer { + only_output_3d_tensor: true + } + } + blocks { + name: 'item_cin' + inputs { + block_name: 'item_cin_feature' + } + keras_layer { + class_name: 'CIN' + cin { + hidden_feature_sizes: [16, 16, 16] + } + } + } + + blocks { + name: 'user_tower_embedding' + inputs { + block_name: 'user_mlp' + } + inputs { + block_name: 'user_dcn_out' + } + inputs { + block_name: 'user_fm' + } + inputs { + block_name: 'user_cin' + } + + merge_inputs_into_list: true + lambda { + expression: 'lambda x: tf.concat(x, axis=1)' + } + } + blocks { + name: 'item_tower_embedding' + inputs { + block_name: 'item_mlp' + } + inputs { + block_name: 'item_dcn_out' + } + inputs { + block_name: 'item_fm' + } + inputs { + block_name: 'item_cin' + } + merge_inputs_into_list: true + lambda { + expression: 'lambda x: tf.concat(x, axis=1)' + } + } + + output_blocks: ['user_tower_embedding', 'item_tower_embedding'] + } + model_params { + l2_regularization: 1e-4 + user_tower_idx_in_output: 0 + item_tower_idx_in_output: 1 + scale_simi: false + simi_func: INNER_PRODUCT + } + loss_type: SOFTMAX_CROSS_ENTROPY + embedding_regularization: 5e-5 +} + +export_config { +}