导读丨使用玩家在游戏内的行为序列基于生成式推荐端到端的对皮肤推荐精排场景进行建模,该方法在离线指标和在线效果均获得了明显提升。
作者:Deltaverse高级研发工程师 宋浩
背景介绍
英雄皮肤售卖是MOBA类游戏最重要的商业化收入来源之一。游戏内英雄皮肤主要在常驻皮肤商城或者活动类场景(抽奖、神秘商店等场景)进行出售。
对于常驻皮肤商城场景,将当前可售卖的所有皮肤按照玩家购买偏好顺序进行曝光展示,待排序的候选池总量一般在1000以内,因候选池规模不大,按照精排模型进行建模即可。活动类场景略有差异,是从指定全量候选池里选取部分候选进行曝光,这些候选也可以根据玩家偏好进行推荐,本质可以和常驻类场景复用相同模型。
在使用生成式推荐之前,我们主要是基于序列化(DIN)+多目标(MMOE)的方式进行建模,整体模型结构和下图比较类似:

在特征层面,我们主要引入了如下特征:
-
统计类特征(dense 特征),主要包括交互统计特征,item侧以及user侧统计特征。
-
预训练产生的embedding特征,譬如基于玩家历史行为产生玩家的embedding表征(user侧embedding特征)。
-
类别特征(spase 特征),user侧基础属性,item侧基础属性。
-
行为序列特征(sequence 特征),不同窗口user历史行为序列。
-
人工交叉特征,譬如显式对user历史行为序列和item基础属性做交叉。
-
实时特征,主要包括玩家实时行为序列以及item侧实时统计特征。
上面的整体方案在我们商业化以及社交等场景已经应用广泛,且取得不错的收益(相比之前策略曝光arpu +14.6%)。今年2月份,Meta发表了一篇论文《Actions Speak Louder than Words: Trillion-Parameter Sequential Transducers for Generative Recommendations》 , 提出基于统一的LLM框架分别对召回和精排场景建模,并取得显著收益。
生成式推荐方案
在之前的方案里,我们会尝试不同方向优化效果,但是主要精力在如何挖掘更多特征。Meta的生成式推荐方案对特征进行了简化,只使用用户历史行为序列或用户的不显著变化的基础属性特征,基于LLM模型结构进行自回归端到端建模。按照论文表述,去掉了统计类特征,并将多条用户行为序列按照时间戳升序合并成一条序列。

因Meta未开源精排部分代码,我们主要参考其论文描述实现我们的精排方案,但在我们场景落地时也做了调整,具体方案如下:
建模
建模样本组织方式
在Meta的方案,样本按照如下的方式进行组织:

对于精排场景,输入序列中的 和
分别代表
以及
, 具体到我们场景,
为候选池全量集合,
主要包括(曝光,购买,点击,对局),序列的组织顺序按照
发生的时间戳升序组织,输出序列是将输入序列右移一位且只在
位置有对应输出
,实际计算next-prediction loss时,我们只计算输出序列
中 action=曝光 或者 购买action=购买位置对应的loss即可。样本如果上述方式组织,主要会有如下优缺点,
优点:
-
一个用户只产生一条序列,不管对于增量训练还是全量训练,都可以极大的节省计算量(论文里也详细说明了计算复杂度的对比情况)。
缺点:
-
对于上述组织方式,将曝光既作为特征又作为样本会导致一些问题,譬如假设上面序列的代表曝光,那么计算
位置的loss时
作为样本的label,在计算
位置的loss时根据可见性
是作为特征输入。如果是同一个曝光产生的所有行为(譬如相同的recommend_id下,
为曝光,
为购买),那么实际上计算
位置的loss时
是不可见的。对于这种情况,需用通过处理attention mask去处理可见行问题。
-
一般情况下,不采样的情况下,玩家曝光行为在所有行为序列中占比最高,不采样的话导致序列过长难以训练。如果对曝光行为作采样,对于玩家的实时曝光行为序列也需要做相同处理,但这里因窗口限制很难保证一致性(过长很难保证实时性,过短很难保证和离线一致性)。
所以,我们对样本组织方式做了如下调整,将原本一条用户序列拆分成多条,譬如我们对20241108这一天的曝光进行采样后,我们采用和之前baseline类似的方式进行组织样本,以单个玩家的样本为例,类似如下:

对于正样本,需要保证同一个recommend_id下的购买或者点击不可见,直接对当天行为序列中,与样本中的购买属于同一个recommend_id下的其他购买或者点击从序列中去除即可。这种样本组织方式可以理解为Meta论文提到的一种特殊形式,虽然对训练性能有较大开销,但是可以避免直接将曝光引入到序列中间导致的问题。
模型结构
模型的主体结构和Meta论文里的HSTU(decoder架构)保持一致:

关于模型内部每一层block的细节,按照作者的说法主要分为Pointwise 映射,Patial 聚合,Pointwise 转换这几个部分,具体说明可以参考论文,这里不做重复介绍。对于精排模型,我们需要在每一个token位置对应的最后一层输出接一个相同的MLP网络,最后使用sigmod激活函数预测每一个token位置的打分,该打分代表基于该token位置之前的输入序列,购买该位置item的概率。

loss计算方式如下:
对于,如果当前token为item,且下一个action为曝光或者购买,则为
1,其余为0。
序列组织方式
在了解了基本的CoT的形式和功能之后,我们参考上海交大的一篇综述性论文【5】,来总结CoT模式转变的几个方向。在我们的场景中,我们只用到了玩家历史行为序列,没有用到玩家基础属性特征,且这部分序列特征是之前baseline特征的子集,将所有行为序列以 交错的方式进行组织:其中,对于item的基础属性,以sideinfo的形式与itemid进行整体处理作为该位置的token,最终输入序列的整体
采用如下方式处理:
, 其中f为一层MLP, 输出输入序列对应embedding表的维度一致。对于,如果当前token为item则为1,其余为0。
输入序列不同组成部分
精排部分为了能保证线上预估时一次对多个候选进行打分,模型的输入序列按照如下方式组织:

其中,user sequence就是实际的玩家历史行为序列,candidate sequence为候选item列表,训练时占位即可(默认占位为0,不参与loss计算),推理时为实际线上的item候选列表,最后为padding sequence, 主要进行填充和截断操作,保证输入的长度一致。
通过引入candidate sequence, 训练时增加了计算量,但是在推理时,可以一次对candidate sequence将原本候选池为1000,对应推理batch_size=1000的打分,优化为batch_size=10的打分(假设candidate sequence的长度为100),这样可以显著改善推理性能。

causal-mask处理
causal-mask主要用于attention计算,在输入序列中我们引入了candidate sequence,为了与线上模型推理时保持一致,除了正常的user sequence使用下三角矩阵,candidate sequence使用对角线全为1的单位矩阵,保证item列表里只能看到自己位置的item,padding sequence处为0即可。
效果提升
在某常驻皮肤商城场景,我们的在线效果相比之前baseline曝光arpu +3.6%, 在某活动类皮肤打折售卖场景,我们的在线效果相比之前baseline曝光arpu +11.2%。
后续计划
基于生成式模型进行端到端建模对特征做了极大的精简,且整体的推荐工程架构相对简化,避免之前为保障离线和在线样本和特征一致性引入的复杂数据链路。关于后续计划,主要包括两个方面:
-
进一步挖掘玩家历史行为,尝试目前主流LLM模型架构,以及基于当前框架结合多目标或多场景建模进一步优化。
-
结合当前主流LLM推理方案,优化线上推理性能。
关于腾讯游戏数据
腾讯游戏数据(海外品牌名称Deltaverse)沉淀20余年、700+款大型游戏的数据工作经验,基于AI大模型及数据科学能力,为全球游戏业务和企业提供专业智能的数据平台及定制化解决方案,覆盖治理、开发、分析全链路及业务全场景,助力实现高效增长。
826



被折叠的 条评论
为什么被折叠?



