当前位置: 首页 > 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.怎么…...

OpenCV截取指定图片区域

import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…...

Java部分新特性

模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...

【SpringBoot】28 API接口防刷(Redis + 拦截器)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括&#xff1a;防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等&#xff0c;以确保接口的安全性。 常见措施 1&#xff09;防火墙 防火墙是网络安全中最基本的安全设备之一&#xff0c…...

IT运维专家给年轻人一些职业上的建议

运维工作在现代企业中是非常重要的一环,保证系统的稳定性、可用性以及安全性对企业的正常运营至关重要。以下是我给年轻人的一些职业发展建议,希望能够帮助你们在运维领域找到方向并取得成功。 1. 夯实基础,扎实技术功底 精通操作系统与网络:运维工作需要深入理解操作系统…...

Django基础之路由

一.前言 前面我们说了django的安装于基础配置&#xff0c;基础知识点我就细分下来&#xff0c;每天和大家讲一点&#xff0c;今天就要和大家说django的基础知识点了&#xff0c;我们今天先来讲路由&#xff0c;内容不多&#xff0c;希望大家记住 二.传统路由 路由就是前面一个…...

Python实例化中默认值的行为及应用

Python实例化中默认值的行为及应用 适合初学者阅读 本文要点 使用可变对象作为默认参数会导致所有实例共享同一对象&#xff0c;引发意外的数据修改。不可变对象作为默认参数时&#xff0c;每次实例化都会创建新的对象&#xff0c;不会共享数据。推荐使用None作为默认值&…...

【WRF后处理】WRF模拟效果评价及可视化:MB、RMSE、IOA、R

【WRF后处理】模拟效果评价及可视化 准备工作模型评价指标Python实现代码Python处理代码:导入站点及WRF模拟结果可视化图形及评价指标参考在气象和环境建模中(如使用 WRF 模型进行模拟),模型性能评价指标是用于定量评估模拟值与观测值之间偏差和拟合程度的重要工具。 本博客…...

ShenNiusModularity项目源码学习(4:身份认证)

ShenNiusModularity项目有两套启动方式&#xff0c;一种是ShenNius.Admin.Mvc项目启动&#xff0c;该项目为MVC模式&#xff0c;带前台页面&#xff0c;也有后台服务&#xff0c;另一种是ShenNius.Admin.Hosting&#xff0c;该项目启动后仅提供后台服务&#xff0c;供其它前台项…...

python+django自动化部署日志采用‌WebSocket前端实时展示

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…...

flink学习(6)——自定义source和kafka

概述 SourceFunction:非并行数据源(并行度只能1) --接口 RichSourceFunction:多功能非并行数据源(并行度只能1) --类 ParallelSourceFunction:并行数据源(并行度能够>1) --接口 RichParallelSourceFunction:多功能并行数据源(并行度能够>1) --类 【建议使用的】 ——…...

wix做的网站在国内访问不/想开个网站怎样开

GitHub地址 用Builder模式重新打造一个dialog&#xff0c;案例中有两种Builder&#xff0c;分别是CommonBuilder和MDBuilder&#xff0c;如果还想实现其他的通用dialog&#xff0c;继承自FRBaseDialogBuilder即可。 1、用法&#xff1a; 1.1、普通Dialog private void showComm…...

创意设计字体/seo团队

&#x1f352; 作者简介&#xff1a;大学机械本科&#xff0c;野生程序猿&#xff0c;学过C语言&#xff0c;玩过前端&#xff0c;还鼓捣过嵌入式&#xff0c;设计也会一点点&#xff0c;不过如今痴迷于网络爬虫&#xff0c;因此现深耕Python、数据库、seienium、JS逆向、安卓逆…...

北京网站建设乐云seo/steam交易链接在哪

i.MX8MM开发板使用手册更新啦&#xff0c;最新版本为1.6版本。后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。更新重点&#xff1a;1 Android源码更新维护&#xff0c;支持4G模块 2 Linux源码修复声卡声音过小问题&#x…...

id导入不了wordpress/接广告的网站

1.Tomcat的结构概述Tomcat服务器是由一系列可配置的组件构成&#xff0c;其核心组件是Catalina Servlet容器&#xff0c;它是所有其他Tomcat组件的顶层容器。Tomcat的组件可以在<CATALINA_HOME>/conf/server.xml文件中进行配置,每个Tomcat的组件在server.xml文件中对应一…...

中国建设银行网站个人/上海百度移动关键词排名优化

问题&#xff1a; 拼接字符串&#xff0c;拼接的那个字符串&#xff0c;需要先拼接&#xff0c;再连接。 思路&#xff1a; 两个字符数组&#xff0c;先创建出来并赋值。计算字符串的长度。随后弄两个指针&#xff0c;在一个for循环中&#xff0c;进行添加赋值。第一个数组从…...

上海网站建设公司哪家好?/广告优化

源码介绍请注意&#xff1a;该源码来源网友分享&#xff0c;素材虎不提供技术支持&#xff0c;没有技术能力的小白勿拍。(如需安装服务费用另算)这套TPfang房产今天看到了就拿出来测试无奈里面没教程只能自己摸索&#xff0c;搞来搞去吧页面显示出来了确找不到后台地址&#xf…...