首页 > 其他分享 >搜广推校招面经七

搜广推校招面经七

时间:2025-01-14 19:28:49浏览次数:3  
标签:dim nn 搜广 self torch 经七 embedding output 推校

抖音推荐算法

  • 一、广告系统中的数据流处理方法,怎么避免延迟回流问题
    延迟回流问题是指,实时系统(如广告点击预估)中,历史数据未及时更新或发生延迟,导致系统的实时预测偏离实际情况。避免延迟回流的方法有
    • 使用高效的流处理框架
      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
      基于任务输出的不确定性调整权重,不确定性大的任务权重降低。
      在这里插入图片描述
  • 五、激活函数sigmoid、tanh出现梯度消失可以怎么处理
    • 1.原因分析
      在这里插入图片描述
    • 2.替换其他更加稳定的激活函数
      在这里插入图片描述
  • 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

相关文章

  • 搜广推校招面经一
    字节抖音搜算法bg:多模态和大模型出身一面一、ppl的计算与物理含义在自然语言处理(NLP)中,PPL是Perplexity(困惑度)的缩写,通常用于衡量语言模型(如神经网络语言模型)在给定文本上的表现。PPL是一种评估语言模型好坏的指标,它在很多任务中被广泛应用,比如机器翻译、自动文本生......
  • 图的基础概念和深搜广搜序
    有关图的定义图是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。图论起源于著名的柯尼斯堡七桥问题(下图所示),该问题于1736年被欧拉解决,因此普遍认为欧拉是图......
  • 字节跳动后端面经七
    MySQL慢查询如何优化?InnDB存储引擎默认隔离级别,如何实现?InnoDb针对数据库缓冲池管理使用LRU算法,做了哪些优化联合索引相关场景,给了个sql,问能不能用上索引线程的状态......
  • TZOJ 7886: 连通块 深搜广搜模板题
    描述一个n*m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区......