多角度审视推荐系统

news2024/11/23 23:27:06

参考自《深度学习推荐系统》——王喆,用于学习和记录

介绍

推荐工程师需要从不同的维度审视推荐系统,不仅抓住问题的核心,更要从整体上思考推荐问题。

具体包括以下内容:

(1)推荐系统如何选取和处理特征?
(2)推荐系统召回层的主要策略有哪些?
(3)推荐系统实时性的重要性体现在哪儿?有哪些提高实时性的方法?
(4)如何根据具体场景构建推荐模型的优化目标?
(5)如何基于用户动机改进模型结构?
(6)推荐系统冷启动问题的解决方法有哪些?
(7)什么是“探索与利用”问题?有哪些主流的解决方法?

以上7个问题之间没有必然的逻辑关系,但它们都是推荐系统中除推荐模型外不可或缺的组成部分。

推荐系统的特征工程

机器学习模型的能力边界在于对数据的拟合和泛化,那么数据及表达数据的特征本身就决定了机器学习模型效果的上限。因此,特征工程对推荐系统效果提升的作用是无法替代的。为了构建一个“好的特征工程,需要依次解决三个问题:

(1)构建特征工程应该遵循的基本原则是什么?

(2)有哪些常用的特征类别?

(3)如何在原始特征的基础上进行特征处理,生成可供推荐系统训练和推断用的特征向量?

构建推荐系统特征工程的原则

在推荐系统中,特征的本质其实是对某个行为过程相关信息的抽象表达

从具体的行为转化成抽象的特征,这一过程必然涉及信息的损失。一是因为具体的推荐行为和场景中包含大量原始的场景、图片和状态信息,保存所有信息的存储空间过大,无法在现实中满足;二是因为具体的推荐场景中包含大量允余的、无用的信息,都考虑进来甚至会损害模型的泛化能力。因此,推荐系统特征工程的原则:

尽可能地让特征工程抽取出的一组特征能够保留推荐环境及用户行为过程中的所有有用信息,尽量摒弃余信息。

举例来说,在一个电影推荐的场景下,应该如何抽取特征才能代表“用户点击某个电影”这一行为呢?

为了回答这个问题,读者需要把自己置身于场景中,想象自己选择点击某个电影的过程受什么因素影响?笔者从自己的角度出发,按照重要性的高低列出了6个要素:
(1)自己对电影类型的兴趣偏好。(2)该影片是否是流行的大片(3)该影片中是否有自己喜欢的演员和导演。(4)电影的海报是否有吸引力。(5)自己是否看过该影片。(6)自己当时的心情。

秉着“保留行为过程中的所有有用信息”的原则,从电影推荐场景中抽取特征时,应该让特征能够尽量保留上述6个要素的信息。因此,要素、有用信息和数据抽取出的特征的对应关系如表5-1所示。

表5-1要素、有用信息和数据抽取出的特征的对应关系

值得注意的是,在抽取特征的过程中,必然存在着信息的损失,例如,“自己当时的心情”这个要素被无奈地舍弃了。再比如,用用户观看历史推断用户的“兴趣偏好”也一定会存在信息丢失的情况。因此,在已有的、可获得的数据基础上,“尽量”保留有用信息是一个现实的工程上的原则。

推荐系统中的常用特征

在推荐系统特征工程原则的基础上,本节列出在推荐系统中常用的特征类别,供读者在构建自己的特征工程时参考。

1.用户行为数据

用户行为数据是推荐系统最常用,也是最关键的数据。用户的潜在兴趣、用户对物品的真实评价均包含在用户的行为历史中。用户行为在推荐系统中一般分为显性反馈行为(explicit feedback)和隐性反馈行为(implicit feedback)两种,在不同的业务场景中,则以不同的形式体现。下表所示为不同业务场景下用户行为数据的例子。

不同业务场景下用户行为数据的例子

对用户行为数据的使用往往涉及对业务的理解,不同的行为在抽取特征时的权重不同,而且一些跟业务特点强相关的用户行为需要推荐工程师通过自己的观察才能发现。

在当前的推荐系统特征工程中,隐性反馈行为越来越重要,主要原因是显性反馈行为的收集难度过大,数据量小。在深度学习模型对数据量的要求越来越大的背景下,仅用显性反馈的数据不足以支持推荐系统训练过程的最终收敛。因此,能够反映用户行为特点的隐性反馈是目前特征挖掘的重点。

在具体的用户行为类特征的处理上,往往有两种方式:一种是将代表用户行为的物品id序列转换成multi-hot向量,将其作为特征向量;另一种是预先训练好物品的Embedding,再通过平均或者类似于DIN模型注意力机制的方法生成历史行为Embedding向量,将其作为特征向量。

2.用户关系数据

互联网本质上就是人与人、人与信息之间的连接。如果说用户行为数据是人与物之间的“连接”日志,那么用户关系数据就是人与人之间连接的记录。在互联网时代,人们最常说的一句话就是“物以类聚,人以群分”。用户关系数据毫无疑问是值得推荐系统利用的有价值信息。

用户关系数据也可以分为“显性”和“隐性”两种,或者称为“强关系”和“弱关系”。如图所示,用户与用户之间可以通过“关注”“好友关系”等连接建立“强关系”,也可以通过“互相点赞”“同处一个社区”,甚至“同看一部电影”建立“弱关系”


社交网络关系的多样性

在推荐系统中,利用用户关系数据的方式不尽相同,可以将用户关系作为召回层的一种物品召回方式;也可以通过用户关系建立关系图,使用GraphEmbedding的方法生成用户和物品的Embedding;还可以直接利用关系数据,通过“好友”的特征为用户添加新的属性特征;甚至可以利用用户关系数据直接建立社会化推荐系统。

3.属性、标签类数据

这里把属性类和标签类数据归为一组进行讨论,因为本质上它们都是直接描述用户或者物品的特征。属性和标签的主体可以是用户,也可以是物品。他们的来源非常多样化,大体上包含表中的几类。

属性、标签类数据的分类和来源

用户属性、物品属性、标签类数据是最重要的描述型特征。成熟的公司往往会建立一套用户和物品的标签体系,由专门的团队负责维护,典型的例子就是电商公司的商品分类体系;也可以有一些社交化的方法由用户添加。上图所示为豆瓣的“添加收藏”页面,在添加收藏的过程中,用户需要为收藏对象打上对应的标签,这是一种常见的社交化标签添加方法。

在推荐系统中使用属性、标签类数据,一般是通过multi-hot编码的方式将其转换成特征向量,一些重要的属性标签类特征也可以先转换成Embedding,再输入推荐模型。


豆瓣的“添加收藏”页面

4.内容类数据

内容类数据可以看作属性标签型特征的延伸,它们同样是描述物品或用户的数据,但相比标签类特征,内容类数据往往是大段的描述型文字、图片,甚至视频。

**一般来说,内容类数据无法直接转换成推荐系统可以“消化”的特征,需要通过自然语言处理、计算机视觉等技术手段提取关键内容特征,再输入推荐系统。**例如,在图片类、视频类或是带有图片的信息流推荐场景中,往往会利用计算机视觉模型进行目标检测,抽取图片特征(如图所示),再把这些特征(要素)转换成标签类数据,供推荐系统使用。

利用计算机视觉模型进行目标检测,抽取图片特征

5.上下文信息

上下文信息(context)是描述推荐行为产生的场景的信息。最常用的上下文信息是“时间”和通过GPS获得的“地点”信息。根据推荐场景的不同,上下文信息的范围极广,包含但不限于时间、地点、季节、月份、是否节假日、天气、空气质量、社会大事件等信息。

引入上下文信息的目的是尽可能地保存推荐行为发生场景的信息。典型的例子是:在视频推荐场景中,用户倾向于在傍晚看轻松浪漫题材的电影,在深夜看悬疑惊悚题材的电影。如果不引人上下文特征,则推荐系统无法捕捉到与这些场景相关的有价值的信息。

6.统计类特征

统计类特征是指通过统计方法计算出的特征,例如历史CTR、历史CVR、物品热门程度、物品流行程度等。统计类特征一般是连续型特征,仅需经过标准化归一化等处理就可以直接输人推荐系统进行训练。
统计类特征本质上是一些粗粒度的预测指标。例如在CTR预估问题中,完全可以将某物品的历史平均CTR当作最简易的预测模型,但该模型的预测能力很弱,因此历史平均CTR往往仅被当作复杂CTR模型的特征之一。统计类特征往往与最后的预测目标有较强的相关性,因此是绝不应被忽视的重要特征类别。

7.组合类特征

组合类特征是指将不同特征进行组合后生成的新特征。最常见的是“年龄 + ^+ + 性别”组成的人口属性分段特征(segment)。在早期的推荐系统中,推荐模型(比如逻辑回归)往往不具备特征组合的能力。但是随着更多深度学习推荐系统的提出,组合类特征不一定通过人工组合、人工筛选的方法选出,还可以交给模型进行自动处理。

常用的特征处理方法

对推荐系统来说,模型的输入往往是由数字组成的特征向量。上节提到的诸多特征类别中,有“年龄”“播放时长”“历史CTR”这些可以由数字表达的特征,它们可以非常自然地成为特征向量中的一个维度。对于更多的特征来说,例如用户的性别、用户的观看历史,它们是如何转变成数值型特征向量的呢?本节将从连续型(continuous)特征和类别型(categorical)特征两个角度介绍常用的特征处理方法。

1.连续型特征

连续型特征的典型例子是上文提到的用户年龄、统计类特征、物品的发布时间、影片的播放时长等数值型的特征。对于这类特征的处理,最常用的处理手段包括归一化、离散化、加非线性函数等方法。

归一化的主要目的是统一各特征的量纲,将连续特征归一到[0,1]区间。也可以做0均值归一化,即将原始数据集归一化为均值为0、方差为1的数据集。

离散化是通过确定分位数的形式将原来的连续值进行分桶,最终形成离散值的过程。离散化的主要目的是防止连续值带来的过拟合现象及特征值分布不均匀的情况。经过离散化处理的连续型特征和经过one-hot处理的类别型特征一样,都是以特征向量的形式输人推荐模型中的。

加非线性函数的处理方法,是直接把原来的特征通过非线性函数做变换,然后把原来的特征及变换后的特征一起加入模型进行训练的过程。常用的非线性函数包括 x a , log ⁡ ( a ) , log ⁡ ( x 1 − x ) , \scriptstyle x^{a},\,\log(a),\,\log({\frac{x}{1-x}}), xa,log(a),log(1xx),

加非线性函数的目的是更好地捕获特征与优化目标之间的非线性关系,增强这个模型的非线性表达能力。

2.类别型特征

类别型特征的典型例子是用户的历史行为数据、属性标签类数据等。它的原始表现形式往往是一个类别或者一个id。这类特征最常用的处理方法是使用one-hot编码将其转换成一个数值向量,在one-hot编码的基础上,面对同一个特征域非唯一的类别选择,还可以采用multi-hot编码。

基础知识—什么是multi-hot编码

对历史行为序列类、标签特征等数据来说,用户往往会与多个物品产生交互行为,或者被打上多个同类别标签,这时最常用的特征向量生成方式就是把其转换成multi-hot编码。

举例来说,某电商网站共有10000种商品,用户购买过其中的10种,那么用户的历史行为数据就可以转换成一个10000维的数值向量,其中仅有10个已购买商品对应的维度是1,其余维度均为0,这就是multi-hot编码。

对类别特征进行one-hot或multi-hot编码的主要问题是特征向量维度过大,特征过于稀疏,容易造成模型欠拟合,模型的权重参数的数量过多,导致模型收 敛过慢。因此,在Embedding技术成熟之后,被广泛应用在类别特征的处理上,先将类别型特征编码成稠密Embedding向量,再与其他特征组合,形成最终的输人特征向量

特征工程与业务理解

本节介绍了推荐系统特征工程的特征类别和主要处理方法。在深度学习时代,推荐模型本身承担了很多特征筛选和组合的工作,算法工程师不需要像之前那样花费大量精力在特征工程上。但是,深度学习模型强大的特征处理能力并不意味着我们可以摒弃对业务数据的理解,甚至可以说,在推荐模型和特征工程趋于一体化的今天,特征工程本身就是深度学习模型的一部分。

举例来说,在Wide&Deep模型中,到底把哪些特征“喂”给Wide部分来加强记忆能力,需要算法工程师对业务场景有深刻的理解;在DIEN模型中,对用户行为序列的特征抽取更是与模型结构进行了深度的耦合,利用复杂的序列模型结构对用户行为序列进行Embedding化。

从这个意义上讲,传统的人工特征组合、过滤的工作已经不存在了,取而代之的是将特征工程与模型结构统一思考、整体建模的深度学习模式。不变的是,只有深人了解业务的运行模式,了解用户在业务场景下的思考方式和行为动机,才能精确地抽取出最有价值的特征,构建成功的深度学习模型。

推荐系统召回层的主要策略

推荐模型部分的两个主要阶段一召回阶段和排序阶段。其中召回阶段负责将海量的候选集快速缩小为几百到几千的规模;而排序阶段则负责对缩小后的候选集进行精准排序之前的工作主要应用于排序阶段,下面是召回层的主要策略。

召回层和排序层的功能特点

推荐系统的模型部分将推荐过程分成召回层和排序层的主要原因是基于工程上的考虑。在排序阶段,一般会使用复杂模型,利用多特征进行精准排序,而在这一过程中,如果直接对百万量级的候选集进行逐一推断,则计算资源和延迟都是在线服务过程无法忍受的。因此加入召回过程,利用少量的特征和简单的模型或规则进行候选集的快速筛选(如图所示),减少精准排序阶段的时间开销。

推荐系统的两个阶段

结合召回层、排序层的设计初衷和图所示的系统结构,可以总结出召回层和排序层的如下特点:

召回层:待计算的候选集合大、速度快、模型简单、特征较少,尽量让用户感兴趣的物品在这个阶段能够被快速召回,即保证相关物品的召回率。排序层:首要目标是得到精准的排序结果。需处理的物品数量少,可利用较多特征,使用比较复杂的模型。

在设计召回层时,“计算速度”和“召回率”其实是矛盾的两个指标,为提高“计算速度”,需要使召回策略尽量简单:而为了提高“召回率,要求召回策略能够尽量选出排序模型需要的候选集,这又要求召回策略不能过于简单,导致召回物品无法满足排序模型的要求。

在权衡计算速度和召回率后,目前工业界主流的召回方法是采用多个简单策略叠加的“多路召回策略”

多路召回策略

所谓“多路召回策略”,就是指采用不同的策略、特征或简单模型,分别召回一部分候选集,然后把候选集混合在一起供后续排序模型使用的策略。
可以明显地看出,“多路召回策略”是在“计算速度”和“召回率”之间进行权衡的结果。其中,各简单策略保证候选集的快速召回,从不同角度设计的策略保证召回率接近理想的状态,不至于损害排序效果。

下图以某信息流应用为例,展示了其常用的多路召回策略,包括“热门新闻”“兴趣标签”“协同过滤”“最近流行”“朋友喜欢”等多种召回方法。其中,既包括一些计算效率高的简单模型(如协同过滤);也包括一些基于单一特征的召回方法(如兴趣标签),还包括一些预处理好的召回策略(如热门新闻、最近流行等)。


常见的多路召回策略

事实上,召回策略的选择与业务强相关。对视频推荐来说,召回策略可以是“热门视频”“导演召回”“演员召回”“最近上映”“流行趋势”“类型召回”等。

每一路召回策略会拉回 K K K 个候选物品,对于不同的召回策略, K K K 值可以选择不同的大小。这里的 K K K 值是超参数,一般需要通过离线评估线上A/B测试的方式确定合理的取值范围

虽然多路召回是实用的工程方法,但从策略选择到候选集大小参数的调整都需要人工参与,策略之间的信息也是割裂的,无法综合考虑不同策略对一个物品的影响。那么,是否存在一个综合性强且计算速度也能满足需求的召回方法呢?
基于Embedding的召回方法给出了可行的方案。

基于 Embedding 的召回方法

YouTube推荐系统中利用深度学习网络生成的Embedding作为召回层的方法。再加上可以使用局部敏感哈希进行快速的Embedding最近邻计算,基于Embedding的召回方法在效果和速度上均不逊色于多路召回。

事实上,多路召回中使用“兴趣标签”“热门度”“流行趋势”“物品属性”等信息都可以作为Embedding召回方法的**附加信息(side information)**融合进最终的Embedding向量中(典型的例子是EGES Embedding方法)。就相当于在利用Embedding召回的过程中,考虑到了多路召回的多种策略。

Embedding召回的另一个优势在于评分的连续性。多路召回中不同召回策略产生的相似度、热度等分值不具备可比性,无法据此决定每个召回策略放回候选 集的大小。Embedding召回可以把Embedding间的相似度作为唯一的判断标准,因此可以随意限定召回的候选集大小。

生成Embedding的方法也绝不是唯一的,除了第4章介绍的Item2vec、GraphEmbedding等方法,矩阵分解、因子分解机等简单模型也完全可以得出用户和物品的Embedding向量。在实际应用中可以根据效果确定最优的召回层Embedding的生成方法。

推荐系统的实时性

为什么说推荐系统的实时性是重要的

在解决怎样提高推荐系统实时性这个问题之前,我们先思考“推荐系统的实时性是不是一个重要的影响推荐效果的因素”。为了证明推荐系统实时性和推荐效果之间的关系,Facebook曾利用“GBDT+LR”模型进行过实时性的实验


Facebook的模型实时性实验

图中横轴代表从推荐模型训练结束到模型测试的时间间隔(天数),纵轴是损失函数NormalizedEntropy(归一化交叉熵)的相对值。从图中可以看出,无论是“GBDT+LR”模型,还是单纯的树模型,损失函数的值都跟模型更新延迟有正相关的关系,也就意味着模型更新的间隔时间越长,推荐系统的效果越差;反过来说,模型更新得越频繁,实时性越好,损失越小,效果越好。

从用户体验的角度讲,在用户使用个性化新闻应用时,用户的期望是更快地找到与自己兴趣相符的文章;在使用短视频服务时,期望更快地“刷”到自己感兴趣的内容;在线购物时,也期望更快地找到自己喜欢的商品。只要推荐系统能感知用户反馈、实时地满足用户的期望目标,就能提高推荐的效果,这就是推荐系统“实时性”作用的直观体现。
从机器学习的角度讲,推荐系统实时性的重要之处体现在以下两个万面:

(1)推荐系统的更新速度越快,代表用户最近习惯和爱好的特征更新越快,越能为用户进行更有时效性的推荐。
(2)推荐系统更新得越快,模型越容易发现最新流行的数据模式(data pattern),越能让模型快速抓住最新的流行趋势。

==这两方面的原因首接对应着推荐系统实时性的两大要素:一是推荐系统“特征”的实时性:二是推荐系统“模型”的实时性。 ==

推荐系统“特征”的实时性

推荐系统特征的实时性指的是“实时”地收集和更新推荐模型的输入特征,使推荐系统总能使用最新的特征进行预测和推荐

举例来说.在一个短视额应用中,某用户完整地看完了一个长度为10分钟的“羽毛球教学”视频。毫无疑向,该用户对“羽毛球这个主题是感兴趣的。系统希望立刻为用户继续推荐“羽毛球”相关的视频。但是由于系统特征的头时性不强,用户的观看历史无法实时反馈给推卷系统,导致推荐系统得知该用户看过“羽毛球教学”这个视频已经是半个小时之后了,此时用户已经离开该应用,无法继续推荐。这就是一个因推荐系统实时性差导致推荐失败的例子。

诚然,在用户下次打开该应用时,推荐系统可以利用上次的用户历史继续推荐“羽毛球”相关的视频,但毫无疑问,该推荐系统丧失了最可能增加用户黏性和留存度的时机。

为了说明增强“特征”实时性的具体方法,笔者在推荐系统的数据流架构图之上(如图所示),来说明影响“特征”实时性的三个王要阶段。

推荐系统的数据流架构图

1.客户端实时特征

客户端是最接近用户的环节,也是能够实时收集用户会话内行为及所有上下文特征的地方。在经典的推荐系统中,利用客户端收集时间、地点、推荐场景等上下文特征,然后让这些特征随http请求一起到达服务器端是常用的请求推荐结果的方式。但容易被忽视的一点是客户端还是能够实时收集session(会话)内用户行为的地方。

拿新闻类应用来说,用户在一次会话中(假设会话时长3分钟)分别点击并阅读了三篇文章。这三篇文章对推荐系统来说是至关重要的,因为它们代表了该用户的即时兴趣。如果能根据用户的即时兴趣实时地改变推荐结果,那对新闻应用来说将是很好的用户体验。

如果采用传统的流计算平台(图中的Flink),甚至批处理计算平台(图中的Spark),则由于延迟问题,系统可能无法在3分钟之内就把session内部的行为历史存储到特征数据库(如Redis)中,这就导致用户的推荐结果不会马上受到session内部行为的影响,无法做到推荐结果的实时更新

如果客户端能够缓存session内部的行为,将其作为与上下文特征同样的实时特征传给推荐服务器,那么推荐模型就能够实时地得到session内部的行为特征,进行实时的推荐。这就是利用客户端实时特征进行实时推荐的优势所在。

2.流计算平台的准实时特征处理

随着Storm、Spark Streaming、Flink等一批非常优秀的流计算平台的日益成熟,利用流计算平台进行准实时的特征处理几乎成了当前推荐系统的标配。所谓流计算平台,是将日志以流的形式进行微批处理(minibatch)。由于每次需要等待并处理一小批日志,流计算平台并非完全实时的平台,但它的优势是能够进行一些简单的统计类特征的计算,比如一个物品在该时间窗口内的爆光次数,点击次数、一个用户在该时间窗口内的点击话题分布,等等。

流计算平台计算出的特征可以立刻存入特征数据库供推荐模型使用。虽然无法实时地根据用户行为改变用户结果,但分钟级别的延迟基本可以保证推荐系统能够准实时地引人用户的近期行为

3.分布式批处理平台的全量特征处理

随着数据最终到达以HDFS为主的分布式存储系统,Spark等分布式批处理计算平台终于能够进行全量特征的计算和抽取了。在这个阶段着重进行的还有多个数据源的数据联结(join)及延迟信号的合并等操作。

用户的曝光、点击、转化数据往往是在不同时间到达HDFS的,有些游戏类应用的转化数据延迟甚至高达几个小时,因此只有在全量数据批处理这一阶段才能进行全部特征及相应标签的抽取和合并。也只有在全量特征准备好之后,才能够进行更高阶的特征组合的工作。这往往是无法在客户端和流计算平台上进行的。

分布式批处理平台的计算结果的主要用途是:
(1)模型训练和离线评估。
(2)特征保存入特征数据库,供之后的线上推荐模型使用。

数据从产生到完全进入HDFS,再加上Spark的计算延迟,这一过程的总延迟往往达到小时级别,已经无法进行所谓的“实时”推荐,因此更多的是保证推荐系统特征的全面性,以便在用户下次登录时进行更准确的推荐。

推荐系统“模型”的实时性

与“特征”的实时性相比,推荐系统“模型”的实时性往往是从更全局的角度考虑问题。特征的实时性力图用更准确的特征描述用户、物品和相关场景,从而让推荐系统给出更符合当时场景的推荐结果。而模型的实时性则是希望更快地抓住全局层面的新数据模式,发现新的趋势和相关性。

以某电商网站“双11”的大量促销活动为例,特征的实时性会根据用户最近的行为更快地发现用户可能感兴趣的商品,但绝对不会发现一个刚刚流行起来的爆款商品、一个刚刚开始的促销活动,以及与该用户相似的人群最新的偏好。要发现这类全局性的数据变化,需要实时地更新推荐模型。

模型的实时性是与模型的训练方式紧密相关的,如图所示,模型的实时性由弱到强的训练方式分别是全量更新、增量更新和在线学习(OnlineLearning)


模型的实时性与训练方式的关系

1.全量更新

“全量更新”是指模型利用某时间段内的所有训练样本进行训练。全量更新是最常用的模型训练方式,但它需要等待所有训练数据都“落盘”(记录在HDFS等大数据存储系统中)才可进行,并且训练全量样本的时间往往较长,因此全量更新也是实时性最差的模型更新方式。与之相比,“增量更新”的训练方式可以有效提高训练效率。

2.增量更新

增量更新仅将新加入的样本“喂”给模型进行增量训练。从技木上讲,深度学习模型往往采用随机梯度下降(SGD)法及其变种进行学习,模型对增量样本的学习相当于在原有样本的基础上继续输入增量样本进行梯度下降。增量更新的缺点是:增量更新的模型往往无法找到全局最优点,因此在实际的推存系统中,经常采用增量更新与全局更新相结合的方式,在进行了几轮增量更新后,在业务量较小的时间窗口进行全局更新,纠正模型在增量更新过程中积累的误差。

3.在线学习

在线学习是进行模型实时更新的主要方法,也就是在获得一个新的样本的同时更新模型。与增量更新一样,在线学习在技术上也通过SGD的训练方式买现,但由于需要在线上环境进行模型的训练和大量模型相关参数的更新和仔储,工程上的要求相对比较高。

在线学习的另一个附带问题是模型的稀疏性不强,例如,在一个输入特征向量达到几百方维的模型中,如果模型的稀疏性好,就可以在模型效果不受影响的前提下,仅让极小一部分特征对应的权重非零,从而让上线的模型体积很小(因为可以摒弃所有权重为0的特征),这有利于加快整个模型服务的过程。但如果使用SGD的方式进行模型更新,相比batch的方式,容易产生大量小权重的特征,这就增大了模型体积,从而增大模型部署和更新的难度。为了在在线学习过程中兼顾训练效果和模型稀疏性,有大量相关的研究,最著名的包括微软的FOBOS、谷歌的FTRL等。
模型稀疏性要好,因为权重为0的特征可以摒弃,减小上线的模型的体积,加快服务速度,但是如果用SGD进行非batch的学习,容易产生大量小权重,增大模型体积。

在线学习的另一个方向是将强化学习与推荐系统结合,在之前介绍的强化学习推荐模型DRN中,应用了一种竞争梯度下降算法,它通过“随机探索新的深度学习模型参数,并根据实时效果反馈进行参数调整”的方法进行在线学习,这是在强化学习框架下提高模型实时性的有效尝试。

4.局部更新

提高模型实时性的另一个改进方向是进行模型的局部更新,大致的思路是降低训练效率低的部分的更新频率,提高训练效率高的部分的更新频率。这种方式的代表是Facebook的“GBDT+LR”模型。
“GBDT+LR”的模型结构,模型利用GBDT进行自动化的特征工程,利用LR拟合优化目标。GBDT是串行的,需要依次训练每一棵树,因此训练效率低,更新的周期长,如果每次都同时训练“GBDT+LR”整个模型,那么GBDT的低效问题将拖慢LR的更新速度。为了兼顾GBDT的特征处理能力和LR快速拟合优化目标的能力,Facebook采取的部署方法是每天训练一次GBDT模型,固定GBDT模型后,实时训练LR模型以快速捕捉数据整体的变化。通过模型的局部更新,做到GBDT和LR能力的权衡。

“模型局部更新”的做法较多应用在“Embedding层 + ^+ + 神经网络”的深度学习模型中,Embedding层参数由于占据了深度学习模型参数的大部分,其训练过程会拖慢模型整体的收敛速度,因此业界往往采用Embedding层单独预训练,Embedding层以上的模型部分高频更新的混合策略,这也是“模型局部更新”思想的又一次应用。

5.客户端模型实时更新

在本节介绍“特征”实时性的部分,提到了客户端“实时特征”的方法。既然客户端是最接近用户的部分,实时性最强,那么能否在客户端就根据当前用户 的行为历史更新模型呢?

客户端模型实时更新在推荐系统业界仍处于探索阶段。对于一些计算机视觉类的模型,可以通过模型压缩的方式生成轻量级模型,部署于客户端,但对于推荐模型这类“重量级”的模型,往往需要依赖服务器端较强大的计算资源和丰富的特征数据进行模型服务。但客户端往往可以保存和更新模型一部分的参数和特征,比如当前用户的Embedding向量。

这里的逻辑和动机是,在深度学习推荐系统中,模型往往要接受用户Embedding Embedding。Embedding,一般需要全局的数据,因此只能在服务器端进行更新;而对用户Embedding;来说,则更多依赖用户自身的数据。那么把用户Embedding的更新过程移植到客户端来做,能实时地把用户最近的行为数据反映到用户的Embedding中来,从而可以在客户端通过实时改变用户Embedding的方式完成推荐结果的实时更新。
这里用一个最简单的例子来说明该过程。如果用户Embedding是由用户点击过的物品Embedding进行平均得到的,那么最先得到用户最新点击物品信息的客户端,就可以根据用户点击物品的Embedding实时更新用户Embedding,并保存该Embedding。在下次推荐时,将更新后的用户Embedding传给服务器,服务器端可根据最新的用户Embedding返回实时推荐内容。
深度学习推荐系统接收用户Embedding和物品Embedding,其中用户Embedding更多依赖于用户自身的数据,那么把用户Embedding的更新过程移植到客户端做,就得到了一部分实时能力。

用“木桶理论”看待推荐系统的选代升级

本节介绍了提高推荐系统的“特征”实时性和“模型”实时性的主要方法。由干影响推荐系统实时性的原因是多方面的,在实际的改进过程中,“抓任一点,重点提升”是工程师应该采取的策略。而准确地找到这个关键点的过程就要求我们以“未桶理论”看待这个问题,找到拖慢推荐系统实时性的最短的那块不板,替换或者改进它,让“推荐系统”这个木桶能够盛下更多的“水”。

从更高的角度看待整个推荐系统的选代开级问题,“木桶理论”也向样适用。推荐系统的模型部分和工程部分总是选代进行、交替优化的。当通过改进模型增加推荐效果的尝试受阻或者成本较高时,可以将优化的方向聚焦在工程部分,从而达到花较少的精力,达成更显著效果的目的

如何合理设定推荐系统中的优化目标

在推荐系统中,如果你的推荐模型的优化自标是不准确的,即使模型的评估指标做得再好,也肯定与实际所希望达到的自标南北辙。所以,不要犯战略性的失误、合理设定推荐系统的优化自标是每位推荐工程师在构建推荐系统之前应该看重思考的问题。

YouTube 以观看时长为优化目标的合理性

YouTube的主要商业模式是免费视频带来的广告收入,它的视频广告会阶段性地出现在视频播放之前和视频播放的过程中,因此YouTube的广告收入是与用户观看时长成正比的。为了完成公司的商业目标,YouTube推荐系统的优化目标并不是点击率、播放率等通常意义上的CTR预估类的优化目标,而是用户的播放时长。

不可否认的是,点击率等指标与用户播放时长有相关性,但二者之间仍存在一些“优化动机”上的差异。如果以点击率为优化目标,那么推荐系统会倾向于推荐“标题党”“预览图劲爆”的短视频,而如果以播放时长为优化目标,那么 推荐系统应将视频的长短、视频的质量等特征考虑进来,此时推荐一个高质量的“电影”或“连续剧”就是更好的选择。推荐目标的差异会导致推荐系统倾向性的不同,进而影响到能否完成“增加用户播放时长”这一商业目标。

在YouTube的推荐系统排序模型(如图所示)中,引入播放时长作为优化目标的方式非常巧妙。YouTube排序模型原本是把推荐问题当作分类问题对待的,即预测用户是否点击某个视频。

既然是分类问题,理论上应很难预测播放时长(预测播放时长应该是回归模型做的事情)。但YouTube巧妙地把播放时长转换成正样本的权重,输出层利用加权逻辑回归(WeightedLogistic)进行训练,预测过程中利用 e W x + b {\bf e}^{W x+b} eWx+b 算式计算样本的概率(Odds),这一概率就是模型对播放时长的预测。

YouTube对于播放时长的预测符合其广告赢利模式和商业利益,从中也可以看出制定一个合理的优化目标对于实现推荐系统的商业目标是必要且关键的。


YouTube推荐模型的输出层

相比视频类公司,对阿里巴巴等电商类公司来说,自然不存在播放时长这样的指标,那么阿里巴巴在设计其推荐系统优化目标时,考虑的关键因素有哪些呢?

模型优化和应用场景的统一性

优化目标的制定还应该考虑的要素是模型优化场景和应用场景的统一性,在这一点上,阿里巴巴的多自标优化模型给出了一个很好的例子。

在天猫、淘宝等电商类网站上做推荐,用户从登录到购买的过程可以抽象成两步:

(1)产品曝光,用户浏览商品详情页。

(2)用户产生购买行为。

与YouTube等视频网站不同,对电商类网站而言,公司的商业目标是通过推荐使用户产生更多的购买行为。按照“优化目标应与公司商业目标一致”的原则,电商类推荐模型应该是一个**CVR(转化率——Conversation rate)**预估模型。

由于购买转化行为是在第二步产生的,因此在训练CVR模型时,直观的做法是采用点击数据 + + + 转化数据(图中灰色和深灰色区域数据)训练CVR模型。在使用CVR模型时,因为用户登录后直接看到的并不是具体的商品详情页,而是首页或者列表页,因此CVR模型需要在产品曝光的场景(图中最外层圈内的数据)下进行预估。这就导致了训练场景与预估场景不一致的问题。模型在不同的场景下肯定会产生有偏的预估结果,进而导致应用效果的损失。


训练空间和预测空间的不一致

训练的时候用的是转化率,但推理的时候,用户使用是在产品曝光场景下,因此训练场景和预估场景是不一致的。

这里当然可以换个思路解决问题,即针对第一步的场景,构建CTR预估模型;再针对第二步的场景,构建CVR预估模型,针对不同的应用场景应用不同的预估模型,这也是电商或广告类公司经常采用的做法。但这个方案的尴尬之处在于CTR模型与最终优化目标的脱节,因为整个问题最终的优化目标是“购买转化”,并不是“点击”,在第一步过程中仅考虑点击数据,显然并不是全局最优化转化率的方案

如果“两步走”,那么在第一步中仅考虑点击数据,与最终的优化目标“购买转化”脱节。

为了达到同时优化CTR和CVR模型的目的,阿里巴巴提出了多目标优化模型ESMM(Entire Space Multi-taskModel)。ESMM可以被当作一个同时模拟“曝光到点击”和“点击到转化”两个阶段的模型

从模型结构(如图)上看,底层的Embedding层是CVR部分和CTR部分共享的,共享Embedding层的目的主要是解决CVR任务正样本稀疏的问题,利用CTR的数据生成更准确的用户和物品的特征表达。

中间层是CVR部分和CTR部分各自利用完全隔离的神经网络拟合自己的优化目标一pCVR(post-clickCVR,点击后转化率)和pCTR(post-viewClickthrough Rate,曝光后点击率)。最终,pCVR 和 pCTR 相乘得到 pCTCVR。

阿里巴巴的多目标优化模型ESMM

pCVR、PCTR和pCTCVR的关系如式所示。

pCTCVR指曝光后点击转化序列的概率。

ESMM同时将pCVR、pCTR和pCTCVR融合进一个统一的模型,因此模型可以一次性得出所有三个优化目标的值,在模型应用的过程中,也可以根据合适的应用场景选择与之相对应的目标进行预测。正因如此,阿里巴巴通过构建ESMM这一多目标优化模型同时解决了“训练空间和预测空间不一致”及“同时 利用点击和转化数据进行全局优化”两个关键的问题。

无论是YouTube,还是阿里巴巴,虽然他们的推荐系统的模型结构截然不同,但在设计推荐系统优化自标时,他们都充分考虑了真正的商业目标和应用场景,力图在训练模型的阶段“仿真”预测阶段的场景和目标,这是读者在设计自己的推荐系统时首先要遵循的原则。

优化目标是和其他团队的接口性工作

构建成功的推荐系统是一个复杂的系统性问题,不是技术团队能够独立完成的,而是需要产品团队、运营团队、内容编辑团队等协调一致,才能够共同达成推荐系统的商业目标。

在协调的过程中,技术团队抱怨产品团队频繁修改需求,产品团队抱怨技术团队没有充分理解他们的设计意图,二者之间往往有结构性的矛盾。如果找一个最可能的切入点,最大限度地解耦产品团队和技术团队的工作,那么最合适的点就是推荐系统优化目标的设计。

只有设定好合适的优化自标,技术团队才能够专心于模型的改进和结构的调整,避免把过于复杂晦涩的推荐系统技术细节暴露给外界。而产品团队也只有设定好合理的优化自标,才能让推荐系统服务于公司的整体商业利益和产品整体的设计目标。诚然,这个过程少不了各团队之间的矛盾、妥协与权衡,但只有在动手解决问题之前协商好优化目标,才能在今后的工作中最大限度地避免战略性的错误和推返工,尽可能最大化公司的商业利益和各团队的工作效率。

推荐系统中比模型结构更重要的是什么

除了推荐模型结构等技术要点,有没有其他更重要的影响推荐系统效果的要素?

有解决推荐问题的“银弹”吗

以阿里巴巴2019年提出的推荐模型DIEN为例。DIEN模型的整体结构是一个加入了GRU序列模型,并通过序列模型模拟用户兴趣进化过程。其中兴趣进化部分首先基于行为层的用户行为序列完成从物品id到物品Embedding的转化,兴趣抽取层利用GRU序列模型模拟用户兴趣进化过程并抽取出兴趣Embedding向量,兴趣进化层利用结合了注意力机制的AUGRU序列模型模拟与目标广告相关的兴趣进化过程。

DIEN的要点是模拟并表达用户兴趣进化的过程,这点在阿里巴巴的应用场景有效,因为用户的兴趣进化路径能够被整个数据流近乎完整的保留,作为中国最大的电商集团,阿里巴巴各产品线组成的产品矩阵几乎能够完整地抓住用户购买兴趣迁移的过程。

所以,DIEN模型有效的前提是应用场景满足两个条件:
(1)应用场景存在“兴趣的进化”。
(2)用户兴趣的进化过程能够被数据完整捕获

然而,在视频流媒体推荐系统中,在一个综合的流媒体平台(比如智能电视)上,用户既可以选择自己的频道和内容,也可以选择观看Netflix、YouTube,或者其他流媒体频道的内容。在这样的场景下,系统仅能获取用户一部分的观看、点击数据,抽取出用户的兴趣点都是不容易的,谈何构建用户的整个兴趣进化路径呢?即使勉强构建出兴趣进化路径,也是不完整、甚至错误的路径。

因此,在构建推荐模型的过程中,从应用场景出发,基于用户行为和数据的特点,提出合理的改进模型的动机才是最重要的

换句话说,推荐模型的结构不是构建一个好的推荐系统的“银弹”,真正的“银弹”是你对用户行为和应用场景的观察,基于这些观察,改进出最能表达这 些观察的模型结构。下面用三个例子对这句话做进一步的解释。

Netflix对用户行为的观察

Netflix是美国最大的流媒体公司,其推荐系统会根据用户的喜好生成影片的推荐列表。除了影片的排序,最能影响点击率的要素其实是影片的海报预览图。在具体的优化过程中,模型会根据不同用户的喜好,使用不同的影片预览图模板,填充以不同的前景、背景、文字等。通过使用简单的线性“探索与利用(Exploration&Exploitation)模型验证哪种组合才是最适合某类用户的个性化海报。

在这个问题中,Netflix并没有使用复杂的模型,但CTR提升的效果是 10 % 10\% 10% 量级的,远远超过改进推荐模型结构带来的收益。这才是从用户和场景出发解决问题。这也符合“木桶理论”的思想,对推荐系统效果的改进,最有效的方法不是执着地改进那块已经很长的木板,而是发现那块最短的木板,提高整体的效果。

观察用户行为,在模型中加入有价值的用户信息

美国最大的SmartTV(智能电视)平台Roku的主页,每一行是一个类型的影片。但对一个新用户来说,系统非常缺少关于他的点击和播放样本。那么对Roku的工程师来说,能否找到其他有价值的信息来解决数据稀疏问题呢?

这就要求我们回到产品中,从用户的角度理解这个问题,发现有价值的信号。针对该用户界面来说,如果用户对某个类型的影片感兴趣,则必然会向右滑动鼠标或者遥控器(如图5-14中红色箭头所指),浏览这个类型下其他影片,这个滑动的动作很好地反映了用户对某类型影片的兴趣。

引入这个动作,无疑对构建用户兴趣向量,解决数据稀疏向题,进而提高推荐系统的效果有正向的作用。广义上讲,引入新的有价值信息相当于为推荐系统增加新的“水源”,而改进模型结构则是对已有“水源”的进一步挖掘。通常,新水源带来的收益更高,开拓难度却小于对已有水源的持续挖掘

DIN模型的改进动机

回到阿里巴巴的推荐模型。DIEN模型的前身是DIN,其基本思想是将注意力机制跟深度神经网络结合起来。
简单回顾DIN的原理,DIN在经典的深度CTR模型的基础上,在构建特征向量的过程中,对每一类特征加人一个激活单元,这个激活单元的作用类似一个开关,控制了这类特征是否放入特征向量及放人时权重的大小。那这个开关由谁控制呢?它是由被预测广告物品跟这类特征的关系决定的。也就是说,在预测用户u是否喜欢物品i这件事上,DIN只把跟物品i有关的特征考虑进来,其他特征的门会被关上,完全不考虑或者权重很小。

那么,阿里巴巴的工程师能够提出将注意力机制应用于深度神经网络的想法是单纯的技术考虑吗?

笔者曾与DIN论文的作者进行过交流,发现他们的出发点同样是用户的行为特点。天猫、淘宝作为综合性的电商网站,只有收集与候选物品相关的用户历史行为记录才是有价值的。基于这个出发点,引人相关物品的开关和权重结构,最终发现注意力机制恰巧是能够解释这个动机的最合适的技术结构。反过来,如果单纯从技术角度出发,为了验证注意力机制是否有效而应用注意力机制,则有“本末倒置”的嫌疑,因为这不是业界解决问题的常规思路,而是试探性的技术验证过程,这种纯“猜测”型的验证无疑会大幅增加工作量

算法工程师不能只是一个“炼金术士”

很多算法工程师把自己的工作戏称为“调参师”“炼金术士”,在深度学习的场景下,超参数的选择当然是不可或缺的工作。但如果算法工程师仅专注于是否dropout,要不要更改激活函数(activation function),需不需要增加正则化项,以及修改网络深度和宽度,是不可能做出真正符合应用场景的针对性改进的。

如果你已经有了几年工作经验,对机器学习的相关技术已经驾轻就熟,反而应该从技术中跳出来,站在用户的角度,深度体验他们的想法,发现他们想法中的偏好和习惯,再用机器学习工具去验证它、模拟它,会得到意想不到的效果。

冷启动的解决办法

冷启动问题是推荐系统必须面对的问题。任何推荐系统都要经历数据从无到有、从简单到丰富的过程。那么,在缺乏有价值数据的时候,如何进行有效的推荐被称为“冷启动问题”。

具体地讲,冷启动问题根据数据匮乏情况的不同,主要分为三类:
(1)用户冷启动,新用户注册后,没有历史行为数据时的个性化推荐。

(2)物品冷启动,系统加人新物品后(新的影片、新的商品等),在该商品还没有交互记录时,如何将该物品推荐给用户。

(3)系统冷启动,在推荐系统运行之初,缺乏所有相关历史数据时的推荐。

针对不同应用场景,解决冷启动问题需要比较专业的洞察,根据领域专家意见制定合理的冷启动策略。总体上讲,可以把主流的冷启动策略归为以下三类:

(1)基于规则的冷启动过程。
(2)丰富冷启动过程中可获得的用户和物品特征。
(3)利用主动学习、迁移学习和“探索与利用”机制。

基于规则的冷启动过程

在冷启动过程中,由于数据的缺乏,个性化推荐引擎无法有效工作,自然可以让系统回退到“前推荐系统”时代,采用基于规则的推荐方法。例如,在用户冷启动场景下,可以使用“热门排行榜”“最近流行趋势”“最高评分”等榜单作为默认的推荐列表。事实上,大多数音乐、视频等应用都是采用这类方法作为冷启动的默认规则。

更进一步,可以参考专家意见建立一些个性化物品列表,根据用户有限的信息,例如注册时填写的年龄、性别、基于IP推断出的地址等信息做粗粒度的规则推荐。例如,利用点击率等目标构建一个用户属性的决策树,在每个决策树的叶节点建立冷启动榜单,在新用户完成注册后,根据用户有限的注册信息,寻找决策树上对应的叶节点榜单,完成用户冷启动过程。
在物品冷启动场景下,可以根据一些规则找到该物品的相似物品,利用相似物品的推荐逻辑完成物品的冷启动过程。当然,寻找相似物品的过程是与业务强相关的。本节以Airbnb为例说明该过程。

Airbnb是全球最大的短租房中介平台。在新上线短租房时,Airbnb会根据该房屋的属性对该短租房指定一个“聚类”,位于同样“聚类”中的房屋会有类似的推荐规则。那么,为冷启动短租房指定“聚类”所依靠的规则有如下三条:

(1)同样的价格范围。

(2)相似的房屋属性(面积、房间数等)

(3)距目标房源的距离在10公里以内。

找到最符合上述规则的3个相似短租房,根据这3个已有短租房的聚类定位冷启动短租房的聚类。

新房上线时的冷启动,根据“聚类”规则定位

通过Airbnb的例子可以知道,基于规则的冷启动方法更多依赖的是领域专家对业务的洞察。在制定冷启动规则时,需要充分了解公司的业务特点,充分利用已有数据,才能让冷启动规则合理且高效。

丰富冷启动过程中可获得的用户和物品特征

基于规则的冷启动过程在大多数情况下是有效的,是非常实用的冷启动方法。但该过程与推荐系统的“主模型”是割裂的。有没有可能通过改进推荐模型达到冷启动的目的呢?当然是有的,改进的主要方法就是在模型中加入更多用户或物品的属性特征,而非历史数据特征。

在历史数据特征缺失的情况下,推荐系统仍然可以凭借用户和物品的属性特征完成较粗粒度的推荐。这类属性特征主要包括以下几类:

(1)用户的注册信息。包括基本的人口属性信息(年龄、性别、学历、职业等)和通过IP地址、GPS信息等推断出的地理信息。

(2)第三方DMP(Data Management Platform,数据管理平台)提供的用户信息。国外的BlueKai、Nielsen,Talking Data常高的数据服务,可以极大地丰富用户的属性特征。这些第三方数据管理平台不仅可以提供基本的人口属性特征,通过与大量应用、网站的数据交换,甚至可以提供脱敏的用户兴趣、收人水平、广告倾向等一系列的高阶特征。

(3)物品的内容特征。在推荐系统中引人物品的内容相关特征是有效地解决“物品冷启动”的方法。物品的内容特征可以包括物品的分类、标签、描述文字等。具体到不同的业务领域,还可以有更丰富的领域相关内容特征。例如,在视频推荐领域,视频的内容特征可包括,该视频的演员、年代、风格,等等。

(4)引导用户输入的冷启动特征。有些应用会在用户第一次登录时引导用户输人一些冷启动特征。例如,一些音乐类应用会引导用户选择“音乐风格”;一些视频类应用会引导用户选择几部喜欢的电影。这些都是通过引导页面来完成丰富冷启动特征的工作。

利用主动学习、迁移学习和“探索与利用”机制

除了规则推荐、特征工程,还有诸多能够帮助我们完成“系统冷启动”的机器学习利器,主要包括主动学习、迁移学习、“探索与利用”机制。它们解决冷启动问题的机制各不相同,以下简述它们解决问题的主要思路。

1.主动学习

主动学习是相比“被动学习”而言的(如图所示)。被动学习是在已有的数据集上建模,学习过程中不对数据集进行更改,也不会加人新的数据,学习的过程是“被动的”。而主动学习不仅利用已有的数据集进行建模,而且可以“主动”发现哪些数据是最急需的,主动向外界发出询问,获得反馈,从而加速整个学习的过程,生成更全面的模型。


被动学习和主动学习的流程图

那么,主动学习模型是如何在推荐系统冷启动过程中发挥作用的呢?这里举一个实例加以说明。如图所示,横轴和纵轴分别代表两个特征维度,图中的点代表一个物品(这里以视频推荐中的影片为例),点的深浅代表用户对该影片实际打分的高低。那么就代表了一个冷启动的场景,即用户没对任何影片进行打分,系统应该如何进行推荐呢?


推荐系统中的主动学习示例

主动学习的学习自标是尽可能快速地定位所有物品可能的打分。可以看到,所有影片聚成了 a a a b b b c c c d d d 4类,聚类的大小不一。那么,以主动学习的思路,应该在下一次的推荐中选择哪部影片呢?

答案是应该选择最大聚类 d d d 的中心节点作为推荐影片,因为通过主动问询用户对 d d d 中心节点的打分,可以得到用户对最大聚类 d d d 的反馈,使推荐系统的收益最大。严格地讲,应定义推荐系统的损失函数,从而精确地评估推荐不同影片获得的损失下降收益。这里仅以此例帮助读者领会主动学习的原理。

主动学习的原理与强化学习一脉相承,主动学习的过程完全遵循“行动-反馈-状态更新”的强化学习循环。它的学习目的就是在一次又一次的循环迭代中,让推荐系统尽量快速地度过冷启动状态,为用户提供更个性化的推荐结果。

2.迁移学习

顾名思义,迁移学习是在某领域知识不足的情况下,迁移其他领域的数据或知识,用于本领域的学习。那么,迁移学习解决冷启动问题的原理就不难理解了,冷启动问题本质上是某领域的数据或知识不足导致的,如果能够将其他领域的知识用于当前领域的推荐,那么冷启动问题自然迎刃而解。

迁移学习的思路在推荐系统领域非常常见。在上节介绍的ESSM模型中,阿里巴巴利用CTR数据生成了用户和物品的Embedding,然后共享给CVR模型,这本身就是迁移学习的思路。这就使得CVR模型在没有转化数据时能够用CTR模型的“知识”完成冷启动过程

其他比较实用的迁移学习的方法是在领域 A A A 和领域 B B B 的模型结构和特征工程相同的前提下,若领域 A A A 的模型已经得到充分的训练,则可以直接将领域 A A A 模型的参数作为领域 B B B 模型参数的初始值。随着领域 B B B 数据的不断积累,增量更新模型 B B B 。这样做的目的是在领域 B B B 数据不足的情况下,也能获得个性化的、较合理的初始推荐。该方法的局限性是要求领域 A A A 和领域 B B B 所用的特征必须基本一致。

3.“探索与利用”机制

“探索与利用”机制是解决冷启动问题的另一个有效思路。简单地讲,探索与利用是在“探索新数据”和“利用旧数据”之间进行平衡,使系统既能利用旧数据进行推荐,达到推荐系统的商业目标,又能高效地探索冷启动的物品是否是“优质”物品,使冷启动物品获得曝光的倾向,快速收集冷启动数据

这里以最经典的探索和利用方法 UCB(Upper Confidence Bound,置信区间上界)讲解探索与利用的原理

下式是用UCB方法计算每个物品的得分的公式。其中 x j x_{j} xj 为观测到的第 j j j 个物品的平均回报(这里的平均回报可以是点击率、转化率、播放率等), n j n_{j} nj 为目前为止向用户曝光第 j j j 个物品的次数, n n n 为到目前为止曝光所有物品的次数之和。

U C B ( j ) = x ‾ j + 2 ln ⁡ n n j \mathsf{U C B}(j)=\overline{{x}}_{j}+\sqrt{\frac{2\ln n}{n_{j}}} UCB(j)=xj+nj2lnn

通过简单计算可知,当物品的平均回报高时,UCB的得分会高;同时,当物品的曝光次数低时,UCB的得分也会高。也就是说,使用UCB方法进行推荐,推荐系统会倾向于推荐“效果好”或者“冷启动”的物品。那么,随着冷启动的物品有倾向性地被推荐,冷启动物品快速收集反馈数据,使之能够快速通过冷启动阶段

“冷启动”的物品被有倾向性地推荐,使其快速收集反馈数据,然后迅速通过冷启动阶段,也就是推荐“效果好”的物品

事实上,“探索与利用”问题是推荐系统领域一个非常重要的问题,除了解决冷启动问题,“探索与利用”机制可以更好地挖掘用户潜在兴趣,维持系统的长期受益状态,下节将着重探讨解决“探索与利用”问题的主流方法。

“巧妇难为无米之炊”的困境

俗语说“巧妇难为无米之炊”,冷启动问题的难点就在于没有米,还要让“巧妇”(算法工程师)做一顿饭。解决这个困局的两种思路:

(1)虽然没有米,但不可能什么吃的都没有,先弄点粗粮尽可能做出点吃的再说。这就要求冷启动算法在没有精确的历史行为数据的情况下,利用一些粗粒度的特征、属性,甚至其他领域的知识进行冷启动推荐。 基于规则冷启动,丰富冷启动过程中可获得的用户和物品特征。

(2)边做吃的边买米,快速度过“无米”的阶段。这种解决问题的思路是先做出点吃的,卖了吃的换钱买米,将饭越做越好,米越换越多。这就是利用主动学习、“探索与利用”机制,甚至强化学习模型解决冷启动问题的思路。主动学习、迁移学习和“探索与利用”机制。

在实际的工作中,这两种方式往往会结合使用,希望各位“巧妇”能够快速度过“借粮度日”和“卖饭换米”的阶段,早日过上“小康生活”。

探索与利用

给用户推荐的机会是有限的,推荐用户喜欢的内容和探索用户的新兴趣这两件事都会占用宝贵的推荐机会,在推荐系统中应该如何权衡这两件事呢?这就是“探索与利用”试图解决的问题。

解决“探索与利用”问题目前主要有三大类方法。

(1)传统的探索与利用方法:这类方法将问题简化成多臂老虎机问题。主要的算法有ε-Greedy(ε贪婪)、Thompson Sampling(汤普森采样)和UCB。该类解决方法着重解决新物品的探索和利用,方法中并不考虑用户、上下文等因素,因此是非个性化的探索与利用方法。

(2)个性化的探索与利用方法:该类方法有效地结合了个性化推荐特点和探索与利用的思想,在考虑用户、上下文等因素的基础上进行探索与利用的权衡,因此被称为个性化探索与利用方法。

(3)基于模型的探索与利用方法:该类方法将探索与利用的思想融入推荐模型之中,将深度学习模型和探索与利用的思想有效结合,是近年来的热点方向。

传统的探索与利用方法

传统的探索与利用方法要解决的其实是一个多臂老虎机问题(Multi-ArmedBand it problem,MAB)

基础知识一多臂老虎机问题

一个人看到一排老虎机(一种有一个摇臂的机器,投入一定金额,摇动摇臂,随机获得一定收益),它们的外表一模一样,但每个老虎机获得回报的期望不同,刚开始这个人不知道这些老虎机获得回报的期望和概率分布,如果有 N N N 次机会,按什么顺序选择老虎机可以收益最大化呢?这就是多臂老虎机问题(如图所示)


多臂老虎机问题示意图

在推荐系统中,每个候选物品就是一台老虎机,系统向用户推荐物品就相当于选择老虎机的过程。推荐系统当然希望向用户推荐收益大的老虎机,以获得更好的整体收益。例如,对视频网站来说,老虎机的收益就是用户的观看时长,推荐系统向用户推荐观看时长期望较大的“老虎机”,以获取更好的整体收益,从而最大化整个视频网站的观看时长。

值得注意的是,在传统的多臂老虎机问题中,假设每台老虎机的回报期望对所有用户一视同仁。也就是说,这不是一个“个性化”的问题,而是一个脱离用户的、只针对老虎机的优化问题。解决传统多臂老虎机问题的主要算法有ε-Greedy、Thompson Sampling UC B

1. ε \varepsilon ε-Greedy算法

ε \varepsilon ε -Greedy算法的主要流程是:选一个[0,1]的数ε,每次以ε的概率在所有老虎机中进行随机选择,以 ( 1 − ε ) (1-\varepsilon) (1ε) 的概率选择截至当前平均收益最大的老虎机,在摇臂后,根据回报值对老虎机的回报期望进行更新。

这里的值代表对“探索”的偏好程度,每次以概率去“探索”,以 ( 1 − ε ) (1-\varepsilon) (1ε) 的概率来“利用”,基于被选择的物品的回报更新该物品的回报期望。本质上讲,“探索”的过程其实是一个收集未知信息的过程,而“利用”的过程则是对已知信息的“贪心”利用过程,这一概率值正是“探索”和“利用”的权衡点

ε \varepsilon ε -Greedv算法是非常简单实用的探索与利用算法,但其对探索部分和利用部分的划分还略显粗暴和生硬。例如,在进行了一段时间的探索后,再进行探索的收益已经没有之前大了,这时应该逐渐减小的值,增加利用部分的占比:另外,对每个老虎机进行完全“随机”的探索也不是高效的探索策略,例如有的老虎机已经积累了丰富的信息,不用再进行探索来收集信息了,这时就应该让探索的机会更倾向于那不常被选择的老虎机。为了改进e-Greedy算法的这些缺陷,启发式探索与利用算法被提出。

2.Thompson Sampling算法

ThompsonSamplingl是一种经典的启发式探索与利用算法。该算法假设每个老虎机能够赢钱(这里假设赢钱的数额一致)的概率是 p p p ,同时概率 p p p 的分布符合beta(win,lose)分布,每个老虎机都维护一组beta分布的参数,即win,lose。每次试验后,选中一个老虎机,摇臂后,有收益(这里假设收益是二值的,0或1)则该老虎机的win参数增加1,否则该老虎机的lose参数增加1。

每次选择老虎机的方式是:利用每个老虎机现有的beta分布产生一个随机数 b ^b b ,逐一生成每个老虎机的随机数,选择随机数中最大的那个老虎机进行尝试

需要进一步解释的是一为什么可以假设赢钱的概率 p p p 服从beta分布,到底什么是beta分布?beta分布是伯努利分布的共轭先验分布,因为掷硬币的过程是标准的伯努利过程,如果为硬币正面的概率指定一个先验分布,那么这个分布就是beta分布。CTR的场景和掷硬币都可以看作伯努利过程(可以把CTR问题看成一个掷偏心硬币的过程,点击率就是硬币正面的概率),因此ThompsonSampling算法同样适用于CTR等推荐场景

再举一个实际的例子来解释ThompsonSampling的过程。如图所示,蓝色的分布action1是beta(600,400),绿色的分布action2是beta(400.600),红色的分布action3是beta(30,70)


三个不同的beta分布
由于action1和action2已经各进行了总数1000次的尝试,积累了足够的数据,不确定性已经非常小,可以看出action1和action2的图形是非常陡峭的,其峰值在收益的经验期望附近。而对action3来说,由于只进行了100次尝试,不确定性很大,分布图形非常平缓。

Thompson Sampling,action 3最低的,如果按照纯“利用”的思路,是不应该选择action3这个“老虎机”的;但基于action3的beta分布图形,可以很明显地看出其概率分布有一部分落在action1和action2概率分布右侧,而且概率并不小( 10 % ∼ 20 % 10\%{\sim}20\% 10%20% )。也就是说,通过ThompsonSampling选择action3这一“老虎机”的机会并不小。这就利用了Thompson Sampling对新物品的倾向性

相当于这种方式仍有不小概率选择新物品,这是一种对推荐老物品和探索新兴趣的权衡。

3.UCB算法

UCB是经典的启发式探索与利用算法。与ThompsonSampling算法的理论基础一样,二者都利用了分布的不确定性作为探索强弱程度的依据。但在形式上,UCB更便于工程实现,其算法流程如下:

(1)假设有 K K K 个老虎机,对每个老虎机进行随机摇臂 m m m 次,获得老虎机j收益的初始化经验期望x。

(2)用 t t t 表示至今摇臂的总次数,用 n j n_{j} nj 表示第 j j j 个老虎机至今被摇臂的次数,计算每个老虎机的UCB值:

U S B ( j ) = x ˉ j + 2 l o g t n j \mathrm{USB}(j)=\bar{x}_{\mathrm{j}}+\sqrt{\frac{2\mathrm{log}t}{n_{j}}} USB(j)=xˉj+nj2logt

(3)选择UCB值最大的老虎机i摇臂,并观察其收益 X i , t ∘ X_{\mathrm{i},t\circ} Xi,t

(4)根据 X i , t X_{\mathrm{i},t} Xi,t 更新老虎机 i i i 的收益期望值x

(5)重复第2步。

UCB算法的重点是UCB值的计算方法,式中x指的是老虎机j之前实验的收益期望,这部分可以被看作“利用”的分值;而 2 l o g t n j \sqrt{\frac{2\mathrm{log}t}{n_{j}}} nj2logt 就是所谓的置信区间宽度,代表了“探索”的分值。二者相加就是老虎机j的置信区间上界。

基础知识——UCB公式的由来

细心的读者肯定对UCB公式的由来有所疑问,这里进行简要介绍。其实,UC B 的公式是基于霍夫丁不等式(Hoeffding Inequality)推导而来的。

假设有 N N N 个范围在0到1的独立有界随机变量, X 1 , X 2 , . . . , X n X_{1}{,}X_{2}{,}...{,}X_{n} X1,X2,...,Xn ,那么这 n n n 个随机变量的经验期望为

X ˉ = X 1 + ⋯ + X n n {\bar{X}}={\frac{X_{1}+\cdots+X_{n}}{n}} Xˉ=nX1++Xn

满足如下所示的不等式:

P ( X ˉ − E [ X ˉ ] ⩾ ε ) ⩽ e − 2 n ε 2 P(\bar{X}-E[\bar{X}]{\geqslant}\varepsilon){\leqslant}\mathrm{e}^{-2n\varepsilon^{2}} P(XˉE[Xˉ]ε)e2nε2

这就是霍夫丁不等式。

那么,霍夫丁不等式和UCB的上界有什么关系呢?令 ε = 2   m o d   t n j \varepsilon={\sqrt{\frac{2{\bmod{t}}}{n_{j}}}} ε=nj2modt 并带入上式,可将霍夫丁不等式转换成如下所示的形式:

P ( X ˉ − E [ X ˉ ] ⩾ 2 l o g t n j ) ⩽ t − 4 P\left({\bar{X}}-E[{\bar{X}}]{\geqslant}{\sqrt{\frac{2\mathsf{l o g}t}{n_{j}}}}\right){\leqslant}t^{-4} P(XˉE[Xˉ]nj2logt )t4

可以看出,如果选择UCB的上界是 2 l o g t n j \sqrt{\frac{2\mathrm{log}t}{n_{j}}} nj2logt 的形式,那么 X X X 的均值与 X X X 的实际期望值的差距在上界之外的概率非常小,小于 t − 4 t^{-4} t4 ,这就说明采用UCB的上界形式是严格且合理的。

对于UCB的一系列严格证明涉及更多的理论知识,在此不再过多扩展。只需要定性地清楚UCB的上界形式相当于老虎机收益期望的严格的置信区间即可

UCB和ThompsonSampling都是工程中常用的探索与利用方法,但这类传统的探索与利用方法无法解决引入个性化特征的问题。这严重限制了探索与利用方法在个性化推荐场景下的使用,为此,个性化的探索与利用方法被提出。

个性化的探索与利用方法

传统的探索与利用方法的弊端是无法引入用户的上下文和个性化信息,只能进行全局性的探索。事实上,在用户冷启动场景下,即使是已经被探索充分的商品,对于新用户仍是陌生的,用户对于这个商品的态度是未知的:另外,一个商品在不同上下文中的表现也不尽相同,比如一个商品在首页的表现和在品类页的表现很可能由于页面上下文环境的变化而截然不同。因此,在传统的探索与利用方法的基础上,引入个性化信息是非常重要的,这类方法通常被称为基于上下文的多臂老虎机算法(Contextual-BanditAlgorithm),其中最具代表性的算法是2010年由雅虎实验室提出的LinUCB算法。

这里省略相关介绍。只需要知道LinUCB算法的流程框架与Thompson Sampling和UCB一致,不同之处仅在于挑选老虎机时使用了LinUCB的探索与利用得分计算方法,并且在更新模型时,需要使用基于岭回归的模型更新方法。

基于模型的探索与利用方法

无论是传统的探索与利用方法,还是以LinUCB为代表的个性化的探索与利用方法,都存在一个显著的问题一无法与深度学习模型进行有效的整合。例如,对LinUCB来说,应用的前提就是假设推荐模型是一个线性模型,如果把预测模型改为一个深度学习模型,那么LinUCB的理论框架就不再自洽了

如果CTR预测模型或者推荐模型是一个深度学习模型,那么如何将探索与利用的思想与模型进行有效整合呢?这里要再次回顾之前介绍的强化学习模型DRN。

在DRN中,对于已经训练好的当前网络 Q \boldsymbol{\mathcal{Q}} Q ,通过对其模型参数 W W W 添加一个较小的随机扰动AW,得到新的模型参数W,这里称W对应的网络为探索网络 Q ~ \tilde{Q} Q~ 再通过系统的实时效果反馈决定是保留探索网络 Q ~ \tilde{Q} Q~ 还是沿用当前网络 Q Q Q

可以看出,DRN对于深度学习模型的探索过程是非启发式的,但这种与模型结构无关的方法也使DRN中的模型探索方式适用于任何深度学习模型。它有效地把探索与利用的思想与深度学习模型结合起来,通过对模型参数随机扰动的方法探索式地优化模型。

与此同时,模型参数的随机扰动也带来了推荐结果的变化和更新,自然实现了对不同内容的探索,这是“探索与利用”的思想在DRN模型中的直接体现。

“探索与利用”机制在推荐系统中的应用探索与利用算法在推荐系统中的应用场景是多样的,主要包括以下3个方面:

(1)物品冷启动。对新加人的物品或者长久没有互动信息的长尾物品来说,探索与利用算法对新物品和长尾物品有天然的倾向性,因此可以帮助这类物品快速收集用户反馈,快速度过冷启动期,并在较少伤害系统整体收益的前提下,快速找到有潜力的物品,丰富优质的物品候选集。

(2)发掘用户新兴趣。本节开头已经介绍过,如果推荐系统总是利用现有数据为用户推荐物品,相当于对用户的已发掘兴趣进行“涸泽而渔”的利用,短期内用户可能满足于当前的推荐结果,但很可能快速疲倦并离开。为了发掘用户新兴趣,推荐系统有必要进行一定程度的探索,维持用户的长期兴趣。另外,用户兴趣本身也在不断的改变和进化,需要通过探索不断抓住用户兴趣改变的趋势。

(3)增加结果多样性。探索与利用也是增加推荐结果多样性的手段。增加结果多样性对于推荐系统的好处主要有两方面,一方面是让用户能明显感觉到结果的丰富性;另一方面是减少大量同质化内容同时出现时用户的厌倦情绪。

总的来说,探索与利用思想是所有推荐系统不可或缺的补充。相比推荐模型的优化目标一利用已有数据做到现有条件下的利益最大化,探索与利用的思想实际上是着眼于未来的,着眼于用户的长期兴趣和公司的长期利益,算法工程师不仅需要充分理解这一点,更需要制定算法目标的决策者有更深的理解,做出更有利于公司长远发展的决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络自动化04:python实现ACL匹配信息(主机与主机信息)

目录 背景分析代码代码解读代码总体结构1. load_pattern_from_excel 函数2. match_and_append_pattern 函数3. main 函数总结 最终的效果: 今天不分享netmiko,今天分享一个用python提升工作效率的小案例:acl梳理时的信息匹配。 背景 最近同事…

如何查看电脑关机时间

要查看电脑的关机时间,可以按照以下步骤进行操作: 1. 打开事件查看器:按下键盘上的Windows键R键,然后在弹出的运行对话框中输入"eventvwr.msc",并按下Enter键。 2. 在事件查看器窗口中,单击左侧窗…

3DTiles之i3dm介绍

3DTiles之i3dm介绍 3D Tiles 是一种用于高效存储和传输三维城市、建筑、地形、点云等空间数据的开放标准格式。i3dm(Intel 3D Model)是 3D Tiles 中用于表示三维模型(如建筑物或其他对象)的一个子格式。i3dm 格式的出现&#xff…

Java | Leetcode Java题解之第559题N叉树的最大深度

题目&#xff1a; 题解&#xff1a; class Solution {public int maxDepth(Node root) {if (root null) {return 0;}Queue<Node> queue new LinkedList<Node>();queue.offer(root);int ans 0;while (!queue.isEmpty()) {int size queue.size();while (size &g…

【机器学习入门】(1) 线性回归算法

学习目标&#xff1a; 线性回归是一种基本的统计学习方法&#xff0c;主要用于分析一个或多个自变量与因变量之间的线性关系。以下是关于线性回归的一些关键点&#xff1a;线性回归的四要素&#xff1a; &#xff08;1&#xff09;假设(hypothesis)&#xff1b;&#xff08;2&…

视频会议接入GB28181视频指挥调度,语音对讲方案

传统的视频会议指挥调度系统目前主流的互联网会议大部分都是私有协议&#xff0c;功能都很独立。目前主流的视频监控国标都最GB平台&#xff0c;新的需求要求融合平台要接入监控等设备&#xff0c;并能实现观看监控接入会议&#xff0c;实时语音设备指挥现场工作人员办公实施。…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

搭建监控系统Prometheus + Grafana

公司有个技术分享会&#xff0c;但是业务忙&#xff0c;没时间精心准备&#xff0c;所以就匆匆忙忙准备分享一下搭建&#xff08;捂脸哭&#xff09;。技术含量确实不多&#xff0c;但是分享的知识确实没问题。 以下是搭建过程&#xff1a; 一、讲解 Prometheus Prometheus 最…

ArkTS中的自定义构建函数、Tab栏和组件状态共享

一、自定义构建函数 1.构建函数 Builder 1.1 介绍 文档地址&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5?catalogVersionV5 概念&#xff1a;ArkUI提供了一种轻量的UI元素复用机制Builder&#xff0c;可以将重复使用的U…

二维、三维情况下的锚点优选方法

多锚点定位时&#xff0c;锚点的选择对定位精度有重要影响。下面介绍基于误差最小化的锚点选择的相应公式和MATLAB代码示例&#xff0c;并进行详细分析 文章目录 方法描述代码MATLAB代码示例代码运行结果 总结 方法描述 选择能够最小化定位误差的锚点组合。通过计算锚点位置与…

CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳

2024年11月9日至10日&#xff0c;以“湾区聚力 开源启智”为主题的2024年中国计算机学会中国开源大会&#xff08;CCF ChinaOSC&#xff09;将在深圳召开。大会将汇聚国内外学术界、顶尖科技企业、科研机构及开源社区的精英力量&#xff0c;共同探索人工智能技术和人类智慧的无…

力扣102:二叉树的层次遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入&a…

数学建模模型算法-Python实现

一、评价决策类 1、层次分析法&#xff08;AHP&#xff09; 层次分析法用来评价或选择一个更好更优的决策或方案 通过找到可以衡量其好坏的指标&#xff0c;进而衡量指标&#xff0c;再形成评价体系 归一化处理 让指标在同一数量级&#xff0c;且保证在同一指标下其差距保持…

linux-vlan(1)

# VLAN # 1.topo # 2.创建命名空间 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns1-veth0 type veth peer name ns21-veth0 ip link add ns3-veth0 type veth peer name ns23-veth0 # 4.veth设备放入命名空间,启动接口 ip link set n…

spring cloud 入门笔记1(RestTemplate,Consul)

最大感受&#xff1a; spring cloud无非是将spring boot中的各个工作模块拆分成独立的小spring boot&#xff0c;各个模块之间&#xff0c;不再是通过导包什么的&#xff0c;调用而是通过网路进行各个模块之间的调用 工具一&#xff1a;RestTemplate 在Java代码中发送HTTP请…

FlinkSql读取kafka数据流的方法(scala)

我的scala版本为2.12 <scala.binary.version>2.12</scala.binary.version> 我的Flink版本为1.13.6 <flink.version>1.13.6</flink.version> FlinkSql读取kafka数据流需要如下依赖&#xff1a; <dependency><groupId>org.apache.flink&…

Docker 安装Immich教程

Immich 是一个开源的自托管照片和视频管理平台,专为帮助用户存储、管理、和分享个人媒体库而设计。Immich 的目标是提供一个类似 Google Photos 的替代方案,但不依赖于第三方服务,用户可以完全控制自己的数据。 本章教程,记录如何用Docker部署安装Immich,使用的操作系统的…

【CICD】CICD 持续集成与持续交付在测试中的应用

一、什么是CICD&#xff1f; CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xf…

交友问题 | 动态规划

描述 如果有n个人&#xff0c;每个人都可以保持单身或与其他人结成一对。每个人只能找一个对象。求总共有多少种保持单身或结对的方式。用动态规划求解。 输入 输入第一行t表示测试用例的数量 对于每一个测试用例, 输入一个整数n表示人数1<n<18 输出 针对每个测试用…

Web开发:ABP框架6——appsetting.json的读取以及实例的注入

目录 一、模块配置服务 二、配置服务的编写&#xff08;配置ORM&#xff09; 三、高层代码的运用&#xff08;ORM实例查询 & 获取字符串&#xff09; 一、模块配置服务 BookStoreHttpApiHostModule 二、配置服务的编写&#xff08;配置ORM&#xff09; (以freesql为例子…