AITM - 多任务模型之顺序依赖性建模(美团)

news2024/11/21 1:40:10

文章目录

  • 1、动机与挑战(信用卡业务广告)
  • 2、信用卡用户整体架构:
  • 3、模型结构
    • 3.1、核心部分

  • Modeling the Sequential Dependence among Audience Multi-step Conversions with Multi-task Learning in Targeted Display Advertising

  • 论文发表在 KDD-2021。论文做的是金融场景下(信用卡业务)的顺序依赖性多任务问题解决框架。

  • 在ESMM的基础上,利用不用任务之间的顺序依赖关系,文章提出了一种自适应信息模型传输多任务AITM(Adaptive Information Transfer Multi-task)框架。基于AIT模块,利用self-attention自适应地提取不同转换阶段的传输信息进行融合输出。现已应用于美团app中。

1、动机与挑战(信用卡业务广告)

  • 用户多步转化过程中的路径序列依赖更长。
  • 在多步转化的长序列依赖中(前一步骤发生了,后一步骤才可能发生),正反馈(正样本)是逐步稀硫的,类别不平衡越来越严重。
    信用卡业务的5个阶段如下,一般来说阶段越低,转换效率越高。业务中,关心的是核卡成功率和激活成功率。
  • 曝光
  • 点击
  • 申请
  • 核卡(授信):意味着用户信用良好,通过申请并被授予了一定的信用卡额度。实时判断
  • 激活:用户在授信并且收到邮寄的信用卡之后,可以激活信用卡并使用。是否激活的标签通常比较难获得,因为信用卡邮寄需要一定的时间,而且用户主动去激活也需要一定的表现期,所以这里类别不平衡更为严重。在这里,我们通常看用户是否会在核卡后14天内激活信用卡。
    在这里插入图片描述

2、信用卡用户整体架构:

  • 简单了解一下就ok。
    在这里插入图片描述
    在这里插入图片描述

3、模型结构

即图a为MMOE,图b为ESMM,图c即为AITM。
在这里插入图片描述

AITM其实就是在ESMM的基础上,引入了attention机制(和self-attention类似但有区别)来建模相邻任务的输出(即当前任务的输出为用attention综合了前一任务的输出和当前任务的输出)。

  • 设有T个任务,那模型输出的各转换步骤的概率的顺序依赖为:y1≥y2≥…≥yT。
  • tower论文用的是MLP(也可以是其他,比如deepfm, nfm等)
  • 两个相邻的任务,通过AIT模块(即attention)进行特征交互,用于学习两相邻任务应该迁移什么信息。AIT模块的输出继续作为下一任务的输入之一。

其实整体来看和MMOE差不多,区别就是在后面加了attention来使相邻任务的特征进行交互(即控制应该迁移前一任务的什么信息到当前任务)。

3.1、核心部分

  • aitm也采用share embedding,这样有利于缓解后一个任务的类别不平衡的问题,训练出一个更好的embedding;还可以减少模型的参数。

  • ait模块(即attention)和self-attention类似,但有区别。这里q,k,v向量通过全连接层映射得到,然后qk内积(对应位置直接相乘)并缩放,得到 (bs, 2) ,然后softmax的注意力得分;然后注意力得分.unsqueeze(dim=-1)得 (bs, 2, 1),和 v向量 (bs, 2, dim) 直接内积得 (bs, 2, dim),最后.sum(dim=1) 即两向量通过注意力得分加权相加,得 (bs, dim)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1TZEUjF-1684399936555)(E:\打工\小米实习工作\pic\aitm-attention.jpg)]

    ait代码实现如下:

  class AttentionLayer(nn.Module):
      """attention for info tranfer
  
      Args:
          dim (int): attention dim
  
      Shape:
          Input: (batch_size, 2, dim):(2, dim)代表相邻两任务的输出特征
          Output: (batch_size, dim)
      """
  
      def __init__(self, dim=32):
          super().__init__()
          self.dim = dim
  
          self.q_layer = nn.Linear(dim, dim)
          self.k_layer = nn.Linear(dim, dim)
          self.v_layer = nn.Linear(dim, dim)
          self.softmax = nn.Softmax(dim=1)
  
      def forward(self, x):
          Q = self.q_layer(x)
          K = self.k_layer(x)
          V = self.v_layer(x)
          # 注意Q,K对应文职相乘
          a = torch.sum(torch.mul(Q, K), -1) / torch.sqrt(torch.tensor(self.dim))  # (bs, 2)
          a = self.softmax(a)
          # 各向量乘上对应的softmax得分,然后向量直接相加
          outputs = torch.sum(torch.mul(torch.unsqueeze(a, -1), V), dim=1)  # (bs, 2, 1)*(bs, 2, dim) sum-> (bs, dim)
          return outputs
  • 每个ait模块的输出经过mlp映射过sigmoid后即可输出对应任务的概率。

  • 另外地,aitm为确保任务之间的顺序依赖性,给二分类交叉熵损失函数加上了一个约束项。aitm用这种方法对目标函数进行约束,保证了最终结果的合理性,同时也可以提高最终结果的准确性。约束项的计算法方式如下;其原理很假单,也就是如果当前任务的概率如果大于前一任务的概率 (不正常的情况),那损失为y_t - y_t-1;若当前任务概率小于前一任务的概率 (正常情况),那就不惩罚,损失为0。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3WuTRFv-1684399936556)(E:\打工\小米实习工作\pic\aitm-loss.jpg)]

aitm loss代码实现为:

    # 写在了model class里
    def calibrator_loss(self, label1, pred1, label2, pred2, constraint_weight=0.6):
        """
        由于aitm针对的问题是具有多步转化顺序依赖关系的多任务学习,
        因此前一个任务的预估值应该远大于下一个任务的预估值(全样本空间中的ctr一定比cvr高),
        因此文章提出了一个calibrator作为一个loss惩罚项。
        事实上就是当yt > y_{t-1}时,即认为是不合理的,惩罚一波loss;否则合理的话,这一项就为0。文章用这种方法对目标函数进行约束,保证了最终结果的合理性,同时也可以提高最终结果的准确性。
        """

        # 和nn.BCELoss()一样的,一个是函数,一个是类而已。
        # 都默认对batch内所有loss取平均
        loss1 = F.binary_cross_entropy(pred1, label1)  # 标量
        loss2 = F.binary_cross_entropy(pred2, label2)

        label_constraint = torch.maximum(pred2 - pred1, torch.zeros_like(label1))
        constraint_loss = torch.sum(label_constraint) / len(label1)  # 标量,公式里是要取平均的

		# 这里可以自由发挥
        loss = (loss1 + loss2)/2 + constraint_weight * constraint_loss
        # loss = loss1 + loss2 + constraint_weight * constraint_loss
        return loss

总的来说,创新点在ait模块用于交互相邻任务的特征,改进了loss确保了相邻任务的顺序依赖性。







参考链接:https://zhuanlan.zhihu.com/p/506921131

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

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

相关文章

【Linux的基本指令】

目录 01.ls指令02.pwd指令03.cd指令04.touch指令05.mkdir指令06.rmdir指令 && rm 指令07.*通配符08.man指令09.cp指令10.mv指令11.cat指令13.more指令14.less指令15.head指令16.tail指令17.date指令18.Cal指令19.find指令20.grep指令21.zip/unzip指令22.tar指令23.bc指…

OpenCL编程指南-5.1工作项函数-整数函数-公共函数

工作项函数 应用程序使用clEnqueueNDRangeKernel和 clEnqueueTask API将OpenCL中的数据并行和任务并行内核排队。对于一个数据并行内核(使用clEnqueueNDRangeKernel排队等待执行),应用程序会指定全局工作大小,即可以并行执行这个内核的工作项…

PSP - AlphaFold2 中单链 MSA 特征的源码简读

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130752004 AlphaFold2 是基于深度学习的方法,可以根据氨基酸序列,预测蛋白质的三维结构。在 2020 年的 CASP14 竞赛中,展示了惊人的准确性,达到了原子级别…

python读取linux系统的cpu以及内存占用

直接贴代码 import subprocessdef get_system_stats():# 通过 shell 命令获取 CPU 使用率和内存使用率cpu_command "top -bn1 | grep %Cpu(s) | awk {print $2}"memory_command "free | grep Mem | awk {print $3/$2 * 100.0}"# 执行命令并获取输出结果…

鸿蒙Hi3861学习十六-Huawei LiteOS-M(Socket服务端)

一、简介 具体概念可以参考上一章内容:鸿蒙Hi3861学习十五-Huawei LiteOS-M(Socket客户端)_t_guest的博客-CSDN博客 WIFI学习一(socket介绍)_wifi socket_t_guest的博客-CSDN博客 二、API介绍 bind 函数功能&#xff1…

pdf怎么转换成jpg图片?转换方式说明

将PDF转换为JPG图片是一种常见的文件格式转换操作,通常用于在不同设备上查看和共享PDF文档。但是,大多数情况下,将PDF转换为JPG图片可能并不总是可行或有效的。在本文中,我们将讨论为什么不能将PDF转换为JPG图片,以及如…

了解设备健康报表的关键指标与分析方法

在现代工业领域中,设备健康报表是一项关键工具,通过收集和分析设备的运行数据,它提供了关于设备状态和性能的重要指标。设备健康报表对于企业的设备管理和维护决策至关重要。本文将介绍设备健康报表的关键指标,并提供解读和分析方…

苹果手机、电脑如何进行屏幕录制?苹果录屏功能在哪?

随着人们生活水平的提高,不少小伙伴都会选择苹果手机、苹果电脑作为主要的设备。因为使用苹果电脑进行办公,不仅仅能够提升效率,对于文件的安全性也是有一些保障的。那么,在使用苹果电脑的时候,如果需要有录屏的需求该…

【JAVA】this关键字和static关键字

目录 1.this关键字 2.static关键字 容易混淆的问题 1.this关键字 一个对象一个this。this是一个变量,是一个关键字,是一个引用。this保存当前对象的内存地址,指向自身。所以,严格意义上来说,this代表的就是“当前对象…

Avada学习之-如何加入谷歌地图

如何正确设置谷歌地图 在给Wordpress网站配置谷歌地图时,常常会出现谷歌地图无法显示的问题。具体提示为Oops! something went wrong,如下图。出现这种问题有如下原因。 内容 隐藏 一、地址不正确 二、API 没填 三、插件冲突 一、地址不正确 很多…

iOS正确获取图片参数深入探究及CGImageRef的使用

一 图片参数的正确获取 先拿一张图片作为测试使用 图片参数如下: 图片的尺寸为: -宽1236个像素点 -高748个像素点 -色彩空间为RGB -描述文件为彩色LCD -带有Alpha通道 请记住这几个参数,待会儿我们演示如何正确获取。 将这张图片分别放在…

光纤衰减器作用及使用说明

在光纤通信中,光信号的强度过大或过小都会对信号的传输和接收产生不良的影响,因此光衰减器在光通信系统中起到了重要的作用。那什么是光衰减器呢?它又有什么作用呢?下面跟着小易一起来了解一下吧! 一、什么是光纤衰减…

APP自动化测试工具的作用和特点

随着移动应用的迅速发展,APP的自动化测试工具变得越来越重要。APP自动化测试工具可以帮助开发者在应用程序的不同平台上执行测试,从而检测和确保应用程序的完整性、稳定性和可靠性。下面将介绍APP自动化测试工具的作用和特点。 一、作用 提高测试效率&am…

Android自定义控件——控件的测量和绘制

控件的测量和绘制 控件架构setContentView()MeasureSpecViewView的测量View的绘制 ViewGroupViewGroup的测量ViewGroup的绘制 自定义View对现有控件进行扩展案例一:添加背景案例二:文字闪动 创建复合控件重写View实现全新控件案例一:弧线展示…

FLEXPART--空气块轨迹-扩散模式

模式简介: FLEXPART(Flexible Particle Dispersion Model)模式是由挪威大气研究所(Norwegian Institute for Air Research)和德国慕尼黑工业大学(Technical University of Munich)联合开发的空气块轨迹-扩散模式, 其通过计算区域内所有气块的运动轨迹进…

PLE - 多任务模型(腾讯)

文章目录 1、动机2、模型结构3、代码实现细节: Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations论文发表在 RecSys-2020, best paper。ple主要缓解了mtl里两大问题:负迁移…

如何在海量、庞杂、混合的数据中发现价值?

数字时代,数据上升为国家战略,数据成为重要的生产要素和资产,得到了越来越多企业的重视,也成为企业数字化转型的重要抓手。据IDC中国预测,2025年中国大数据生产量有望增长至48.6ZB。 随着越来越大的数据量&#xff0c…

【C++从0到王者】第六站:类和对象(下)

文章目录 一、再谈构造函数1.构造函数体赋值2.初始化列表1>初始化列表的使用2>初始化列表的注意事项 3.explicit关键词 二、static成员1.如何统计当前程序中变量的个数2.static的特性3.从1加到n4.设计一个类,只能在栈或者堆上开辟空间 三、友元1.友元函数2.友…

一个简化、落地的实时数据仓库解决方案

从传统的经验来讲,数据仓库有一个很重要的功能是记录数据变化历史。通常,数据仓库都希望从业务上线的第一天开始有数据,然后一直记录到现在。但实时处理技术,又是强调当前处理状态的一门技术,所以当这两个相互对立的方…

聚合数据证件识别接口-基于PHP示例代码

1、开通接口 以下代码示例基于聚合数据提供的证件识别接口,使用前需要先注册申请本接口,获得请求密钥key。 接口文档地址:https://www.juhe.cn/docs/api/id/153 2、功能介绍 通过自动识别的方式获取常规证件文字内容,免去用户…