搜广推校招面经四十六

news2025/3/13 11:12:19

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散度更适合用于你需要衡量或最小化两个概率分布之间的差异的情况,例如在生成模型中对比生成的数据分布与真实数据分布的相似性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MCP-代码解读TypeScript版本

MCP-代码解读TypeScript版本 文章目录 MCP-代码解读TypeScript版本1-参考网址2-TypeScript代码3-代码解读1-[非重点]定义函数2-[非重点]定义工具说明3-[重点]运行MCP服务 1-参考网址 B站视频参考 2-TypeScript代码 import { McpServer } from "modelcontextprotocol/sd…

写了一个二叉树构造函数和画图函数,方便debug

代码 class TreeNode(object):def __init__(self, val, leftNone, rightNone):self.val valself.left leftself.right rightdef construct_tree(nodes):if not nodes:return Noneroot TreeNode(nodes[0])queue [root]index 1while index < len(nodes):node queue.p…

docker 小记

一、卸载 查看当前版本 docker -v2. 如果有&#xff0c;先停止docker systemctl stop docker如果是yum安装&#xff0c;卸载方式为 #已防版本冲突&#xff0c;直接卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…

G-Star 公益行起航,挥动开源技术点亮公益!

公益组织&#xff0c;一直是社会温暖的传递者&#xff0c;但在数字化浪潮中&#xff0c;也面临着诸多比大众想象中复杂的挑战&#xff1a;项目管理如何更高效&#xff1f;志愿者管理又该如何创新&#xff1f;宣传推广怎么才能更有影响力&#xff1f;内部管理和技术支持又该如何…

k9s入门及实战

概述 k9s&#xff0c;GitHub&#xff0c;是用于管理k8s集群的CLI&#xff0c;提供一个终端UI来与k8s集群进行交互。通过封装kubectl功能&#xff0c;k9s会以特定时间间隔监控k8s的变化&#xff0c;默认为2秒&#xff0c;并提供后续命令来与k8s资源进行交互&#xff0c;k9s可让…

redis增加ip白名单

Redis增加IP白名单 随着互联网的快速发展&#xff0c;网络安全问题也日益凸显。为了保护服务器安全&#xff0c;我们常常需要对访问服务器的IP地址进行限制。而Redis作为一种高性能的缓存数据库&#xff0c;可以用来实现IP白名单功能。本文将介绍如何使用Redis来增加IP白名单&…

git commit messege 模板设置 (规范化管理git)

配置方法 git config --global core.editor vim &#xff08;设置 Git 的默认编辑器为 Vim&#xff09;在用户根目录下&#xff08;~&#xff09;&#xff0c;创建一个.git_commit_msg文件&#xff0c;然后把下面的内容拷贝到文件中并保存。 [version][模块][类型]{解决xxx问题…

Franka机器人ROS 2 发布:赋能机器人研究和行业应用

Franka机器人 ROS 2 发布&#xff1a;赋能机器人研究和行业应用 Franka ROS 2 发布&#xff1a;赋能机器人研究和行业应用 由zlem Odeh 于Franka Robotics 发布 在机器人操作系统 (ROS) 等技术和生态系统的推动下&#xff0c;机器人世界正以前所未有的速度发展。ROS 2 是广受…

docker部署jenkins,安装使用一条龙教程

Jenkins k8s 实现CI/CD 一、简介 1. JenKins是什么? Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2. 什么是CI / CD…

短视频下载去水印,用什么工具好?

去除视频和图片水印是许多用户的需求&#xff0c;尤其是在分享或保存内容时。以下是6款超好用的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受纯净的视觉体验&#xff1a; 1. 易下载去水印小程序 特点&#xff1a; 操作简单&#xff0c;支持抖音、快手、小红书、哔哩哔哩…

推理大模型时代,TextIn ParseX助力出版业知识资产重构

在大语言模型&#xff08;LLM&#xff09;与推理能力快速进化的技术浪潮下&#xff0c;出版机构沉淀数十年的非结构化数据资产&#xff0c;包括书籍、期刊、手稿及历史档案&#xff0c;正在焕发新的机遇。基于文档解析、NLP与大模型的推理生成能力&#xff0c;我们在图书馆层层…

Redis 2025/3/9

Redis主从集群 搭建主从集群 Redis并发能力非常强&#xff0c;单节点能够达到数万的并发。 不过对一些用户规模大&#xff0c;并发量比较高的应用来讲&#xff0c;数万并发不太够。这时候就用到redis的集群了。因为Redis中的数据通常读多写少&#xff0c;所以最常用的集群方…

2min搞定~Mac Pro 编译安装 Nginx 1.8.1

2min搞定&#xff5e;Mac Pro 编译安装 Nginx 1.8.1 一安装流程简述1、编译源码前&#xff0c;获取要依赖的源码包2、进行编译、安装nginx3、启动 二、实战部分&#xff1a;测试demo1、nginx.conf改动2、代码改动3、访问 一安装流程简述 阿哟啊哟老铁&#xff0c;别嫌我啰嗦奥…

要在Unreal Engine 5(UE5)中实现角色打击怪物并让怪物做出受击反应,

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、最终效果 前言 ue5角色受击没有播放受击动画&#xff0c;主角达到怪物身上没有反应 一、实现思路 要在Unreal Engine 5&#xff08;UE5&#xff09;中实现角色打击怪物并让怪物做出受击反应&#xff0c;你需要…

C++蓝桥杯基础篇(十一)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来学习C蓝桥杯基础篇&#xff08;十一&#xff09;&#xff0c;学习类&#xff0c;结构体&#xff0c;指针相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 一、类与结构体 类的定义&#xff1a;在C中&#x…

Leetcode 698-划分为k个相等的子集

给定一个整数数组 nums 和一个正整数 k&#xff0c;找出是否有可能把这个数组分成 k 个非空子集&#xff0c;其总和都相等。 示例 1&#xff1a; 输入&#xff1a; nums [4, 3, 2, 3, 5, 2, 1], k 4 输出&#xff1a; True 说明&#xff1a; 有可能将其分成 4 个子集&#…

Word 小黑第2套

对应大猫42 Word1 从文件中导入新样式 样式组 -管理样式 -导入导出 -关闭Normal文件 -打开文件 -修改文件 -选中所需 -复制 调整字符宽度 调整字符间距 -字体组 加宽 适当修改磅值 文字效果通过文字组修改 另起一页&#xff0c;分隔符&#xff08;布局 -分隔符 -分节符 -下一…

ctfshow做题笔记—栈溢出—pwn69~pwn72

目录 前言 一、pwn69(可以尝试用ORW读flag flag文件位置为/ctfshow_flag) 二、pwn70(可以开始你的个人秀了 flag文件位置为/flag) 三、pwn71(32位的ret2syscall) 四、pwn72 前言 学了一些新的东西&#xff0c;pwn69的文档忘保存了&#xff08;悲&#xff09;&#xff0c…

同盾v2 2025版 blackbox , wasm加解密,逆向协议算法生成,小盾安全

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 wjxch1004

c++领域展开第十六幕——STL(vector容器的了解以及模拟实现、迭代器失效问题)超详细!!!!

文章目录 前言一、vector的介绍和使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector的空间增长问题1.2.4 vector的增删改查 二、vector在 oj 中的使用只出现一次的数删除有序数组中的重复项杨辉三角 总结 前言 在c专栏的上一篇…