mind召回模型, 在dssm的基础上加入了兴趣聚类功能,支持多兴趣召回,能够显著的提升召回层的效果.

feature_configs {
sequence_id_feature {
feature_name: "click_50_seq__adgroup_id"
sequence_length: 50
sequence_delim: "|"
expression: "user:click_50_seq__adgroup_id"
embedding_dim: 16
num_buckets: 846812
}
}
feature_configs {
sequence_id_feature {
feature_name: "click_50_seq__cate_id"
sequence_length: 50
sequence_delim: "|"
expression: "user:click_50_seq__cate_id"
embedding_dim: 8
num_buckets: 12961
}
}
feature_configs {
sequence_id_feature {
feature_name: "click_50_seq__brand"
sequence_length: 50
sequence_delim: "|"
expression: "user:click_50_seq__brand"
embedding_dim: 8
num_buckets: 461498
}
}
model_config {
feature_groups {
group_name: "user"
feature_names: "user_id"
feature_names: "cms_segid"
feature_names: "cms_group_id"
feature_names: "final_gender_code"
feature_names: "age_level"
feature_names: "pvalue_level"
feature_names: "shopping_level"
feature_names: "occupation"
feature_names: "new_user_class_level"
feature_names: "pid"
group_type: DEEP
}
feature_groups {
group_name: "item"
feature_names: "adgroup_id"
feature_names: "cate_id"
feature_names: "campaign_id"
feature_names: "customer"
feature_names: "brand"
feature_names: "price"
group_type: DEEP
}
feature_groups {
group_name: "hist"
feature_names: "click_50_seq__adgroup_id"
feature_names: "click_50_seq__cate_id"
feature_names: "click_50_seq__brand"
group_type: SEQUENCE
}
mind{
user_tower{
input: 'user'
history_input: 'hist'
user_mlp {
hidden_units: [256, 128]
dropout_ratio: 0.2
}
hist_seq_mlp {
hidden_units: [256, 128]
bias: false
dropout_ratio: 0.2
}
capsule_config {
max_k: 8
num_iters: 3
max_seq_len: 50
high_dim: 64
squash_pow: 0.2
const_caps_num: false
routing_logits_stddev: 1
routing_logits_scale: 20
}
concat_mlp {
hidden_units: [256, 128]
bias: false
dropout_ratio: 0.2
}
}
item_tower{
input: 'item'
mlp {
hidden_units: [256, 128]
dropout_ratio: 0.2
}
}
output_dim: 32
simi_pow: 20
in_batch_negative: false
similarity: COSINE
temperature: 0.01
}
metrics {
recall_at_k {
top_k: 1
}
}
metrics {
recall_at_k {
top_k: 5
}
}
losses {
softmax_cross_entropy {}
}
}
-
model_config: 配置3个feature_groups, group_name分别为'user', 'item', 'hist'(group_name可以按需自定义),分别表示user, item和user历史行为序列的输入。hist group的类型为SEQUENCE,表示输入为序列特征。
-
mind模型配置:
- user_tower: 用户tower配置
- input: 输入的feature_group 名称,即'user'
- history_input: 输入历史行为序列的feature_group名称,即'hist'
- user_mlp: 用户特征的mlp layer配置,包括隐藏层和BN层
- hist_seq_mlp(可选): 历史行为序列特征的mlp layer配置,包括隐藏层和BN层
- capsule_config: 兴趣胶囊配置
- max_k(可选): 最大兴趣个数,默认为5
- max_seq_len: 最大序列长度
- high_dim: 兴趣向量维度
- squash_pow(可选): 对squash加的power, 防止squash之后的向量值变得太小, 默认为1
- num_iters(可选): 动态路由的迭代次数, 默认为3
- const_caps_num(可选): 对所有用户使用相同的兴趣数量, 默认为False
- routing_logits_scale(可选): 动态路由logits的初始化缩放系数, 默认为20
- routing_logits_stddev(可选): 动态路由logits的初始化标准差, 默认为1
- concat_mlp: 拼接用户特征和历史兴趣的mlp layer配置
- item_tower: 物品tower配置,包括输入层和mlp layer
- input: 输入的feature_group名称,即'item'
- mlp: 物品特征的mlp layer配置,包括隐藏层和BN层。
- simi_pow: 对相似度做的倍数, 放大interests之间的差异
- in_batch_negative: 是否使用in-batch negative,默认为false。
- similarity: u/i相似度计算方式,支持COSINE和INNER_PRODUCT,默认为COSINE。
- temperature: 相似度的温度系数,默认为1.0, 如果使用COSINE similarity,建议使用更小的temperature以便提高正负样本的区分度。
- output_dim: user_tower和item_tower的输出维度
- user_tower: 用户tower配置
torchrun --master_addr=localhost --master_port=32555 \
--nnodes=1 --nproc-per-node=1 --node_rank=0 \
-m tzrec.export \
--pipeline_config_path {your_model_path}/pipeline.config \
--export_dir {your_model_path}/export
- item tower推理 以本地推理为例, 如果数据在maxcompute可将路径改为对应的maxcompute表
torchrun --master_addr=localhost --master_port=32771 \
-m tzrec.predict \
--scripted_model_path ${MODEL_DIR}/export/item \
--predict_input_path data/tzrec_taobao/taobao_ad_feature/\*.parquet \
--predict_output_path ${MODEL_DIR}/item_emb \
--reserved_columns adgroup_id \
--output_columns item_tower_emb
- user tower推理
torchrun --master_addr=localhost --master_port=32771 \
--nnodes=1 --nproc-per-node=1 --node_rank=0 \
-m tzrec.predict \
--scripted_model_path ${MODEL_DIR}/export/user \
--predict_input_path data/tzrec_taobao/taobao_data_recall_eval/\*.parquet \
--predict_output_path ${MODEL_DIR}/user_emb \
--reserved_columns user_id,adgroup_id \
--output_columns user_tower_emb
- read maxcompute
torchrun --master_addr=$MASTER_ADDR --master_port=$MASTER_PORT \
--nnodes=$WORLD_SIZE --nproc-per-node=$NPROC_PER_NODE --node_rank=$RANK \
-m tzrec.tools.hitrate \
--user_gt_input odps://{project}/tables/tbl_user_gt_input \
--item_embedding_input odps://{project}/tables/tbl_item_embedding_input \
--total_hitrate_output odps://{project}/tables/tbl_total_hitrate_output \
--hitrate_details_output odps://{project}/tables/tbl_hitrate_details_output \
--item_id_field docid_int \
--request_id_field uid \
--gt_items_field docid_int \
--top_k 200 \
--batch_size 1024 \
--num_interests 8
- local
torchrun --master_addr=localhost --master_port=32771 \
--nnodes=1 --nproc-per-node=1 --node_rank=0 \
-m tzrec.tools.hitrate \
--user_gt_input ${MODEL_DIR}/user_emb/part-0.parquet \
--item_embedding_input ${MODEL_DIR}/item_emb/part-0.parquet \
--total_hitrate_output ${MODEL_DIR}/hitrate_total \
--hitrate_details_output ${MODEL_DIR}/hitrate_details\
--item_id_field docid_int \
--request_id_field uid \
--gt_items_field docid_int \
--top_k 200 \
--batch_size 2048 \
--num_interests 8
- user_gt_input表: 用户真实序列(ground truth)表和embedding, 包含列[request_id, gt_items, user_tower_emb]
- item_embedding_input表: item embedding表, 包含列[item_id, item_tower_emb]
- request_id_field: user_gt_input表中的request id的列名
- item_id_field: item embedding表中的item id列名
- request_id_field: user_gt_input表中的request id列名
- num_interests: 用户最大兴趣个数
- top_k: 召回top k个item
- topk_across_interests: 当给出该参数时(该参数无需赋值),在所有的兴趣中,共召回top k个item;当不给出该参数时,则在每个兴趣中, 各召回top k个item。