ivi在线电影博客上有关于Hydra推荐系统体系结构的大量文章。 但是,建议不仅是外部API,而且还是“隐藏在内部”并实现非常复杂的业务逻辑的算法。
在本文中,我将讨论“冷启动”内容的问题。 如果您有兴趣了解我们如何推荐最近添加到目录中的内容,而又无法获得用户的反馈,欢迎加入cat。
本文将包含使用Keras的Python代码的可复制示例。
内容冷启动:问题陈述
建议如何工作? 大致如下:
我们使用以下管道作为建议:
- 以用户内容矩阵的形式加载内容视图统计信息
- 应用机器学习魔术盒
- 在目录的每个单元的框的出口处显示
- 我们使用内容功能进行推荐
可以在此存储库
github.com/ivi-ru/hydra中找到冷启动模型训练管道的所有阶段。
我们使用隐式库获取内容特征,如下所示
train_model.pyimport implicit import numpy as np from scipy.sparse import load_npz
如何推荐最近在服务中出现的内容? 这样的内容将没有视图(或视图将很少)-这意味着在机器学习的魔力之列中,此类内容将没有任何功能,并且不会出现在用户推荐中。 顺便说一下,我们基于用户-内容交互获得的功能称为协作。
因此,我们遇到了一个冷门的问题:我们如何推荐没有用户反馈的内容? 例如,可以将新内容混合到随机输出中,然后等待直到收集到“有机”视图为止。
另一个选择是建立一个可以预测“冷”内容特征的模型。
我们决定走第二条路,那就是我们来的地方
冷启动1.0
为了解决冷启动的问题,例如,我们预先了解了有关新内容的内容功能,从而为我们提供了帮助
- 人员:导演,编剧,演员
- 内容类型:动作,喜剧等
- 类别:长片,卡通,纪录片
- 编辑器标签
编辑标签是对内容的简短描述,形式是有限(通常几百个)特征集。 以下是一组Beaver Zombie内容标签
首先,我们解决了冷启动问题,如下所示:
- 对于每个“冷”内容,请通过标签尽可能擦拭
- 具有类似内容的协作功能
- 冷内容的协作特征是其“热”邻居特征的平均值
在python中,它看起来像这样 for row in new_items_neighbors: neighbors_als_indices = row.neighbors_ids[:self.cold_start_neighbors_count] neighbors_average_factors = item_factors[neighbors_als_indices].mean(axis=0)
这种方法
以某种方式有效 ,但是有两个缺点:
- 扩展性弱:例如,很难在模型上添加海报的相似性
- 没有人能保证标签特征相似的内容具有ALS功能的相似性,没有这一点,使用平均值看起来就很奇怪
我们意识到您不能再这样生活了,因此提出了一个更加透明和可扩展的模型。
重构冷启动模型
代替使用启发式算法(如求平均值)来计算ALS内容特征,我们可以训练一个神经网络来预测协作内容特征-例如,通过编辑器标签。 类似的模型已经
在Habr的网站上闪过 ,在Yandex之前,
Spotify音乐服务商谈论了类似的模型
模型原型代码可
从ivi存储库中获得 ,冷启动的神经网络如下:
cold_start_model.py def _get_model(self, dims: List[int]) -> Sequential: model = Sequential() model.add( Dense( units=dims[1], activation='linear', input_dim=dims[0], kernel_initializer=WeightInitializer.custom_normal, bias_initializer='zeros' ) ) model.compile( loss=lambda y_true, y_pred: K.sum(K.square(y_pred - y_true), axis=-1), optimizer=optimizers.Adam(lr=self.learning_rate, decay=self.decay) ) return model
实施此实验时遇到了什么困难?
- 事实证明,训练网络非常困难:要素是一口气编码的,并且由于输入层的尺寸较大,网络的训练也很差。 我必须仔细选择功能,最后只使用类别,类型,然后使用tf-idf从编辑器标签中选择最“重要”的功能
- 使用pipenv软件包管理器安装Keras的麻烦:python,环境不行,我必须完成Keras没有与之交朋友的第三方maxvolpy软件包
实验结果
结果,我们减少了新功能的使用,开发人员花了大约100个小时冲刺了两次冲刺,这是在项目中使用神经网络的第一次体验。 这次的分布如下:
- 60小时阅读文章和原型开发
- 30小时将原型集成到项目代码库中
- 部署新模型需要10个小时-由于我们的特定依赖关系(例如maxvolpy),将Keras拖入python环境并非如此简单
我们有进行进一步实验的空间-使用神经网络不仅可以让您学习编辑器标签,还可以学习其他功能:图片,脚本,用户评论,素材等。