# 4. 精排

## 4.1 推荐算法的五个维度

* 记忆与扩展
* Embedding
* 高维稀疏的类别特征
* 交叉结构
* 用户行为序列建模

## 4.2 交叉结构

### FTRL：传统时代的记忆大师

* 技术要求：online learning、特征稀疏
* FTRL：为了减少单个样本的随机扰动，最优参数，是让之前所有步骤的损失之和最小
  * 引入代理损失函数：$$\mathbf{w}*{t+1}=\operatorname{argmin}*{\mathbf{w}}\left\[\mathbf{g}*{1: t} \cdot \mathbf{w}+\frac{1}{2}\left(\sum*{s=1}^t \sigma\_s\left|\mathbf{w}-\mathbf{w}\_s\right|\_2^2\right)+\lambda\_1|\mathbf{w}|\_1+\frac{1}{2} \lambda\_2|\mathbf{w}|\_2^2\right]$$
  * 每个特征独立设置步长：$$\eta\_{t, i}=\frac{\alpha}{\beta+\sqrt{\sum\_{s=1}^t \mathbf{g}\_{s, i}^2}}$$

### FM：半脚迈入 DNN 的门槛

* Embedding + 自动二阶交叉：$$logit\_{FM}=b+\sum\_{i=1}^n w\_i x\_i+\sum\_{i=1}^n \sum\_{j=i+1}^n\left(v\_i \cdot v\_j\right) x\_i x\_j$$
  * 参数 $$n^2$$ → $$nk$$，数据利用率高、训练充分
  * 提升了模型的扩展性

### Wide & Deep：兼顾记忆与扩展

* Deep（DNN）：Embedding + MLP，高阶隐式交叉（扩展性、多样性）
* Wide（LR）：强于记忆，防止 Deep 过分扩展影响精度，类似正则（查缺补漏）
* 共同训练：$$CTR\_{predict}=sigmoid(logit\_{wide}+logit\_{deep})$$
  * Wide - FTRL，Deep - Adagrad / Adam / ...

### DeepFM：融合二阶交叉

* 自动特征交叉，Wide 侧增加 FM
* DeepFM：$$CTR\_{predict}=sigmoid(logit\_{lr}+logit\_{fm}+logit\_{dnn})$$
  * Deep：$$logit\_{dnn}=DNN(Concat(Embedding(\mathbf{x}\_{dnn})))$$
  * FM：$$logit\_{fm}=FM(\mathbf{x},Embedding(\mathbf{x}\_{dnn}))$$，与 Deep 共享 / 独立
  * LR：$$logit\_{lr}=\mathbf{w}*{lr}\cdot\mathbf{x}*{lr}$$，强于记忆，防止过分扩展的正则化

### DCN：不再迷信 DNN

* DCN (Deep & Cross Network) ：隐式交叉结构
  * DCN V1：对于 L 层，相当于所有元素 $$\le L+1$$ 阶的交叉
    * 每个 cross layer，$$\mathbf{x}\_{l+1}=\mathbf{x}\_0 \mathbf{x}\_l^T \mathbf{w}\_l+\mathbf{b}\_l+\mathbf{x}\_l$$
  * DCN V2：原始输入长度大，只做信息交叉（而不是压缩和提炼）
    * 参数容量有限，$$w\_l$$ 替换为 $$d\times d$$ 矩阵 $$W\_l$$，$$\mathbf{x}\_{l+1}=\mathbf{x}\_0 \odot\left(\mathbf{W}\_l \mathbf{x}\_l+\mathbf{b}\_l\right)+\mathbf{x}\_l$$
    * 原始输入 $$x\_0$$ 长度很大，还提出将大矩阵 $$W\_l$$ 分解成两个 $$d\times l$$ 的矩阵相乘
* DCN 与 DNN 融合
  * 串联：DCN → DNN
  * 并联：DCN + DNN

### AutoInt：借用 Transformer 特征交叉

* Transformer：$$\operatorname{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V})=\operatorname{softmax}\left(\frac{\mathbf{Q K}^T}{\sqrt{d\_k}}\right) \mathbf{V}$$，采用 multi-head 机制增强表达能力
  * 将一系列 Value 压缩成一个 Embedding，压缩方式根据 Query
  * 对 Value 序列加权求和，权重就是 Query 和 Key 的相关程度
* AutoInt
  * 步骤
    * 准备各 field 的 embedding
    * 组成 \[B,M,d] 的矩阵 X，套用 transformer
    * 多层 transformer 的结果仍然是 \[B,M,d] 矩阵，拼接喂给浅层 DNN
  * 缺点
    * 为了使用 self-attention，要求 field embedding 长度相等
    * 对信息只交叉不压缩，每层输出都是 \[B,M,d]，时间开销不小
  * 实践：不独立预测，而只是作为一个模块，嵌入更大的模型（只选择部分重要特征）

## 4.3 用户行为序列建模

* 行为序列信息的构成
  * 每个视频 id 的 embedding
  * 时间差信息：距离现在时间差，分桶为整数，方便模型刻画时间衰减
  * 视频元信息（作者、来源、分类、标签等），动作程度（观看时长、观看完成度）
* 简单 pooling：sum / average / weighted-sum

### DIN：千物千面

* Deep Interest Network (DIN)：$$UE\_{u, t}=\sum\_{j=1}^H w\_j h\_j=\sum\_{j=1}^HA\left(h\_j, t\right) h\_j$$
  * 候选物料 t 作为 query，对用户历史序列做 attention（相似度权重）
  * 召回、粗排场景，user / item 解耦，可以用行为序列最后的 item 作为 query

### 建模序列内的依赖关系

* 双层 attention
  * self-attention：与前后历史行为交叉、关联
  * target-attention：套用 DIN，建模相关性，得到用户兴趣向量

### 建模长序列

* 在线提取用户兴趣：Search-based Intereset Model (SIM)
  * DIN 软过滤 \~O(L)，SIM 改用硬过滤，得到相关短序列 SBS
    * Hard Search：搜索相同属性的序列，数据库缓存（userId - category - SBS）
    * Soft Search：根据 item embedding 查找 ANN，组成 SBS
      * Embedding：用候选 item 和长期行为序列，构建小模型预测 CTR，得到 embedding
  * 缺点：实现复杂，耗时增加，工程难度大（维护缓存）
* 离线预训练用户兴趣
  * 人工统计长期兴趣，e.g. 某个标签过去 1 周/月的 CTR
  * 离线预训练辅助模型，提取用户长期兴趣
    * 预训练模型：输入长期行为序列，输出 embedding 代表用户长期兴趣
    * 行为序列较长的用户，都过一遍模型，将 embedding 存入 KV 数据库
    * 天级更新即可，短期兴趣留给 DIN、双层 attention 等模型学习
  * 预训练模型：双塔结构，cos(A用户长期, A用户短期) 越小越好，cos(A用户长期, B用户短期)
  * 优点：不会增加线上耗时，实现简单
  * 缺点：长期兴趣，不会随着候选无聊而变化
