写这篇文章的原因是因为在一个推荐任务中使用SVD,deepwalk进行embedding之后,模型效果得到了提升,并且SVD的应用超出了进行降维的认知,感觉其中值得思考的东西很多,所以对SVD和embedding的一些方法进行整理总结。
1.奇异值分解SVD(Singular Value Decomposition)
1.1 SVD降维
SVD是对矩阵进行分解,假设A是一个 m × n m\times n m×n 的矩阵,则 X X X 的SVD为:
X = U ∑ V T X = U\sum V^T X=U∑VT
其中 U U U 是一个𝑚×𝑚的矩阵, ∑ \sum ∑ 是一个𝑚×𝑛的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个𝑛×𝑛的矩阵。 U U U 和 V V V 都是酉矩阵,即满足: 𝑈 T 𝑈 = 𝐼 , 𝑉 T 𝑉 = 𝐼 𝑈^T𝑈=𝐼,𝑉 ^ T𝑉=𝐼 UTU=I,VTV=I
在奇异矩阵中( ∑ \sum ∑ )奇异值(对角线元素)是按照从大到小排列的,并且奇异值的减少特别快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和99%以上的比例,所以可以认为前10%甚至1%的奇异值包含了全部的奇异值99%的信息。那么,则可以用最大的k个奇异值和对应的左右奇异向量来近似描述矩阵,即:
X m × n = U m × m ∑ m × n V n × n T ≈ U m × k ∑ k × k V k × n T X_{m\times\ n} = U_{m\times m} \sum_{m\times n}V_{n\times n}^T\approx U_{m\times k}\sum_{k\times k}V_{k\times n}^T X<