当前位置: 首页 > news >正文

搜广推校招面经四十六

Minimax llm&广告推荐算法

一、反向梯度下降的数学推导(以逻辑回归为例)

1.1. 模型定义

假设模型为逻辑回归,输入特征为 x ∈ R d \mathbf{x} \in \mathbb{R}^d xRd,权重参数为 w ∈ R d \mathbf{w} \in \mathbb{R}^d wRd,偏置为 b ∈ R b \in \mathbb{R} bR
模型输出为:
z = w T x + b z = \mathbf{w}^T \mathbf{x} + b z=wTx+b
通过 Sigmoid 函数得到概率:
p = σ ( z ) = 1 1 + e − z p = \sigma(z) = \frac{1}{1 + e^{-z}} p=σ(z)=1+ez1
损失函数为二元交叉熵:
L = − y log ⁡ p − ( 1 − y ) log ⁡ ( 1 − p ) L = -y \log p - (1 - y) \log (1 - p) L=ylogp(1y)log(1p)

1.2. 反向梯度推导

(1)损失对概率 p p p 求导

∂ L ∂ p = − y p + 1 − y 1 − p \frac{\partial L}{\partial p} = -\frac{y}{p} + \frac{1 - y}{1 - p} pL=py+1p1y

(2)概率 p p p 对 Sigmoid 输入 z z z 求导

∂ p ∂ z = σ ( z ) ( 1 − σ ( z ) ) = p ( 1 − p ) \frac{\partial p}{\partial z} = \sigma(z)(1 - \sigma(z)) = p(1 - p) zp=σ(z)(1σ(z))=p(1p)

(3)Sigmoid 输入 z z z 对参数 w \mathbf{w} w 求导

∂ z ∂ w = x \frac{\partial z}{\partial \mathbf{w}} = \mathbf{x} wz=x

(4)链式法则合并

∂ L ∂ w = ∂ L ∂ p ⋅ ∂ p ∂ z ⋅ ∂ z ∂ w \frac{\partial L}{\partial \mathbf{w}} = \frac{\partial L}{\partial p} \cdot \frac{\partial p}{\partial z} \cdot \frac{\partial z}{\partial \mathbf{w}} wL=pLzpwz
代入具体表达式:
∂ L ∂ w = ( − y p + 1 − y 1 − p ) ⋅ p ( 1 − p ) ⋅ x \frac{\partial L}{\partial \mathbf{w}} = \left( -\frac{y}{p} + \frac{1 - y}{1 - p} \right) \cdot p(1 - p) \cdot \mathbf{x} wL=(py+1p1y)p(1p)x
化简后:
∂ L ∂ w = ( p − y ) ⋅ x \frac{\partial L}{\partial \mathbf{w}} = (p - y) \cdot \mathbf{x} wL=(py)x

3. 参数更新公式

梯度下降更新权重:
w ← w − η ⋅ ∂ L ∂ w = w − η ⋅ ( p − y ) ⋅ x \mathbf{w} \leftarrow \mathbf{w} - \eta \cdot \frac{\partial L}{\partial \mathbf{w}} = \mathbf{w} - \eta \cdot (p - y) \cdot \mathbf{x} wwηwL=wη(py)x
其中, η \eta η 为学习率。

二、手撕梯度下降

import numpy as np

class LogisticRegression:
    def __init__(self, learning_rate=0.01, num_iterations=1000):
        self.learning_rate = learning_rate        # 学习率
        self.num_iterations = num_iterations   # 迭代次数
        self.theta = None                                 # 模型参数
    
    def sigmoid(self, z):
        """计算 Sigmoid 函数"""
        return 1 / (1 + np.exp(-z))
    
    def compute_cost(self, X, y):
        """计算交叉熵损失函数"""
        m = len(y)
        p = self.sigmoid(np.dot(X, self.theta))
        cost = - (1/m) * np.sum(y * np.log(p) + (1 - y) * np.log(1 - p))
        return cost
    
    def gradient_descent(self, X, y):
        """梯度下降优化"""
        m = len(y)
        for i in range(self.num_iterations):
            p = self.sigmoid(np.dot(X, self.theta))         # 计算预测值
            gradient = (1/m) * np.dot(X.T, (p- y))          # 计算梯度
            self.theta -= self.learning_rate * gradient     # 更新参数
            if i % 100 == 0:                                # 每100次输出一次损失值
                cost = self.compute_cost(X, y)
                print(f"Iteration {i}, Cost: {cost}")
    
    def fit(self, X, y):
        """训练模型"""
        m, n = X.shape
        self.theta = np.zeros(n)  # 初始化参数
        self.gradient_descent(X, y)
    
    def predict(self, X):
        """预测新样本的类别"""
        probabilities = self.sigmoid(np.dot(X, self.theta))
        return probabilities >= 0.5  # 预测类别:如果大于等于 0.5,分类为 1,否则为 0

二、交叉熵和kl散度怎么用,分别在什么时候用

交叉熵和KL散度(Kullback-Leibler Divergence)是两种衡量概率分布之间差异的度量方式,它们在机器学习中有着广泛的应用。

2.1. 交叉熵

定义: 对于两个离散概率分布P和Q,其中P是我们的真实分布,Q是我们的估计分布,交叉熵定义为:

H ( P , Q ) = − ∑ x P ( x ) log ⁡ Q ( x ) H(P, Q) = -\sum_{x} P(x) \log Q(x) H(P,Q)=xP(x)logQ(x)

用途:

  • 分类问题: 在多分类问题中,交叉熵损失函数常被用于评估模型预测的概率分布与真实标签之间的差异。特别是在使用softmax作为输出层激活函数时,交叉熵损失函数可以有效地衡量模型输出与实际类别之间的差距。
  • 信息理论: 在信息论中,交叉熵衡量的是用编码方案Q来编码来自分布P的信息所需的平均比特数。

2.2. KL散度

定义: KL散度衡量的是两个概率分布P和Q之间的差异,它不是对称的,即 D K L ( P ∣ ∣ Q ) D_{KL}(P||Q) DKL(P∣∣Q)并不等于 D K L ( Q ∣ ∣ P ) D_{KL}(Q||P) DKL(Q∣∣P)。其定义如下:

D K L ( P ∣ ∣ Q ) = ∑ x P ( x ) log ⁡ ( P ( x ) Q ( x ) ) D_{KL}(P||Q) = \sum_{x} P(x) \log\left(\frac{P(x)}{Q(x)}\right) DKL(P∣∣Q)=xP(x)log(Q(x)P(x))

用途:

  • 分布间差异比较: KL散度常用于衡量两个分布之间的“距离”。但它被称为“散度”而非“距离”,因为它不满足距离度量的所有条件(例如,不对称性)。它可以用来比较一个模型生成的分布与真实数据分布之间的相似性。
  • 变分推断: 在贝叶斯推理中,特别是变分自动编码器(VAEs)等模型中,KL散度用于衡量近似后验分布与先验分布之间的差异,以优化模型参数。

2.3. 使用场景

  • 交叉熵更适用于当你需要直接优化模型预测与实际标签之间的误差时,尤其是在分类任务中。
  • KL散度更适合用于你需要衡量或最小化两个概率分布之间的差异的情况,例如在生成模型中对比生成的数据分布与真实数据分布的相似性。

相关文章:

  • FastDDS中Utils定义的那些数据结构(二)
  • redis增加ip白名单
  • 多数元素——面试经典150题(力扣)
  • 30天学习Java第四天——JVM规范
  • Chrome 扩展开发 API实战:Sessions (六)
  • 使用Python实现ICO文件生成工具
  • TensorFLow深度学习实战(11)——风格迁移详解
  • 电脑突然没有声音的可能原因与应对方法
  • NineData:解锁多云与混合云环境下的智能数据管理
  • 艾尔登复刻Ep1——客户端制作、场景切换、网络控制
  • Spring Boot 读取 ZooKeeper (ZK) 属性的总结指南
  • Lsposed模块原理详解
  • AI概率学预测足球大小球让球数据分析
  • 工作记录 2017-01-06
  • 支持向量机(SVM)原理与应用
  • Redis Sentinel 深度解析:构建高可用分布式缓存系统的核心机制
  • ActiveMQ监听器在MQ重启后不再监听问题
  • 用户可免费体验!国家超算互联网平台上线阿里开源推理模型接口服
  • Python网络爬虫之requests库的使用方法
  • 在虚拟机中部署kafka