DeepMatch-Torch
DeepMatch-Torch copied to clipboard
在创建用户特征的时候,生成的历史观影数据长度的声明前后不一致?
在run_youtubednn.py中,SEQ_LEN = 50
,但是在创建user_feature_columns
这一个变量的时候,声明的历史电影长度为10,这会影响模型的正确运行么?
VarLenSparseFeat(SparseFeat('hist_movie_id', vocabulary_size=feature_max_idx['movie_id'], embedding_dim=embedding_dim, embedding_name="movie_id"), maxlen=10, combiner='mean')
在创建item tower的时候,X维度为(BatchSize,61) (1+1+1+1+1+50+6=61),当取item的id的时候,self.feature_index['movie_id']
为[15:21],这会导致不能正确地按照维度取值?
代码写的不太好,见谅~
问题1. 这里主要是我代码写的比较有问题,比如 SEQ_LEN=50
,然后写 history movie len 的时候又写了10,会不会影响运行?
Answer: 不会影响运行。因为 SEQ_LEN 是 样本上把 hist_movie_id 补齐到多少,比如补齐到 50, 那么样本的特征里面就有有 50个 movie_id (包括 PAD),而在 VarLenSparseFeat
设置 10 是希望 embedding 的时候使用多少聚合成一个 embedding. 这里是选 前10个进行聚合,选了特征里面前 10个 movie_id 的 embedding 进行 mean操作。
补充:这里 SEQ_LEN 和 max_len 最好是一样的,不会影响运行,但是会给人造成疑惑。(这里我找时间修复一下)
问题2:感兴趣可以先看一下为什么这里的item_id 我设置了 6,这是因为在 pytorch 里面,没有 sampledsoftmax, 所以我用了另外一种方式来替代,具体见:链接 。 Answer: 这里 self.feature_idx["movie_id"] 实际上是 [55:61],因为前面提到了 max_len 实际上只影响 embedding 聚合,不影响你 FeatureColumn 选取。最终获取的到的是最后 6个 movie_id 的 embedding. (第一个是正样本 movie_id, 后面五个是负样本 movie_id)
如果还有疑问,欢迎交流,也可以提个 PR 帮忙修复一下 SEQ_LEN 这个问题~
感谢解答,还有一个问题:
在创建测试集的时候,这里以list的方式创建了正负样本。
然后推理测试的时候生成了
test_true_label
,value是一个二维的list.
后面召回了50个电影id,并计算召回率:
二维list不能转换成set 这里实际上会报错:
此外,这里计算hit的时候,以及计算召回率的时候,是不是都只需要考虑正样本呢?
此外,这里计算hit的时候,以及计算召回率的时候,是不是都只需要考虑正样本呢?
嗯嗯是的,计算 hit rate 的时候只要考虑正样本就可以了。test_true_label 依然保持了和 Train 一样的格式是因为好计算 loss以及一些其他的指标。(因为没有 SampledSoftmax,所以只能这样妥协一下)
感谢大佬回复 有个题外话,想问下目前大厂做推荐系统是用torch比较多还是用tf.keras比较多呢?
感谢大佬回复 有个题外话,想问下目前大厂做推荐系统是用torch比较多还是用tf.keras比较多呢?
一般用 tf 多(广告推荐领域),说实话除了看到一篇微信某场景发了一篇用 torch的,其他没见过用 torch 的,不过我觉得这主要是历史因素。
欢迎交流~