Fork me on GitHub

TDM(Tree-based Deep Model,树模型)

从“直觉 → 结构 → 训练 → 推理 → 新 item 挂载”一步步来,用通俗语言 + 必要公式TDM(Tree-based Deep Model,树模型)彻底讲透。


一、结论

TDM 是一种把“海量 item 的多分类问题”,变成“在一棵树上逐层二分类/多分类”的算法,用树结构把计算复杂度从 O(N) 降到 O(log N)。

它解决的是一个非常现实的问题:

item 太多了,模型算不过来。


二、TDM 想解决什么问题?(动机)

假设你在做推荐系统:

  • item 数量:
    \( N = 10^6 \text{(100 万)} \)
  • 用户 u 来了,你要预测:
    \( P(i \mid u) \quad \forall i \in {1,\dots,N} \)

❌ 传统做法(不可行)

Softmax:

\( P(i \mid u) = \frac{e^{f(u,i)}}{\sum_{j=1}^N e^{f(u,j)}} \)

计算复杂度:

\( O(N) \)

👉 直接爆炸


三、TDM 的核心思想(一句话就懂)

别一次性在 100 万个 item 里选,先选“哪一大类”,再选“哪一小类”,最后选到具体 item。

这就是一棵树。


四、TDM 树长什么样?

1️⃣ 树结构

  • 每个 叶子节点 = 一个 item
  • 每个 非叶子节点 = 一组 item 的集合

例如:

               Root
          /               \
      Node A             Node B
     /       \           /       \
  item1    item2     Node C     item6
                      /   \
                  item3  item4

2️⃣ 树的数学表示

  • 树深度:(L)
  • 每个 item 对应一条路径:

\( \pi(i) = (n_0, n_1, \dots, n_L) \)

其中:

  • (n_0):根
  • (n_L):item 对应叶子

五、TDM 的概率分解(最关键的公式)

这是 TDM 的灵魂

传统目标:

\( P(i \mid u) \)

TDM 把它拆成:

\(P(i \mid u) = \prod_{l=1}^{L} P(n_l \mid u, n_{l-1})\)

解释人话版:

  • 用户 u

  • 从根开始

  • 每一层只判断:

    “在当前节点下,我该往哪个子节点走?”


对比一下复杂度

  • 原来:
    \( O(N) \)
  • 现在:
    \( O(L \cdot B) \approx O(\log N) \)

(B 是每层分支数)


六、每一层在干嘛?(模型结构)

在第 (l) 层:

  • 输入:

    • 用户向量$ ( \mathbf{u} )$
    • 当前节点向量 \(( \mathbf{v}*{n*{l-1}} )\)
  • 输出:

    • 子节点的概率分布

一个典型打分函数:

\( s(u, n) = \mathbf{u}^\top \mathbf{v}_n \)

Softmax(在兄弟节点内):

\(P(n_l \mid u, n_{l-1})=\frac{e^{s(u,n_l)}}{\sum_{c \in \text{Children}(n_{l-1})} e^{s(u,c)}}\)

👉 注意:
softmax 只在“兄弟节点”里算,不是全局。


七、TDM 是怎么训练的?

1️⃣ 训练数据

每条样本是:

\( (u, i) \)

但我们把它变成:

\( (u, \pi(i)) \)

也就是:

  • 用户
  • item 对应的整条树路径

2️⃣ Loss 函数(路径级)

\(\mathcal{L}= \sum_{l=1}^{L} \log P(n_l \mid u, n_{l-1})\)

直觉解释:

  • 每一层都要“走对”
  • 走错一层,item 就找不到了

3️⃣ 为什么训练稳定?

  • 每一层是 小 softmax
  • 梯度干净
  • 不会被百万 item 稀释

八、推理阶段(在线召回)

从根开始:

  1. 在 root 选 top-K 子节点
  2. 对每个子节点继续往下走
  3. Beam Search / 贪心

复杂度:

\( O(K \cdot L) \)

👉 非常适合在线服务。


九、新 item 怎么挂载?

“TDM 树里边新 item 挂载:找特征最相似的叶子节点路径,相当于给这个新 item 一个更合理的起点”

这句话 完全正确


新 item 挂载的做法

1️⃣ 先算 item embedding

\( \mathbf{e}_{new} \)

2️⃣ 从 root 开始找最相似路径

在第 (l) 层:

$n_l^*=\arg\max_{c \in \text{Children}(n_{l-1})} \mathbf{e}_{new}^\top \mathbf{v}_c $

3️⃣ 一直走到叶子

这条路径:

\( \pi(i_{new}) \)

就是新 item 的初始位置。


为什么这一步非常重要?

  • 冷启动 item:

    • 如果随机挂
    • 召回几乎为 0
  • 语义挂载:

    • 继承“相似 item 的流量路径”
    • 召回立刻可用

十、TDM vs 你熟悉的那些东西(统一视角)

场景 本质
NLP 扩词表 新 token 找相似 embedding 初始化
CLIP 视觉词汇 新视觉概念落到语义空间
Q-Former 从已有 token 中挑
TDM 在树结构里给新 item 找“合理位置”

一句话统一:

不要从随机点开始学习,要从“语义正确的位置”开始。


十一、一句话“面试 / 评审级总结”

你可以直接这么说:

TDM 将大规模 item 召回建模为树路径预测问题,通过概率分解把 O(N) 的分类复杂度降为 O(log N),并允许新 item 通过语义相似路径挂载,实现高效、可扩展的推荐召回。


posted @ 2026-02-03 09:59  stardsd  阅读(44)  评论(0)    收藏  举报