2. Dynamic Weight(DW),“动态权重”
这个内容源自大佬的一篇文章:推荐算法的新范式https://zhuanlan.zhihu.com/p/500934745, Dynamic Weight 模式是在传统的“特征”和“结构”之外开辟了一条新的技术路线,即在DNN Weight上做文章。
将“场景敏感”特征z,喂入一个小网络,输出一个向量W,即
把W reshape成一个子模型 Dynamic Weighted Network(DWN)。比如,W一共640维, 640=32×16+16×8 ,从而可以reshape成一个32->16->8的三层MLP。
拿以上根据 “场景敏感”特征动态生成权重的DWN, 接入整个推荐模型的关键位置。即 ,注意这个动态网络的输入是x,就是普通特征,场景敏感和非敏感都包括。(上面的意思就是把这个场景敏感的特征 单独 处理一遍?没理解,看下面的分析)
优点:
1).各个场景的数据还是合在一起训练的,模型参数也只有一套,方便线上维护。而且共享的模型参数,也允许数据丰富场景学习到的知识,向数据稀少的场景迁移。(不同场景的数据或者网络具体是怎么配合的呢?)
2).前文已经讲到过了,“场景敏感” 特征如果和其它特征一样喂入DNN的最底层,很容易就“泯然众人矣”。这些“场景敏感”特征的信息,在层层向上传递过程中,被其他特征所干扰,无法对最终预测结构产生多少影响。 而DW模式特别突出了“场景敏感”特征的作用,让它们像一个“滤波器”控制住了其他信息的向上传递通道。其他信息向上传递过程中,都要经过“场景敏感”特征的“调制”,根据不同场景,对前一层发现的模式局部放大或衰减。(这块没看懂,敏感和非敏感的特征放在一起,没起到特殊对待敏感特征的作用啊。)而且在将动态产生的权重reshape成DWN的过程中,DWN层与层之间可以插入非线性的激活函数,从而允许实现 比较 复杂的“调制”功能。
2.1 重新理解一遍大佬的思维:
文中大佬的思维是:不是把场景敏感特征单独处理一遍,正确的流程是两条路,完全分开:
- 场景敏感特征 z→ 走小网络 →生成另一层网络的权重 W(场景特征z不参与预测,只负责“造网络”)→ 把 W reshape 成一个MLP 的权重(比如 32→16→8)→这就叫 DWN(动态权重网络)
- 普通特征 x(含敏感 + 不敏感)→ 走W 构成的网络前向传播(z造出来的网络)→ 输入DWN→ 用刚才 z 生成的权重做前向→ 得到输出
2.1.1 敏感和非敏感的特征放在一起的x,如何起到特殊对待敏感特征?
所有特征 x(敏感 + 非敏感全部混在一起)作为输入数据,喂进上面【z 生成的 DWN 网络】里计算。DW 让场景敏感 z (单独支路、用来生成 DWN 权重 W 的那个 z)像滤波器,控制其他信息向上传递,对模式放大 / 衰减。(DWN每一层权重都是 z 生成的,x 每乘一次权重,就是被 z 调制一次),整个网络怎么算 x,完全由 z 说了算。
比如:
深夜场景z1 → 网络权重变成【放大点击偏好、衰减兴趣特征】
白天场景z2 → 网络权重变成【放大商品特征、衰减点击偏好】
2.1.2 那这样对 普通特征公平吗,岂不是全 特殊对待 敏感特征了?
翻译一下我的疑问:
z 都能控制整个网络了,那普通特征还有话语权吗?公平吗?岂不是全听 z 的了?
回答:DW 确实是【刻意偏心、特殊优待】场景敏感特征,但不是废掉普通特征,而是让场景敏感特征当「裁判 / 滤波器」,普通特征当「选手」;而且这种偏心是合理的,反而比传统方式更公平。
但并不是全听z的,真实逻辑是:
z 控制的是「怎么解读普通特征」,不是直接代替普通特征!z不直接输出结果。
z 决定:普通特征在当前场景下,应该重视什么、忽略什么、放大什么、衰减什么
普通特征没有被删掉、没有被忽略、没有权重被强制置 0。普通特征依然是预测主体,只是不再一刀切统一权重。
场景敏感特征 z 拥有【调制权 / 控制权】,普通特征拥有【信息权】;
- z:管规则、权重、滤波、放大衰减(高阶控制权)
- x:管具体内容、偏好、匹配信息(预测主体)
没有 x,z 啥也预测不出来;没有 z,x 就是不分场景的傻瓜模型。
二者是控制 + 被控制,不是取代 + 被取代。
z 从头到尾,永远不会直接输出 CTR 预测!
z 只做一件事:
z → 进小网络 → 生成DWN 网络的权重 Wz只造网络,不做预测z 永远不输出最终点击率、转化率。这就是:z 不直接输出结果。
传统模式:场景特征 地位太低,被普通特征淹没。DW模式:把场景特征地位提升到网络控制器级别,用来修正普通特征的表达。属于抬升弱势特征地位,不是打压强势普通特征。
2.1.3 什么场景 适合这种 处理 模式呢?
1).多场景混合训练,场景之间差异巨大
不同场景用户行为逻辑完全不一样:
白天 / 深夜
首页推荐 / 搜索页 / 购物车页
新用户 / 老用户 / 沉睡召回用户
WiFi 环境 / 流量环境
安卓 /iOS
一线城市 / 下沉市场
2).场景特征是强 Bias,但直接喂底层会被淹没
就是你笔记里的强 bias 特征:时段、渠道、曝光场景、用户分层、流量来源……这种特征很重要,但很弱、很稀疏、特征值很小直接塞进 DNN 底层,会被用户 ID、商品 ID、历史行为淹没(泯然众人矣)。
3).跨场景数据分布不均衡(冷启动 / 长尾场景)
主场景数据极多
小场景、长尾场景、新场景数据极少
传统模型:模型只会学大数据场景,小场景直接废掉
4).同一个特征,在不同场景作用完全相反
举例真实业务:
价格特征:白天负向(越便宜越点),深夜正向(贵的反而点)
历史 CTR 偏置:首页权重高,搜索页权重低
行为序列特征:新用户重要,老用户不重要
传统模型只能学一个平均权重,学不出这种反向规律。
5).序列很长、特征很多,需要轻量化自适应调制
不想做多塔模型(多套模型,线上巨难维护)不想分场景单独训练(无法迁移、资源爆炸)想要:一套模型 + 场景自适应
6).【不适合 DW】的场景
单一场景、没有场景区分 → 完全没必要
场景特征很弱、几乎没用 → DW 白做
愿意做多塔、多模型分场景训练 → 不用 DW
追求极致简单、不想加复杂动态网络结构
3. 权重的乘法 有哪几种形式
一、先统一符号(你在论文里只会看到这 4 种)
1. 普通点乘· 或 直接写一起:矩阵/向量乘法(线性代数乘法)
2. 圆圈点 ⊙:按元素相乘(哈达玛积)
3. 上标 T 转置 ·^T:向量内积
4. 〈·,·〉尖括号:也是内积,和点乘一样
深度学习 / DCN 里,点乘 = 内积,点积=内积
向量・向量这种乘法 =点乘 = 内积 = dot product 结果是:一个数字(标量)
矩阵・向量 / 矩阵・矩阵 这叫矩阵乘法,不叫内积
向量 ⊙ 向量这叫按位乘 / 哈达玛积 结果是:同维度向量
公式口诀:
3.1. 向量内积(点积)(点乘)
形式:
或
输入:两个同维度向量
运算:对应位置相乘再相加
输出:一个标量(数字)
例子:
在DCN v1 里就是这个:得到一个数,再去乘。
点乘 = 内积,只是名字不同。
1.1 为什么论文里写成
?
因为严格线性代数里:
a是列向量(d,1)
是行向量(1,d)
= 一行 乘以一列 = 一个数, 本质还是点积 / 点乘。
总结:点乘 或者 点积的 本质是,输入是两个向量,输出是一个数。(乘完再加 → 一个数)
3.2. 矩阵 × 向量
形式:
输入:矩阵,向量
运算:标准矩阵乘法
输出:一个同维度向量
DCNV2 用的就是这个,把原来的向量 w 换成矩阵 W。
3.3. 按元素相乘(哈达玛积), 按位乘
- 数学正式名:哈达玛积
- 深度学习 / 代码里:按元素相乘
- 口语 / 直观叫法:按位乘
- 在DIEN论文中,绝大多数GRU/LSTM论文,以及早期的深度学习文献中,使用的符号是
,现在很多新论文,一些数学/工程文献中更偏好这个符号
,为了和【函数复合】的
区分开。
符号:
输入:两个同形状向量/矩阵
运算:每个位置自己乘自己
输出:形状不变
DCN 整个系列都大量用这个:
总结:两个同形状向量 / 矩阵,每个位置自己乘自己,只乘不加,输出形状不变。
按位乘 / 按元素相乘 / 哈达玛积:两向量 →同形状向量
3.4. 外积(你在特征交叉里会遇到)
形式:
输入:两个向量
输出:矩阵
作用:显式做二阶交叉(DeepFM、FM 核心)
3.4.1. 放在 DCN 里,帮你彻底对应上
DCN v1
先算内积 → 得到一个数
再和 按位乘
所以:所有维度共用同一个系数
DCN-V2
矩阵乘向量 → 得到一个 d 维向量
再和按位乘
所以:每个维度有自己独立系数
3.4.2 外积在二阶特征交叉中的使用
外积:
就是把两个特征的embedding做外积,生成一个矩阵,这个矩阵的每一个位置,都代表特征i 和 特征 j 的交叉项。在模型里的作用只有一句话:显式、暴力、完整地学习所有二阶特征交叉。
3.4.2.1. 外积长什么样
假设两个embedding都是3维
,
外积:
输入:两个k维向量
输出: