THUIR / PreHash

61 stars 11 forks source link

prehash hash部分的hash layer和tree layer的关系是? #2

Closed DoubleYing closed 3 years ago

DoubleYing commented 4 years ago

parser.add_argument('--hash_layers', type=str, default='[32]', help='MLP layer sizes of hash') parser.add_argument('--tree_layers', type=str, default='[64]', help='Number of branches in each level of the hash tree')

想请问一下,这里的tree layer和hash layer在Hierarchical Hash中的哪部分,作用是什么?感觉论文中并没有详细介绍(也可能是我没看到)。可以麻烦在详细讲解一下吗?谢谢

Shuriken13 commented 4 years ago

抱歉,hash_layers好像确实漏了Orz,我的错。它其实就是一层的mlp对his vector做了一个转换,即u^v = hash_layer(u^v)。 tree_layers其实是定义了树的结构是从1-64-1024,1是根节点省略了,1024是桶数目。 代码中用到tree_layers的一段实现对应论文中公式4。实现是用self. u_hash_predict一次性求出了所有的u^v和节点向量n_k的点乘,然后再根据tree_layers分段求最后的权重的。(hash求权重的公式4非常简单所以可以这么做,如果要考虑父亲节点和子节点的关系,实现会更复杂。)

DoubleYing commented 4 years ago

嗯,感谢您的回复,这部分内容看懂了~ 还有一个是关于公式(2)的实现,在PreHash.py文件 all_his_vector = history.mm(self.iid_embeddings.weight) history是包含了target item的序列对吧? 那all_his_vector不是等价于user所有序列行为的sum pooling吗? 并没有attention的部分呀?

Shuriken13 commented 4 years ago

那个if分支是history输入给的是sparse输入时,实际模型跑的时候不是sparse输入,都是输入的一个历史交互的有限序列,是else分支。

DoubleYing commented 4 years ago

懂了,谢谢~

Shuriken13 commented 4 years ago

不客气~

DoubleYing commented 4 years ago

aha,再次请教一下 PreHash,py 文件的predict(self, feed_dict)方法中,得到了三个prediction,分别是his_prediction,hash_prediction和prediction。 his_prediction是只用了历史行为作为user_emb得到的预测 prediction是prehash得到的预测 hash_prediciton,有点不理解,是只用anchor_vec作为user_emb得到的预测吗?

Shuriken13 commented 4 years ago

his_prediction是拿u^v历史向量和item向量点乘做预测,hash_prediction是拿u^h哈希部分向量和item向量点乘做预测,prediction是拿两部分聚合后的向量u‘和item向量点乘做预测。不仅希望聚合后的向量u’好,希望每一部分单独拿出来的向量也足够好。