6.3.2 利用ALS来求解矩阵分解

ALS是一个高效的求解矩阵分解的算法,目前Spark MLlib中的协同过滤算法就是基于ALS求解的矩阵分解算法,它可以很好地拓展到分布式计算场景,轻松应对大规模训练数据的情况(本章参考文献[6]中有ALS分布式实现的详细说明)。下面对ALS算法原理及特点做一个简单介绍。

ALS算法的原理基本就是它的名字表达的意思,通过交替优化求得极小值。一般过程是先固定pu,那么式(6-2)就变成了一个关于qv的二次函数,可以作为最小二乘问题来解决,求出最优的后,固定,再解关于pu的最小二乘问题,交替进行直到收敛。对工程实现有兴趣的读者可以参考Spark ALS算法的源码。相比SGD算法,ALS算法有如下两个优势。

1.可以并行处理

从上面pu、qv的更新公式中可以看到,在固定pu后,迭代更新qv时每个qv只依赖自己,不依赖于其他标的物的特征向量,所以可以将不同qv的更新放到不同的服务器上执行。同理,qv在固定后,迭代更新pu时每个pu只依赖自己,不依赖于其他用户的特征向量,一样可以将不同用户的更新公式放到不同的服务器上执行。Spark ALS算法就是采用这样的方式做到并行的。

2.对于隐式特征问题比较合适

用户真正的评分是很稀少的,所以利用隐式行为是更好的选择(其实也是不得已的选择)。利用了隐式行为后,用户行为矩阵就不会那么稀疏了,即有非常多的(u,v)对是非空的,计算量会更大,这时采用ALS算法是更合适的,因为固定pu或者qv让整个计算问题更加简单,容易求目标函数的极值。读者可以阅读本章参考文献[5],进一步了解隐式反馈利用ALS算法实现的原因及细节(Spark MLlib中的ALS算法即是参考该论文来实现的)。