系列 · 推荐系统 · 第 14 篇

推荐系统(十四)—— 跨域推荐与冷启动解决方案

深入讲清冷启动与跨域推荐的整套打法:三种冷启动场景、EMCDR/PTUPCDR 跨域桥接、MeLU/MAML 元学习、UCB Bandit 探索利用,以及从冷到温的完整线上路由策略。

Netflix 进入新国家时,接手的是几百万完全没有历史记录的用户和一个没有任何本地评分的内容库;亚马逊每次开拓新品类时也会遇到同样的问题——纯协同过滤(CF)在这种场景下完全失效。要让推荐系统在冷启动环境中发挥作用,需要组合多种技术:首次请求采用启发式 Bootstrap 方法生成初始推荐,积累少量交互后切换至元学习以快速适配用户,若存在相关源域则引入跨域迁移来复用外部知识,当模型初步具备置信度后再通过 Bandit 策略持续探索未知物品空间。这篇文章将详细拆解这套技术栈,每一层都直接对应到其来源的经典论文。

推荐系统(十四)—— 跨域推荐与冷启动解决方案 — 章节概览图


你将学到什么#

  • 三种冷启动场景 —— 新用户、新物品、新系统,每种场景需要不同的解决思路。
  • 跨域桥接 —— 从 EMCDR 的共享 MLP 到 PTUPCDR 的用户级元网络
  • 推荐系统的元学习 —— MAML 的双层优化,以及 MeLU 如何为用户定制化改进
  • 探索与利用的权衡 —— UCB1、ε-greedy、Thompson Sampling 及其 regret 界限
  • 从冷启动到温启动的演进 —— 不同方法在不同交互次数下的主导地位
  • 基于内容的兜底策略 —— 新物品的常备安全网

前置知识#

  • 熟悉协同过滤和矩阵分解(第 3–4 篇)
  • 掌握 PyTorch 和基础梯度下降(第 7 篇)
  • 愿意认真读懂一两个公式

冷启动的三种形态#

三种冷启动场景以用户-物品矩阵呈现:新用户对应一整行空白;新物品对应一整列空白;新系统则整张矩阵都接近空白

推荐系统依赖历史数据训练,但当历史数据缺失时,会以三种方式失效。每种失效模式在用户-物品矩阵中表现为不同形状的空洞。

用户冷启动#

一个新用户注册了,我们可能知道他的设备类型、IP 地址归属地、引流广告渠道,甚至从注册表单里获取了他的年龄段信息,但显式交互行为为零,他在评分矩阵中的那一行完全是空白的。行业数据显示,首会话推荐质量较差的用户,30 天留存率比普通用户低约 70%。解决这个问题的关键在于稀疏信号推断和主动探索。

物品冷启动#

商家上架了一个新 SKU,片方发布了一部新电影,创作者上传了一段新视频,这些新物品在矩阵中新增了一整列空白。协同过滤(CF)无法检索到这些物品,因为没有任何用户与它们发生过交互。若不干预,这些新物品将长期缺乏曝光,难以积累交互数据,最终沉入长尾——这正是推荐系统中典型的“马太效应”。解决这一问题的核心是利用内容特征,包括标题、封面图、预训练编码器生成的 embedding,以及基于相似“温物品”的评分迁移。

系统冷启动#

一个新平台上线,或者现有平台扩展到一个全新业务领域,此时用户-物品矩阵几乎完全空白,行和列同时稀疏。解决这一问题的关键在于迁移学习:复用相关且数据丰富的源域中的用户/物品 embedding、跨域映射关系,甚至整个排序模型。

统一的形式化描述#

给定用户集合 $U$ 、物品集合 $I$ ,以及交互矩阵 $R \in \mathbb{R}^{|U| \times |I|}$ ,定义冷启动子集:对于 $u \in U_{\text{cold}}$ ,满足 $|R_{u,\cdot}| < K$ ;同理定义 $I_{\text{cold}}$ 。目标是预测至少一侧为冷启动状态的 $(u, i)$ 对应的 $R_{u,i}$ 。标准协同过滤(CF)通过共现模式学习嵌入向量 $\mathbf{e}_u, \mathbf{e}_i$ ;但在冷启动场景下,这些嵌入向量要么不存在,要么只是没有梯度信号的随机初始化值。下面提到的所有方法本质上都在回答一个问题:当数据缺失时,用什么替代 $\mathbf{e}_u$$\mathbf{e}_i$


跨域推荐#

跨域推荐流程图:源域交互 → 源域 embedding → 桥接函数映射 → 目标域 embedding → 目标域打分器为冷启动用户出分

直觉很简单:喜欢库布里克《2001 太空漫游》的用户,大概率也会读阿瑟·克拉克。他的观影行为对图书偏好是一个很强的先验信号,即使物品类型完全不同。技术问题只有一个:如何将这种“强先验”数学化 —— 用什么函数把用户在电影域的表征映射到图书域?

EMCDR —— 全局 MLP 桥接#

Man 等人,IJCAI 2017 提出了 EMCDR (Embedding and Mapping for Cross-Domain Recommendation),这是最简洁的实现方式。分为三步:

  1. 分别训练域内 MF。对源域交互 $R^S$ 和目标域交互 $R^T$ 分别进行矩阵分解,得到用户嵌入 $U^S, U^T$ 和物品嵌入 $V^S, V^T$
  2. 在重叠用户上学习桥接函数。对于同时出现在两个域的用户 $i \in U_o = U^S \cap U^T$ ,训练一个 MLP $f_\phi$ ,最小化 $\sum_{i \in U_o} \|f_\phi(\mathbf{u}_i^S) - \mathbf{u}_i^T\|^2$
  3. 为目标域冷启动用户打分。对于只存在于源域的用户,令 $\hat{\mathbf{u}}_i^T = f_\phi(\mathbf{u}_i^S)$ ,然后输入目标域预测器。

桥接函数是全局共享的 —— 所有用户都通过同一个 $f_\phi$ 映射。

PTUPCDR —— 个性化桥接#

$$\phi_i = h_\theta\bigl(\{\mathbf{v}_j^S : j \in \mathcal{H}_i^S\}\bigr), \qquad \hat{\mathbf{u}}_i^T = f_{\phi_i}(\mathbf{u}_i^S)$$

其核心思想是:根据用户在源域的历史行为,动态生成一组个性化桥接权重,再用该权重映射其源域 embedding。在 Amazon 跨品类标准基准测试中, PTUPCDR 的 MAE 比 EMCDR 降低了 5–10%。

EMCDR 与 PTUPCDR 对比:左侧 EMCDR 所有用户共用一个 MLP;右侧 PTUPCDR 用元网络根据用户行为生成个性化桥接参数

最简跨域骨架代码#

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import torch
import torch.nn as nn

class CrossDomainBridge(nn.Module):
    """EMCDR 风格的共享桥接模型。

    第一步(未展示):分别预训练源域和目标域的 MF。
    第二步:本模块在重叠用户上学习 f_phi。
    第三步:对目标域冷启动用户,用 f_phi(u^S) 进行预测。
    """

    def __init__(self, embedding_dim=64, hidden_dim=128):
        super().__init__()
        self.bridge = nn.Sequential(
            nn.Linear(embedding_dim, hidden_dim),
            nn.Tanh(),
            nn.Linear(hidden_dim, hidden_dim),
            nn.Tanh(),
            nn.Linear(hidden_dim, embedding_dim),
        )

    def forward(self, user_emb_source: torch.Tensor) -> torch.Tensor:
        return self.bridge(user_emb_source)

def emcdr_loss(bridge, u_source, u_target_true):
    """仅在重叠用户上训练 —— 本质是 embedding 空间中的回归任务。"""
    u_target_pred = bridge(u_source)
    return torch.mean((u_target_pred - u_target_true) ** 2)

负迁移 —— 必须警惕的失败模式#

跨域推荐并非适用于所有场景。若源域与目标域关联性较弱(例如新闻阅读与生鲜电商),桥接反而可能损害目标域的推荐效果。判断方法很简单:跑一个仅使用目标域数据的基线模型做 A/B 测试,观察冷启动用户的指标。如果跨域模型在相同训练成本下无法超越基线,说明两个域的关联性太弱了。

元学习冷启动#

跨域推荐假设你有一个数据丰富的相关领域。元学习换了个思路:即使在单个领域内,能不能让模型通过少量交互快速适应新用户?

一句话讲明白 MAML#

$$\theta'_i = \theta - \alpha \nabla_\theta \mathcal{L}_{T_i}(f_\theta, \mathcal{S}_i)$$ $$\theta \leftarrow \theta - \beta \nabla_\theta \sum_{T_i \sim p(\mathcal{T})} \mathcal{L}_{T_i}(f_{\theta'_i}, \mathcal{Q}_i)$$

从几何上看, MAML 把 $\theta$ 推到参数空间的一个特殊区域:无论遇到哪个任务,只要走几步梯度就能接近最优解。

MAML 损失曲面图:三个任务最优点环绕在中央的元初始化星标周围;右侧给出内外层循环公式

MeLU —— 针对推荐场景优化的 MAML#

Lee 等人(KDD 2019) 将 MAML 应用到推荐系统,提出了 MeLU (Meta-Learned User preference estimator)。工程上的关键选择是:内层只调整决策层,而嵌入层保持共享且变化缓慢。这符合直觉:物品和类别的嵌入应该稳定,不同用户之间的差异在于如何组合这些嵌入。

每个“任务”对应一个用户。支持集 $\mathcal{S}_i$ 是用户的前 1–5 次交互;查询集 $\mathcal{Q}_i$ 用于外层计算损失。在几十万用户上完成元训练后,处理新用户的流程如下:

  1. 取用户的前 $K$ 条评分作为支持集。
  2. 在决策层上跑 1–5 步梯度更新。
  3. 用更新后的模型为所有候选物品打分。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class MeLU(nn.Module):
    """MeLU 风格推荐器:共享嵌入,自适应决策头。

    内层只调整 decision_head 的参数。
    嵌入层仅在外层更新。
    """

    def __init__(self, num_items, num_genres, embedding_dim=32):
        super().__init__()
        self.item_embedding = nn.Embedding(num_items, embedding_dim)
        self.genre_embedding = nn.Embedding(num_genres, embedding_dim)
        self.decision_head = nn.Sequential(
            nn.Linear(embedding_dim * 2, 64),
            nn.ReLU(),
            nn.Linear(64, 32),
            nn.ReLU(),
            nn.Linear(32, 1),
        )

    def forward(self, item_ids, genre_ids):
        x = torch.cat(
            [self.item_embedding(item_ids), self.genre_embedding(genre_ids)],
            dim=-1,
        )
        return self.decision_head(x).squeeze(-1)

def melu_inner_adapt(model, support_items, support_genres, support_ratings,
                     inner_lr=0.01, n_steps=3):
    """只在决策头上跑几步梯度。

    返回 requires_grad=True 的参数列表,
    外层可以通过它反向传播(二阶梯度)。
    """
    fast_params = [p.clone().detach().requires_grad_(True)
                   for p in model.decision_head.parameters()]

    for _ in range(n_steps):
        x = torch.cat([model.item_embedding(support_items),
                       model.genre_embedding(support_genres)], dim=-1)
        for i in range(0, len(fast_params), 2):
            w, b = fast_params[i], fast_params[i + 1]
            x = torch.nn.functional.linear(x, w, b)
            if i < len(fast_params) - 2:
                x = torch.relu(x)
        pred = x.squeeze(-1)

        loss = torch.mean((pred - support_ratings) ** 2)
        grads = torch.autograd.grad(loss, fast_params, create_graph=True)
        fast_params = [p - inner_lr * g for p, g in zip(fast_params, grads)]

    return fast_params

元学习什么时候划算#

MAML/MeLU 因为内层展开和二阶梯度,训练成本是普通模型的 3–10 倍。以下三种情况值得尝试:

  • 用户量大但每人交互很少(典型的长尾分布)。
  • 任务边界清晰,比如按用户、会话或人群划分。
  • 启发式方法不够用,又没有相关领域可以迁移。

如果二阶梯度太贵,可以用 FOMAML,去掉二阶项,保留一阶近似,效果差不多。

Bandit —— 探索与利用#

推荐系统(十四)—— 跨域推荐与冷启动解决方案 — 章节小结图

模型对用户有一定把握后,下一步该推什么?如果总是选最高分的物品,就永远不知道用户是否喜欢那些分数稍低的物品;但如果完全随机推荐,用户的体验会很差。解决这个问题的经典方法是多臂老虎机

UCB1 —— 置信上界#

$$a_t = \arg\max_a \left[ \hat\mu_a + \sqrt{\frac{2 \ln t}{n_a}} \right]$$

可以实现 $O(\log t)$ 的累积 regret。也就是说, UCB 和“始终选择最优臂”的理想策略之间的差距,只会随着轮数对数增长。公式的意义很直观:选择置信上界最高的物品。被推荐次数 $n_a$ 少的物品会有较大的探索奖励,因此会被优先尝试;而被推荐次数多的物品,置信区间较窄,只有真实均值高时才会被选中。

左:四个臂的估计奖励柱状图,每根柱子上方加了一段表示不确定性奖励的须;少拉的臂须更长。右:累积 regret 对比,UCB 与 Thompson 是对数级,ε-greedy 线性增长但更慢,pure greedy 卡在次优臂上线性涨,random 涨得最快

Thompson Sampling —— 贝叶斯方法#

Thompson Sampling 给每个臂维护一个奖励的后验分布,每次从分布中采样,选择采样值最高的臂。实际效果通常不输 UCB1,甚至更好,而且实现起来非常简单,尤其是针对 Beta-Bernoulli 奖励。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np

class UCB1Recommender:
    """K 个候选物品上的 UCB1。奖励范围 [0, 1]。"""

    def __init__(self, n_items: int):
        self.n_items = n_items
        self.counts = np.zeros(n_items, dtype=np.int64)
        self.means = np.zeros(n_items, dtype=np.float64)
        self.t = 0

    def select(self) -> int:
        self.t += 1
        # 先把每个臂都拉一遍
        unpulled = np.where(self.counts == 0)[0]
        if len(unpulled) > 0:
            return int(unpulled[0])
        ucb = self.means + np.sqrt(2 * np.log(self.t) / self.counts)
        return int(np.argmax(ucb))

    def update(self, item: int, reward: float) -> None:
        self.counts[item] += 1
        n = self.counts[item]
        self.means[item] += (reward - self.means[item]) / n

class ThompsonSampling:
    """二值奖励(点击 / 未点击)下的 Beta-Bernoulli Thompson 采样。"""

    def __init__(self, n_items: int, alpha=1.0, beta=1.0):
        self.alpha = np.full(n_items, alpha)
        self.beta = np.full(n_items, beta)

    def select(self) -> int:
        samples = np.random.beta(self.alpha, self.beta)
        return int(np.argmax(samples))

    def update(self, item: int, reward: float) -> None:
        self.alpha[item] += reward
        self.beta[item] += 1 - reward

在线上场景中,上下文 Bandit (如 LinUCB 和神经网络版本)扩展了这些思想,利用用户和物品特征,而不仅仅是简单的计数器。它们是解决少样本问题的标准工具,尤其适合元学习生成初始模型后,仍需高效收集数据的场景。


内容兜底#

新物品如果没有信号,再强的元学习也无能为力。基于内容的检索是永远在线的安全网。

新物品通过 BERT/CLIP/TF-IDF 等编码器生成内容嵌入,用余弦相似度匹配温物品库,从最相似的 K 个温物品中按相似度加权聚合评分,完成冷启动预测

流程很简单:

  1. 编码新物品:文本用 BERT 或 sentence-transformers,图像用 CLIP,结构化数据用人工特征加一个小 MLP。
  2. 找 K 个最相似的温物品:在内容嵌入上计算余弦相似度。
  3. 预测评分:用相似度作为权重,对邻居的评分加权平均: $\hat r_{u,i} = \frac{\sum_{j \in N_K(i)} \mathrm{sim}(i, j) \cdot r_{u,j}}{\sum_{j \in N_K(i)} \mathrm{sim}(i, j)}$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import numpy as np

class ContentFallback:
    """从 K 个最近的温物品借评分,给冷物品出分。"""

    def __init__(self, item_features: np.ndarray, K: int = 20):
        # item_features: (n_items, d) 预计算好的嵌入(如 BERT、CLIP)
        norms = np.linalg.norm(item_features, axis=1, keepdims=True) + 1e-8
        self.normed = item_features / norms
        self.K = K

    def predict(self, cold_item_idx: int, warm_ids: np.ndarray,
                warm_ratings: np.ndarray) -> float:
        sims = self.normed[warm_ids] @ self.normed[cold_item_idx]
        top = np.argpartition(-sims, kth=min(self.K, len(sims) - 1))[: self.K]
        s, r = sims[top], warm_ratings[top]
        s = np.maximum(s, 0)  # 负相似度直接忽略
        return float((s * r).sum() / (s.sum() + 1e-8))

这个方法同样适用于用户冷启动。只要能拿到一点内容信号,比如注册问卷或首次引导页的一次点击,就把它编码成向量,找到最相似的温用户,借用他们的偏好。


从冷启动到温启动的线上路由策略#

没有任何一种方法能在所有交互量区间内都表现最优。实际生产系统会根据用户积累的交互数据量,动态将请求分发给最适合的算法。

NDCG@10 随用户交互量变化:纯 CF 起步接近零、爬升缓慢;内容兜底有一条不高不低的水平线;MeLU 在 1-10 这个区间斜率最陡;PTUPCDR 起步最高但很快趋平;混合方案全程压在最上面

每条曲线都有它的意义:

  • 纯 CF 在交互次数低于 5 次时几乎没用,直到 20 次左右才开始有明显提升。
  • 内容召回提供了一条稳定的基线 —— 不惊艳,但也不至于崩盘,随时可用。
  • **元学习(MeLU)**在 1–10 次交互区间内增长最快,这正是它的设计目标。
  • **跨域(PTUPCDR)**起步最高,因为它直接利用了源域的知识,但后续增长很快趋于平缓。
  • 混合策略是上包络线:根据当前交互量选择最优的方法。

一份可以直接用的路由规则如下:

交互次数主方法兜底方法
0跨域 / 热门内容召回
1–3跨域 + Bandit内容召回
3–20元学习(MeLU)跨域
20+完整 CF / DIN / 序列模型新会话回退到元学习

同时并行运行一条“热门基线”作为保护机制:如果任何方法的预测置信度不足,就直接回退到用户所属人群的热门物品推荐。


常见问答#

Q:我的平台没有可迁移的源域,从哪里开始?

先用基于内容的召回策略处理物品侧,用热度先验解决用户侧。等积累了一些交互数据后,再用 MeLU 进行元训练。跨域迁移能带来 10–20% 的相对提升,但不是必需的。

Q: MeLU 需要多少次交互才能超越基于内容的 baseline?

在公开数据集(MovieLens、 Bookcrossing)上, MeLU 通常在 2–3 次交互时开始占优, 5 次交互后基本稳赢。具体效果取决于支持集的信息量 —— 多样化的类别比单一化的更有优势。

Q: FOMAML 真的够用吗?还是必须用二阶 MAML?

在推荐场景中, FOMAML 和 MAML 在标准指标上的差距只有 1–2%,但训练速度快了 3 倍。只有当我明确测出这点差距对业务指标有实际影响时,才值得切换到二阶 MAML。

Q:如何检测跨域迁移中的负迁移问题?

同时跑一个只用目标域数据的 baseline。如果冷启动用户的表现没有提升,说明两个域的差异太大。常见问题是按 ID 对齐用户,但同一个用户在不同域的行为模式可能完全不同(比如工作账号 vs 个人账号)。

Q: Bandit 对 Top-K 推荐有用吗?还是只适合单选问题?

主要在 feed 的前一两个位置有价值 —— 这些位置的探索收益最高。后面的位次可以直接切回排序逻辑。组合 Bandit 虽然可行,但工程成本太高,不建议轻易尝试。

Q:如何离线评估冷启动系统?

按用户整体留出数据,而不是随机留出交互记录。对每个留出用户,只把最早的 $K$ 次交互作为支持集喂给模型,预测剩余的交互行为。按 $K \in \{1, 3, 5, 10\}$ 分别报告指标,单一数字会掩盖冷启动到热启动的过渡过程。


参考文献#


冷启动的细分对症#

第一节提到冷启动分为用户冷启、物品冷启和系统冷启。但方法和冷启动场景的实际匹配,比论文里描述的要窄得多。

冷启动类型生产环境有效的方法听起来不错但不实用
新用户,无历史Bandit + 引导信号收集元学习(单用户计算太慢,方差大)
新物品,有元数据基于内容的兜底 + 跨域迁移纯 CF (没有信号可供学习)
新物品,无元数据高探索率 ε 的 Bandit任何基于嵌入的方法(随机嵌入占主导)
新领域,用户有重叠跨域方法(CMF、 EMCDR、 BiTGCF)独立训练
新领域,无重叠内容 + 大模型嵌入跨域方法(没有桥梁可用)

我见过最有效的物品冷启动技巧是用预训练大模型生成初始嵌入。比如一个电商新品,有标题、描述和图片:

  1. 用多语言句子编码器(bge-m3 或 e5-multilingual-large)处理标题和描述。
  2. 用 CLIP 或领域专用视觉编码器处理图片。
  3. 拼接或平均这些特征,得到物品第一天的嵌入。

积累约 50 次交互后,用 sigmoid 门控机制融合内容嵌入和 ID 嵌入。达到约 500 次交互后,完全丢弃内容嵌入。

这个简单的干预措施通常能让新物品首周点击率(CTR)比随机初始化提升 15%–30%。只需三行代码,效果立竿见影。

冷启动的延迟预算#

冷启动方法的服务成本通常高于热路径,需要特别注意以下几点。

Thompson Sampling 的 Bandit 方法
请求时从后验分布采样,如果使用全协方差高斯后验,每个 arm 的复杂度是 $O(d^2)$ 。假设候选物品有 10K、$d=128$ ,单次请求需要 1.6 亿次运算,完全不可行。可以改用对角协方差(降到 130 万次运算),或者每隔几秒批量预计算采样结果。

推理阶段的元学习
MAML 类方法在请求时需要为每个冷用户跑 k 步梯度更新。当 $k=5$ 时,相当于多跑 5 次模型前向传播,通常会增加 50–200 ms 的延迟。这种延迟对漏斗顶端场景不可接受。建议将这部分逻辑放到后端,设计一个“onboarding 后学习”流程,等用户完成 onboarding 后再离线运行。

双编码器的跨域模型
EMCDR 类模型分别使用源域和目标域编码器,推理成本直接翻倍。缓解方法是:夜间离线预计算源域 embedding,线上只运行轻量级的目标域编码器。

基于内容的兜底策略
如果提前计算好物品的内容 embedding,并将其存储在与协同过滤 embedding 相同的 ANN 索引中,这种方法的成本很低。可以在排序阶段通过标志列标记“冷”物品,并对其分数应用热度偏差调整。

总结模式:保持在线路径简单(一次 ANN 调用 + 一个小排序模型),将冷启动相关的复杂逻辑放到批处理任务中,每几分钟更新一次 ANN 索引即可。

总结#

冷启动不是一个单一问题,也没有万能解法。它是一个区间,在交互次数轴的不同位置,需要不同的解决方案。

  • 冷启动的分类(用户 / 物品 / 系统)决定了可用的杠杆:探索、内容或迁移。
  • EMCDRPTUPCDR 把数据丰富的源域转化为稀疏目标域的先验知识。目前来看, PTUPCDR 的个性化桥接是实际应用中的最佳选择。
  • MAML 及其推荐系统专用版本 MeLU 训练出的模型初始化后只需几步就能快速适应,非常适合 3–10 次交互的场景。
  • UCB1Thompson Sampling 提供了少样本情况下的理论支持,探索规则的 regret 是对数级别的。
  • 内容兜底虽然不起眼,但始终是可靠的最后一道防线。
  • 混合架构根据交互次数进行路由,并内置热门保护机制。

逐步搭建这个架构:先从内容 + 热门起步,等用户量足够时引入元学习,等到相关领域出现时再加入跨域方法。冷启动用户的指标必须单独统计,不能和成熟用户混在一起。聚合数据会掩盖掉真正亏钱的那个区间。

本系列

推荐系统 16 篇

  1. 01 推荐系统(一)—— 入门与基础概念
  2. 02 推荐系统(二)—— 协同过滤与矩阵分解
  3. 03 推荐系统(三)—— 深度学习基础模型
  4. 04 推荐系统(四)—— CTR 预估与点击率建模
  5. 05 推荐系统(五)—— Embedding 表示学习
  6. 06 推荐系统(六)—— 序列推荐与会话建模
  7. 07 推荐系统(七)—— 图神经网络与社交推荐
  8. 08 推荐系统(八)—— 知识图谱增强推荐系统
  9. 09 推荐系统(九)—— 多任务学习与多目标优化
  10. 10 推荐系统(十)—— 深度兴趣网络与注意力机制
  11. 11 推荐系统(十一)—— 对比学习与自监督学习
  12. 12 推荐系统(十二)—— 大语言模型与推荐系统
  13. 13 推荐系统(十三)—— 公平性、去偏与可解释性
  14. 14 推荐系统(十四)—— 跨域推荐与冷启动解决方案 当前
  15. 15 推荐系统(十五)—— 实时推荐与在线学习
  16. 16 推荐系统(十六)—— 工业级架构与最佳实践

读有所得?

GitHub 关注我 → 新文周更

GitHub