DIN特征加权、POSO特征增强、SENET特征选择

本文转自:DIN、POSO、SENet 聊聊推荐模型中常用的Attention-腾讯云开发者社区-腾讯云

一、前言

聊起模型结构的时候,经常听做推荐的同学说:

"这里加了个self-attention" "类似于一个SENet" "一个魔改的POSO" "DIN就是一个attention" ......

这些常见的模块、模型,听完之后很多时候还是一知半解,看了几篇模型的知乎,感觉长得都挺像的,为了把这些模型都摸清楚,还是把论文都翻出来读了一遍。本文将以推荐系统中的特征选择为例聊聊这几个模型怎么做到模块化使用,并加上一些自己个人的理解,如有不对欢迎评论区指正!

二、推荐系统例子

先举一个常见推荐的例子,做推荐模型的大家应该都熟悉,最简单的数据通常包括两方面:用户特征、物品特征,以MLP模型为例,下图展示了基本流程,从数据的角度简单说一下下图,主要分为4部分:

  1. 原始数据:这里就是我们最原始的数据,字符串形式。
  2. Embedding数据:通过把原始数据hash成key,再构建一个词典,一个key对应一个初始化的dim维度的向量。此时注意,像【兴趣】这种特征,由于这个用户有3种,这里需要embedding成3个独立的向量,也就是"王者"、"音乐"、"交友"各一个向量。
  3. 聚合后的Embedding数据:聚合通常使用sum pooling(对应元素相加),也可以使用avg pooling(对应元素取均值)。这么做默认就是每个特征同样重要,比如【兴趣】里面,"音乐"和"交友"是相同权重的。如果一个特征里只有一个key,比如【年龄】、【性别】,那聚合之后相当于没有任何变化;如果是多个key,比如【兴趣】,那就会将多个key的Embedding聚合。
  4. MLP模型的Input数据:将上一步获得的5个向量按"头接屁股"的方式拼成一个长长的向量。

通过上面一通操作可以把:年龄:20,性别:……的数据转换成模型所需要的tensor。此时通常是(batchsize, feature_num, dim)的形式:

  1. batchsize是批大小,比如512;
  2. feature_num是特征数量,在上图中就是5;
  3. dim是每一个特征的维度,比如16。

为啥要把最基础的数据输入说这么清楚呢,因为后面要说的POSO、SENet、DIN进行特征选择,本质上就是在这个基础上改变的,下面分别解释这些模型(模块)。

3. SENet

先说说SENet,最初提出是在CV领域,模型目的按照作者的原话是:

Our goal is to ensure that the network is able to increase its sensitivity to informative features so that they can be exploited by subsequent transformations, and to suppress less useful ones. (目的是希望提高网络对特征的敏感性,更好的利用特征并抑制不太有用的特征)

于是便提出了以上的模型,如果放在推荐系统里面呢,上图的一些概念应该被替换:

  1. H(高)、W(宽)应该被替换成dim
  2. C(Channel)应该被替换成feature_num

放在上面的例子里面,整个过程如下:

1. SENet就是把初始数据为(batchsize, feature_num, dim)的特征先压缩成(batchsize, feature_num, 1)接着拿着这个压缩的特征过一个两层MLP,最后用sigmoid输出,得到一个(batchsize, feature_num, 1)形式的权重。

2. 接着拿着这个权重分别乘回每一个聚合后的Embedding,得到新的聚合后的Embedding数据。

如果按照SENet的原文的理解,应当就是这么处理,不难看出来,其实就是给feature_num的每个特征不同的权重。因为在推荐系统中,feature_num可以类比成CV里面的Channel。其实到这里就有一些疑问了:

  1. 为什么SENet在论文中是压缩两个维度(H、W),而上面的流程只压缩了dim? 答:因为图片有长宽、相比于推荐系统多一个维度,所以原生的SENet需要压缩两个维度。并且由于是两个维度原文压缩使用是avg pooling,在推荐里面只有一个维度可以使用dense层代替。
  2. 为什么是给feature_num的每个特征不同的权重,而不是dim?不能做成给不同元素不同的权重吗? 答:原生SENet目的是“解决卷积神经网络在处理图像时对于通道相关特征的建模能力不强的问题”,因此照搬过来的话就是给feature_num不同的权重。如果非要做成给不同元素不同的权重,即压缩成(batchsize, 1, dim)的形式,再做加权,个人认为也可以完全没有问题的。相当于是给不同的元素不同的权重。当然如果想做成gate net的形式也可以,那就是生成(batchsize, feature_num, dim)的tensor再做加权。
  3. 既然只加权不求和,理论上是不是可以在MLP里面就学习到这个信息,这么做会不会多余? 答:理论上来说确实可以在MLP里面学习到这个权重信息。就像万能近似定理一样,你不能说MLP理论上什么都能做我就只用MLP,别的啥都不加。毕竟在有限的数据情况下,人为先验增加一些复杂的模型结构可以帮助模型更好的拟合。所以这么做多不多余,还得试了看有没有效果再说。不排除在某些场景下加了跟没加一样,没有什么区别(狗头)。

最后总结一下,SENet的样式可以加在任何一个网络里面,只要你想给某一个维度下不同元素不同的权重。值得注意的是这里只加权,不求和。至于选哪个维度(feature_num还是dim)下的元素给不同权重,根据具体的业务理解来选择。

4. DIN

DIN是阿里针对用户行为特征所构建的模型。即当用户的的行为序列(比如点击序列)有多个itemid的时候,如果直接用sum pooling聚合,则默认这几个点击的item的权重是一样的。类比在第二章的图可以看出来,当一个特征域(比如【兴趣】)有多个特征的时候,常规的做法是sum pooling或者avg pooling。这样就会默认这几个特征的权重是一样的,DIN便是针对此问题,认为不同的特征应该有不同的权重,而这个权重就是用户的兴趣。

因此将DIN套在我们的例子上,过程如下:

  1. 选择一个有多个特征的特征域,比如【兴趣】,在选择一个与之对应或关联的特征,比如【物品类型】。接着用游戏的embedding(batchsize, 1, dim),和每一个兴趣的embedding(batchsize, 3, dim)进“激活单元”得到一个权重值(batchsize, 3, 1),代表Attention权重。至于“激活单元”是啥,可以参考DIN的论文,就是一个小门控网络,当然思路打开这里具体怎么实现激活单元可以各种尝试,论文的结构也不是一定的。

2. 接着把得到的权重替换之前的sum pooling,改成加权求和生成聚合Embedding,放回整个框架里面大致如下图所示。如果用算式表示大概就是: a+b+c升级成了(0.7×a)+(0.05×b)+(0.25×c) 相比之下后者显然优雅一些,而且这些权重是模型自动计算获得。

最后总结一下,简单的说完DIN的结构可以发现,和SENet比,DIN的Attention作用于“Embedding数据”这一层,也就是图中从下往上的第二层。所以从业务理解上面来说,DIN的Attention不是在做“特征选择”,而是对sum pooling的一个小小的升级,让特征表达的更准确。这里是加权、求和

5. POSO

最后说一下POSO的结构,相比于前面两个,POSO的出名程度可能要低一些。《POSO: Personalized Cold Start Modules for Large-scale Recommender Systems》,是快手在21年提出的论文,其主要是针对冷启动中的特征淹没的问题而在模型层面上提出的改进。以MLP为例,若MLP的尺寸是512 * 256 * 256的。即选一个人为认为比较重要的特征xpc去生成512、256、256三种不同的权值去乘进MLP网络内。

若放在我们的例子里,大致如下图所示,若MLP的尺寸是512 * 256 * 128的。取一个我认为比较重要的特征,比如【兴趣】作为xpc,然后过3个门控网络生成3个tensor,分别是(batchsize, 512, 1)(batchsize, 256, 1)(batchsize, 128, 1)。这里的门控网络可以是MLP+sigmoid的形式。当然也可以自己发挥魔改。最后将得到的三个tensor以乘法的形式乘进MLP网络里面,以实现对不同神经元的attention。

最后总结一下,POSO虽然看起来也是在做一种attention,但是它是对神经元来做,和以上两种又有所不同。POSO严格意义上来说不算一种特征选择,而是一种特征增强的策略。因此只要你觉得某个特征很重要,就把他拎出来整一下,说不定就有提升了呢~

6. 总结

以上三种模型结构都用到了类似attention的思想,所以attention是个啥呢?引用SENet原文的一句话:

Attention can be viewed, broadly, as a tool to bias the allocation of available processing resources towards the most informative components of an input signal. (从广义上讲,注意力可以看作是一种工具,用于将可用处理资源的分配偏向于输入信号信息量最大的组件。)

我个人理解就是“物尽其用”。网上也就很多说法,比如一种常见的说法就是attention就是加权求和的行业黑话,这么理解也未尝不可。至于怎么说,怎么做,无论学术界还是工业界都倾向于结果导向,有了好效果才是王道!

参考文献

SENet:http://dx.doi.org/10.1109/tpami.2019.2913372

DIN:http://dx.doi.org/10.1145/3219819.3219823

POSO:https://readpaper.com/paper/3190143440

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第6章 Mybatis高级查询(详解篇)

第6章 Mybatis高级查询_详解篇 1. 一对一映射1.1 自动映射(关联的嵌套结果映射)1.2 使用 resultMap 配置一对一映射resultMap复用1.3 association 标签的嵌套结果映射resultMap复用1.4 association标签的嵌套查询结构分析嵌套查询加载方式延迟记载注意事项延迟记载:利用@Respon…

[Visual Studio 报错] error 找不到指定的 SDK“Microsoft

[Visual Studio 2022 报错] error : 找不到指定的 SDK“Microsoft.NET.Sdk.Web” 问题描述: 在新电脑上安装了VS2022,打开现有项目的解决方案后的时候报了这个错,所有projet文件都加载失败,如图所示: 报错分析及解决 打开项目配…

经验丰富也被裁了,失业快2年找不到工作?

前几天徐工说,他有个邻居,最近逮到他总是要跟他扯上几句。 原因是徐工一直是做嵌入式开发,而他一直做纯软件开发,具体不知道做后端还是前端。 他说,他至少有半年没上班了,之前在一家龙头物流公司上班。 碰上…

Netty websocket配置wss

录音配置https 导致ws连不上 Slf4j Component public class NettyServer {/*** 启动** throws InterruptedException*/private void start() throws InterruptedException {bossGroup new NioEventLoopGroup();workGroup new NioEventLoopGroup();ServerBootstrap bootstrap…

STM32 HAL库F103系列之DAC实验(二)

DAC输出正弦波实验 实验简要 1,功能描述 通过DAC1通道1(PA4)输出正弦波,然后通过DS100示波器查看波形 2,使用定时器7 TRGO事件触发转换 TEN1位置1、TSEL1[2:0]010 3,关闭输出缓冲 BOFF1位置1 4,使用DMA模式 DMAE…

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略 导读:2024年4月23日,微软发布Phi-3,这是微软推出的一款新的开源AI模型家族Phi-3。背景痛点:小语言模型(SLM)尽管规模不大,但在语言理解、代码…

盲盒商城小程序(有米就出)

一款前端采用uniapp,后端采用Django框架开发的小程序,包含后台管理,如有人需要可联系演示功能(个人开发,可商用/学习)。 部分截图如下:

设备驱动-随记

1. dma_alloc_coherent函数是用于在Linux内核中为设备驱动程序分配用于DMA操作的内存区域的函数。DMA是指通过外部设备直接访问系统内存的过程,它通常用于设备之间的数据传输,比如网络数据包的接收和发送,磁盘I/O等。 这个函数在linux/dma-…

【刷题】C++ 版刷题指南

C 刷题指南(自用) 小tips:includestruct节点io输入输出练习其它 库输入迭代器stringvectordeque(双端队列)优先队列priority\_queue优先队列 tuple优先队列 结构体(自定义排序) mapsetpairtup…

文件摆渡:安全、高效的摆渡系统助力提升效率

很多组织和企业都会通过网络隔离的方式来保护内部的数据,网络隔离可以是物理隔离,也可以是逻辑隔离,如使用防火墙、VPN、DMZ等技术手段来实现,隔离之后还会去寻找文件摆渡方式,来保障日常的业务和经营需求。 进行网络隔…

Python的一些高级用法

Python的高级用法涵盖了更深入的编程技巧、设计模式、并发编程、性能优化等方面。以下是Python的一些高级用法: 1.装饰器 用于修改函数或类的行为的函数,常用于日志记录、性能分析等。 def my_decorator(func):def wrapper():print("Something i…

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中,数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时,必须谨慎考虑变更对数据可能产生的后果,以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况,我们必须迅速将数据库恢复到变更…

jsp+springboot+java二手车交易管理系统258u6

设计而成的系统要有以下目标:管理员和用户能够跳转到不同的页面当中。因此要把系统的目标设置为如下几项: (1) 系统在操作上不能过于复杂。 (2) 用户对应着不同的角色 (3) 设计完成的数据库要有能够处理并发和安全的作用 (4) 设计完成的管理…

Python——目标检测标签中的英文名转化为对应的类别编号

Yolov5进行目标检测流程在下文中已做说明: Python——一文详解使用yolov5进行目标检测全流程(无需gpu)_yolo不用gpu-CSDN博客 在Yolov5使用中中,标签数据里类别的中文名,需要转换成类别编号。相关代码如下&#x…

亚马逊云科技提高企业生产力神器Amazon Q评测分析

一年一度的全球云计算春晚,亚马逊云科技Re:invent在2023年11月27于Vegas震撼来袭,其中最令人关注的就是CEO Adam在Keynote中分享的内容。其中一个新内容就是提升生产力神器: Amazon Q,可以说它重新定义了企业的工作模式。那具体它神在哪里呢&…

设计模式- 代理模式(Proxy Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

Python构建学生信息管理系统:网站路由补充和首次运行

在之前的内容中,我们已经完成了学生信息管理系统(Student Information Management System, SIMS)的需求分析、环境搭建、数据库创建、项目结构的初始化,以及运行。正常做下来的朋友,会发现项目运行后输入http://127.0.…

vulfocus靶场thinkphp命令执行cve-2018-1002015

thinkPHP 5.0.x版本和5.1.x版本中存在远程代码执行漏洞,该漏洞源于ThinkPHP在获取控制器名时未对用户提交的参数进行严格的过滤。远程攻击者可通过输入‘\’字符的方式调用任意方法利用该漏洞执行代码 开启靶场: 使用工具: think…

使用微软Phi-3-mini模型快速创建生成式AI应用

微软Phi-3大语言模型是微软研究院推出的新一代系列先进的小语言模型。Phi-3系列包括phi-3-mini、phi-3-small和phi-3-medium三个不同规模的版本。这些模型在保持较小的参数规模的同时,通过精心设计的训练数据集和优化的算法,实现了与大型模型相媲美的语言…

VaR(Value at Risk)模型代码

Value at Risk(VaR)是一种用于衡量投资组合可能损失的风险的模型。它可以帮助投资者评估他们面临的潜在风险,并做出相应的风险管理决策。以下是一个简单的VaR模型案例。 假设一个投资组合由两个资产组成:股票A和股票B。股票A的市…