发现好久之前整理的推荐系统被遗忘在了草稿箱,让它出来见见世面。。。后续空了持续更新
文章目录
- 1.Background
- 2.Related works
- 2.1 典型推荐模型
- 2.1.1 DIN
- 2.1.2 DIEN
- 2.1.3 SIM
- 2.1.4 MMoE
- 2.1.5 其他
- 2.2. 生成式推荐
- 3.Method
- 3.1 统一特征空间
- 3.2 重塑召回排序模型
- 3.2.1 召回任务
- 3.2.2 排序任务
- 3.3 模型架构升级——HSTU
- 其他工程优化
1.Background
大模型生成用于推荐场景有如下几个难点:
- 特征缺乏显式结构。存在sparse和dense特征,其中sparse特征指的是一些离散特征,这部分离散特征通过onehot方式映射成embedding输入到模型。dense模型是连续特征,比如ctr、交叉的连续特征等。
- 推荐系统使用不断变化的十亿级词汇表。具体来说两方面:a. 词表大 b.词表一直在变比如新增了一个用户id,推荐场景会有入场退场机制,但是语义的生成大模型处理的都是token如何处理新增特征表示(直接加入的话,训练阶段可能没有见过或者导致欠拟)
- 计算成本是实现大规模顺序模型的主要瓶颈。这块主要指的是训练方式和推理速度。GPT-3 在 1-2 个月的时间内使用数千个 GPU 对总共 300B个token 进行了训练。推荐模型一般要处理十亿的日常活跃用户,他们每天会浏览数十亿条帖子、图片和视频。用户序列的长度可能高达 1 0 5 10^5 105。因此,推荐系统每天需要处理的 token 数量比语言模型在 1-2 个月内处理的 token 多几个数量级。
2.Related works
2.1 典型推荐模型
2.1.1 DIN
v U ( A ) = f ( v A , e 1 , e 2 , . . . , e H ) = ∑ j = 1 H a t t e n t i o n ( e j , v A ) = ∑ j = 1 H w j e j \mathbf v_U(A) = f(\mathbf v_A,\mathbf e_1, \mathbf e_2, ..., \mathbf e_H ) = \sum_{j=1}^H attention(\mathbf e_j,\mathbf v_A) = \sum_{j=1}^H \mathbf w_j \mathbf e_j vU(A)=f(vA,e1,e2,...,eH)=j=1∑Hattention(ej,vA)=j=1∑Hwjej
{
e
1
,
e
2
,
.
.
.
,
e
H
}
\{\mathbf e_1, \mathbf e_2, ..., \mathbf e_H\}
{e1,e2,...,eH}是用户历史行为的一组Embedding,长度为H H
一点理解:
Attention的作用主要是有多个兴趣点,在对本次进行排序的时候,主要关注的是target类似的兴趣还好的情况。
2.1.2 DIEN
DIN通过attention能够动态刻画用户的兴趣,不过DIN没有考虑用户序列之间的相关性,用户序列之间的顺序也没有考虑。也就是如果用户购买序列为“鞋子->袜子->水杯->键盘->风扇”和用户序列是“鞋子->水杯->袜子>风扇->键盘”通过attention得到的用户表征完全一样,实际上这两个序列是不同的.
- 兴趣提取层
用GRU建模用户序列的这种前后依赖的关系,用隐状态表示用户当前时刻的兴趣。同时引入辅助loss,通过下一个时刻的行为对当前行为进行监督,保证隐状态的有效性。
引入辅助loss可以有效缓解长序列梯度传播问题,引入用户非点击序列作为负样本,限制用户隐状态包含用户兴趣,模型用到的用户行为序列数据,长度可能非常大,容易导致GRU面临梯度消失问题;而且对各个时刻隐状态进行监督,可以提高提取到的兴趣表征效果,从而有利于下一个阶段兴趣演化层对兴趣的学习 - 兴趣进化层
通过基于attention的GRU方式,把attention分数当做更新门的作用,对GRU的隐状态进行更新。减弱不想管历史行为隐藏状态的更新,因此可以对隐状态的更新更细化。使兴趣演化过程聚焦在相关兴趣上,相关性越高,对隐状态的更新越大,从而对最终兴趣表征影响越大。
用户行为阿里这里使用了用户过去两周即14天的点击商品与商品类目序列
负样本是对应正样本(展现点击)对应的t时刻有展未点的作为负样本
参考:推荐系统(十二)阿里深度兴趣网络(二):DIEN模型(Deep Interest Evolution Network)
一点理解:
实际上阿里早在DIN版本中就尝试过了用RNN来对用户行为序列建模,但并没有什么效果。用户行为序列还和文本序列不太一样,文本序列有明确的语法制约,比如【我是好人】就是一句有明确含义的话,打乱下顺序【人我是好】就明显不具有含义了。但是用户行为序列,比如点击行为序列【牛仔裤–>哈伦裤–>阔腿裤】和【哈伦裤–>牛仔裤–>阔腿裤】顺序改变下,其实是没什么影响的,也就是说用户行为序列对于『顺序』实际上不是很敏感的,这里再去硬套RNN似乎有些牵强附会。
2.1.3 SIM
MIMN模型能够基于memory network对长达 1000 长度的行为序列数据进行训练和在线 serving 的整体解决方案。然而在处理更大规模的序列数据时,容易被数据的噪声干扰、效果很不理想。
对长序列进行建模,引入超长的用户行为数据。提出了一个两阶段搜索范式来建模用户的超长行为序列。SIM 包含两级检索模块 General Search Unit (GSU) 和 Exact Search Unit (ESU)。在第一阶段,我们利用 General Search Unit (GSU) 从原始用户行为中搜索 Top-K 相关的用户子序列行为。这个搜索时间远低于原始行为遍历时间,同时 K 也比原始用户行为小几个数量级。在第二阶段,ESU 利用 GSU 产出的和广告相关的用户序列数据来捕捉用户跟广告更精准的兴趣表达,利用一个 multi-head attention 结构来捕捉用户在广告上的动态的用户兴趣。
参考:阿里定向广告新一代主模型:基于搜索的超长用户行为建模范式
2.1.4 MMoE
paper:Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts
Shared-Bottom Multi-task Model
如上图a所示,shared-bottom网络(表示为函数f位于底部,多个任务共用这一层。往上,K个子任务分别对应一个tower network(表示为h),每个子任务的输出
y
k
=
h
k
(
f
(
x
)
)
y_k=h_k(f(x))
yk=hk(f(x))
Mixture-of-Experts(MoE / OMoE)
MoE模型可以形式化表示为
y
=
∑
i
=
1
n
g
i
(
x
)
f
i
(
x
)
y=\sum^n_{i=1} g_i(x)f_i(x)
y=∑i=1ngi(x)fi(x),其中
∑
i
=
1
n
g
i
(
x
)
=
1
\sum^n_{i=1} g_i(x)=1
∑i=1ngi(x)=1,且
f
i
f_i
fi,
i
=
1
,
.
.
.
,
n
i=1,... , n
i=1,...,n是n个expert network(expert network可认为是一个神经网络)。
g是组合experts结果的gating network,具体来说g产生n个experts上的概率分布,最终的输出是所有experts的带权加和。显然,MoE可看做基于多个独立模型的集成方法。这里注意MoE并不对应上图中的b部分。
后面有些文章将MoE作为一个基本的组成单元,将多个MoE结构堆叠在一个大网络中。比如一个MoE层可以接受上一层MoE层的输出作为输入,其输出作为下一层的输入使用。
Multi-gate Mixture-of-Experts(MMoE)
MMoE目的就是相对于shared-bottom结构不明显增加模型参数的要求下捕捉任务的不同。其核心思想是将shared-bottom网络中的函数f替换成MoE层,如上图c所示,形式化表达为:
y
k
=
h
k
(
f
k
(
x
)
)
,
f
(
x
)
=
∑
i
=
1
n
g
k
(
x
)
i
f
i
(
x
)
y_k=h^k(f^k(x)),f(x)=\sum ^n _{i=1}g^k(x)_if_i(x)
yk=hk(fk(x)),f(x)=i=1∑ngk(x)ifi(x)
其中
g
k
(
x
)
=
s
o
f
t
m
a
x
(
W
g
k
x
)
g^k(x)=softmax(W_{gk}x)
gk(x)=softmax(Wgkx),输入就是input feature,输出是所有experts上的权重。
一方面,因为gating networks通常是轻量级的,而且expert networks是所有任务共用,所以相对于论文中提到的一些baseline方法在计算量和参数量上具有优势。
另一方面,相对于所有任务公共一个门控网络(One-gate MoE model,如上图b),这里MMoE(上图c)中每个任务使用单独的gating networks。每个任务的gating networks通过最终输出权重不同实现对experts的选择性利用。不同任务的gating networks可以学习到不同的组合experts的模式,因此模型考虑到了捕捉到任务的相关性和区别。
参考:多任务学习模型MMoE详解 Multi-gate Mixture-of-Experts 与代码实现
2.1.5 其他
- 一些传统用户行为序列建模:用户行为序列建模。
- senet、ppnet 这种 gateing网络
其他经典模型:序列建模简史(DIN/DIEN/DSIN/BST/MIMN/SIM/ETA/SDIM/TWIN)
2.2. 生成式推荐
- GRU4Rec 、 RecSys:在这两种情况下,正样本(被点击的商品或用户至少花了一定时间观看的视频)序列作为输入。我们进一步观察到,在经典的工业规模两阶段推荐系统设置中,包括检索和排序。GRU4Rec主要做的是检索任务。
详情:推荐中的序列化建模:Session-based neural recommendation
- SASRec: 第一个在推荐中将transformer应用于推荐自回归。类似于GRU4Rec,他们将评论或评分视为正样本,将Amazon Reviews 3和MovieLens 4等经典数据集转换正样本序列。position embedding是可学习矩阵,这就存在长度过长的学习不充分。
- BERT4Rec 、S3Rec
上述的几种方式基本方法都类似: 最后预测下一个目标推荐的结果,跟生成模型类似,预测下一个token,包括loss也比较像,都是候选Item的softmax encropy或者pair-wise loss。
3.Method
针对第一节background中的三个问题,下面分别围绕这3个方面展开介绍Solution:“统一的特征空间”、“重塑召排问题”、“新Encoder架构HSTU、性能加速优化”。然后具体分析实验部分(Evaluation)并做总结(Conclusion)。
前奏:任务定义
给定按照时间顺序排列的tokens序列
x
0
,
x
1
,
…
,
x
n
−
1
(
x
i
∈
X
)
x_0, x_1,…, x_{n−1} (x_i∈X)
x0,x1,…,xn−1(xi∈X),对应的时间序列为
t
0
,
t
1
,
…
,
t
n
−
1
t_0, t_1,…, t_{n−1}
t0,t1,…,tn−1,以及其他的元数据
a
i
∈
X
a_i∈X
ai∈X(例如:主时间序列里的元数据包括用户的行为类型,如曝光/点击/点赞/浏览图片等)。序列直推式任务(a sequential transduction task) 是在给定掩码序列
m
0
,
m
1
,
…
,
m
n
−
1
m_0, m_1,…, m_{n−1}
m0,m1,…,mn−1的条件下,将此输入序列映射到输出标记
y
0
,
y
1
,
…
,
y
n
−
1
(
y
i
∈
X
∪
∅
)
y_0, y_1,…, y_{n−1} (y_i∈X∪{∅})
y0,y1,…,yn−1(yi∈X∪∅),其中
y
i
=
∅
y_i =∅
yi=∅表示
y
i
y_i
yi未定义。
其中
Φ
i
∈
X
c
(
X
c
⊆
X
)
Φ_i∈X_c (X_c \subseteq X)
Φi∈Xc(Xc⊆X)表示系统向用户提供的内容。 掩码序列主要为了标记各个
y
i
y_i
yi的含义,
m
i
∈
{
0
,
1
}
m_i ∈ \{ 0, 1\}
mi∈{0,1},
m
i
=
1
m_i=1
mi=1处
y
i
y_i
yi有定义(比如是交互的正样本item),
m
i
=
0
m_i=0
mi=0则未定义(比如是某个属性/用户行为类型,不代表正样本item)。
整体模型图:
3.1 统一特征空间
现代推荐系统通常在海量稀疏类别型特征(sparse)和稠密型数值特征(dense)上训练。
-
类别型(稀疏)特征:如用户喜欢的item、品类、用户使用的语言、用户加入的社群、发起请求的城市等。首先,选择跨度最长的序列作为主时间序列,通过合并用户交互的item特征来实现。如上图右侧中间部分,main time series通常由交互的item构成,包括交互itemID、时间戳、行为类型等。辅助aux time series通常是随着时间缓慢变化的特征构成,如用户的人口统计学信息或已关注的作者等,会对aux时间序列做压缩,只保留每个连续片段的最早记录,然后将结果合并到主时间序列中,比如:图中aux time series 1 左侧3个连续行为保留第一个插入main series的最左端,这种方法不会显著增加整体序列的长度。
-
数值型(稠密)特征:如user-item topic的历史统计点击率特征。与分类特征相比,这些特征的变化频率要高得多,可能会随着每个(用户,物品)交互而发生变化。因此,从计算和存储的角度来看,将这些特征完全序列化是不可行的。然而,一个重要的洞察是,这类聚合统计特征,可以被大规模长序列建模所替代,通过直推式序列架构(sequential transduction architecture)以及目标感知(target-aware)的建模方式,也能捕捉和编码好用户兴趣,并且随着序列长度和计算量的增加,这种信息捕捉得会越好,因此本方法中丢弃要显式数值统计类特征。
这也是典型的两个门派,长序列DNN端到端建模 VS 手动特征工程。海量样本/高频消费场景+长序列建模架构,是有可能更泛化地捕捉用户兴趣,发挥特征工程的作用;反之,在规模不足的场景下,这类特征工程仍然是有必要的。现实中能达到前者要求的大厂不多。
为了统一海量的异构特征,作者将用户所有的正负反馈(正负样例,是否点击)行为组织成序列,这个序列中既包括itemid、userid、也包括稀疏特征、交互行为类型等,摒弃了数值型特征,构造成生成式建模所需要的统一输入格式。
问题: itemid、userid、交互行为怎么表示的?
3.2 重塑召回排序模型
关键问题:如何用生成式框架来重新定义召回和排序任务?Reformulating ranking and retrieval as sequential transduction tasks
归纳式学习是从已有数据中归纳出模式来,应用于新的数据和任务,是我们比较常见的机器学习模式,如传统监督学习。
直推式学习由当前学习的知识直接推广到给定的数据上,即:首先观察全部数据,包括了训练和测试数据,我们从观测到的训练数据集上进行学习,然后在测试集上做预测。即便如此,我们不知道测试数据集上的标签,我们可以在训练时利用数据集上的模式和额外信息。
总结:归纳式学习强调输入和输出之间的映射关系的预测;而直推式学习强调从数据中发现隐含的模式和结构。
ref: 如何理解 inductive learning 与 transductive learning?
3.2.1 召回任务
为每个用户学习概率分布 p ( x i + 1 ∣ u i ) p(x_i+1|u_i) p(xi+1∣ui),其中 x i + 1 ∈ X c x_i+1 ∈ X_c xi+1∈Xc, u i u_i ui是在时间步i的用户表征向量(可以理解为整个行为序列表征),学习在给定用户表征下,全库物料的概率分布,学习目标是选择 m a x x ∈ X c max_{x \in X_c} maxx∈Xc。 p ( x ∣ u i ) p(x|u_i) p(x∣ui)来最大化某个特定的reward。但和标准的自回归有一定差异:
- 首先,下一个token x i + 1 {x_{i+1}} xi+1不一定是 x i x_i xi, y i y_i yi的监督信号,因为 x i + 1 x_{i+1} xi+1有可能是负样本(比如曝光未点击);
- 其次,下一个token还不一定是物料,也有可能代表元特征,比如人口属性特征 x i + 1 ∈ X c x_{i+1} \in X_c xi+1∈Xc。
上述情况会通过掩码序列来标识,此时
m
i
=
0
m_i=0
mi=0。
这个召回Loss的设计文中没有细讲。基于个人理解,召回任务采取的是类似自回归建模,
decoder-only,next-token prediction,对于非item token或者非正样本(如曝光),会通过
mi=0来做mask,不进行回归预测,但输入层面会做self-attention来提取信息,只是算自回归loss的时候不参与而已。此外,在做next-token prediction预测全库概率分布时,肯定也需要进行负采样优化(softmax预测候选的所有item成本太高了),和标准的双塔召回应该也是类似的。差异就是输入序列的构造上引入了全部的行为反馈数据,达到特征层面充分交叉,预测层面通过mask实现正样本的next-token prediction。
整个用户行为序列加工后的表征可以作为user embedding,最后使用的时候也可以是向量召回形式。这个部分论文实在是讲的太少,理解不对的地方多多指教。也期待作者后续更新arxiv。
3.2.2 排序任务
精排通常需要target-aware的建模,即:将待预测的item和用户历史行为等做交叉,且要在深度模型底层更早地做交叉,而不能到深度模型输出侧才做交叉,那样效果大打折扣。在标准的自回归设定下,交叉只能在encoder输出后接softmax层进行,无法在encoder内部底层提早做交叉,效果上大打折扣。为了解决这样的问题,一种思路是对encoder的输入序列做改造,来实现底层交叉的目的。
作者通过在序列上交错插入item和action来实现(We address this problem by interleaving items and actions in the main time series.)。也就是前文提到的将action当做是一种新模态,实现历史各种行为和target的充分交叉。
因此暂时先不考虑类别型元特征,构造好的序列形如 x 0 , a 0 , x 1 , a 1 , . . . x n − 1 , a a − 1 x_0, a_0, x_1, a_1, ... x_{n-1}, a_{a-1} x0,a0,x1,a1,...xn−1,aa−1,在action位置上对应的mask m i = 0 m_i=0 mi=0。在实际建模中,每个content物料位置通过encoder编码好的表征会接多个任务塔来实现多目标训练和预测。
这个地方仍然没有讲清楚ranking的loss是怎么设计的,仍然按照个人的理解,ranking任务在content物料位置接多任务tower来实现训练和预测,且特定任务的tower参数应该是所有content位置共享的,另外这里我的理解所有content位置不管是正负样例都是会进行多目标预测。个人认为排序中自回归目标不是必须的,但作为辅助目标是可以的。
线上要进行推理的时候,将待预估的候选item和信息插到历史行为序列(怎么插文中没提,比如插到末尾)中进行交叉和预测。历史用户行为序列计算实际上在所有候选items间是可以共享的,因此通过合理组织和“折叠对齐”候选items,是可以实现1次推理,全部候选items的预估(形式上是单次推理,实际上仍然是多次打分,复用了大部分算力)。这点非常香,能节省大量算力和资源。类Transformers架构的精排或重排模型,是有可能实现这一效果的,足够颠覆现有的预估范式。这个方法近期我们在做item维度下子粒度创意预估时有切身感受,通过折叠子候选集来实现算力复用,节省大量算力。
召排的GRs是否有部分共享,还是只是基础架构一样,仍然是2个分开的模型?文中也没有讲这块,但从最终的实验模型上看,两个模型是分开训练的(对于ranking, l = 3 l=3 l=3, n = 2048 n=2048 n=2048, d = 512 d=512 d=512;对于检索, l = 6 l=6 l=6, n = 512 n=512 n=512, d = 256 d=256 d=256)。从技术实现上,自回归部分是能共享的,排序额外的多目标损失则是多出来的一块。
3.3 模型架构升级——HSTU
新encoder定位:A High Performance Self-Attention Encoder for Generative Recommendations,作者设计了新一代的encoder架构,称为HSTU(Hierarchical Sequential Transduction Unit) (HSTU)
这里主要解决文章开头说的难点部分:推荐系统使用不断变化的十亿级词汇表,在这个背景下如何提高效果。 这里借鉴了很多传统的推荐模型方法,比如:DIN、MoEs、SENet
类似Transformers,HSTU堆叠多个层,层与层之间通过残差连接。每个层包含三个主要的子层:pointwise投影层,pointwise空间聚合层和pointwise转换层。
poinwise投影层:
U
(
X
)
,
V
(
X
)
,
Q
(
X
)
,
K
(
X
)
=
S
p
l
i
t
(
ϕ
1
(
f
1
(
X
)
)
)
U(X), V(X), Q(X), K(X)=Split(\phi_1(f_1(X)))
U(X),V(X),Q(X),K(X)=Split(ϕ1(f1(X))),
f
1
(
x
)
f_1(x)
f1(x)是单层MLP,
ϕ
1
\phi_1
ϕ1是激活函数,采用SiLU,对输入序列做了个非线性变换。
pointwise空间聚合层:
A
(
X
)
V
(
X
)
=
ϕ
2
(
Q
(
X
)
K
(
X
)
+
r
a
b
p
,
t
)
V
(
X
)
A(X)V(X) = \phi_2(Q(X)K(X)+rab^{p,t})V(X)
A(X)V(X)=ϕ2(Q(X)K(X)+rabp,t)V(X)。整体类似传统的QKV self-attention。
r
a
b
p
,
t
rab^{p,t}
rabp,t是attention bias,引入了位置
p
p
p和时间
t
t
t信息,执行attention操作。
pointwise转换层:
Y
(
X
)
=
f
2
(
N
o
r
m
(
A
(
X
)
V
(
X
)
)
⨀
U
(
X
)
)
Y(X) = f_2(Norm(A(X)V(X)) \bigodot U(X) )
Y(X)=f2(Norm(A(X)V(X))⨀U(X))。
f
2
f_2
f2也是单层MLP,类似传统的feedforward MLP。
HSTU相比于Transformer,在推荐系统领域的改进点体现在上面3个层:
- poinwise投影层:在传统Q,K,V基础上,多了一个 U ( X ) U(X) U(X),压缩该用户长期历史行为信息,可以理解为底层的用户长期行为序列表征,在后续层中,会基于序列信息+target进行信息筛选和增强。
- pointwise空间聚合层:HSTU采用了一种新的pointwise聚合注意力机制,而不是Transformers中的softmax注意力机制。这个处理和DIN[5]是类似的。即把序列维度的聚合权重 ∑ i w i = 1 \sum_iw_i=1 ∑iwi=1的约束放松了,也就是抛弃了softmax normalization的操作,能够更好地保留用户兴趣的强度,能够保留用户对激活item的强度信息。比如1个用户的历史行为中包含了90%的衣服,10%的电子产品。对于目标为衣服的item,显然行为序列中为衣服的item信息要尽可能多的保留,如果采用softmax做normalization,那么这一强度信息就会失真, 导致在预测多目标时预估不准确(如item时长)。如果不采用softmax,那么用户交互了“多少件衣服item”这一先验的重要信息能够保留。如果仅仅只需要预估相对排序,那么normalization后的序信息是可以保留的。但除了序,我们还要预估准“值”,那么softmax的操作就需要舍弃了。除此之外,作者通过生成数据来模拟流式环境,发现softmax激活不适合这种非稳态动态词表的场景。使不使用softmax对性能的影响巨大。如下图所示。这个洞察还是很有启发的,和DIN思路如出一辙。只不过“pointwise聚合”叫法感觉容易让人摸不着头脑。另外,我们还能发现attention bias(rab)的作用也是比较大的。
- pointwise转换层:HSTU具备替代传统多层深度模型的能力,能起到特征抽取、特征交叉和表征转换的作用。
- 特征抽取:很多稀疏特征会作为输入,过各层网络后得到attentive pooled embedding。
- 特征交叉:传统DNN通过FM等结构实现,HSTU采用基于attention得到的pooled特征来直接和其他特征交互,即上述的
N
o
r
m
(
A
(
X
)
V
(
X
)
)
⨀
U
(
X
)
Norm(A(X)V(X)) \bigodot U(X)
Norm(A(X)V(X))⨀U(X)。这个设计的动机来源于多层MLP在近似点积上实际上存在困难 12,比如Rendle在Recsys2020上挑战经典的神经协同过滤方法NCF。如果U(X)上再套层SiLU,那么就很像SwiGLU的变体了。个人理解此处的
更好地保留了原始输入的信息,经过attention计算后的pooled信息本身蕴含了和target的高阶交叉特征,再补充和底层原始信息之间的特征交叉。 - 表征转换:传统DNN通常基于MoE来动态路由选取多样异构的输入信息。一种想法是为每个用户专门定制子网络来进行条件计算,在HSTU中,element-wise点积可以在标准化因子上实现类似MoEs的门控操作。个人理解相当于
可以类比MoE中的门控操作,对底层
做信息筛选。实际上也有点像SENet/PPNet等特征重要度学习方法。
其他工程优化
本文方法特点:
- Ignorance of features other than user-interacted items. 只保留与用户交互的Item信息。我的理解就是描述Item的离散特征或者Sparse特征。
下一时刻如果item没有被点怎么办?
生成的结果是什么?
为什么Q K V U都会用到SiLU激活?MoEs、SENet?
论文中cross attention的实现,感觉挺有意思的。如果在CTR推荐场景落地论文的架构,有可能是把曝光和点击行为,都放到一条序列中,把item的time diff、类目等属性信息以类似position embedding的方式相加引入进来,把行为类型也放到了序列中,序列形式类似于:item1,action(曝光未点击),item2,action(点击),item3,action(点击)。。。后面是一个next item prediction的loss,精排模型会mask掉序列中的用户画像和action部分,而在item位置后接一个小网络进行多任务action目标的预测。召回模型则只对序列中的item进行预测,不过会把像曝光未点击这类item mask掉。
线上推理阶段,可以把上百个精排候选集放到序列中,一次推理即可得到所有打分结果,而且随着候选集数目的上升,相比传统架构的优势也越来越明显。推测应该是decode-only架构,用了causal mask的方式,序列中每个item在做attention的时候,只能看到自己和之前的item,看不到后面的item。模型能力比历史行为和target item拼一起直接做 self attention要低,比历史行为做完self attention之后再做target attention要高。复杂度确实可以控制到
O
(
(
n
+
b
m
)
2
d
)
O((n+b_m)^2d)
O((n+bm)2d)的水平。
论文虽然抛弃了人工构造的统计特征,但仍然是基于ID体系进行学习的,并没有多模态信息的引入。目前一些研究表明,多模态信息在一些情况下是可以打平ID体系的,不知道后面结合模型复杂度和数据量的提升,是否会有一些质的飞跃,这个还是比较期待的。
线上推理阶段,可以把上百个精排候选集放到序列中,一次推理即可得到所有打分结果,而且随着候选集数目的上升,相比传统架构的优势也越来越明显。
后续落地的一些思考:
- 效果空间:取决于当前基线的特征交叉和用户建模技术水位,基线太强会影响提升的效果,那么落地这个工作可能就会不太划算。
- 工程优化:离线训练和在线推理都有挺多需要优化的地方,否则很难控制计算成本和迭代效率。
- 信息对齐:基线可能特征很多,数据来源也很多,需要尽量把基线特征用的上游数据源都梳理清楚,保证两套系统在输入信息量上是可比的。另外新架构很难把基线模型的交叉特征和统计特征加进来,给打平效果也带来了不小的困难。
DLRM 通常使用相对较小的序列长度,例如BST中的20、DIN中的1,000和TransAct中的100。对比之下,这些序列长度与本文中的模型长度8,192相比要小1-3 个数量级。
Neural collaborative filtering vs. matrix factorization revisited. In Fourteenth ACM Conference on Recommender Systems ↩︎
Revisiting neural retrieval on accelerators ↩︎