实时推荐系统:滚动特征矩阵

在许多应用中,速度比质量更有价值。当BRKNG文章发布时,推荐系统没有时间提出完全相关的建议。交通高峰出现在头几分钟。以下是如何应对这种情况的想法。

现在很难找到一个新闻网站,不会试图通过一些推荐系统来保持你的注意力。

如果您碰巧在互联网上的任何地方阅读过文章 – “阅读下一个”,“最常阅读”,“趋势”或类似内容将不可避免地在下面与您见面。有时我们仍然会看到编辑的摘要 – 无论上下文如何,推荐文章都不会改变的情况。更先进的将使用标签,基于内容或另一种手工制作的相似性。但是当一个人读到今天的火灾事故时,并不一定意味着“火灾”或“意外”表征了他或她的兴趣。说11.3%可能是真的,但今天的其他新闻可能比一个月前的另一起火灾事故更有意思,让我们说概率为24.6%,剩下的可能利益是形成的思想和感情的复杂组合根据过去三天的信息背景。

当然,人们可以以某种方式理解和衡量所有可能因素的影响,并为排名函数提出一个非常精确的系数列表,但明天世界将会有所不同。一项实证研究表明,任何形式的协同过滤在提出建议方面更有效。也就是说,我们永远不应该试图将集体思想解释为人类可读的表现形式。现代推荐系统不应该关注关键字和日期,而应关注行为模式。有效的简单且经证实的方法是依赖于文章的余弦相似性。

为了使用余弦相似性,您必须将文章表示为访问的向量。为简单起见,当第N个读者访问给定文章时,第N个系数为1,否则为0。在浏览多篇文章时,您可以将这些向量堆叠到一个矩阵中,其中每行代表一篇文章,每列代表一个阅读器。如果您在网站的访问日志中选择一个窗口,则可以按如下方式表示。

d – 文件,p – 人(这是文章和读者的更一般术语)

现在,要了解每对文章之间的余弦相似性,您可以使用以下方法。

得到的对称矩阵具有M×M的形状,其中M是物品的数量。每个系数表示第i和第j条之间的相似性度量。不用说,当i = j时,系数为1,因为这是物品与其自身的相似性。

上面的例子是一种批处理。也就是说,当您加载一块体面的原始输入数据,进行计算并存储结果时,可以在以后请求推荐时检索它们。这种方法广泛用于推荐系统,因为它使您能够使用更复杂的数据表示和更精确的算法。它适用于新出版物具有较低频率和较长生命周期的应用程序 – 例如在线商店或娱乐平台。但是当谈到新闻网站时,间歇性操作就成了一个重大问题。

想象一下,病毒式出版物将在几分钟内被成千上万的人访问。如果这样的浪潮恰好出现在你的推荐系统的工作周期之间,每10分钟运行一批?要充分利用高峰出勤率,您必须向这些人推荐一些东西才能让他们留下来。当您尝试在计算能力有限的情况下增加批处理的频率时,您可能需要减小批量的大小,这反过来会降低结果的质量,但仍不能完全消除间歇性的负面影响。那么,你如何为新闻网站的推荐系统不断工作呢?

关键的想法是始终将文档/人员矩阵保存在内存中,以便在数据到来时填充数据并按需执行计算。与此同时,我们仍然希望控制矩阵的大小。因此,矩阵必须在任何给定时刻仅包含最重要的数据。好像每次发送推荐请求时都加载了批处理。我想到的是使用一些缓存替换策略。

想象一下,我们有一个document_id,person_id对的倾倒输入流。当下一对到达时,我们将其document_id放入Cache1,将person_id放入Cache2。当发生命中时,我们根据策略调整相应的缓存并在矩阵中分配相应的系数。并且对于未命中的情况,我们替换高速缓存中的最不重要(例如最近的)记录,并且使用除了该对的交集之外的全零来重新初始化矩阵中的对应行或列。价值千言万语的GIF如下所示。

在此示例中,我使用Adaptive Replacement Cache算法。该算法考虑了通过从驱逐历史中学习而缓存的元素的频率和新近度。最频繁元素与最新元素的比率是自适应的,并且是算法的核心知识。它有助于仅保留内存中最重要的元素,即在不久的将来可能再次访问的元素。我使用的实现的关键特性是为缓存中的每个记录分配一个从0到N-1范围内取得的唯一ID,其中N是缓存中的最大记录数。这些ID不会告诉我们有关记录顺序的任何信息,但只保证在缓存实例中是唯一的。因此,ID可以用作矩阵中行和列的索引。当记录被驱逐时,ID被重用,我们知道哪个行或列必须重新初始化。现在我们有一个“滚动特征矩阵”。这意味着它包含一批滑动的输入数据,可以用于实时计算建议。当然,这种方法可能有更多的应用程序。我只是使用推荐系统给你一个想法。

实施细微差别

使用lil_matrix可以更快地进行计算,同时保留变异效率(稀疏度变化),在执行某个文档的推荐计算之前删除不需要的列。也就是说,切出相应行具有零的所有列。

如果你有一个2k乘2k矩阵,大约有10k非零值(在很多情况下这是足够的数据量),上述代码在任何现代CPU的单个线程中每秒运行数百次,这使得这种方法成为可能。适合实时应用。

为了说明我的观点,我实施了推荐系统Recom.live,它利用了“滚动特征矩阵”。这是一个可立即投入生产的实时推荐系统。您可以在docker容器中安装并运行它。请查看此存储库,其中包含Dockerfile和说明。简而言之,安装非常简单:

这将启动UDP服务器(默认端口为5005)。您可以开始将document_id,person_id对注入其中,并通过提供相同的上下文(document_id,person_id对)从中检索推荐。 API很简单,虽然为了使它更简单,我在python中编写了一个小的客户端库。

在负载下,在Intel Core-i5 CPU上运行时,Recom.live每秒保持700条记录/建议请求。具有默认的矩阵形状(2000 X 2000).Rein.live服务器消耗大约100 Mb的RAM。 Docker镜像是由debian构建的:stretch-slim,占用大约350 Mb的磁盘空间。总而言之,它肯定不会降低您的服务器。

因此,欢迎大家使用,留下反馈并为Recom.live的开发做出贡献。有一个美好的一天/周末/生活,并毫不犹豫地伸出手

资讯来源:由0x资讯编译自HACKERNOON。版权归作者所有,原文链接:https://hackernoon.com/real-time-recommendation-system-rolling-feature-matrix-f5ca701439df?source=collection_category—4——0———————。未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢