文献阅读:Towards Out-of-Distribution Sequential Event Prediction:A Causal Treatment

news2024/12/23 14:59:07
  • 文献阅读:Towards Out-of-Distribution Sequential Event Prediction:A Causal Treatment
    • 1. 问题描述
    • 2. 方法 & 模型设计
      • 1. loss定义
      • 2. 模型设计
    • 3. 实验 & 结果
      • 1. 基础实验
      • 2. CaseQ策略细节分析
    • 4. 结论 & 总结
  • 文献链接:https://arxiv.org/abs/2210.13005

1. 问题描述

这篇文章是我最近刷到的一篇工作,和我最近的工作有一点相似,所以就想拿来参考一下。

这篇文章针对的主要训练数据与线上服务的数据偏差问题。

具体而言,当前推荐模型的训练模型往往都是采用历史某一个时间段内的真实点击数据拟合用户与商品之间的关联性,从而预测未来某个时刻用户对于某一个商品的感兴趣程度,并用ctr或者cvr进行表征。

但是这样一来会带来一定的问题:

  • 历史训练数据所处的时间段与线上服务的时间存在一定的gap,导致商品的分布与线上服务当中真实的商品数据分布存在一定的偏差,劣化模型的效果,且这种劣化作用会随着时间的增长而增大。

举例来说,如果用户上次浏览点击的时候是夏季,看了几件T恤,然后半年过去了,他在冬季重新浏览了一下,这个时候他更可能买羽绒服,而不会是T恤,虽然显然后者与用户的浏览历史关联度更高。更极端的,一个用户如果在08年的时候浏览过手机,那可能他点了一堆诺基亚,而到了22年,苹果华为早已是主流了,诺基亚可能都已经不存在这个商品类目了。

因此,这篇文章就尝试搞定上述问题,他们的方法也比较直观,就是在事件(商品点击)当中引入事件发生时的context信息,从而使得上述这种随时间增加而产生的商品分布偏差可以尽可能地被抹除。

2. 方法 & 模型设计

如前所述,这篇文章的核心方法就是在事件的预测当中引入context信息。

但是这里也存在一定的问题,主要就是隐私保护的问题,使得事实上现在我们基本都不太能够获取到用户点击发生时的context信息。

而文中针对这个问题的处理文中使用的方法也是相对来说比较巧妙的,就是先预先设计K个context场景,然后使用贝叶斯概率的方式将其耦合入最终点击的预测,某种意义上来说,就是先去预测每一个context下用户点击发生的概率,然后根据每一个context发生的概率对其进行一下加权求和,最终得到不同综合情况下用户的点击概率。

具体可以参考下图:

在这里插入图片描述

下面,我们首先来看一下loss的数学定义,然后来看一下文中给出的模型实际的构造方法。

1. loss定义

这里,模型的loss定义本质上就是如下条件表达式:

P θ ( Y ∣ d o ( S ) ) = P θ ( Y ∣ S , C ) = ∑ i = 1 ∣ C ∣ P θ ( Y ∣ S , C = c i ) ⋅ P ( C = c i ) \begin{aligned} P_{\theta}(Y|do(S)) &= P_{\theta}(Y|S,C) \\ &= \sum\limits_{i=1}^{|C|} P_{\theta}(Y|S,C=c_i) \cdot P(C=c_i) \end{aligned} Pθ(Ydo(S))=Pθ(YS,C)=i=1CPθ(YS,C=ci)P(C=ci)

而通过附录B中给出的推导,我们可以使用Jensen不等式直接将上式放缩为:

P θ ( Y ∣ d o ( S ) ) ≥ E c ∼ Q ( C ∣ S = S ) [ l o g P θ ( Y ∣ S = S , C = c ) ] − D K L ( Q ( C ∣ S = S ) ∣ ∣ P ( C ) ) P_{\theta}(Y|do(S)) \geq E_{c\sim Q(C|S=S)} [logP_{\theta}(Y|S=S,C=c)] - D_{KL}(Q(C|S=S) || P(C)) Pθ(Ydo(S))EcQ(CS=S)[logPθ(YS=S,C=c)]DKL(Q(CS=S)∣∣P(C))

其中, Q ( C ∣ S = S ) Q(C|S=S) Q(CS=S)为模型拟合的在行为序列 S S S情况下场景(context) C C C的发生概率。

而关于 P ( C ) P(C) P(C)的计算,可以通过下述表达式来近似:

P ( C ) ≃ 1 N ∑ i = 1 N Q ( C ∣ S = S i ) P(C) \simeq \frac{1}{N}\sum\limits_{i=1}^{N}Q(C|S=S_i) P(C)N1i=1NQ(CS=Si)

当然,完整计算上式的复杂度太高,因此文中对其进行了简化,只从中sample了一些样本进行近似拟合:

P ( C ) ≃ 1 R ∑ j = 1 R Q ( C ∣ S = S j ) P(C) \simeq \frac{1}{R}\sum\limits_{j=1}^{R}Q(C|S=S_j) P(C)R1j=1RQ(CS=Sj)

其中 R ≪ N R \ll N RN

由此,我们事实上就将上述loss表达式完全转换成了 P θ ( Y ∣ S , C = c i ) P_{\theta}(Y|S,C=c_i) Pθ(YS,C=ci) Q ( C ∣ S ) Q(C|S) Q(CS)的表达式了。

因此,我们只需要用模型给出 P θ ( Y ∣ S , C = c i ) P_{\theta}(Y|S,C=c_i) Pθ(YS,C=ci) Q ( C ∣ S ) Q(C|S) Q(CS)即可。

2. 模型设计

下面,我们来看一下文中给出的具体模型设计。

首先,文中对于行为序列中的每一个行为的embedding映射倒是一个非常简单的行为,就是一个基础的one-hot embedding的lookup,记作:

h m 1 = O n e H o t ( x m ) T ⋅ H x h_m^1 = \mathop{OneHot}(x_m)^T \cdot H_x hm1=OneHot(xm)THx

然后,通过一个神经网络(比如RNN或者Self-Attention网络),可以将其投影到一个输出的embedding:

[ h 1 2 , h 2 2 , . . . , h t 2 ] = Φ ( [ h 1 1 , h 2 1 , . . . , h t 1 ] , c ( t ) ; Θ ) = ∑ k = 1 K c ( t ) [ k ] ⋅ Φ k ( [ h 1 1 , h 2 1 , . . . , h t 1 ] ; Θ k ) \begin{aligned} [h_1^2, h_2^2, ..., h_t^2] &= \Phi([h_1^1, h_2^1, ..., h_t^1], c(t); \Theta) \\ &= \sum\limits_{k=1}^{K}c(t)[k] \cdot \Phi_k([h_1^1, h_2^1, ..., h_t^1]; \Theta_k) \end{aligned} [h12,h22,...,ht2]=Φ([h11,h21,...,ht1],c(t);Θ)=k=1Kc(t)[k]Φk([h11,h21,...,ht1];Θk)

其中,关于 c ( t ) [ k ] c(t)[k] c(t)[k]的计算,文中是一个attention层的输出 q t q_t qt来进行模拟的,具体而言,就是将输入向量 h t h_t ht映射到 k k k个归一化权重上:

q t = Ψ ( h t 1 ; Ω ) q_t = \Psi(h_t^1; \Omega) qt=Ψ(ht1;Ω)

其中 ∑ k = 1 K q k = 1 \sum\limits_{k=1}^{K}q_k = 1 k=1Kqk=1

具体其中的映射关系为:

q t [ k ] = e x p ( ( s t k + g ) / τ ) ∑ k = 1 K e x p ( ( s t k + g ) / τ ) s t k = a k ⋅ t a n h ( W k ⋅ h t ) \begin{aligned} q_t[k] &= \frac{exp((s_{tk} + g)/\tau)}{\sum\limits_{k=1}^{K}exp((s_{tk} + g)/\tau)} \\ s_{tk} &= a_k \cdot \mathop{tanh}(W_k \cdot h_t) \end{aligned} qt[k]stk=k=1Kexp((stk+g)/τ)exp((stk+g)/τ)=aktanh(Wkht)

此时,输出层的向量就可以表达为:

[ h 1 2 , h 2 2 , . . . , h t 2 ] = ∑ k = 1 K q t [ k ] ⋅ Φ k ( [ h 1 1 , h 2 1 , . . . , h t 1 ] ; Θ k ) [h_1^2, h_2^2, ..., h_t^2] = \sum\limits_{k=1}^{K} q_t[k] \cdot \Phi_k([h_1^1, h_2^1, ..., h_t^1]; \Theta_k) [h12,h22,...,ht2]=k=1Kqt[k]Φk([h11,h21,...,ht1];Θk)

由是,我们来看一下文中最终给出的CaseQ模型结构的loss函数定义。

首先,关于模型的预测结果,这部分其实和传统的定义差不多,就是拿最后一层的输出和全部商品计算内积取最大值:

y ^ t = a r g m a x m ∈ { 1 , . . . , M } ( H x ⋅ h t D + 1 ) [ m ] \hat{y}_t = \mathop{argmax}_{m \in \{1, ..., M\}} (H_x \cdot h_t^{D+1})[m] y^t=argmaxm{1,...,M}(HxhtD+1)[m]

因此,此时完整的loss定义函数就可以表达为:

L = ∑ S ∑ t = 1 ∣ S ∣ − 1 [ l ( y t , y ^ t ) + α D K L ( q t ∣ ∣ 1 R ∑ j = 1 R ( q ( S j ′ ) ) ) ] L = \sum\limits_{S} \sum\limits_{t=1}^{|S|-1}[l(y_t, \hat{y}_t) + \alpha D_{KL}(\bold{q}_t || \frac{1}{R} \sum\limits_{j=1}^{R}(\bold{q}(S_j')))] L=St=1S1[l(yt,y^t)+αDKL(qt∣∣R1j=1R(q(Sj)))]

其中,这里的 q t \bold{q}_t qt定义略微复杂,具体表达如下:

q t = F l a t t e n ( ⊗ l = 1 D q t l ) ∈ R K D \bold{q}_t = \mathop{Flatten}(\mathop{\otimes}\limits_{l=1}^{D}q_t^{l}) \in \mathcal{R}^{K^D} qt=Flatten(l=1Dqtl)RKD

其中, K K K为context种数,然后 D D D为模型层数。

3. 实验 & 结果

下面,我们来看一下文中给出的实验以及对应的结果如下:

1. 基础实验

这里的实验设计其实主体上就是在推荐数据集上测试一下效果,考察一下基础指标是否有变得更好,以及随着时间gap的增加,指标降低是否弱于原始模型。

这里,文中采用了如下几个测试数据集:

  1. Sequential Recommendation
    1. Movielens;
    2. Yelp;
  2. Event Prediction
    1. Stack Overflow;
    2. ATM;

两类实验下的具体实验结果如下图所示:

在这里插入图片描述

可以看到:

  • 当测试集紧邻训练数据时,CaseQ不会损伤模型的效果,反而会带来小幅的指标提升;
  • 当测试数据与训练数据的gap增大时,CaseQ
  • 针对不同类型的基础模型,CaseQ策略总是有效的;
  • 针对两类不同的任务,CaseQ同样是有效的;

2. CaseQ策略细节分析

然后,文中还对Context进行了更为细致的考察。

首先,文中看了一下对于不同的时间gap下输出与不同的context之间的关联关系如下:

在这里插入图片描述

可以看到:

  • 不同时间gap下,context的分布之间存在明显的差异,因此可以认为context确实学到了与时间gap之间的关联关系

此外,为了更好地说明context之间的差异性,文中还将context投影到了二维空间当中,看了一下context之间差异性。

在这里插入图片描述

从上图中的Figure5中可以看到:

  • 随着训练的深入,不同的context之间的差异会逐渐变大,说明随着训练的深入,不同的context确实能够表征不同的特征

另外,文中还考察了CaseQ模型的可扩展性,如上图中的Figure6中显示的:

  • 模型训练以及预测的耗时 t t t近似有 t ∝ K × D t \propto K \times D tK×D,即两者近似呈线性关系,因此存在着良好的可扩展性。

最后,文中还对context的超参进行了考察,如上图中Figure7中展示的:

  • 一定范围内, K × D K\times D K×D的增大可以带来效果的增益,但是并不是越大越好,太大反而会对结果有所伤害。

4. 结论 & 总结

结论而言,这篇文章的核心思路其实就是引入一个新的变量context来模拟不同场景,然后分别计算不同场景下的事件发生概率,最后对其使用context发生概率来进行加权求和来优化模型的效果。

这个思路其实也不算有特色,至少我们的实际业务场景里面事实上很早就用到了,虽然是出于不同的出发点,但是真实的模型结构其实大差不差。

但是,这里比较惊艳我的还是这里的loss函数的变化,感觉有一试的价值,回头可以在我们自己的业务上面试试看效果,虽然我还是不太理解这为啥可以work,总感觉怪怪的……

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

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

相关文章

GDB调试学习

文章目录简介准备工作常用命令简介 ​GDB 全称“GNU symbolic debugger”,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GD…

五个了解自己天赋优势的分析工具(二)盖洛普优势测评

盖洛普优势测评 盖洛普优势识别器(也叫克利夫顿优势评估),是盖洛普公司旗下⼀款王牌产品,是⼀个专⻔⽤来识别⼀个⼈隐形天赋、潜在优势、驱动⼒来源的⼯具,它可以帮助⼀个⼈科学认识⾃⼰。 它把⼈的思维⽅式、感受形…

网络初识

一些基本概念认识IP地址概念:IP地址用于定位主机的网络地址,标识了网络上设备所在的位置。也就是说主机在哪。格式:IP地址是一个32位的二进制数,通常被分割为4个字节。通常我们使用“点分十进制”的方式来表示主机的IP地址——>…

2.2 SQL入门和实战

文章目录数据库介绍MySQL的入门应用SQL的基础与DDLSQL的分类:SQL的基础语法特性:DDL库管理:DDL表管理:SQL-DMLSQL-DQLDQL基础查询DQL分组聚合排序分页Python&MySQLcommit数据库介绍 数据库的层级:按照库->表-&…

WAL Write AheadLog

WAL即 Write Ahead Log,WAL的主要意思是说在将元数据的变更操作写入磁盘之前,先预先写入到一个log文件中 磁盘读取分为顺序读取和随机读取 内存读取也有顺序读取和随机读取 下图是磁盘,内存 顺序和随机读取的效率表 一般来说内存读取速度要…

硬件设计基础 —— 电流、电压、功率

目录 电流的形成 原子的结构 原子核与电子 电子的移动 电流的测量 电子的运动形成电流 电压的作用 功率 电流的形成 原子的结构 上图为原子结构示意图中间带正电的称为原子核带负电荷的电子围绕在他周围旋转原子核与电子 电子离原子核越远,外围电子越少&…

Cadence PCB仿真使用Allegro PCB SI进行数字电路毛刺容差设置的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1, 概述2,配置方法3,总结1, 概述 数字信号的波形往往不是完美的低和高电平,经常会有一些毛刺。这在信号完整性仿真中也经常遇到,为了保证仿真顺利进行需要对接收电路的毛刺容差进行设置。本文简单介绍其配置方法。…

COCO_02 二值分割数据集制作为COCO数据集

文章目录1 前言2 分割数据集格式2.1 原始图像2.2 分割标注2.3 文件名信息3 制作COCO格式基本流程4 根据分割标注制作COCO标注(核心)Main1 前言 最近要开始实例分割任务,由于实例分割是建立再目标检测基础之上的,因此需要制作能用…

两道一年级数学题把我干废了

目录一、背景二、题目三、过程第一解:第二解:第三解:四、总结五、升华一、背景 最近在看小学一年级数学课本的时候,其中两道题让我感叹现在小学教育题的伟大和深厚,并且从中领悟到了…哈哈哈,先卖个官司&a…

【Ansible】Ansible 角色

Ansible 角色 文章目录Ansible 角色一、Ansible Roles 介绍二、Roles 结构三、role 的制作过程四、如何在PlayBook中使用 Role1. 经典(原始)方式2. 新方式五、如何使用 Galaxy一、Ansible Roles 介绍 一个数据中心有可能存在好多类型的服务器。比如&…

【博客588】ipvs nat模式下独立于iptables与conntrack的连接跟踪表和NAT机制

ipvs nat模式下独立于iptables与conntrack的连接跟踪表和NAT机制 ipvs的连接跟踪表和NAT机制 ipvs只有DNAT和de-DNAT功能 ,它独立与iptables和conntrack,实现了自己的一套连接跟踪表和NAT机制。ipvs仅仅在做DNAT后对conntrack连接进行更新,防止回包因为没有记录而被丢弃。 i…

邂逅Vue.js开发

1、认识Vue Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式 JavaScript框架。 全称是Vue.js或者Vuejs;它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型;帮助你高效地开发用户…

学习笔记 一天学完JavaScript基础语法(全)

JavaScript 文章目录JavaScript第一章——初始JavaScript1.1 浏览器执行 JS 简介1.2 JS的组成1.2.1 ECMAScript1.2.2 DOM ——文档对象模型1.2.3 BOM ——浏览器对象模型1.3 JS的写法1.3.1 行内式写法1.3.2 内嵌式写法1.3.3 外部js文件1.4 注释1.5 变量1.5.1 变量声明1.5.2 变量…

【源码解析】Nacos配置中心的源码解析

POM文件添加依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>在依赖中查看自动装配文件spring.factories org.springframework.cloud.bootstr…

String类详解

在Java编程中&#xff0c;除Object类外&#xff0c;最常用的类就是String类了。本文将从String类源码出发&#xff0c;对String类进行一个全面的分析&#xff0c;以帮忙我们更好的理解和使用String类。 String类概述 Java 使用 String 类代表字符串。Java 中的所有字符串字面…

已解决MemoryError

已解决Python读取20GB超大文件报错&#xff1a;MemoryError 文章目录报错问题报错翻译报错原因解决方法1解决方法2&#xff08;推荐使用&#xff09;帮忙解决报错问题 日常数据分析工作中&#xff0c;难免碰到数据量特别大的情况&#xff0c;动不动就2、3千万行&#xff0c;…

Linux——网络配置篇

1、前情提要&#xff1a; 今晚在配置Linux &#xff08;CentOS7完整版&#xff09;的时候 明明已经配好了网络环境&#xff0c;重启虚拟机后&#xff0c;又出现了Ping不通 主机、Ping不通网关&#xff0c;外网的情况 &#xff08;NAT&#xff09;。 让我很费解的一个情况是&am…

数据结构与算法基础(王卓)(8):线性表的应用

PPT&#xff1a;第二章P173&#xff1b; 并集集合&#xff1a;线性表的合并&#xff08;无需有序&#xff0c;不能重复&#xff09; 线性表&#xff1a; Status Union(Sqlist& A, Sqlist& B)//并集 {int len_A A.length;int len_B B.length;for (int i 1; i < …

SpringCloud学习(1)

SpringCloud学习 软件架构演进之路 对于单体架构&#xff0c;我们根据设计期和开发实现期的不同模式和划分结构&#xff0c;可以分为&#xff1a; 简单单体模式&#xff1a; 代码层面没有拆分&#xff0c;所有的业务逻辑都在一个项目&#xff08;Project&#xff09;里打包…

​力扣解法汇总2293. 极大极小游戏

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣 描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;其长度是 2 的幂。 对 n…