长序列建模

推荐模型中,序列建模是一个重要话题。如$DIN$、$BST$等都已经成为经典模型。但是这些模型都是聚焦在用户的短期(实时)兴趣,对于用户的长期兴趣无法精确捕捉。这个时候,就需要对用户的长期行为序列进行建模。 长序列建模 长序列一般是指规模在千或者万级别的行为序列。对于这种级别的序列进行建模的难点在于,计算时间复杂度高,开销大,对线上服务的计算延迟提出了很大的挑战。所以研究的重点大多集中在如何降低模型的……

阅读全文

当推荐遇到大模型

自从大语言模型爆火之后,大家对大语言模型(LLM)如何成功应用在推荐系统进行了不少尝试。本文是对目前一些业界工作的调研和总结。 大模型应用范式 现阶段,经典推荐架构基本遵循以下范式: 目前, LLM 在推荐系统中的主流应用可以分为两种范式: 一个是作为经典推荐系统的辅助部分,即 LLM+RS。 一个是 LLM 单独作为一个完整的推荐系统,即 LLM AS RS。 本文接下来将分别介绍这两种应用方式。 LLM+RS 传统推荐系统经过多年发展,从召回、排序……

阅读全文

Batch内负采样

In-batch Negative Sampling code: 1import torch 2import torch.nn as nn 3import torch.nn.functional as F 4 5class RecommenderModel(nn.Module): 6 def __init__(self, user_size, item_size, embedding_dim): 7 super(RecommenderModel, self).__init__() 8 self.user_embedding = nn.Embedding(user_size, embedding_dim) 9 self.item_embedding = nn.Embedding(item_size, embedding_dim) 10 11 def forward(self, user_ids, item_ids): 12 user_embeds = self.user_embedding(user_ids) 13 item_embeds = self.item_embedding(item_ids) 14 return user_embeds, item_embeds 15 16 def in_batch_negative_sampling_loss(user_embeds, item_embeds): 17 batch_size = user_embeds.size(0) 18 19 # 正样本得分 (batch_size,) 20 positive_scores = torch.sum(user_embeds * item_embeds, dim=-1) 21 22 # 负样本得分 (batch_size, batch_size) 23 negative_scores = torch.matmul(user_embeds, item_embeds.t()) 24 25 # 创建标签 (batch_size, batch_size) 26 labels = torch.eye(batch_size).to(user_embeds.device) 27 28 # 计算损失 29 loss = F.cross_entropy(negative_scores, labels.argmax(dim=-1)) 30 31 return loss 32 33# 示例数据 34batch_size = 4 35embedding_dim = 8 36user_size = 100 37item_size = 1000 38 39user_ids = torch.randint(0, user_size, (batch_size,)) 40item_ids = torch.randint(0, item_size, (batch_size,)) 41 42model = RecommenderModel(user_size, item_size, embedding_dim) 43user_embeds, item_embeds = model(user_ids, item_ids) 44 45loss = in_batch_negative_sampling_loss(user_embeds, item_embeds) 46print(f'Loss: {loss.item()}') 优点 效性:批量内负采样能够充分利用每个训练批次中的样本,提高……

阅读全文

动态权重在推荐中的应用

动态权重 1. 从LHUC说起 语音识别领域2016年一项开创性工作提出了LHUC(Learning Hidden Unit Contribution)算法, 在DNN网络中为每个speaker学习对应的hidden unit contribution, 然后与common hidden layer相结合,以此提升不同speaker的语音识别准确率。这项工作属于domain adaptation领域,LHUC方法相比之前工作最重要的改进点是模型实现doma……

阅读全文

POSO冷启动

POSO POSO: Personalized Cold Start Modules for Large-scale Recommender Systems 是快手发表的一篇关于如何解决新老用户分群的文章。与传统的做法从样本上做文章不同,论文直接从模型结构上入手,希望模型能够区分两部分人群,达到一个新用户冷的效果。 Motivation 文章先分析了新用户和普通用户行为的存在差异性,然后设计实验可视化了新用户特征被淹没的现象,再提出了可嵌入到主流网络结构中的方法POSO。 按照常规的做法,一个模型想要hold住两种不一样的分布(新用户 && 老用户),至少得有一……

阅读全文

推荐中的特征交叉技术

特征交叉范式 特征交叉指的是通过组合两个(或多个)特征来学习特征间非线性的组合高阶表达,其收益则是来自通过挖掘特征之间的共现组合,拓展了特征输入的表达,从而使得模型能更容易学习到共现组合提供的信息。 业界实现方案可以主要分为非参数化方案和参数化方案。 非参数化方案:显式的表达特征交叉ID,例如特征求交,笛卡尔积特征等。 参数化方案:主要通过模型参数隐式拟合的形式去捕捉特征的非线性组合能力,而参数化方案在D……

阅读全文

Ordinal Regression

像分类的回归 考虑一个场景:豆瓣电影评分预测。一共5个档位,从1星到5星。label_set = [1, 2, 3, 4, 5]。很自然的,我们可以把它当作一个经典的多分类问题,模型最后一层通过$softmax$函数输出每一类的概率。然后用$ce\ loss$训练。但是,如果当作分类问题,我们忽略了一点,打分之间是有可比性的:5>4>3>2>1。而如果当作分类问题,经过$one-hot$编码之后,每……

阅读全文

召回模型的评估

召回模型评测指标 为什么不用AUC指标 AUC指标不适用于衡量召回模型。原因有三: 计算AUC时,正样本容易获得,可以拿点击样本做正样本。但负样本从哪里来?照搬精排,用曝光未点击做负样本,行不行?不行。否则,测试样本都来自曝光物料,也就是从系统筛选过的、比较匹配用户爱好的优质物料,这样的测试数据明显与召回的实际应用场景(海量的、和用户毫不相关的物料)有着天壤之别。失真的测试环境只能产生失真的指标,不能反……

阅读全文

多兴趣召回推荐

传统双塔 user_tower: 产生$V_u$ item_tower: 产生$V_i$ $$ score = f(u\_emb, i\_emb)= <V_u, V_i> $$ 多兴趣双塔 MIND 1interest_capsules = CapsuleLayer(input_units=user_seq_embedding.shape[-1], 2 out_units=params['embedding_dim'], 3 max_len=params['max_seq_len'], 4 k_max=params['k_max'], 5 mode=mode)((user_seq_embedding, like_user_seq_len)) # [B, k_max, embedding_dim] 6 7q_embedding_layer = tf.tile(tf.expand_dims(q_embedding, -2), [1, params['k_max'], 1]) # [B, k_max, 64] 8 9q_deep_input = tf.concat([q_embedding_layer, interest_capsules], axis=-1) # [B, k_max, embedding_dim+64] $Dynamic \ \ Routing$: $Loss$: $$ \begin{aligned} \overrightarrow{\boldsymbol{\upsilon}}_{u} &=\mathrm{Attention}\left(\overrightarrow{\boldsymbol{e}}_{i},\mathrm{V}_{u},\mathrm{V}_{u}\right) \\ &=\mathrm{V}_{u}\mathrm{softmax}(\mathrm{pow}(\mathrm{V}_{u}^{\mathrm{T}}\overrightarrow{\boldsymbol{e}}_{i},p)) \end{aligned} $$ 问题 interest之间差异比较小,学到的兴趣接近 改进$squash$函数 $$ \text{squash函数: }a\leftarrow\frac{|a|^2}{1+|a|^2}\frac a{|a|} \\ \text{ 改进的Squash: }a\leftarrow pow\left(\frac{|a|^2}{1+|a|^2},\mathbf{p}\right)\frac a{|a|} \ \ (0 \leq p \leq 1) $$ 或者对学到的K个兴趣向量加正则损失: $$ D_{output}=-\frac{1}{K^2}\sum_{i=1}^K\sum_{j=1}^K\frac{O^i\cdot O^j}{|O^i||O^j|} $$ ComiRec $Dynamic \ \ Routing$提取兴……

阅读全文

多任务loss优化

多任务学习是推荐系统中常见的技术实现. 在很多推荐与排序场景中,业务目标通常有多个,找到一种综合排序方法使得多个目标都达到整体最优,才能实现受益最大化。 多任务学习 多任务学习经常使用联合训练(Joint-train)的模式进行多任务优化学习,公式如下: $$ L=\min_\theta \sum_{t=1}^T \alpha^t L^t\left(\theta^{s h}, \theta^t\right) $$ 公式$\theta^{t}$是任务$t$公式的独享参数,$\theta^{sh}$是所有任务的共享参数, $\alpha^t$是任务$t$……

阅读全文