mind召回模型, 在dssm的基础上加入了兴趣聚类功能,支持多兴趣召回,能够显著的提升召回层的效果.
...
feature_configs {
input_names: "tag_category_list"
feature_type: SequenceFeature
embedding_dim: 16
hash_bucket_size: 1000000
separator: ","
}
feature_configs {
input_names: "tag_brand_list"
feature_type: SequenceFeature
embedding_dim: 16
hash_bucket_size: 1000000
separator: ","
}
feature_configs {
input_names: "seq_ts_gap"
feature_type: SequenceFeature
embedding_dim: 1
hash_bucket_size: 100000
separator: ","
}
model_config:{
model_class: "MIND"
feature_groups: {
group_name: 'hist'
feature_names: 'tag_category_list'
feature_names: 'tag_brand_list'
feature_names: 'seq_ts_gap'
}
feature_groups: {
group_name: 'user'
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'
wide_deep: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'
feature_names: 'pid'
wide_deep:DEEP
}
mind {
user_dnn {
hidden_units: [256, 128, 64, 32]
}
item_dnn {
hidden_units: [256, 128, 64, 32]
use_bn: false
}
concat_dnn {
hidden_units: 64
hidden_units: 32
}
capsule_config {
max_k: 5
max_seq_len: 64
high_dim: 32
squash_pow: 0.2
# use the same numer of capsules for all users
const_caps_num: true
}
simi_pow: 20
l2_regularization: 1e-6
time_id_fea: "seq_ts_gap"
}
embedding_regularization: 5e-5
}
- model_class: 'MIND', 不需要修改
- feature_groups: 需要三个feature_group: hist, user和item, group name不能变
- mind: mind相关的参数,必须配置user_dnn和item_dnn
- user_dnn: user侧的dnn参数
- dnn:
- hidden_units: dnn每一层的channel数
- use_bn: 是否使用batch_norm, 默认是true
- dnn:
- item_dnn: item侧的dnn参数, 配置同user_dnn
- note: item侧不能用batch_norm
- pre_capsule_dnn: 进入capsule之前的dnn的配置
- 可选, 配置同user_dnn和item_dnn
- concat_dnn: hist seq 和 user feature融合后的dnn
- capsule_config: 胶囊(动态路由)的配置
- max_k: 胶囊(兴趣)的个数
- max_seq_len: hist seq的最大长度
- high_dim: 兴趣向量的维度
- num_iters: 动态路由(兴趣聚类)的轮数
- routing_logits_scale: 放大routing logits, >0时生效;
- 一些场景显示设置为20时,兴趣向量比较分散, 即相似度比较低(0.8左右)
- routing_logits_stddev: routing_logits初始化的标准差
- squash_pow: 对squash加的power, 防止squash之后的向量值变得太小
- simi_pow: 对相似度做的倍数, 放大interests之间的差异
- embedding_regularization: 对embedding部分加regularization,防止overfit
- user_seq_combine:
- CONCAT: 多个seq之间采取concat的方式融合
- SUM: 多个seq之间采取sum的方式融合, default是SUM
- time_id_fea: time_id feature的name, 对应feature_config里面定义的特征
- 注意embedding_dimension必须是1
-
行为序列特征可以加上time_id, time_id经过1 dimension的embedding后, 在time维度进行softmax, 然后和其它sequence feature的embedding相乘
-
time_id取值的方式可参考:
- 训练数据: Math.round((2 * Math.log1p((labelTime - itemTime) / 60.) / Math.log(2.))) + 1
- inference: Math.round((2 * Math.log1p((currentTime - itemTime) / 60.) / Math.log(2.))) + 1
- 此处的时间(labelTime, itemTime, currentTime) 为seconds
-
使用增量训练,增量训练可以防止负采样的穿越。
-
使用HPO对squash_pow[0.1 - 1.0]和simi_pow[10 - 100]进行搜索调优。
-
要看的指标是召回率,准确率和兴趣损失,三个指标要一起看。
-
使用全网的点击数据来生成训练样本,全网的行为会更加丰富,这有利于mind模型的训练。
-
数据清洗:
- 把那些行为太少的item直接在构造行为序列的时候就挖掉
- 排除爬虫或者作弊用户
-
数据采样:
- mind模型的训练默认是以点击为目标
- 如果业务指标是到交易,那么可以对交易的样本重采样
离线的效果评估主要看在测试集上的hitrate. 可以参考文档效果评估
pai -name tensorflow1120_cpu_ext
-Dscript='oss://easyrec/deploy/easy_rec/python/tools/hit_rate_pai.py'
-Dbuckets='oss://easyrec/'
-Darn='acs:ram::xxx:role/aliyunodpspaidefaultrole'
-DossHost='oss-cn-beijing-internal.aliyuncs.com'
-Dtables='odps://pai_rec/tables/mind_item_embedding/dt=${ymd},odps://pai_rec/tables/mind_user_seq_and_embedding/dt=${eval_ymd}'
-Doutputs='odps://pai_rec/tables/mind_hitrate_details/dt=${ymd}/name=mind_top200,odps://pai_rec/tables/mind_total_hitrate/dt=${ymd}/name=mind_top200'
-Dcluster='{
\"ps\" : {
\"count\" : 1,
\"cpu\" : 800,
\"memory\" : 20000
},
\"worker\" : {
\"count\" : 16,
\"cpu\" : 800,
\"memory\" : 20000
}
}'
-DuserDefinedParameters='--recall_type=u2i --top_k=200 --emb_dim=32 --knn_metric=1 --knn_strict=False --batch_size=1024 --num_interests=3';
- mind_user_seq_and_embedding:
- user_id: string
- item_ids: string, ","分割
- user_emb: string, 多个向量之间用"|"分割, 向量内部用","分割
- user_emb_num: bigint, user兴趣向量的最大个数
- 说明: 不限制列名的定义,但是限制列的顺序: 0:user_id, 1:item_ids, 2:user_emb, 3:user_emb_num
- Local需要修改easy_rec/python/tools/hitrate.py
- mind_item_embedding:
- item_id: bigint
- item_emb: string, item embedding, 向量内部用","分割
- 说明: 不限制列名的定义,但是限制列的顺序: 0:item_id, 1:item_emb
- Local可以按照下面的格式准备item embedding数据:
id:int64 feature:string 63133 0.125,0.286,0.913,0.893
- num_interests: 最大的兴趣向量数
- knn_strict: 是否使用精确的knn计算, 会导致计算量增加
- knn_metric: 定义距离计算方式
- 0: L2 distance
- 1: Inner Product similarity
- emb_dim: user / item表征向量的维度
- top_k: knn检索取top_k计算hitrate
- recall_type:
- u2i: user to item retrieval
输出下面两张表
-
mind_hitrate_details:
- 输出每一个user的hitrate = user_hits / user_recalls
- 格式如下:
id : bigint topk_ids : string topk_dists : string hitrate : double bad_ids : string bad_dists : string
-
mind_total_hitrate:
- 输出平均hitrate = SUM(user_hits) / SUM(user_recalls)
- 格式如下:
hitrate : double