SVD、Word2Vec和神经网络的嵌入层都可以用来计算Embedding,这其中有什么区别,个人谈谈对它们的理解,欢迎拍砖。
如果采用Negative Sampling方式计算Word2Vec和SVD,其实三者本质上没有任何区别,都是用N个1*K的向量去乘K*N的矩阵(N可以简单理解为物品数/用户数,K为Embedding维数),然后根据算得的1*N的结果来计算损失函数。
当然SVD可以用最小二乘法、Word2Vec可以用霍夫曼树,这个还是有区别的。但即便使用Negative Sampling方式,三者还是有差别的。
SVD的优势在于可以同时计算出用户和物品的Embedding,那么首先对于召回来说不能更方便了,其次对于排序,将同一个模型生成的Embedding输入CTR模型,是一定更容易得到损失更小的结果的,可能意味着更简单的模型,也可能意味着更快的损失下降。
但单就对于物品Embedding来说,SVD一定是不如Word2Vec“准确”的,原因如下。
首先,SVD只能基于用户-物品矩阵来做,顶多也只能将0~1转化为量化的评分,但Word2Vec基于的是序列,这个花样就多了,比如DeepWalk等等。
其次,SVD计算得的Embedding的范数是明显不均匀的,热门物品的Embedding的范数明显比冷门物品的Embedding大的多,这是由于一个用户的向量和物品向量矩阵相乘是要得到最后预测的评分的,那么热门的物品天然的有更大的概率评分更高。而Word2Vec采用Negative Sampling的话,一个词被采样为负样本的概率与其被采样为正样本的概率一样,因此Embedding的范数是基本均匀的。
那如果说对物品的Embedding除以各自的范数,这样两个Embedding的乘积就是夹角余弦值,是不是就跟Word2Vec算得差不多了?
还不是,这是由于SVD算得物品Embedding方向上也是不均匀的。这个可以通过简单的实验得到,分别统计下Word2Vec和SVD算得向量各个维度的正负值统计情况,可以发现SVD算得的Embedding明显正值偏多,意味着更多的点在“第一象限”,更少的点在“第三象限”,而Word2Vec算得的Embedding没有这个现象,所以后者在向量空间分布的更加均匀。
这个原因,就出在损失估计上:对于SVD,是直接计算向量内积与实际评分的RMSE,实际评分是0~1,那么优化时自然向正值方向偏斜;对于Word2Vec,计算完向量内积后,还要经过一次sigmoid,等同于将+∞~-∞映射到0~1上,所以优化不会向正值方向偏斜。
同样大小的特征空间,一般而论,当然是更加均匀的区分度更好,更加“准确”。
但SVD有SVD的好处,就是无论除不除范数,SVD算得的Embedding都是偏向热门的,所以使用SVD得到的Embedding做召回,自带热门效果。而Word2Vec算得的Embedding,更适合输入更深层次的模型。
在CTR预测阶段,如果用神经网络的话,往往也需要用到Embedding。这时可以使用事先算好的Embedding输入神经网络,也可以令神经网络的嵌入层跟模型其他参数一起训练,但一般不会这么做,原因有三点。
一、SVD和Word2Vec属于“简单”模型,模型本身简单,能输入的特征也有限,因此可以承载更大的数据量,可以算出尽可能多的物品Embedding。
二、SVD和Word2Vec的计算目标是比较原始、比较多元的,不像CTR模型一样目标很单一很明确,因此会更多的表示物品本身的属性,不会被其他因素干扰,因此如果先算好Embedding,再输入模型,类似的物品所得的预测结果会是类似的,不论训练样本是否存在偏差,或者有其他不稳定因素,这样模型的泛化性更好。
三、即便把事先算好的Embedding输入模型,然后进行Fine-Tune,事实上也是风险很高的操作,这是由于嵌入层往往参数量巨大,其参与训练,不仅仅是提高训练计算量的问题,关键是会大大提高模型的复杂度,过拟合的风险很大。