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

手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程

“Men pass away, but their deeds abide.”

人终有一死,但是他们的业绩将永存。

——奥古斯坦-路易·柯西

目录

前言

简单函数求极值

复杂函数梯度法求极值

泰勒展开

梯度,Nabla算子

Cauchy-Schwarz不等式

梯度下降算法

算法流程 

梯度下降法优缺点


前言

        在学习和训练过程中,需要根据训练样本来确定一组与分类器模型相关的参数。学习过程往往要首先定义某个准则函数,用以描述参数的“合适性”,然后寻找一组“合适性”最大的参数作为学习的结果,也就是将学习问题转化成针对某个准则函数的优化问题


简单函数求极值

        对于简单函数,根据数学分析的知识可知:

  • m 维矢量 x' 是 f(x) 的极值点的必要条件是:

\frac{\partial f }{\partial x_i'}=0,\forall i \in [1,m]

  • 将所有的偏导数写成矢量形式:

\frac{\partial f(x)}{\partial x}=\begin{bmatrix} \frac{\partial f}{\partial x_1}\\ \vdots \\ \frac{\partial f}{\partial x_m} \end{bmatrix}=\begin{bmatrix} 0\\ \vdots \\ 0 \end{bmatrix}=\vec 0

  • 函数 f(x) 的极值点可以通过求解该矢量方程得到

        但是,上述方程的解可能是极大值点,也可能是极小值点,也可能不是极值点,具体情况还需二阶导数来判断。 

        如果希望求 f(x) 的极大值或极小值点,可以通过比较所有的极大值或极小值得到。


复杂函数梯度法求极值

        对于简单的纯凸函数或纯凹函数,由于只存在唯一的极值点,极值点即为最大值或最小值点,因此可以直接求解矢量方程 \frac{\partial f(x)}{\partial x}=\vec 0 得到 f(x) 的优化解。

        对于复杂函数来说,直接求解矢量方程得到优化函数的极值点往往非常困难。在这种情况下,可以考虑采用迭代的方法从某个初始值开始,逐渐逼近极值点,即——梯度法


泰勒展开

  • 如果给定了点 x_0 具有所有的前 n 阶导数的函数 f(x),我们称多项式:

为函数 f(x) 在点 x_0 处的 n 阶泰勒展开式

        泰勒公式是高等数学中的一个非常重要的内容,它将一些复杂的函数逼近近似地表示为简单的多项式函数,泰勒公式这种化繁为简的功能,使得它成为分析和研究许多数学问题的有力工具 

考虑到多元函数 f(x) 在点 x 附近的一阶泰勒展开式:

f(x+\Delta x)=f(x)+\sum_{i=1}^m \frac{\partial f}{\partial x_i}\Delta x_i+r(x,\Delta x)

其中:

        \Delta x 为矢量增量

        \Delta x_i 为其第 i 维元素

        r(x,\Delta x) 为展开式的余项


梯度,Nabla算子

接下来引入梯度的概念

 设二元函数 z=f(x,y) 在平面区域 D 上具有一阶连续偏导数,则对于每一个点 p(x,y) 都可以定出一个向量:

\{\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\}=f_x(x,y)\vec i+f_y(x,y)\vec j

称作函数 z=f(x,y) 在点 p(x,y) 的梯度,记作 \triangledown f(x,y)

其中:

\triangledown =\frac{\partial}{\partial x}\vec i+\frac{\partial }{\partial y}\vec j

称为(二维的)向量微分算子或Nabla算子

设 e = \{cos\alpha ,cos\beta \} 是方向 l 上的单位向量,则:

\frac{\partial f}{\partial l}=\frac{\partial f}{\partial x}cos\alpha+\frac{\partial f}{\partial y}cos\beta=\triangledown f(x,y)e

=|\triangledown f(x,y)|\cdot|e|\cdot cos[\triangledown f(x,y),e]

当 l 与梯度方向一致时,有:

cos[\triangledown f(x,y),e]=1

此时方向导数 \frac{\partial f}{\partial l} 有最大值,值为梯度的模:

|\triangledown f(x,y)|=\sqrt{(\frac{\partial f}{\partial x})^2+(\frac{\partial f}{\partial y})^2}

我们将其推广到无穷维的情况:

设 n 维函数 f(x) 在空间区域 G 内具有一阶连续偏导数,点 P(x)\in G,称向量:

\{\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\cdots,\frac{\partial f}{\partial x_n}\}

为函数   在点 P 处的导数,记为 \triangledown f(x)

 稍微集中一下注意力:

         注意到一阶展开式中求和项 \sum_{i=1}^m \frac{\partial f}{\partial x_i} \Delta x_i,改写为:

\frac{\partial f}{\partial x_1}\Delta x_1 +\frac{\partial f}{\partial x_2}\Delta x_2+\cdots+\frac{\partial f}{\partial x_m}\Delta x_m

        不难发现,该求和式实际上为 f(x) 关于 x 的梯度矢量与矢量增量 \Delta x 之间的内积。

        同时,令 \Delta x\rightarrow 0,有 r(x,\Delta x)\rightarrow 0,于是有:

f(x+\Delta x)\approx f(x)+[\triangledown f(x)]^T\Delta x =f(x)+(\frac{\partial f}{\partial x})^T\Delta x

        如果要求取 f(x) 的极小值 x',可以从某个初始点 x_0 开始搜索,每次增加一个增量 \Delta x,虽然不能保证 x_0+\Delta x 直接达到极小值点,但如果能够保证每次迭代过程中函数值逐渐减小:

f(x+\Delta x)<f(x)

        那么经过一定的迭代次数之后,函数值能够逐渐逼近极小值 x',这是一个逐渐下降的过程,因此称为梯度下降法。

        更进一步,如果希望下降过程越快越好,用尽可能少的迭代次数逼近极小值,达到对极小值更高精度的逼近,这种方法称为最速下降法


Cauchy-Schwarz不等式

要使函数值下降的最快,就是要寻找一个矢量增量 \Delta x 使得 [\triangledown f(x)]^T\Delta x 最小。

我们引入Cauchy-Schwarz不等式:

其向量形式(欧式空间):

x\cdot y=|x|\cdot|y|\cdot cos(x,y)\leq |x|\cdot|y|

这里不做严谨的证明,且该结论对于大部分人来说非常显然

        由于上面我们只展开到一阶近似,当 ||\Delta x|| 过大时,余项 r(x,\Delta x) 便不能忽略,近似的精度会很差。因此不能直接寻找矢量增量,而是应该寻找使得函数值下降的最快的方向,也就是在约束 ||\Delta x|| =1 的条件下,寻找使得 [\triangledown f(x)]^T\Delta x 最小的矢量增量。找到最速下降的方向后,在确定该方向上合适的矢量长度

        根据柯西不等式:

||[\triangledown f(x)]^T\Delta x||\leq ||\triangledown f(x)||\cdot||\Delta x||

(\triangledown f(x))^T\Delta x \geq -||\triangledown f(x)||\cdot||\Delta x|| = -||\triangledown f(x)||

        令

\Delta x=-\frac{\triangledown f(x)}{||\triangledown f(x)||}

        有:

[\triangledown f(x)]^T\Delta x=[\triangledown f(x)]^T[-\frac{\triangledown f(x)}{||\triangledown f(x)||}]

=-\frac{[\triangledown f(x)^T]\triangledown f(x)}{||\triangledown f(x)||}

=-\frac{||\triangledown f(x)||^2}{||\triangledown f(x)||}

=-||\triangledown f(x)||

        可以得到,当 \Delta x 为负的梯度方向时,不等式等号成立,[\triangledown f(x)]^T\Delta x 取得最小值,函数值下降速度最快。

        所以,最速下降法按照以下方式进行迭代:

x=x+\Delta x=x-\eta \triangledown f(x)

        其中 \eta 一般被称为“学习率” ,用于控制矢量的长度。如果是要寻找极大值,则 \Delta x 应当沿梯度正方向。


梯度下降算法

因为代码求梯度非常困难,博主手搓不出来,这里只给算法流程

算法流程 

  • 初始化:x_0,\eta,\theta,i=0
  • 循环,直到||\eta\triangledown f(x)|_{x=x_i}||<\theta
    • 计算当前点的梯度矢量:\triangledown f(x)|_{x=x_i}
    • 更新优化解:x_{i+1}=x_i-\eta\triangledown f(x)|_{x=x_i}
    • i=i+1
  • 输出优化解

        参数 \theta 为收敛精度,值越小,输出解越接近极小值点,同时迭代次数越多。

梯度下降法优缺点

优点:

  • 算法简单,只要知道任意一点的梯度矢量就能进行迭代优化 
  • 在学习率合适的情况下,算法能很好的收敛到极小值点

缺点:

  • 对于梯度值较小的区域,收敛速度很慢
  • 收敛性依赖于学习率的设置,与初始值选择无关,但目前对于某个具体问题来说,还没有能够直接确定学习率的方法
  • 梯度下降只能保证收敛于一个极值点,无法一次计算出所有的极值点,具体收敛到哪个极值点依赖于初始值的设置
  • 梯度下降不能保证求得的极小值是全局最小值 

参考文献

【1】模式识别 - 刘家锋

【2】数学分析(一)- 崔国辉

相关文章:

手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程

“Men pass away, but their deeds abide.” 人终有一死&#xff0c;但是他们的业绩将永存。 ——奥古斯坦-路易柯西 目录 前言 简单函数求极值 复杂函数梯度法求极值 泰勒展开 梯度&#xff0c;Nabla算子 Cauchy-Schwarz不等式 梯度下降算法 算法流程 梯度下降法…...

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization&#xff08;多目标粒子群优化算法&#xff09; 一、摘要&#xff1a; 本文提出了一种将帕累托优势引入粒子群优化算法的方法&#xff0c;使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…...

Swift——自动引用计数ARC

ARC ARC是swift使用的一种管理应用程序内存的机制&#xff0c;对于C语言我们知道&#xff0c;当我们申请一块空间&#xff0c;通常需要手动释放&#xff0c;不然会造成空间浪费&#xff0c;而有了ARC机制&#xff0c;你无需考虑内存的管理&#xff0c;因为ARC会在类的实例不再…...

【Quarkus】基于CDI和拦截器实现AOP功能(进阶版)

Quarkus 基于CDI和拦截器实现AOP功能&#xff08;进阶版&#xff09; 拦截器的属性成员拦截器的重复使用基于属性成员和重复使用的拦截器的发消息案例 本节来了解一下拦截器高级特性&#xff08;拦截器的重复使用和属性成员&#xff09;&#xff0c;官网说明&#xff1a;https:…...

【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决

前言 在日常开发和运维中&#xff0c;为了提高服务器登录的安全性&#xff0c;我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而&#xff0c;在配置 SSH 公钥登录的过程中&#xff0c;可能会遇到各种坑和 Bug。本文将从零开始&#xff0c;手把手教你如何在 Ubuntu…...

insmod一个ko提供基础函数供后insmod的ko使用的方法

一、背景 在内核模块开发时&#xff0c;多个不同的内核模块&#xff0c;有时候可能需要都共用一些公共的函数&#xff0c;比如申请一些平台性的公共资源。但是&#xff0c;这些公共的函数又不方便去加入到内核镜像里&#xff0c;这时候就需要把这些各个内核模块需要用到的一些…...

七、传统循环神经网络(RNN)

传统循环神经网络 RNN 前言一、RNN 是什么&#xff1f;1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…...

LeetCode:19.删除链表倒数第N个节点

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;19.删除链表倒数第N个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表…...

【RISC-V CPU debug 专栏 2 -- Debug Module (DM), non-ISA】

文章目录 调试模块(DM)功能必须支持的功能可选支持的功能兼容性要求规模限制Debug Module Interface (DMI)总线类型地址与操作地址空间控制机制Debug Module Interface Signals请求信号响应信号信号流程Reset Control复位控制方法全局复位 (`ndmreset`)Hart 复位 (`hartreset…...

单片机学习笔记 11. 外部中断

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...

基于stm32的智能教室管理系统/智能家居系统

基于stm32的智能教室管理系统/智能家居系统 持续更新&#xff0c;欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前&#xff0c;物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起&#xff0c;实现管理的智能化…...

基于 Qt 和 GStreamer 的环境中构建播放器

一、功能与需求分析 功能描述 播放本地视频文件(如 MP4、MKV)。 支持基本控制功能(播放、暂停、停止、跳转)。 提供音量调节功能。 在 Windows 环境下使用 Visual Studio 2022 编译。 技术选型 Qt:用于构建用户界面。 GStreamer:负责视频解码和播放。 Visual Studio 202…...

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步&#xff1a;安装Docker Desktop for Windows 系统要求&#xff1a; Windows 10 64位版本&#xff08;专业版、企业版或教育版&#xff09;。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...

baomidou Mabatis plus引入异常

1 主要异常信息 Error creating bean with name dataSource 但是有个重要提示 dynamic-datasource Please check the setting of primary 解决方法&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring…...

深度学习中的正则化模型是什么意思?

一、定义 在深度学习中&#xff0c;正则化是一种用于防止过拟合的技术。过拟合是指模型在训练数据上表现非常好&#xff0c;但在新的、未见过的数据&#xff08;测试数据&#xff09;上表现很差的情况。正则化模型就是通过在损失函数中添加额外的项来约束模型的复杂度&#xf…...

修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题

之前很多配置都是放在nacos里面&#xff0c;然后这次同事有个配置写在application.properties中&#xff0c;这个配置含有中文&#xff0c;启动之后发现拿到的中文值会乱码&#xff0c;然后就帮忙看了一下问题。 排查问题 经过不停的百度、排查发现&#xff0c;spring读取app…...

Flink 热存储维表 使用 Guava Cache 减轻访问压力

目录 背景 Guava Cache 简介 实现方案 1. 项目依赖 2. Guava Cache 集成到 Flink (1) 定义 Cache (2) 使用 Cache 优化维表查询 3. 应用运行效果 (1) 维表查询逻辑优化 (2) 减少存储压力 Guava Cache 配置优化 总结 背景 在实时计算场景中&#xff0c;Flink 应用中…...

深入探索SenseVoiceSmall:高效多语言语音识别与处理模型

引言 随着人工智能技术的飞速发展&#xff0c;语音识别技术已经广泛应用于智能助手、客户服务、智能家居等多个领域。然而&#xff0c;现有的语音识别模型往往存在资源消耗大、多语言支持不足等问题。今天&#xff0c;我们要介绍的是来自ModelScope平台的SenseVoiceSmall模型&…...

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 &#xff08;一&#xff09;map 算子 &#xff08;二&#xff09;flatMap 算子 &#xff08;三&#xff09;filter 算子 &#xff08;四&#xff09;keyBy 算子 元组类型 POJO &#xff08;五&#xff09;reduce 算子 二、合并与连接操作 …...

每日十题八股-2024年11月27日

1.类型互转会出现什么问题吗&#xff1f; 2.为什么用bigDecimal 不用double &#xff1f; 3.装箱和拆箱是什么&#xff1f; 4.Java为什么要有Integer&#xff1f; 5.Integer相比int有什么优点&#xff1f; 6.那为什么还要保留int类型&#xff1f; 7.说一下 integer的缓存 8.怎么…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...