作者回复: 这是个好问题。按照DeepFM原论文,数值型特征是不参与特征交叉的,因为特征交叉的操作是在两个embedding向量间进行的。 但是如果可以把通过分桶操作把连续型特征处理成离散型特征,然后再加Embedding层,就可以让数值型特征也参与特征交叉。这是一个可行的方案。
作者回复: 是这样,原FM中内积作为权重,然后还要乘以特征本身的值。 但在DeepFM中,所有的参与交叉的特征都先转换成了embedding,而且由于是one-hot,所以特征的值就是1,参不参与交叉都无所谓。所以直接使用embedding的内积作为交叉后的值就可以了。 至于数值型特征的问题在于,如何把他们转换成embedding向量,我觉得分桶后加embedding层是一个方法,但其实分桶后加embedding层也是不用加原特征值的,因为分桶后的结果还是一个one-hot向量。
作者回复: 加操作是不进行特征交叉,直接把原先的特征接入输出层,相当于wide&deep模型中的wide层。
作者回复: 这两个想法都没有问题,其实深度学习中没有什么不可以的,有的只是提出思路,改进模型,和验证效果。 把点积和元素积在一起使用,交给模型自动学习权重当然也是可行的。 除此之外,还有元素减,外积等交叉操作,除此之外还有一些自定义的复杂交叉操作,比如google cross&deep模型中自定义的一些cross操作。
作者回复: 元素积不求和,对位操作后生成一个向量。
作者回复: 几乎不可以。如果一定要做的话,也要在不同embedding层上再加上一层fc layer或者embedding layer,把他们变成一致的,然后交叉。
作者回复: 这些确实都可以,但针对性不强,还是一些专门针对两个embedding特征交叉设计的操作效果好一些。比如我们提到的dot product, element-wise product 和element-wise minus. outer product等等。
作者回复: 一般是通过人工经验进行一些预处理。当然,预处理层也可以看作深度学习模型的一部分,需要一些人工的尝试。
作者回复: 代码中只是一个例子,仅供参考,具体哪种效果好当然是靠自己探索。 你的思路很对,一般来说物品侧和用户侧的特征交叉的作用更大,在实际应用中,还是最好有一些手动调参,和先验知识会更好一些。
作者回复: 1. 不一定,也有大量公司采用单机多卡的形式训练。如果是分布式的环境,改变会比较大,需要深入研究parameter server相关的配置和实践,属于非常偏工程前沿的内容了,需要大家自己去踩坑填坑。 2. 这个问题不用我回答,你自己estimate一下就可以了,redis的容量有多大,你的数据量有多大。然后做一个poc去先插入少量数据看一下实际的内存使用量就可以了。 如果redis容量不够怎么办,参考之前存储模块的那讲。