特征交叉系列:DCN-Mix 混合低秩交叉网络理论和实践
DCN-Mix和DCN-V2的关系
DCN-Mix(a mixture of low-rank DCN)是基于DCN-V2的改进版,它提出使用矩阵分解来降低DCN-V2的时间空间复杂度,又引入多次矩阵分解来达到类似混合专家网络MOE的效果从而提升交叉层的表征能力,若读者对DCN-V2不甚了解可以参考上一节[特征交叉系列:Deep&Cross(DCN-V2)理论和实践]做知识铺垫。
DCN-V2权重矩阵的低秩性和矩阵分解
在DCN-V2中核心的参数是交叉层的权重矩阵W,该参数是M×M的方阵,其中M是所有输入embedding拼接后的向量总长度,每一层交叉之间W不共享,W矩阵需要学习的参数数量能占到所有参数量的70%以上,而进一步作者发现随着网络的训练,W矩阵的奇异值出现快速下降呈现出低秩特性,代表该矩阵存在信息冗余,因此可以考虑通过矩阵分解来进行特征提取和信息压缩。
在PyTorch中可以通过torch.linalg.svd计算出矩阵的奇异值,例如
>>> a = torch.tensor([[1, 1], [1, 1.1]])
>>> u, s, v = torch.linalg.svd(a)
>>> print(s)
tensor([2.0512, 0.0488])
其中s是对角阵,斜对角线上的值就是奇异值,a矩阵的第二行几乎可以从第一行线性变换而来,因此s各位置上的奇异值差距极大,第一个奇异值基本携带了全部的矩阵信息。
在DCN-V2的训练代码里面,打印出第一个交叉层初始化的W矩阵和训练早停后W矩阵的奇异值,奇异值的长度和输入长度M一致,代码如下
# 初始化时
model = DCN(field_num=10, feat_dim=72, emb_num=16, order_num=2, dropout=0.1, method='parallel').to(DEVICE)
init_s = torch.linalg.svd(model.cross_net.cell_list[0].w)[1].cpu().detach().numpy().tolist()
# 早停时
if early_stop_flag:train_s = torch.linalg.svd(model.cross_net.cell_list[0].w)[1].cpu().detach().numpy().tolist()break
奇异值列表中元素大小逐个递减,对init_s和train_s分别做最大最小归一化,要求第一个奇异值归因化为1,
init_s = [(x - min(init_s)) / (max(init_s) - min(init_s)) for x in init_s]
train_s = [(x - min(train_s)) / (max(train_s) - min(train_s)) for x in train_s]
然后做图看一下初始矩阵的奇异值和收敛后的奇异值的各个位置元素的大小情况
import matplotlib.pylab as plt
plt.scatter(list(range(len(init_s))), init_s, label='init', s=3)
plt.scatter(list(range(len(train_s))), train_s, label='learned', s=3)
plt.legend(loc=0)
plt.show()

init和learned奇异值下降对比
相比于初始化阶段(蓝线),模型收敛后(橙线)的W矩阵奇异值急速下降,说明头部的奇异值已经携带了大部分矩阵信息,W矩阵可以考虑做压缩。
在论文中作者将W分解为U,V两个矩阵的相乘,其中U,V都是维度为[M, R]的二维矩阵,M和输入等长,R<=M/2,公式如下

矩阵分解
此时一个交叉权重的参数数量由M平方降低为2×MR。
DCN-Mix的混合专家网络
DCN-Mix使用矩阵UV分解来逼近原始的交叉矩阵W,受到MOE(Mixture of Experts)混合专家网络的启发,作者对W进行多次矩阵分解,单个矩阵分解相当于单个专家网络(Expert)在子空间学习特征交叉,再引入门控机制(Gate)对多个子空间的交叉结果进行自适应地融合,从而提高交叉层的表达能力,DCN结合MOE的示意图如下

MOE示意图
其中该层的输入Input x分别进入n个Expert专家网络,专家网络中包含UV矩阵相乘,同时Input x输入给一个门控网络Gate+Softmax输出n个权重标量,最后Input x会和加权求和的专家网络结果做残差连接。
将矩阵分解和MOE结合起来形成最终的交叉层公式如下

结合MOE的矩阵分解交叉层
相比于DCN-V2,等号左侧的哈达玛积部分改为了一个Σ加权求和的UV矩阵逼近,而右侧的残差连接放到最后和MOE的结果一起做残差连接。
DCN-Mix在PyTorch下的实践
本次实践的数据集和上一篇特征交叉系列:完全理解FM因子分解机原理和代码实战一致,采用用户的购买记录流水作为训练数据,用户侧特征是年龄,性别,会员年限等离散特征,商品侧特征采用商品的二级类目,产地,品牌三个离散特征,随机构造负样本,一共有10个特征域,全部是离散特征,对于枚举值过多的特征采用hash分箱,得到一共72个特征。
DCN-Mix的PyTorch代码实现如下
class Embedding(nn.Module):def __init__(self, feat_num, emb_num):super(Embedding, self).__init__()self.embedding = nn.Embedding(feat_num, emb_num)nn.init.xavier_normal_(self.embedding.weight.data)def forward(self, x):# [None, filed_num] => [None, filed_num, emb_num] => [None, filed_num * emb_num]return self.embedding(x).flatten(1)class DNN(nn.Module):def __init__(self, input_num, hidden_nums, dropout=0.1):super(DNN, self).__init__()layers = []input_num = input_numfor hidden_num in hidden_nums:layers.append(nn.Linear(input_num, hidden_num))layers.append(nn.BatchNorm1d(hidden_num))layers.append(nn.ReLU())layers.append(nn.Dropout(p=dropout))input_num = hidden_numself.mlp = nn.Sequential(*layers)for layer in self.mlp:if isinstance(layer, nn.Linear):nn.init.xavier_normal_(layer.weight.data)def forward(self, x):return self.mlp(x)class CrossCell(nn.Module):"""一个交叉单元"""def __init__(self, input_num, r):super(CrossCell, self).__init__()self.v = nn.Parameter(torch.randn(input_num, r))self.u = nn.Parameter(torch.randn(input_num, r))self.b = nn.Parameter(torch.randn(input_num, 1))nn.init.xavier_normal_(self.v.data)nn.init.xavier_normal_(self.u.data)def forward(self, x0, xi):# [None, emb_num] => [None, emb_num, 1]xi = xi.unsqueeze(2)x0 = x0.unsqueeze(2)# [r, input_num] * [None, emb_num, 1] => [None, r, 1]# [input_num, r] * [None, r, 1] => [None, emb_num, 1]xii = (torch.matmul(self.u, torch.matmul(self.v.t(), xi)) + self.b) * x0return xii # [None, emb_num, 1]class MOECrossCell(nn.Module):def __init__(self, input_num, r, k):super(MOECrossCell, self).__init__()self.k = kself.cross_cell = nn.ModuleList([CrossCell(input_num, r) for i in range(self.k)])self.gate = nn.Linear(input_num, self.k)nn.init.xavier_normal_(self.gate.weight.data)def forward(self, x0, xi):# [None, emb_num] => [None, emb_num, 1]xii = xi.unsqueeze(2)export_out = []for i in range(self.k):cross_out = self.cross_cell[i](x0, xi)# [[None, emb_num, 1], [None, emb_num, 1], [None, emb_num, 1], [None, emb_num, 1]]export_out.append(cross_out)export_out = torch.concat(export_out, dim=2) # [None, emb_num, 4]# [None, k] => [None, 1, k]gate_out = self.gate(xi).softmax(dim=1).unsqueeze(dim=1)# [None, emb_num, 4] * [None, 1, k] = [None, emb_num, k] => [None, emb_num, 1]out = torch.sum(export_out * gate_out, dim=2, keepdim=True)out = out + xii # [None, emb_num, 1]return out.squeeze(2)class CrossNet(nn.Module):def __init__(self, order_num, input_num, r, k):super(CrossNet, self).__init__()self.order = order_numself.cell_list = nn.ModuleList([MOECrossCell(input_num, r, k) for i in range(order_num)])def forward(self, x0):xi = x0for i in range(self.order):xi = self.cell_list[i](x0=x0, xi=xi)return xiclass DCN(nn.Module):def __init__(self, field_num, feat_dim, emb_num, order_num, r=16, k=4, dropout=0.1, method='parallel',hidden_nums=(128, 64, 32)):super(DCN, self).__init__()input_num = field_num * emb_numself.embedding = Embedding(feat_num=feat_dim, emb_num=emb_num)self.dnn = DNN(input_num=input_num, hidden_nums=hidden_nums, dropout=dropout)self.cross_net = CrossNet(order_num=order_num, input_num=input_num, r=r, k=k)if method not in ('parallel', 'stacked'):raise ValueError('unknown combine type: ' + method)self.method = methodlinear_dim = hidden_nums[-1]if self.method == 'parallel':linear_dim = linear_dim + input_numself.linear = nn.Linear(linear_dim, 1)nn.init.xavier_normal_(self.linear.weight.data)def forward(self, x):emb = self.embedding(x) # [None, field * emb_num]cross_out = self.cross_net(emb) # [None, input_num]if self.method == 'parallel':dnn_out = self.dnn(emb) # [None, input_num]out = torch.concat([cross_out, dnn_out], dim=1)else:out = self.dnn(cross_out) # [None, input_num]out = self.linear(out)return torch.sigmoid(out).squeeze(dim=1)
在CrossCell模块中完成了一个给予UV逼近的交叉操作,在MOECrossCell模块中完成了MOE和残差连接,其中export_out和gate_out分别为专家网络的输出和门控机制的权重。
本例全部是离散分箱变量,所有有值的特征都是1,因此只要输入有值位置的索引即可,一条输入例如
>>> train_data[0]
Out[120]: (tensor([ 2, 10, 14, 18, 34, 39, 47, 51, 58, 64]), tensor(0))
x的长度为10代表10个特征域,每个域的值是特征的全局位置索引,从0到71,一共72个特征。
DCN-Mix调参和效果对比
对阶数(order_num)和融合策略(method)这两个参数进行调参,分别尝试1~4层交叉层,stacked和parallel两种策略,采用10次验证集AUC不上升作为早停条件,验证集的平均AUC如下
| DCN调参AUC | 并行parallel | 串行stacked |
|---|---|---|
| 1层交叉(2阶) | 0.6345 | 0.6321 |
| 2层交叉(3阶) | 0.6328 | 0.6323 |
| 3层交叉(4阶) | 0.6331 | 0.6333 |
| 4层交叉(5阶) | 0.6340 | 0.6331 |
结论依旧是parallel效果好于stacked,其中一层交叉的并行parallel达到验证集最优AUC为0.6345。
再对比一下之前文章中实践的FM,FFM,PNN,DCN-V2等一系列算法,验证集AUC和参数规模如下
| 算法 | AUC | 参数量 |
|---|---|---|
| FM | 0.6274 | 361 |
| FFM | 0.6317 | 2953 |
| PNN* | 0.6342 | 29953 |
| DeepFM | 0.6322 | 12746 |
| NFM | 0.6329 | 10186 |
| DCN-parallel-3 | 0.6348 | 110017 |
| DCN-stacked-3 | 0.6344 | 109857 |
| DCN-Mix-parallel-1 | 0.6345 | 54501 |
| DCN-Mix-stacked-3 | 0.6333 | 97869 |
使用矩阵分解逼近策略的DCN-Mix略低于原生的DCN-V2,但是还是超越一众FM系列的算法,其中以同样是三层交叉的stacked DCN为例,DCN-Mix的参数量相比于DCN-V2有所降低,也印证了论文中提到的“在模型效果和部署延迟之间找到一个平衡”。
最后的最后
感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。
因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

四、AI大模型商业化落地方案

五、面试资料
我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关文章:
特征交叉系列:DCN-Mix 混合低秩交叉网络理论和实践
DCN-Mix和DCN-V2的关系 DCN-Mix(a mixture of low-rank DCN)是基于DCN-V2的改进版,它提出使用矩阵分解来降低DCN-V2的时间空间复杂度,又引入多次矩阵分解来达到类似混合专家网络MOE的效果从而提升交叉层的表征能力,若读者对DCN-V2不甚了解可…...
python项目(豆瓣电影)
目录 1、项目效果 2、项目源码 3、技术实现 4、总结 前言 我的这个项目是做的一个豆瓣电影爬取,爬取了豆瓣电影的TOP排行榜的数据 包括电影的名称 演员 评分 评价人数等等 运用了TK布局助手 布了4个界面 有登录 注册 首页 详情 注意:项目并没有连接数…...
精选网络安全书单:打造数字世界的钢铁长城!
目录 1.前言 2.书单推荐 2.1. 《内网渗透实战攻略》 2.2. 《Kali Linux高级渗透测试(原书第4版)》 2.3. 《CTF那些事儿》 2.4. 《权限提升技术:攻防实战与技巧》 2.5. 《数字政府网络安全合规性建设指南:密码应用与数据安全…...
Ubuntu由于没有公钥,无法验证下列签名。
其他操作系统报错也一样处理,我kali的也是这样解决的。 使用sudo apt update时出现以下错误: 3B4FE6ACC0B21F32就是公钥,每个人的不一样,注意看自己的报错信息 :~$ sudo apt update [sudo] ts 的密码: 命中:1 http:…...
水库安全监测系统:智慧水文动态监测系统
TH-SW2水库安全监测系统,作为一款智慧水文动态监测系统,其在现代水利管理中扮演着至关重要的角色。该系统通过集成先进的数据采集、传输、处理和分析技术,为水库的安全运行提供了强有力的技术支撑。 水库安全监测系统是一种用于实时监测和记…...
下载centos7镜像及在VMware上安装Linux (Centos7)操作系统详细教程
文章目录 下载centos7镜像文件及在VMware上安装centos7详细教程一、下载Centos7镜像二、 利用VM安装Centos7进入VM软件安装配置虚拟机 安装Centos7进入图形化界面配置 三、访问外网 配置IP地址结语Linux配置IP网卡Linux配置本地yum源 下载centos7镜像文件及在VMware上安装cento…...
【全开源】考试答题系统源码(FastAdmin+ThinkPHP+Uniapp)
一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统,提供全部前后台无加密源代码,支持私有化部署。 📝考试答题系统:便捷高效的学习新选择💡 📚 考试答题系统是什么? 考试答题系统&…...
toB市场 | 我们喜欢赞助这样的展会活动
过去的六一儿童节,刚去成都参加了个行业内的展会。受护网行动、儿童节等等的影响,这次去成都的客户并不算太多,但会议延续了一贯的高品质,让我们收货满满。 选择目标受众来得多的展会 不同厂商会视自己的产品和模式、目标客户来…...
【学习笔记】Git常用命令
目录 Git常用命令1. git init (初始化一个新的Git仓库)2. git clone [url] (克隆远程仓库到本地计算机)3. git status (查看当前工作区的状态)4. git add [file] (将文件添加到暂存区࿰…...
【C/C++】IO流
目录 前言: 一,C语言的I/O流 二,C的I/O流 2-1,C标准IO流 2-2,IO流的连续输入 前言: “流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据…...
Vite5+Vue3整合Tailwindcss详细教程
创建vite项目 执行命令: npm create vite启动项目 npm install -g pnpm pnpm i pnpm dev浏览器访问 http://localhost:5174/ 整合Tailwindcss 安装依赖 pnpm install -D tailwindcss postcss autoprefixer初始化配置文件 npx tailwindcss init用webstorm打开…...
小程序 UI 风格魅力非凡
小程序 UI 风格魅力非凡...
【常用工具系列】Git 教程——从入门到大师
目录 前言一、Git 基础1-1、Git 简介与安装安装 Git 1-2、 Git 工作流程1-3、 Git 配置与管理用户配置查看配置 1-4、 Git 仓库操作克隆仓库推送更改拉取更新 1-5 Git 分支管理创建分支切换分支删除分支解决冲突 二、 Git 进阶2-0、 Git 标签使用创建标签查看标签检出标签推送标…...
每天坚持写java锻炼能力---第一天(6.4)
今天的目标是菜单: B站/马士兵的项目菜单 package java1;import java.util.Scanner;public class Test {public static void main(String[] args) {while(true){ //3.加入死循环,让输入一直有System.out.println();System.out.println("--->项…...
mysql 如何分布式部署
MySQL的分布式部署是一个涉及多个步骤和配置的过程,以确保数据库系统能够支持大规模数据存储、高并发访问和容错性。以下是MySQL分布式部署的主要步骤和要点,结合参考文章中的相关信息进行整理: 一、前期准备 环境准备: 选择合…...
Git的概念
Git 一些概念 **工作区:**电脑上你能看到的目录 **版本库:**工作区的隐藏目录.git。含 暂存区:git add后但未git commit的文件修改被添加到暂存区本地分支:git commit后,但未git push,即把暂存区的所有…...
【每日刷题】Day58
【每日刷题】Day58 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 3038. 相同分数的最大操作数目 I - 力扣(LeetCode) 2. 868. …...
Python 的七个HTTP请求库对比
Python HTTP请求库对比 库名称特点优点缺点requests简单易用的HTTP库,基于urllib3。- 语法简洁- 社区支持强大- 易于上手和维护- 阻塞式调用,不支持异步操作- 相比aiohttp体积较大http.clientPython标准库中的低级HTTP库。- 无需安装第三方库- 提供底层…...
顶顶通呼叫中心中间件-如何配置识别不同语种的ASR
文章目录 前言联系我们创建不同语种的语音识别任务开始对接识别不同语种的ASR重启 asrproxy 程序使用识别不同语种的ASR 前言 之前讲过顶顶通的 asrproxy 程序如何对接第三方的ASR,比如:阿里云的ASR。不知道如何对接的,可以参考:…...
C# SolidWorks 二次开发-显示配置
在 SolidWorks 的二次开发中,显示配置(Display States)是一个非常重要的功能。显示配置允许用户在同一个配置(Configuration)下保存不同的显示状态,如隐藏或显示的零件、不同的颜色和材质等。本文将向新的开…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
