Skip to content

Commit 346d3ab

Browse files
committed
修复图片大小问题及代码中的数据路径问题
1 parent 5f6d1b9 commit 346d3ab

File tree

29 files changed

+177
-76
lines changed

29 files changed

+177
-76
lines changed

docs/_images/chapter_02_outline.svg

Lines changed: 1 addition & 1 deletion
Loading

docs/_images/generateive_recall.svg

Lines changed: 4 additions & 0 deletions
Loading

docs/_sources/chapter_0_introduction/1.intro.rst.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,16 @@
2222
f(User, Item,
2323
Context)**\ 。这个函数接收对用户、物品和场景的理解作为输入,输出一个代表连接可能性的分数。分数越高,系统越确信这个用户会对这个物品产生正面的行为反应。
2424

25+
.. _score_function:
26+
2527
.. figure:: ../img/score_function.svg
28+
:width: 350px
2629

2730
推荐系统的核心预测函数
2831
推荐系统通过整合用户特征(U)、物品特征(I)和场景特征(C),计算用户与物品产生有价值连接的可能性分数。
2932

33+
34+
3035
从某种意义上说,整个推荐算法领域的发展历程,就是不断寻找更强大、更精准的函数f的过程。从早期的协同过滤算法,到现在的深度学习模型,本质上都是在优化这个预测函数。
3136

3237
**工业视角:规模化带来的挑战与解决方案**
@@ -45,11 +50,16 @@ Context)**\ 。这个函数接收对用户、物品和场景的理解作为输
4550

4651
最后一个阶段是\ **重排**\ ,其目标是对排序后的结果进行最终优化。重排阶段解决的一个关键问题是:预测分数最高的列表,不一定等于用户体验最佳的列表。系统在这个阶段会考虑多样性、新颖性、公平性等因素。比如,如果排序后的前十个推荐都是同一类型的内容,重排阶段会适当调整,引入一些其他类型的优质内容,避免用户产生审美疲劳。同时,这个阶段也会处理一些业务规则,比如插入必要的广告内容或运营推广的物品。
4752

53+
.. _recommendation_pipeline:
54+
4855
.. figure:: ../img/recommendation_pipeline.svg
56+
:width: 400px
4957

5058
工业级推荐系统的三阶段流水线架构
5159
通过召回、排序、重排三个阶段,推荐系统将亿级候选逐步筛选为最终推荐列表,在效率与效果之间实现平衡。
5260

61+
62+
5363
这套三阶段流水线看似复杂,但其核心逻辑很简单:\ **在不同阶段采用不同的策略,逐步从“可能相关”筛选到“最优匹配”**\ 。召回追求速度和覆盖度,排序追求精度,重排追求体验。每个阶段都有其不可替代的价值,共同构成了工业级推荐系统的技术骨架。
5464

5565
**宏观视角:构建多方共赢的生态系统**
@@ -75,10 +85,15 @@ Context)**\ 。这个函数接收对用户、物品和场景的理解作为输
7585

7686
对于\ **平台**\ 而言,它承担着生态协调者的角色。一方面,平台需要优化推荐效果,提升用户满意度和使用时长;另一方面,它还要关注生态的长期健康,比如维护内容多样性、抑制低质内容泛滥、保护创作者积极性。有时平台甚至需要牺牲部分短期指标来换取长期信任,例如降低对标题党内容的推荐权重,以维护整体体验。
7787

88+
.. _ecosystem_balance:
89+
7890
.. figure:: ../img/ecosystem_balance.svg
91+
:width: 250px
7992

8093
推荐系统生态中的三角关系:用户与创作者、内容、平台。用户既是内容的消费者,也是潜在的生产者;内容是价值的核心媒介;平台负责连接与分配。推荐系统需要在三者之间保持动态平衡。
8194

95+
96+
8297
**真正优秀的推荐系统,是一个精巧的平衡器**\ 。它需要在用户与创作者、内容质量、平台发展之间找到动态平衡点,确保生态系统的长期健康。这要求推荐系统设计者不仅是技术专家,更需要具备生态思维,能够从多方利益的角度思考问题。
8398

8499
**从认知到实践:本书的技术地图**

docs/_sources/chapter_0_introduction/2.outline.rst.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@
88

99
**召回系统**\ 是推荐流水线的起点,需要在毫秒级时间内从亿级候选中筛选出千级相关物品。本章将沿着三条技术演进路径,展现召回技术从简单到复杂、从静态到动态的发展历程。
1010

11+
.. _chapter_02_outline:
12+
1113
.. figure:: ../img/chapter_02_outline.svg
14+
:width: 400px
1215

1316
召回模型演化图
1417

18+
19+
1520
**协同过滤(Collaborative Filtering)**
1621
是推荐系统的经典起点。我们将探讨基于用户的协同过滤(UserCF,:numref:`usercf`\ )如何通过“找到相似用户,推荐他们喜欢的物品”来实现推荐,以及基于物品的协同过滤(ItemCF,:numref:`itemcf`\ )如何通过“推荐与用户历史行为相似的物品”来提升推荐效果。Swing算法(:numref:`swing`\ )展示了如何通过考虑用户活跃度来改进物品相似度计算。最后,矩阵分解(Matrix
1722
Factorization,:numref:`matrix_factorization`\ )技术将协同过滤从统计方法推向了机器学习时代,通过学习用户和物品的隐向量表示来预测偏好。
@@ -26,10 +31,15 @@ Factorization,:numref:`matrix_factorization`\ )技术将协同过滤从统
2631

2732
经过召回阶段的快速筛选,\ **排序系统**\ 需要对数千个候选物品进行精准的偏好预测。本章将展现排序模型从简单线性模型到复杂深度学习模型的演进历程。
2833

34+
.. _chapter_03_outline:
35+
2936
.. figure:: ../img/chapter_03_outline.svg
37+
:width: 400px
3038

3139
排序模型演化图
3240

41+
42+
3343
我们从\ **Wide &
3444
Deep模型**\ :numref:`wide-and-deep`\ )开始,这个模型巧妙地结合了线性模型的“记忆”能力和深度模型的“泛化”能力,为后续模型发展奠定了基础。Wide部分通过人工设计的交叉特征快速学习显性关联规则,Deep部分则通过嵌入层和多层神经网络自动发现深层次的非线性关系,两者通过联合训练实现优势互补。
3545

docs/_sources/chapter_1_retrieval/1.cf/1.usercf.rst.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ UserCF是最早提出的协同过滤方法
1515
.. _usercf_illustration:
1616

1717
.. figure:: ../../img/usercf_illustration.svg
18+
:width: 400px
1819

1920
UserCF 原理示意图
2021

2122

23+
2224
UserCF的实现过程可以分解为两个核心步骤:首先计算用户之间的相似度,找出与目标用户偏好最接近的邻居用户;然后基于这些邻居用户的历史行为,预测目标用户对未购买商品的兴趣程度。接下来我们详细看看每个步骤是如何实现的。
2325

2426
**第一步:用户相似度计算**

docs/_sources/chapter_1_retrieval/1.cf/2.itemcf.rst.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@
1010

1111
与前面介绍的UserCF不同,ItemCF换了一个角度来思考推荐问题。它不再寻找“和你相似的用户还喜欢什么”,而是关注“和你喜欢的物品相似的还有什么”。这种思路建立在一个简单的假设上:用户的兴趣具有一定的连贯性,喜欢某个物品的用户往往也会对相似的物品感兴趣。
1212

13+
.. _itemcf_illustration:
14+
1315
.. figure:: ../../img/itemcf_illustration.svg
16+
:width: 300px
1417

1518
ItemCF 原理示意图
1619

20+
21+
1722
从上图可以看到,当我们要给左方用户推荐物品时,ItemCF会分析T恤和夹克之间的相似性。由于右方两个用户都同时喜欢这两种服装,系统判断它们具有较高的相似性。既然左方用户喜欢T恤,那么夹克就成为了一个不错的推荐选择。
1823

1924
ItemCF的实现流程主要包含以下两个步骤:

docs/_sources/chapter_1_retrieval/1.cf/3.swing.rst.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ Swing 算法
1010
.. _swing_illustration:
1111

1212
.. figure:: ../../img/swing_illustration.svg
13+
:width: 400px
1314

1415
产品之间的替代性和互补性关系
1516

1617

18+
1719
Swing Score :cite:`yang2020large`
1820
提供了一个新的解题思路。它不再简单地统计共同购买次数,而是深入分析用户-物品二部图中的内部子结构,通过捕捉那些在用户行为中反复出现、具备较强“鲁棒性”的共同购买关系来度量物品相似性。其核心洞察是:\ **如果多个用户在其他共同购买行为较少的情况下,同时购买了同一对物品,那么这对物品之间的关联性就更可信**\
1921

@@ -57,10 +59,12 @@ Swing score 的基础计算公式为:
5759
.. _swing_score:
5860

5961
.. figure:: ../../img/swing_score.svg
62+
:width: 250px
6063

6164
Swing Score 计算示意图
6265

6366

67+
6468
假设 :math:`\alpha = 1`\ ,那么:
6569

6670
- 用户对 :math:`[A, B]`

docs/_sources/chapter_1_retrieval/1.cf/4.mf.rst.txt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,31 @@
1313
.. _mf_usercf_illustration:
1414

1515
.. figure:: ../../img/mf_usercf_illustration.svg
16+
:width: 350px
1617

1718
基于用户行为统计的方法。张三喜欢左边的三部电影。为了对他进行预测,系统会找到也喜欢这些电影的相似用户,然后确定他们还喜欢哪些其他电影。在这种情况下,所有三位用户都喜欢《拯救大兵瑞恩》,因此这是首个推荐。接着,其中两位用户喜欢《沙丘》,所以它排在第二位,依此类推。
1819

1920

21+
2022
但这种方法有个致命弱点:当评分数据非常稀疏时,很难找到足够的相似用户或物品。想想看,在一个有百万用户和十万电影的系统中,大部分用户只看过其中几十部电影,传统方法很可能因为共同评分太少而失效。
2123

2224
这时候,矩阵分解登场了。它不再直接寻找相似性,而是换了个思路:假设用户的偏好和电影的特征都可以用几个关键因子来描述。比如,我们可以用“面向男性vs面向女性”和“严肃vs逃避现实”这两个维度来刻画电影,同时用用户对这两类特征的偏好程度来描述用户。这样,预测一个用户对某部电影的评分就变成了计算这两个向量的相似度。
2325

26+
矩阵分解的核心想法建立在两个关键假设上:
27+
28+
- 第一个是低秩假设:虽然评分矩阵看起来很复杂,但实际上可能只受少数几个隐含因素影响,比如“面向男性vs面向女性”、“严肃vs逃避现实”等维度。
29+
- 第二个是隐向量假设:每个用户和每部电影都能用一个包含这些隐含因子的向量来表示,用户向量反映了其对各种因子的偏好程度,而电影向量则描述了该电影在各个因子上的特征强度。
30+
31+
这种做法的好处是显而易见的:即使两个用户没有看过相同的电影,只要他们在隐含因子上表现相似,我们就能为他们推荐相似的内容。这大大提高了模型处理稀疏数据的能力。
32+
2433
.. _mf_illustration:
2534

2635
.. figure:: ../../img/mf_illustration.svg
36+
:width: 400px
2737

2838
隐语义模型意图,该方法通过两个维度来刻画用户和电影:一个是面向男性与面向女性,另一个是严肃与逃避现实。
2939

3040

31-
矩阵分解的核心想法建立在两个关键假设上:
32-
33-
- 第一个是低秩假设:虽然评分矩阵看起来很复杂,但实际上可能只受少数几个隐含因素影响,比如“面向男性vs面向女性”、“严肃vs逃避现实”等维度。
34-
- 第二个是隐向量假设:每个用户和每部电影都能用一个包含这些隐含因子的向量来表示,用户向量反映了其对各种因子的偏好程度,而电影向量则描述了该电影在各个因子上的特征强度。
35-
36-
这种做法的好处是显而易见的:即使两个用户没有看过相同的电影,只要他们在隐含因子上表现相似,我们就能为他们推荐相似的内容。这大大提高了模型处理稀疏数据的能力。
3741

3842
接下来我们看看如何把这个想法变成具体的算法。我们将介绍两种矩阵分解模型:简单直接的\ **基础模型**\ (FunkSVD)和考虑评分偏差的\ **改进模型**\ (BiasSVD)。
3943

@@ -138,7 +142,7 @@ FunkSVD 在 MovieLens 数据集上的应用
138142
+---------------+--------------+-----------+----------+----------------+---------------+
139143
| hit_rate@10 | hit_rate@5 | ndcg@10 | ndcg@5 | precision@10 | precision@5 |
140144
+===============+==============+===========+==========+================+===============+
141-
| 0.0033 | 0.0018 | 0.0016 | 0.0011 | 0.0003 | 0.0004 |
145+
| 0 | 0 | 0 | 0 | 0 | 0 |
142146
+---------------+--------------+-----------+----------+----------------+---------------+
143147
144148
@@ -177,6 +181,6 @@ BiasSVD 在 MovieLens 数据集上的应用
177181
+---------------+--------------+-----------+----------+----------------+---------------+
178182
| hit_rate@10 | hit_rate@5 | ndcg@10 | ndcg@5 | precision@10 | precision@5 |
179183
+===============+==============+===========+==========+================+===============+
180-
| 0.001 | 0.0007 | 0.0008 | 0.0007 | 0.0001 | 0.0001 |
184+
| 0.0008 | 0.0008 | 0.0008 | 0.0008 | 0.0001 | 0.0002 |
181185
+---------------+--------------+-----------+----------+----------------+---------------+
182186

docs/_sources/chapter_1_retrieval/2.embedding/1.i2i.rst.txt

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,15 @@ Words)。Skip-Gram模型通过给定的中心词来预测其周围的上下文
2727
Skip-Gram模型详解
2828
~~~~~~~~~~~~~~~~~
2929

30+
.. _w2v_skip_gram:
31+
3032
.. figure:: ../../img/w2v_skip_gram.svg
33+
:width: 300px
3134

3235
Word2Vec Skip-Gram模型示意图
3336

37+
38+
3439
在Skip-Gram模型中,给定文本序列中位置\ :math:`t`\ 的中心词\ :math:`w_t`\ ,模型的目标是最大化其上下文窗口内所有词语的出现概率。具体而言,对于窗口大小为\ :math:`m`\ 的情况,模型要预测\ :math:`w_{t-m}, w_{t-m+1}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+m}`\ 这些上下文词的概率。
3540

3641
中心词\ :math:`w_t`\ 预测上下文词\ :math:`w_{t+j}`\ 的条件概率定义为:
@@ -121,7 +126,7 @@ Item2Vec直接采用Word2Vec的Skip-Gram架构,但在序列构建上有所简
121126
+---------------+--------------+-----------+----------+----------------+---------------+
122127
| hit_rate@10 | hit_rate@5 | ndcg@10 | ndcg@5 | precision@10 | precision@5 |
123128
+===============+==============+===========+==========+================+===============+
124-
| 0.0098 | 0.0033 | 0.0035 | 0.0015 | 0.001 | 0.0007 |
129+
| 0.0098 | 0.0049 | 0.0036 | 0.0021 | 0.001 | 0.001 |
125130
+---------------+--------------+-----------+----------+----------------+---------------+
126131
127132
@@ -139,11 +144,16 @@ Information):cite:wang2018billion
139144

140145
EGES的第一个创新是将物品序列的概念从简单的用户交互扩展为更精细的会话级序列。考虑到用户行为的复杂性和计算效率,研究者设置了一小时的时间窗口,只选择窗口内的用户行为构建商品关系图。
141146

147+
如图所示,如果两个商品在用户行为序列中连续出现,则在它们之间建立一条有向边,边的权重等于商品转移在所有用户行为历史中的频率。这种基于会话的图构建方法比简单的用户交互序列更能捕捉用户的短期兴趣模式。
148+
149+
.. _eges_item_graph:
150+
142151
.. figure:: ../../img/eges_item_graph.png
152+
:width: 500px
143153

144154
商品图构建过程
145155

146-
如图所示,如果两个商品在用户行为序列中连续出现,则在它们之间建立一条有向边,边的权重等于商品转移在所有用户行为历史中的频率。这种基于会话的图构建方法比简单的用户交互序列更能捕捉用户的短期兴趣模式。
156+
147157

148158
在构建好的商品图上,EGES采用带权随机游走策略生成训练序列。从一个节点出发,转移概率由边权重决定:
149159

@@ -171,10 +181,15 @@ GES的核心思想是将商品本身的embedding与其各种属性的embedding
171181

172182
**EGES的核心创新**\ 在于认识到不同类型的辅助信息应该有不同的重要性。对于手机,品牌可能比价格更重要;对于日用品,价格可能比品牌更关键。
173183

184+
.. _eges_model:
185+
174186
.. figure:: ../../img/eges_model.png
187+
:width: 400px
175188

176189
EGES模型架构
177190

191+
192+
178193
对于具有\ :math:`n`\ 种辅助信息的商品\ :math:`v`\ ,EGES为其维护\ :math:`n+1`\ 个向量表示:一个商品ID的向量表示,以及\ :math:`n`\ 个属性的向量表示。商品的最终向量表示通过加权聚合得到:
179194

180195
.. math:: H_v = \frac{\sum_{j=0}^n e^{a_v^j} W_v^j}{\sum_{j=0}^n e^{a_v^j}}
@@ -236,7 +251,7 @@ EGES在淘宝的实际部署效果显著:在包含十亿级训练样本的大
236251
+---------------+--------------+-----------+----------+----------------+---------------+
237252
| hit_rate@10 | hit_rate@5 | ndcg@10 | ndcg@5 | precision@10 | precision@5 |
238253
+===============+==============+===========+==========+================+===============+
239-
| 0.0089 | 0.0051 | 0.004 | 0.0028 | 0.0009 | 0.001 |
254+
| 0.0142 | 0.0089 | 0.0067 | 0.0049 | 0.0014 | 0.0018 |
240255
+---------------+--------------+-----------+----------+----------------+---------------+
241256
242257
@@ -260,10 +275,15 @@ Sessions)构建序列。当用户连续点击间隔超过30分钟时,就会
260275
为了强化模型对最终转化行为的学习,Airbnb设计了全局上下文机制。在传统的Skip-Gram模型中,只有在滑动窗口内的物品才被视为上下文,但这种局部窗口无法充分利用最终预订这一强烈的正向信号。因此,Airbnb让用户最终预订的房源(booked
261276
listing)与序列中的每一个浏览房源都形成正样本对进行训练,无论它们在序列中的距离有多远。
262277

278+
.. _airbnb_global_context:
279+
263280
.. figure:: ../../img/airbnb_global_context.png
281+
:width: 500px
264282

265283
Airbnb预订房源全局上下文
266284

285+
286+
267287
修改后的优化目标增加了全局上下文项:
268288

269289
.. math:: \text{argmax}_{\theta} \sum_{(l, l^+) \in \mathcal{D_p}} \log \frac{1}{1 + e^{-v_{l^+}^T v_l}} + \sum_{(l, l^-) \in \mathcal{D_n}} \log \frac{1}{1 + e^{v_{l^-}^T v_l}} + \log \frac{1}{1 + e^{-v_{l_b}^T v_l}}

0 commit comments

Comments
 (0)