P8 双塔模型 : 模型和训练
1.使用Embedding层将 用户与物品的ID 以及 离散特征映射为一个向量 , 连续特征则通过归一化,分桶等处理 转化为特征向量 .
2.将这些向量拼接起来 , 输入到神经网络 ( 可以是简单的全连接网络 也可以是 更复杂的结构)
3. 神经网络最终会输出一个向量 , 即 : 用户\物品的表征 (供召回使用)
双塔模型 :
左侧塔提取用户的特征 , 右侧的塔提取物品的特征 (与矩阵补充模型的不同 : 使用了ID之外的多种特征作为双塔的输入) .最终两个向量的余弦相似度用于预估用户对物品的兴趣 .
双塔模型的训练 :
1.pointwise : 独立看待每个正样本 , 负样本 , 做简单的二元分类 .
把召回看作是二元分类任务 ; 对于正样本 , 鼓励cos(a,b)接近+1 ;
对于负样本 , 鼓励cos(a,b)接近-1 ; 一般做法 : 控制正负样本数量为1:2 或 1:3 ;
2.pairwise : 每次取一个正样本 , 一个负样本 .
每一组的输入是一个三元组 :
在这里 , 两个物品塔的Embedding层 与 全连接层是相同的 (共享参数 )
用户与正样本的相似度越大越好 , 最好接近+1 ;
用户与负样本的相似度越小越好 , 最好接近-1 ;
基本想法 : 鼓励正样本的相似度大于负样本的相似度 ;
如果正样本的相似度大于(负样本的相似度+m) , 则没有损失 ;
否则 , 损失等于(负样本相似度+m) - 负样本相似度
3.listwise : 每次取一个正样本 , 多个负样本 .
一条数据包含 :
一个用户 , 特征向量记作 a .
一个正样本 , 特征向量记作 b+ ;
多个负样本 , 特征向量记作b1- , b2- ......bn- ;
训练时 , 鼓励a与正样本的余弦相似度尽量大 ; 鼓励a与负样本的余弦相似度尽量小 ;
(n+1个余弦相似度会先通过激活函数 , 得到n+1个分数 , 右侧为正负样本标签 , 表示鼓励正样本相似度接近1 , 负样本相似度接近于0 . ; 最后计算交叉熵得到损失函数 , 训练时最小化交叉熵表示鼓励S接近于Y .
P9 双塔模型 : 正负样本
正样本 : 曝光且有点击的用户-物品二元组 . ( 用户对物品感兴趣 )
存在的问题 : (2/8法则) 少部分物品占据了大部分点击 , 导致正样本大多是热门物品.
解决方案 : 过采样冷门物品 , 或者降采样热门物品 .
过采样 : 一个样本出现多次
降采样 : 一些样本被抛弃 .
负样本 :
简单负样本 :
1. 未被召回的物品 , 大概率是用户不感兴趣的 .
因为未被召回的物品 ≈ 全体物品 .
因此 , 可以直接从全体物品中作抽样 , 作为负样本 .
如何抽样 ? 均匀 or 非均匀
均匀抽样 : 对冷门物品不公平 . ( 正样本大多数是热门物品 , 如果采用均匀抽样 , 便会导致大部分负样本都是冷门物品 --> 导致 热门物品更热 , 冷门物品更冷 )
非均匀抽样 : 其目的是打压热门物品 .
负样本抽样概率与热门程度(点击次数)正相关 .
如: 抽样概率 正比于 (点击次数)0.75次方 这里的0.75是经验值
2.Batch内负样本 :
1个batch 内有n和正样本 , 一个用户和n-1个物品组成负样本 ;
因此 , 这个batch内共有n(n-1)个负样本 ; 这些都是简单负样本
困难负样本
1.被粗排淘汰的物品(比较困难) 2. 精排分数靠后的物品(非常困难)
双塔模型实际上可以看成是对正负样本做一个二元分类 :
若将全体物品作为负样本(简单 ) -> 分类准确率高
若将被粗排淘汰的物品(比较困难) 作为负样本 --> 容易分错
若将精排分数靠后的物品(非常困难)作为负样本 --> 更容易分错
工业界常用的做法 :
将不同难度的负样本混合起来作为训练数据 : 例如 : 50%的负样本是全体物品(简单负样本) , 50%的负样本是没通过排序的物品(困难负样本) .
常见的错误 : (将曝光但未点击的物品作为负样本训练召回)
曝光但未点击的物品通常作为负样本训练排序模型 .
召回的目标 : 快速找到用户可能感兴趣与不感兴趣的物品 . 排序的目标才是区分用户感兴趣与非常感兴趣的 .
有曝光但是没点击 : 说明已经是精排推荐给用户的物品了 , 很符合用户的兴趣 , 可能碰巧没有点击 , 若作为负样本训练召回 , 将产生负收益 .