搜广推校招面经二十八

蚂蚁推荐算法

一、介绍损失函数、为什么分类和回归的损失函数不能共用

损失函数的介绍见【搜广推校招面经十八】

1.1. 分类和回归损失函数不能共用的原因

分类和回归任务的目标不同,因此它们的损失函数设计也存在本质区别:

  1. 输出空间的不同

    • 回归任务:目标是预测一个连续值(如房价、温度等)。输出空间是连续的实数范围。
    • 分类任务:目标是预测离散的类别标签(如“猫”或“狗”)或者概率。输出空间通常是有限的类别集合。
  2. 误差衡量方式的不同

    • 回归问题:误差通常直接基于数值差,例如均方误差 ( y i − y ^ i ) 2 (y_i - \hat{y}_i)^2 (yiy^i)2 或绝对误差 ∣ y i − y ^ i ∣ |y_i - \hat{y}_i| yiy^i
    • 分类问题:误差更多地关注预测概率分布是否接近真实分布。例如,交叉熵损失衡量的是预测概率分布与真实分布之间的信息差距。
  3. 模型输出的形式不同

    • 回归模型:通常输出单一的数值预测。
    • 分类模型:通常输出每个类别的概率分布(经过 softmax 或 sigmoid 转换)。
  4. 优化目标的不同

    • 回归任务:优化目标是最小化预测值与真实值之间的差距。
    • 分类任务:优化目标是最小化预测类别与真实类别之间的不确定性或错误率。

二、手撕Softmax

Softmax 是一种常用的激活函数,主要用于将一组实数值(logits)转换为概率分布。

2.1. Softmax 的定义

假设输入是一个长度为 C C C 的向量 z = [ z 1 , z 2 , . . . , z C ] z = [z_1, z_2, ..., z_C] z=[z1,z2,...,zC],Softmax 函数的定义为:
softmax ( z i ) = exp ⁡ ( z i ) ∑ j = 1 C exp ⁡ ( z j ) \text{softmax}(z_i) = \frac{\exp(z_i)}{\sum_{j=1}^{C} \exp(z_j)} softmax(zi)=j=1Cexp(zj)exp(zi)
其中:

  • z i z_i zi 是输入向量中的第 i i i 个元素。
  • exp ⁡ ( z i ) \exp(z_i) exp(zi) z i z_i zi 的指数值,用于放大输入差异
  • 分母 ∑ j = 1 C exp ⁡ ( z j ) \sum_{j=1}^{C} \exp(z_j) j=1Cexp(zj) 是所有输入元素的指数值之和,用于归一化,确保输出的概率分布和为 1。

2.2. Python 实现

以下是使用 Python 和 NumPy 手撕 Softmax 的代码:

import numpy as np
def softmax(z):
    # 防止数值溢出:减去最大值以稳定计算
    z -= np.max(z)
    
    # 计算指数值
    exp_z = np.exp(z)
    
    # 计算分母(按行求和)
    sum_exp_z = np.sum(exp_z)
    
    # 计算 Softmax 输出
    return exp_z / sum_exp_z

# 测试
z = np.array([2.0, 1.0, 0.1])
output = softmax(z)
print("Softmax 输出:", output)
print("概率和:", np.sum(output))  # 概率和应为 1

2.3. 推导 Softmax 和 Sigmoid 在二分类任务中的等价性

2.3.1. Softmax 的定义

对于一个二分类问题,假设输入 logits 为 z 1 z_1 z1 z 2 z_2 z2,Softmax 的输出为:
softmax ( z 1 ) = exp ⁡ ( z 1 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) \text{softmax}(z_1) = \frac{\exp(z_1)}{\exp(z_1) + \exp(z_2)} softmax(z1)=exp(z1)+exp(z2)exp(z1)

softmax ( z 2 ) = exp ⁡ ( z 2 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) \text{softmax}(z_2) = \frac{\exp(z_2)}{\exp(z_1) + \exp(z_2)} softmax(z2)=exp(z1)+exp(z2)exp(z2)

其中:

  • softmax ( z 1 ) \text{softmax}(z_1) softmax(z1) 表示样本属于类别 1 的概率。
  • softmax ( z 2 ) \text{softmax}(z_2) softmax(z2) 表示样本属于类别 2 的概率。
    由于是二分类问题,我们可以令 z 2 0 z_2 0 z20(不失一般性),此时 Softmax 的输出变为:
    softmax ( z 1 ) = exp ⁡ ( z 1 ) exp ⁡ ( z 1 ) + exp ⁡ ( 0 ) = exp ⁡ ( z 1 ) exp ⁡ ( z 1 ) + 1 \text{softmax}(z_1) = \frac{\exp(z_1)}{\exp(z_1) + \exp(0)} = \frac{\exp(z_1)}{\exp(z_1) + 1} softmax(z1)=exp(z1)+exp(0)exp(z1)=exp(z1)+1exp(z1)
    softmax ( z 2 ) = exp ⁡ ( 0 ) exp ⁡ ( z 1 ) + exp ⁡ ( 0 ) = 1 exp ⁡ ( z 1 ) + 1 \text{softmax}(z_2) = \frac{\exp(0)}{\exp(z_1) + \exp(0)} = \frac{1}{\exp(z_1) + 1} softmax(z2)=exp(z1)+exp(0)exp(0)=exp(z1)+11

2.3.2. Sigmoid 的定义

Sigmoid 函数的定义为:
σ ( x ) = 1 1 + exp ⁡ ( − x ) \sigma(x) = \frac{1}{1 + \exp(-x)} σ(x)=1+exp(x)1
其中:

  • x x x 是输入值。
  • σ ( x ) \sigma(x) σ(x) 表示事件发生的概率。

2.3.3. 等价性推导

softmax ( z 1 ) = exp ⁡ ( z 1 ) exp ⁡ ( z 1 ) + 1 \text{softmax}(z_1) = \frac{\exp(z_1)}{\exp(z_1) + 1} softmax(z1)=exp(z1)+1exp(z1)

我们可以通过分子分母同时除以 exp ⁡ ( z 1 ) \exp(z_1) exp(z1) 来简化该表达式:

softmax ( z 1 ) = 1 1 + exp ⁡ ( − z 1 ) \text{softmax}(z_1) = \frac{1}{1 + \exp(-z_1)} softmax(z1)=1+exp(z1)1

这正是 Sigmoid 函数的形式:

σ ( z 1 ) = 1 1 + exp ⁡ ( − z 1 ) \sigma(z_1) = \frac{1}{1 + \exp(-z_1)} σ(z1)=1+exp(z1)1
因此,在二分类问题中,Softmax 和 Sigmoid 是等价的。

三、DIN模型和SIM模型的差别是什么?

见【搜广推校招面经十二】
DIN(Deep Interest Network)、DIEN(Deep Interest Evolution Network)和 SIM(Sequence-aware Item Matching)是推荐系统领域中常用的深度学习模型,后者在前者的基础上进行了逐步改进。

3.1. DIN(Deep Interest Network)

(1)背景与核心思想

  • 提出时间:2018 年,由阿里巴巴提出。
  • 核心目标:通过注意力机制动态地建模用户的兴趣。
  • 主要解决的问题:传统方法(如 Wide & Deep、PNN)对用户历史行为的建模过于简单,无法捕捉用户兴趣的多样性。

(2)主要特点

  • 动态兴趣建模
    • 使用注意力机制计算每个历史行为与当前候选物品的相关性。
    • 根据候选物品选择性地激活与之相关的用户历史行为。
  • 优点
    • 简单高效,适合大规模工业应用。
    • 能够根据候选物品动态调整用户兴趣表示。
  • 局限性
    • 忽略了用户行为的时序性和演化特性。
    • 假设用户的历史行为是独立的,未考虑行为之间的依赖关系。

3.2. DIEN(Deep Interest Evolution Network)

(1)背景与核心思想

  • 提出时间:2019 年,由阿里巴巴进一步提出。
  • 核心目标:在 DIN 的基础上引入用户兴趣的演化建模,捕捉用户行为的时序性和动态变化。

(2)主要改进

  • 引入序列建模
    • 使用 GRU(Gated Recurrent Unit)对用户的行为序列进行建模,捕捉行为之间的依赖关系。
    • 引入辅助损失函数(AUX Loss),通过预测下一个行为来增强序列建模的效果。
  • 兴趣演化建模
    • 在 GRU 的基础上增加了一个注意力模块(Attention over GRU),用于从序列中提取与候选物品最相关的兴趣表示。
  • 优点
    • 捕捉了用户兴趣的动态变化和时序依赖性。
    • 较好地解决了 DIN 中忽略行为顺序的问题。
  • 局限性
    • 计算复杂度较高,训练成本增加。
    • 对于某些场景(如用户行为无明显时序依赖),可能过度建模。

3.3. SIM(Sequence-aware Item Matching)

(1)背景与核心思想

  • 提出时间:后续改进于 DIN 和 DIEN 的基础上。
  • 核心目标:进一步优化用户行为序列的建模,提升推荐效果,尤其是在短视频、新闻等需要强时序依赖的场景中。

(2)主要改进

  • 更高效的序列建模
    • 使用 Transformer 或其他轻量级序列建模方法替代 DIEN 中的 GRU,减少计算复杂度的同时提升性能。
    • 更加注重行为序列中的长期依赖关系。
  • 多粒度兴趣建模
    • 不仅关注用户的全局兴趣,还引入了局部兴趣建模,能够更好地捕捉用户在不同时间段的兴趣变化。
  • 兴趣匹配优化
    • 在 DIN 和 DIEN 的基础上改进了兴趣与候选物品的匹配方式,增强了模型的表达能力。
  • 优点
    • 在保持高精度的同时降低了计算复杂度。
    • 更适合短视频、新闻等需要强时序依赖的推荐场景。
  • 局限性
    • 需要更多的数据支持以充分利用序列建模的优势。

3.4. 三者的关系与改进总结

特性 DIN DIEN SIM
是否考虑序列信息
序列建模方法 GRU + Attention Transformer 或轻量级序列建模
兴趣建模方式 动态兴趣建模(基于注意力机制) 兴趣演化建模(GRU + Attention) 多粒度兴趣建模(Transformer)
计算复杂度 较低 较高 较高但更高效
适用场景 用户行为无明显时序依赖的场景 用户行为有较强时序依赖的场景 需要高效建模强时序依赖的场景

3.5. 改进路径总结

  1. DIN → DIEN

    • 改进点:引入序列建模(GRU)和兴趣演化建模,捕捉用户行为的时序性和动态变化。
    • 解决问题:DIN 中忽略用户行为顺序和兴趣演化的不足。
  2. DIEN → SIM

    • 改进点:使用更高效的序列建模方法(如 Transformer),并引入多粒度兴趣建模。
    • 解决问题:DIEN 中 GRU 的计算复杂度较高,且对长序列依赖关系的建模不够充分。
  3. 总体趋势

    • 从静态兴趣建模(DIN)到动态兴趣建模(DIEN),再到高效多粒度兴趣建模(SIM),模型逐步提升了对用户行为序列的理解能力和推荐效果。

4、394. 字符串解码(力扣hot100_栈_中等)

class Solution:
    def decodeString(self, s: str) -> str:
        st = []
        res = ""
        multi = 0
        for c in s:
            if "0" <= c <= "9":   # 1.遇到数字先记录,multi*10+int(c)是为了正确处理多位数字
                multi = multi*10+int(c)
            elif c=="[":          # 2.遇到左括号,入栈当前结果和数字。并重置结果。
                st.append([multi, res])
                res, multi = "", 0
            elif c == "]":       # 4.遇到右括号,出栈当前结果和数字,
                cur_multi, last_res = st.pop()
                res = last_res + cur_multi*res
            else:               # 5.遇到字母,累计括号中字母
                res += c
        return res

你可能感兴趣的:(搜广推面经,推荐算法,求职招聘,搜索引擎,机器学习,算法)