一开始我看到“NCF”这三个字母组合的时候,我也挺懵的,没啥概念。毕竟咱搞技术的,天天跟各种缩写打交道,哪个都记不住。但我最近在弄一个推荐系统项目的时候,老是碰到这个词,这才停下来好好查了查,发现搞懂它,对理解现在很多推荐算法的套路还真挺有帮助的。
咱们先从最基础的说起。之前搞推荐,最常见的就是矩阵分解(MF)。矩阵分解这玩意儿,说白了就是把用户和物品的交互信息,拆成两个低维度的向量,然后通过这两个向量的内积来预测评分。用数学话说,就是 $R_{ui} \approx p_u^T q_i$ 这么个事儿。这套路管用,简单粗暴,效果也不错,尤其是在数据量大的时候。
但是,矩阵分解有个致命的毛病,就是它只能处理线性的关系。你把用户和物品表示成向量了,然后就只能用内积来算相似度,这太死板了。现实世界里头,用户喜欢个东西,哪儿是那么简单的线性关系?肯定有一堆复杂的非线性因素在里面。
我最开始做实验的时候就发现,当数据稍微复杂点,比如加入一些用户画像信息、物品标签信息的时候,矩阵分解的效果就开始掉链子了。我试着把这些特征也塞进去,但怎么弄都像是“缝合”上去的,不够自然。

然后,我就接触到了NCF,也就是Neural Collaborative Filtering,神经协同过滤。这玩意儿的核心思想,就是把矩阵分解那个简单的内积操作,换成一个神经网络来处理。
具体怎么做的?我把用户ID和物品ID分别做个嵌入(Embedding),把它们变成一串向量。然后,不再是直接算内积,而是把这两个向量丢进一个神经网络里头去。我当时为了跑通这个流程,就搭了一个特别基础的网络结构。
我先是把用户向量和物品向量拼起来(Concatenate),然后过几层全连接层(Dense Layer)。在每一层,我都用了激活函数,比如ReLU,目的就是引入非线性。这一步做完后,再通过一个输出层,预测出用户对物品的喜好程度。
我尝试对比了两种模型结构。一种是把用户向量和物品向量先做个哈达玛积(Element-wise Product),再输入网络,这有点像是在模仿矩阵分解的结构,算是混合模型的一部分。另一种就是直接把它们拼起来丢进去,让网络自己去学特征组合的方式。
说实在的,跑起来的时候,计算量比单纯的矩阵分解大多了。我得用GPU跑了好久才能收敛。但是,结果出来我就明白了为啥大家推崇它了。当我们把一些复杂的交互数据加进去后,NCF模型比传统矩阵分解的预测准确率明显高出一截。它能捕捉到用户和物品之间那种更微妙、更复杂的关联性,这种关联性是简单的线性模型学不出来的。
这个过程让我体会到,把深度学习那套“万金油”的方法用在协同过滤上,确实能带来质的提升。NCF就是个很好的过渡,它没有完全抛弃协同过滤的思路,而是用神经网络的强大拟合能力,把线性的限制给打破了。现在很多更复杂的推荐模型,比如GNN、Transformer在推荐上的应用,底层逻辑也是借鉴了NCF这种思想,就是用更复杂的结构去拟合交互数据的非线性关系。
当我们再听到NCF的时候,就该明白,这玩意儿就是用神经网络替代了传统矩阵分解里的那个线性内积,让推荐系统更聪明了一点点。