惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
PCI Perspectives
PCI Perspectives
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
S
Secure Thoughts
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
WordPress大学
WordPress大学
SecWiki News
SecWiki News
B
Blog
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
Webroot Blog
Webroot Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
LINUX DO - 热门话题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
酷 壳 – CoolShell
酷 壳 – CoolShell
IT之家
IT之家
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
F
Fortinet All Blogs
W
WeLiveSecurity
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
The Last Watchdog
The Last Watchdog
S
Schneier on Security
爱范儿
爱范儿
V
V2EX - 技术
L
LINUX DO - 最新话题
月光博客
月光博客
博客园 - 【当耐特】
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
U
Unit 42
Schneier on Security
Schneier on Security
E
Exploit-DB.com RSS Feed
J
Java Code Geeks
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss
TaoSecurity Blog
TaoSecurity Blog
博客园 - 叶小钗
T
Troy Hunt's Blog
大猫的无限游戏
大猫的无限游戏
AI
AI
Security Latest
Security Latest

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误
SMO 算法求解 SVM 拉格朗日系数
Yiwei Zhang · 2022-10-24 · via 又见苍岚

之前的 SVM 推导得到了一堆关于拉格朗日系数的表达式,但是没有求解,本文记录 SMO 解决 SMV 问题的思想流程。

SVM 回顾

  • 之前经过对 SVM 推导 得到了最终需要求解拉格朗日系数的步骤:

$$ \begin{array}{l} \min _{\alpha} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(\Phi\left(x_{i}\right) \cdot \Phi\left(x_{j}\right)\right)-\sum_{i=1}^{n} \alpha_{i}\\ s.t. \sum_{i=1}^{n} \alpha_{i} y_{i}=0 , \alpha_{i} \geq 0 \end{array} $$

  • 其中 $\alpha_i$ 为拉格朗日系数,$y_i$ 为数据标签, $n$ 为数据个数, $x_i$ 为数据向量,$\Phi$ 为核函数映射
  • 仅有 $\alpha_i$ 未知,我们认为 $\alpha_i$ 是有限的,给定一个取值上限 $C$

$$ \begin{array}{l} \min _{\alpha} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(\Phi\left(x_{i}\right) \cdot \Phi\left(x_{j}\right)\right)-\sum_{i=1}^{n} \alpha_{i}\\ s.t. \sum_{i=1}^{n} \alpha_{i} y_{i}=0 , 0 \leq \alpha_{i} \leq C \end{array} $$

  • 现在的问题是:如何在满足拉格朗日约束 KKT 条件的同时解出 $\alpha_i$
  • SMO 算法提供了解决方案

SMO 简介

  • SMO (Sequential Minimal Optimization),翻译过来是序列最小优化算法。算法的核心思想是由于我们需要寻找的是一系列的 $α$ 值使得原始优化问题取极值,但问题是这一系列的值我们很难同时优化。所以SMO算法想出了一个好办法解决这个问题,把这一系列的 $α$ 中的两个看成是变量其它的全部固定看成是常数,通过不断迭代优化这两个变量来优化目标函数。
  • 这里有一个问题是为什么我们要选择两个 $α$ 看成是变量而不选一个呢?选一个不是更加简单吗?因为我们的约束条件当中有一条是 $∑y_iα_i=0$,所以如果我们只选择一个 $α$ 进行调整的话,那么显然会破坏这个约束。所以我们选择两个,其中一个变化,另外一个也随着变化,这样就可以保证不会破坏约束条件了。
  • 为了方便叙述,我们默认选择的两个 $α$ 分别是 $α_1,α_2$。另外由于我们涉及$x_iTx_j$的操作,我们令$K_{ij}=x_iTx_j$。这样上面的问题可以写成:

$$ \min _{\alpha 1, \alpha_{2}} \frac{1}{2} K_{11} \alpha_{1}^{2}+\frac{1}{2} K_{22} \alpha_{2}^{2}+y_{1} y_{2} \alpha_{1} \alpha_{2}-\left(\alpha_{1}+\alpha_{2}\right)+y_{1} \alpha_{1} \sum_{i=3}^{m} y_{i} \alpha_{i} K_{i 1}+y_{2} \alpha_{2} \sum_{i=3}^{m} y_{i} \alpha_{i} K_{i, 2}+ Constant $$

  • 其中由于 $y_i=±1$,所以 $y_i^2=1$,上面的 $Constant$ 表示除了$α_1,α_2$ 以外的常数项。我们假设$α_1y_1+α_2y_2=k$,其中 $α_1,α_2∈[0,C]$,由于 $y_i$ 只有两个选项1或者-1,所以我们可以分情况讨论。

核心算法

选取样本标注不同

  • 当选取的两个样本标注不同时,$y_1$ 和 $y_2$ 符号不同
  • 由于 $\alpha \geq0$,那么无外乎两种情况之一:
    1. $α_1−α_2=k$
    2. $α_2−α_1=k$
  • 第一种情况是 $α_2=α_1−k$,第二种情况是 $α_2=α_1+k$。
  • 对于第一种情况,如果 $k < 0$,其实就是第二种情况,同样对于第二种情况,如果 $k > 0$ 其实就是第一种情况,因此 $k$ 的符号正负都可以规约成同一个问题。
  • 这变成了一个线性规划问题,我们把图画出来就非常清晰了。

  • 第一种情况,$α_2$ 的范围是 $(0,C−k)$,也就是 $(0,C−\alpha_1+\alpha_2)$
  • 第二种情况,$α_2$ 的范围是$(k, C)$,也就是$(α_2−α_1,C)$。
  • 这里我们把 $k$ 又表示回了 $α_1,α_2$,由于我们要通过迭代的方法来优化 $α_1, α_2$的取值,所以我们令上一轮的$α_1,α_2$分别是$α_{1o},α_{2o}$。这里的 $o$ 指的是 old 的意思
  • 我们把刚才求到的结论综合一下,就可以得到$α_2$下一轮的下界是 $max(0,α_{2o}−α_{1o})$,上界是$min(C+α_{2o}−α_{1o},C)$。

选取样本标注相同

  • 当选取的两个样本标注相同时,$y_1$ 和 $y_2$ 符号相同
  • 同理,我们画出 $α_1,α_2$ 同号时的情况,也有 $k > 0$ 和 $k < 0$ 两种。

  • 第一种情况是 $y_1=y_2=1$,这时 $α_1+α_2=k$,设 $k > 0$:

    • 当 $C > k > 0$:对应的 $α_2$ 的取值是 $(0,k)$,即 $(0,α_{1o}+α_{2o})$
    • 当$k > C$,这时候也就是图中 1' 的情况,此时过了中间的虚线,$α_2$ 的范围是 $(k-C,C)$,即 $(α_{1o}+α_{2o}−C,C)$。
  • 第二种情况是 $y_1=y_2=−1$,此时 $α_1+α_2=k$,设 $k < 0$:

    • 由于这个时候是不符合约束条件 $0≤α_1,α_2≤C$的,所以此时没有解。
  • 这两种情况综合一下,可以得到下界是 $max(0,α_{1o}+α_{2o}−C)$,上界是 $min(α_{1o}+α_{2o},C)$。

综合求解 $\alpha_2$

  • 我们假设我们通过迭代之后得到的下一轮 $α_2$是 $α_{2 new,unc}$,这里的unc是未经过约束的意思。那么我们加上刚才的约束,假设上界为 $H$,下界为 $L$,可以得到:

$$ \alpha_{2 n e w}=\left\{\begin{array}{lr}H & \alpha_{2 n e w, u n c}>H \\ \alpha_{2 n e w, u n c} & L \leq \alpha_{2 n e w, u n c} \leq H \\ L & \alpha_{2 n e w, u n c} < L\end{array}\right. $$

  • 这里的$α_{2new,unc}$是我们利用求导得到取极值时的 $α_2$,但问题是由于存在约束,这个值并不一定能取到。所以上述的一系列操作就是为了探讨约束存在下我们能够取到的极值情况。

代入消元

  • 我们现在已经得到了下一轮迭代之后得到的新的 $α_2$ 的取值范围,接下来要做的就是像梯度下降一样,求解出使得损失函数最小的 $α_1$ 和 $α_2$的值,由于 $α_1+α_2$ 的值已经确定,所以我们求解出其中一个即可。

  • 我们令$α_1y_1+α_2y_2=ξ$,那么我们可以代入得到 $α_1=y_1(ξ−α_2y_2)$

  • 我们把这个式子代入原式,得到的式子当中可以消去 $α_1$,这样我们得到的就是只包含 $α_2$ 的式子。我们可以把它看成是一个关于 $α_2$ 的函数,为了进一步简化,我们令v:

$$
v_{i}=\sum_{j=3}^{m} y_{j} \alpha_{j} K i, j, E_{i}=f\left(x_{i}\right)-y_{i}=\sum_{j=1}^{m} \alpha_{j} y_{j} K_{i, j}+b-y_{i}
$$

  • 这里的 $E_i$ 表示的是第 $i$ 个样本真实值与预测值之间的差,我们把上面两个式子代入原式,化简可以得到:

$$
f\left(\alpha_{2}\right)=\frac{1}{2} K_{11}\left(\xi-\alpha_{2} y_{2}\right)+\frac{1}{2} K_{22} \alpha_{2}^{2}+y_{2} K_{12}\left(\xi-\alpha_{2} y_{2}\right) \alpha_{2}-\left(\xi-\alpha_{2} y_{2}\right) y_{1}-\alpha_{2}
+\left(\xi-\alpha_{2} y_{2}\right) v_{1}+y_{2} \alpha_{2} v_{2}
$$

  • 接下来就是对这个式子进行求导求极值,就是高中数学的内容了。

$$
\frac{\partial W}{\partial \alpha_{2}}=K_{11} \alpha_{2}+K_{22} \alpha_{2}-2 K_{12} \alpha_{2}-K 11 \xi y_{2}+K 12 \xi y_{2}+y_{1} y_{2}-1-v_{1} y_{2}
+y_{2} v_{2}=0
$$

  • 我们求解这个式子,最终可以得到:

$$
\alpha_{2 \text { new }, \text { unc }}=\alpha_{2 o}+\frac{y_{2}\left(E_{1}-E_{2}\right)}{K_{11}+K_{22}-2 K_{12}}
$$

  • 我们根据这个式子就可以求出 $α_2$ 下一轮迭代之后的值,求出值之后,我们在和约束的上下界比较一下,就可以得到在满足约束的情况下可以取到的最好的值。最后,我们把 $α_2$ 代入式子求解 $α_1$。
  • 这样我们就同时优化了一对 $α$ ,SMO算法其实就是重复使用上面的优化方法不停地选择两个参数进行优化,直到达到迭代次数,或者是不能再带来新的提升为止。
  • 本质上是一种局部参数上的贪心策略,每次调整为局部最优解,以此逐步迭代优化全局问题。

参考资料

文章链接:
https://www.zywvvd.com/notes/study/machine-learning/about-svm/svm-smo/svm-smo/