抖音推荐算法
- 一、广告系统中的数据流处理方法,怎么避免延迟回流问题
延迟回流问题是指,实时系统(如广告点击预估)中,历史数据未及时更新或发生延迟,导致系统的实时预测偏离实际情况。避免延迟回流的方法有- 使用高效的流处理框架
Kafka、Flink等流处理工具,确保实时性; 使用滑动窗口处理实时数据,允许系统适应一定的延迟 - 特征工程优化
- 消除数据泄漏
严格限制特征只使用过去和当前的可用数据,防止数据泄露。 - 实时与离线特征分层
将特征分为离线特征(如用户画像、历史行为)和实时特征(如当前广告上下文、实时点击行为),根据实时性不同分阶段更新。
- 消除数据泄漏
- 模型训练优化
- 使用增量学习(在线学习)
持续训练模型,吸收最新的数据流输入;在模型训练中,为最新数据分配更高的权重,减小延迟数据对模型影响
- 使用增量学习(在线学习)
- 使用高效的流处理框架
- 二、介绍DeepFM模型
DeepFM 是一种结合了因子分解机(FM)和深度神经网络(DNN)的模型,旨在同时捕捉特征的低阶交互和高阶非线性交互。其结构可以分为两个部分:FM 部分和 DNN 部分,最终两者的输出会结合起来进行预测。
import torch
import torch.nn as nn
import torch.optim as optim
class DeepFM(nn.Module):
def __init__(self, n_features, embedding_dim, hidden_units, dropout_rate=0.5):
super(DeepFM, self).__init__()
self.embedding = nn.Embedding(n_features, embedding_dim)
self.dnn = nn.Sequential(
nn.Linear(n_features * embedding_dim, hidden_units[0]),
nn.ReLU(),
nn.Dropout(dropout_rate),
nn.Linear(hidden_units[0], hidden_units[1]),
nn.ReLU(),
nn.Dropout(dropout_rate),
nn.Linear(hidden_units[1], 1)
)
# 输出层:FM 和 DNN 部分的输出拼接
self.output_layer = nn.Linear(1 + 1, 1) # FM 输出与 DNN 输出拼接
def forward(self, x):
# FM 部分:计算特征的二阶交互
embedding_x = self.embedding(x)
fm_output = torch.sum(torch.pow(torch.sum(embedding_x, dim=1), 2) - torch.sum(torch.pow(embedding_x, 2), dim=1), dim=1, keepdim=True)
# DNN 部分:通过嵌入层和神经网络计算高阶特征交互
x_dnn = embedding_x.view(embedding_x.size(0), -1)
dnn_output = self.dnn(x_dnn)
# 输出层:将 FM 和 DNN 的输出拼接起来
output = self.output_layer(torch.cat([fm_output, dnn_output], dim=1))
return output
# 示例
n_features = 10 # 假设有 10 个特征
embedding_dim = 5 # 每个特征的嵌入维度
hidden_units = [64, 32] # DNN 的隐藏层大小
model = DeepFM(n_features, embedding_dim, hidden_units)
# 假设有 4 个样本,每个样本有 10 个特征
x = torch.randint(0, n_features, (4, n_features))
output = model(x)
print("DeepFM 输出:", output)
其中 fm_output = torch.sum(torch.pow(torch.sum(embedding_x, dim=1), 2) - torch.sum(torch.pow(embedding_x, 2), dim=1), dim=1, keepdim=True)
这行代码计算了FM的二阶交互
- 三、多任务学习中ESSM有什么特点
- 1.ESSM是一个典型的硬共享早期阶段共享的多任务学习模型,通过共享嵌入层和中间层来学习两个任务的共性特征
- 2.loss函数通过加权平均等计算
L = α ⋅ L 1 + β ⋅ L 2 L = \alpha \cdot L_{1} + \beta \cdot L_{2} L=α⋅L1+β⋅L2
- 四、多任务学习中MMoE(Multi-gate Mixture-of-Experts)有什么特点,如何解决不同任务的梯度冲突
利用 专家网络(Experts) 和 任务门控(Task-specific Gates) 来共享底层特征,同时允许每个任务独立选择适合自己的特征组合,通过门控网络提供动态特征共享机制,有效缓解任务冲突- DWA(Dynamic Weight Average)
DWA 动态调整每个任务的损失权重,目的是平衡任务之间的训练进度。DWA 根据任务的损失下降速率动态调整权重,鼓励更慢收敛的任务获得更多关注。
- PCGrad(Project Conflicting Gradient)
PCGrad 当两个任务的梯度方向冲突时,PCGrad 会将一个梯度在另一个梯度的正交方向上进行投影
- 3.Uncertainty Weighting
基于任务输出的不确定性调整权重,不确定性大的任务权重降低。
- DWA(Dynamic Weight Average)
- 五、激活函数sigmoid、tanh出现梯度消失可以怎么处理
- 1.原因分析
- 2.替换其他更加稳定的激活函数
- 1.原因分析
- 3.批归一化 (Batch Normalization)
- 4.正则化
- 5.调整学习率
- 6.残差连接
- 7.梯度裁剪 (Gradient Clipping)
在反向传播过程中,对梯度进行裁剪,防止梯度过小或过大
torch.nn.utils.clip_grad_norm_ # torch中有自带的梯度剪裁方法
- 六、介绍AUC,手撕AUC
AUC有一个常用的定义:随机从正样本和负样本中各选一个,分类器对于该正样本打分大于该负样本打分的概率。基于计算AUC的代码可以写为
def cal_auc_1(label, pred):
numerator = 0 # 分子
denominator = 0 # 分母
for i in range(len(label) - 1):
for j in range(i, len(label)):
if label[i] != label[j]:
denominator += 1
# 统计所有正负样本对中,模型把相对位置排序正确的数量
r = (label[i] - label[j]) * (pred[i] - pred[j])
if r > 0:
numerator += 1
elif r == 0:
numerator += 0.5
return numerator / denominator
- 七、手撕:最大上升子序列(LIS)
给定一个无序的整数数组,找到其中的最长严格递增子序列,并返回该子序列的长度,子序列可以不连续。这是一个经典的动态规划问题
def LIS(nums):
if not nums:
return 0
dp = [1] * len(nums) # dp[i] 表示以 nums[i] 为结尾的最长递增子序列长度
# 遍历所有元素,计算以每个元素为结尾的最长递增子序列
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp) # 返回 dp 中的最大值,即最长递增子序列的长度
标签:dim,nn,搜广,self,torch,经七,embedding,output,推校
From: https://blog.csdn.net/yin2567588841/article/details/145133535