正如我们在ivi在线电影院中推荐的最新目录(+ Python代码)

ivi在线电影博客上有关于Hydra推荐系统体系结构的大量文章。 但是,建议不仅是外部API,而且还是“隐藏在内部”并实现非常复杂的业务逻辑的算法。

在本文中,我将讨论“冷启动”内容的问题。 如果您有兴趣了解我们如何推荐最近添加到目录中的内容,而又无法获得用户的反馈,欢迎加入cat。


本文将包含使用Keras的Python代码的可复制示例。

内容冷启动:问题陈述


建议如何工作? 大致如下:


我们使用以下管道作为建议:

  • 以用户内容矩阵的形式加载内容视图统计信息
  • 应用机器学习魔术盒
  • 在目录的每个单元的框的出口处显示
  • 我们使用内容功能进行推荐

可以在此存储库github.com/ivi-ru/hydra中找到冷启动模型训练管道的所有阶段。
我们使用隐式库获取内容特征,如下所示

train_model.py
import implicit import numpy as np from scipy.sparse import load_npz #   user-item user_item_views_coo = load_npz('/srv/data/user_item_interactions.npz') als_params = { 'factors': 40, 'regularization': 0.1, 'num_threads': 3, 'iterations': 5} print('  ALS-') als_model = implicit.als.AlternatingLeastSquares(**als_params) als_model.fit(user_item_views_coo.T) als_factors = als_model.item_factors print('ALS- ,   ', als_factors.shape) als_factors_filename = '/srv/data/fair_als_factors.npy' np.save(als_factors_filename, als_factors,allow_pickle=True) print('   ', als_factors_filename) 


如何推荐最近在服务中出现的内容? 这样的内容将没有视图(或视图将很少)-这意味着在机器学习的魔力之列中,此类内容将没有任何功能,并且不会出现在用户推荐中。 顺便说一下,我们基于用户-内容交互获得的功能称为协作。

因此,我们遇到了一个冷门的问题:我们如何推荐没有用户反馈的内容? 例如,可以将新内容混合到随机输出中,然后等待直到收集到“有机”视图为止。

另一个选择是建立一个可以预测“冷”内容特征的模型。

我们决定走第二条路,那就是我们来的地方

冷启动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 item_factors[row.new_item_als_index] = neighbors_average_factors 



这种方法以某种方式有效 ,但是有两个缺点:

  • 扩展性弱:例如,很难在模型上添加海报的相似性
  • 没有人能保证标签特征相似的内容具有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环境并非如此简单

我们有进行进一步实验的空间-使用神经网络不仅可以让您学习编辑器标签,还可以学习其他功能:图片,脚本,用户评论,素材等。

Source: https://habr.com/ru/post/zh-CN478694/


All Articles