随机梯度下降法的数学基础

梯度是微积分中的基本概念,也是机器学习解优化问题经常使用的数学工具(梯度下降算法)。因此,有必要从头理解梯度的来源和意义。本文从导数开始讲起,讲述了导数、偏导数、方向导数和梯度的定义、意义和数学公式,有助于初学者后续更深入理解随机梯度下降算法的公式。大部分内容来自维基百科和博客文章内容的总结,并加以个人理解。

导数

导数(英语:derivative)是微积分学中的一个概念。函数在某一点的导数是指这个函数在这一点附近的变化率。导数的本质是通过极限的概念对函数进行局部的线性逼近。当函数 \(f\) 的自变量在一点 \(x_0\) 处产生一个增量时 \(h\) 时,函数输出值的增量与自变量增量 \(h\) 的比值在 \(h\) 趋于 0 时的极限如果存在,则将这个比值定义为 \(f\)\(x_0\) 处的导数,记作 \(f'(x_0)\)\(\frac{\mathrm{d}f}{\mathrm{d}x}(x_0)\)\(\left.\frac{\mathrm{d}f}{\mathrm{d}x}\right|_{x=x_0}\)

导数是函数的局部性质。不是所有的函数都有导数,一个函数也不一定在所有的点上都有导数。若某函数在某一点导数存在,则称其在这一点可导(可微分),否则称为不可导(不可微分)。如果函数的自变量和取值都是实数的话,那么函数在某一点的导数就是该函数所代表的曲线在这一点上的切线斜率。

对于可导的函数 \(f\)\(x \mapsto f'(x)\) 也是一个函数,称作 \(f\) 的导函数。导数示例如下图所示:

函数每个位置处的导数

导数的一般定义如下:

如果实函数 \(f\) 在点 \(a\) 的某个领域内有定义,且以下极限(注意这个表达式所定义的函数定义域不含 \(a\)

\[{\displaystyle \lim _{x\to a}{\frac {f(x)-f(a)}{x-a}}} \]

存在,则称 \(f\)\(a\) 处可导,并称这个极限值为 \(f\)\(a\) 处的导数,记作 \(f'(a)\)

偏导数

偏导数的作用与价值在向量分析和微分几何以及机器学习领域中受到广泛认可。

导数是一元函数的变化率(斜率),导数也是函数,可以理解为函数的变化率与位置的关系。

那么如果是多元函数的变化率问题呢?答案是偏导数,定义为多元函数沿坐标轴的变化率

偏导数是多元函数“退化”成一元函数时的导数,这里“退化”的意思是固定其他变量的值,只保留一个变量,依次保留每个变量,则 \(N\) 元函数有 \(N\) 个偏导数。

如果一个变量对应一个坐标轴,那么偏导数可以理解为函数在每个位置处沿着自变量坐标轴方向上的导数(切线斜率)。

在数学中,偏导数(英语:partial derivative)的定义是:一个多变量的函数(或称多元函数),对其中一个变量(导数)微分,而保持其他变量恒定。函数 \(f\) 关于变量 \(x\) 的偏导数记为 \(f'(x)\)\(\frac{\partial f}{\partial x}\)。偏导数符号 $\partial $ 是全导数符号 \(d\) 的变体。

假设 \(f\) 是一个多元函数。例如:

\[z = f(x, y) = x^2 + xy + y^2 \]

我们把变量 \(y\) 视为常数,通过对方程求导,我们可以得到函数 \(f\) 关于变量 \(x\) 的偏导数:

\[{\displaystyle {\frac {\partial f}{\partial x}} = 2x + y} \]

同理可得,函数 \(f\) 关于变量 \(y\) 的偏导数:

\[{{\frac {\partial f}{\partial y}} = x + 2y} \]

方向导数

在前面导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当我们讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即:某一点在某一趋近方向上的导数值

通俗理解就是:我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率(方向导数)。如下图所示,点 \(P\) 位置处红色箭头方向的方向导数为黑色切线的斜率。图片来自链接 Directional Derivative。

Directional Derivative Visual

方向导数的定义参考下图,来源-直观理解梯度,以及偏导数、方向导数和法向量等。

方向导数计算推导

梯度

梯度,写作 \(\nabla f\) 或 grad \(f\),二元时为(\(\frac{\partial z}{\partial x}, \frac{\partial z}{\partial y}\))。梯度是微积分中的基本概念,也是机器学习解优化问题经常使用的数学工具(梯度下降算法)。

在向量微积分中,梯度(英语:gradient)是一种关于多元导数的概括。平常的一元(单变量)函数的导数是标量值函数,而多元函数的梯度是向量值函数。

就像一元函数的导数表示这个函数图形的切线的斜率,如果多元函数在点 \(P\) 上的梯度不是零向量,则它的方向是这个函数在 \(P\) 上最大增长的方向、而它的量是在这个方向上的增长率

可以从以下两个例子理解梯度的意义:

  1. 假设有一个房间,房间内所有点的温度由一个标量场 \(\phi\) 给出的,即点 \((x,y,z)\) 的温度是 \(\phi(x,y,z)\)。假设温度不随时间改变。然后,在房间的每一点,该点的梯度将显示变热最快的方向。梯度的大小将表示在该方向上的温度变化率。

  2. 考虑一座高度函数为 \(H\) 的山,山上某点 \((x, y)\) 的高度是 \(H(x, y)\),点 \((x,y)\) 的梯度是在该点坡度(或者说斜度)最陡的方向。梯度的大小会告诉我们坡度到底有多陡。

总结梯度的几何意义:

  • 当前位置的梯度方向,为函数在该位置处方向导数最大的方向,也是函数值上升最快的方向,反方向为下降最快的方向;
  • 当前位置的梯度长度(模),为最大方向导数的值。

总结

  • 方向导数是各个方向上的导数。
  • 偏导数连续才有梯度存在。
  • 梯度的方向是方向导数中取到最大值的方向,梯度的值是方向导数的最大值。

参考资料

  1. 维基百科-偏导数
  2. 直观理解梯度,以及偏导数、方向导数和法向量等

版权声明 ©

本文作者嵌入式视觉

本文链接http://www.cnblogs.com/armcvai/p/17058941.html

版权声明:本文为「嵌入式视觉」的原创文章,首发于 github ,遵循 CC BY-NC-ND 4.0 版权协议,著作权归作者所有,转载请注明出处!

鼓励博主:如果您觉得文章对您有所帮助,可以点击文章右下角【推荐】一下。您的鼓励就是博主最大的动力!

本文转载于网络 如有侵权请联系删除

相关文章

  • JDBC的工作原理和工作步骤

    JDBC的工作原理:马克-to-win:JDBC主要完成三件事:1)建立连接;2)发送SQL语句;3)处理返回的结果。紧接着,下节以实例仔细分析这三条。第二节JDBCHelloWorld例子1.细述JDBC的工作原理紧接着上节的JDBC的工作原理,下面我们就仔细讲讲这三条。1)建立连接:马克-to-win:JDBC靠java.sql.DriverManager.getConnection(dbUrl,user,password);和数据库连接。当DriverManager执行getConnection时,它会在内存当中寻找最合适的驱动类。(我们在给机器装声卡时是不是也得先安装一个驱动程序?道理一样,每一个数据库,都需要有一个专门和它相配的驱动程序。)所以我们需要事先就把驱动类加载进来。怎么加载?靠Class.forName(className),在我们以下的例子当中就是Class.forName("com.mysql.jdbc.Driver");马克-to-win:注意:这个类不在jdk的核心包当中,因为它只和Mysql这个数据库相关。如果jdk的核心包中包含这个类

  • HBase实践 | HBase IO优化与高可用建设

    CAP能力模型 在CAP能力模型表现方面,hbase主要是面向CP的应用系统,针对数据写入可以满足强一致性需求,从客户端视角来看写入成功之后的数据是即时可见的。然而hbase的CP模型目前还存在很大的短板,比如当有服务节点出现宕机事件时,需要经历很长时间的MTTR过程,耗时主要体现在以下两个方面:首先需要对宕机节点做到及时发现。 目前hbase主要通过监听ZK来做服务感知,因此能够发现目标节点宕机的时间主要跟ZK的session超时时间有关。其次需要基于LSM树来做日志回放处理。 回放的数据总量跟当时的memstore数据量大小相关,数据量越大恢复时延将越明显。通过观察线上hbase集群发现当有RS节点出现宕机事件时,相关Region的服务恢复时间基本都维持在分钟级别,也即服务访问需要有分钟级的响应延迟,这是所有在线服务都无法接受的。而从另一个角度来看,目前很多线上业务其实对数据的强一致性要求并不严苛,数据写入成功后不要求立刻可见,只要能够在一定的时间buffer之后访问到数据即可,但是对服务的可用性要求非常高,对服务的响应时延要求非常敏感,更多是对AP场景的能力需求。原生AP能力支持

  • 【消消大冒险】工程资源结构与解析

    昨天Shawn在微店上出售了我在微信上线的小游戏《消消大冒险》,该游戏原本是我计划的收费视频教程的案例,但由于视频录的不太顺利,暂将源代码低价出售,目前已经有30多人购买,感谢大家的支持,在此还要特别感谢一位支持Shawn的老板一次购买了500份!工程中没有附属有文档,下面我将工程结构介绍一下,可以帮助大家快速了解资源组织结构,以及我所理解的模块化设计思路,也欢迎你提出不同的意见。一、整体结构下图是整体目录结构。按次序从上向下,依次说明一下:animations:动画资源目录,动画应该是与项目没关系的,独立了出来;components:组件脚本,里面都是Creator的组件代码,可以通用,后面有详细说明;music:游戏音效资源,都是mp3不过多释解;prefabs:预制体,这里面预制体都会有一个配套的控制脚本,后面说明;scene:游戏场景,除了场景文件,还有该场景用到的专属组件脚本也在这里;scripts:一些三方的脚本,这里主要是微信小游戏相关的;textures:游戏中用到的图片资源、字体资源都在这里面,有子目录分类。Shawn这里没有将脚本代码集中存放一个目录,而是跟着配套的

  • 一种查看Block中引用的所有外部对象的实现方法

    在我的前一篇文章:iOS调试Block引用对象无法被释放的一个小技巧中有介绍一种显示某个block对象的实现函数的方法,以及从DebugMemoryGraph中查看某个对象被哪个block所引用的方法,其实有更加简单的两个方法来查看持有某个对象的block的信息:方法1:在项目工程中打开EditScheme...在出现的如下界面:中勾选MallocStack。这样在DebugMemoryGraph中就可以看到对象的内存分配调用栈信息,以及某个block的实现函数代码了。方法2:在lldb控制台中使用po[xxxdebugDescription]这里面的xxx就是某个block对象或者block在内存中的地址。block内存布局简介要想实现这个能力,就需要从block对象的内存布局说起,如果你查看开源库https://opensource.apple.com/source/libclosure/libclosure-73/中关于block内部实现的定义就可以看出,在其中的Block_private.h文件中有关于block对象内部布局的定义,每个block其实是一个如下形式的结构体://

  • [javaSE] IO流(管道流)

    之前我们使用io流,都是需要一个中间数组,管道流可以直接输入流对接输出流,一般和多线程配合使用,当读取流中没数据时会阻塞当前的线程,对其他线程没有影响定义一个类Read实现Runable接口,实现run()方法,构造方法传递PipedInputStream对象读取流里面的数据定义一个类Write实现Runable接口,实现run()方法,构造方法传递PipedOutputStream对象写入流里面数据获取PipedInputStream对象,new出来获取PipedOutputStream对象,new出来调用PipedInputStream对象的connect()方法,对接输出流,参数:PipedOutputStream对象开启两个线程执行读写importjava.io.IOException; importjava.io.PipedInputStream; importjava.io.PipedOutputStream; /** *读取数据线程 *@authortaoshihan * */ classReadPipeimplementsRunnable{ privatePipedIn

  • 从经济学博士到爬坑机器学习十年,微软首席数据科学家谢梁的AI故事

    谢梁,美国微软总部首席数据科学家,本科毕业于西南财经大学经济学专业,然后在中国工商银行从事信贷评估工作,一年后辞职到纽约州立大学学习应用计量经济学。研究兴趣主要是混合模型(mixedmodel)和数据挖掘方法,以及SAS潜力的挖掘(他认为在各大SAS论坛帮人解决问题同时学习他人经验,是提升自己最快的途径,曾用网名oloolo),著有《Keras快速上手:基于Python的深度学习实战》。 十余年的机器学习应用经验,让他成功从一位经济学毕业生转型为云计算领域的顶级数据科学家。近日,谢梁接受CSDN专访,分享了从经济学入坑机器学习的原因和挑战;如何深入掌握深度学习;当今工业界应用的模型很多,是否可安心当调包侠等话题。谢梁美国微软总部首席数据科学家另外,10月28日,谢梁将在SDCC2017「人工智能技术实战线上峰会」上带来题为《使用Keras由零开始快速构造自己的深度学习模型》的分享,更多峰会嘉宾和议题请查看文末。为何转向机器学习CSDN:你是经济学博士,什么原因让你着迷于机器学习、数据挖掘和人工智能,并将其应用于IT基础架构的优化?谢梁:我的专业是计量经济学,专注于实证分析各种社会和经济

  • (62) 神奇的序列化 / 计算机程序的思维逻辑

    在前面几节,我们在将对象保存到文件时,使用的是DataOutputStream,从文件读入对象时,使用的是DataInputStream,使用它们,需要逐个处理对象中的每个字段,我们提到,这种方式比较啰嗦,Java中有一种更为简单的机制,那就是序列化。简单来说,序列化就是将对象转化为字节流,反序列化就是将字节流转化为对象。在Java中,具体如何来使用呢?它是如何实现的?有什么优缺点?本节就来探讨这些问题,我们先从它的基本用法谈起。基本用法 Serializable要让一个类支持序列化,只需要让这个类实现接口java.io.Serializable,Serializable没有定义任何方法,只是一个标记接口。比如,对于57节提到的Student类,为支持序列化,可改为:publicclassStudentimplementsSerializable{ Stringname; intage; doublescore; publicStudent(Stringname,intage,doublescore){ ... } ... } 复制声明实现了Serializable接口后,保存/读取

  • 5分钟带你入门Redis

    1.redis概述redis是一个开源的,先进的key-value存储可用于构建高性能的存储解决方案。它支持数据结构有字符串,哈希,列表,集合,带有范围查询的排序集,位图,超文本和具有半径查询的地理空间索引。NoSQL,NotOnly[SQL],泛指非关系型的数据库。所以redis是一种nosql。敲黑板画重点:redis是一种nosql.redis的优点:异常快速支持丰富的数据类型操作都是原子的2.下载安装linux系统下安装:““ $wgethttp://download.redis.io/releases/redis-3.2.6.tar.gz tarxzfredis−3.2.6.tar.gztarxzfredis-3.2.6.tar.gzcdredis-3.2.6 $make启动服务器: ``` $src/redis-server ``` 启动客户端 ``` $src/redis-cli ``` mac下安装: ``` brewinstallredis复制启动:redis-server redis-cli复制windows下安装:由于官方并没有提供windows版本,不

  • MySQL基础课堂笔记「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。MySQL基础知识学习笔记整理今日内容数据库的基本概念 MySQL数据库软件 安装卸载配置SQL 数据库的基本概念1.数据库的英文单词:DataBase简称:DB 2.什么数据库? *用于存储和管理数据的仓库。 3.数据库的特点: 1.持久化存储数据的。其实数据库就是一个文件系统 2.方便存储和管理数据 3.使用了统一的方式操作数据库--SQL复制​ 4.常见的数据库软件 *参见《MySQL基础.pdf》MySQL数据库软件1.安装 *参见《MySQL基础.pdf》 2.卸载 1.去mysql的安装目录找到my.ini文件 *复制datadir="C:/ProgramData/MySQL/MySQLServer5.5/Data/" 2.卸载MySQL 3.删除C:/ProgramData目录下的MySQL文件夹。 3.配置 *MySQL服务启动 1.手动。 2.cmd-->services.msc打开服务的窗口 3.使用管理员打开cmd *netstartmysql:启动my

  • 记-Golang获取本机IP及快速搭建局域FTP

    1packagemain 2 3import( 4"fmt" 5"net" 6"net/http" 7"strings" 8) 9 10funcmain(){ 11addrs,err:=net.InterfaceAddrs()//局域文件传输代码 12iferr!=nil{ 13fmt.Println(err) 14return 15} 16for_,address:=rangeaddrs{ 17//检查ip地址判断是否回环地址 18ifipnet,ok:=address.(*net.IPNet);ok&&!ipnet.IP.IsLoopback(){ 19ifipnet.IP.To4()!=nil{ 20ipv4:=ipnet.IP.String() 21ifstrings.Contains(ipv4,"10."){//此处需根据公司ip段进行判断 22fmt.Printf("访问:http://%s:8080",ipnet.IP.String()) 23} 24} 25} 26} 27http.Handle("/",http.FileServer(http.Dir(

  • freemarker使用shiro标签(spring boot)

    freemarker使用shiro标签(springboot) 2018年07月03日14:20:37 niu_sayok 阅读数:348更多 个人分类: freeMarkerShiro   首先需要写一个类   /**   *集成Shiro标签   */   @Component   publicclassShiroTagFreeMarkerConfigurerimplementsInitializingBean{       @Autowired   privateConfigurationconfiguration;       @Autowired   privateFreeMarkerViewResolverresolver;       @Override  

  • 数据库--标准语言SQL

    1.完成核心功能只有9个动词: 数据查询;SELECT 数据定义:CREATE,DROP,ALTER; 数据操纵:insert,delete,update 数据控制;grant,remove 2.支持三级模式结构 视图--外模式基本表(的集合)--模式存储文件和索引---内模式   3.定义和修改基本表(定义模式): CREATETABLE DROPTABLEALTERTABLE定义视图(定义外模式): CREATEVIEWDROPVIEW定义索引(定义内模式): CREATEINDEXDROPINDEX说明:视图是从基本表导出的虚表,索引依赖于基本表,SQL没有修改视图和索引的操作,可通过先删除,再创建达此目的。  4.修改基本表 (1)增加列:ALTERTABLE表名ADD列名类型[完整性约束];(2)修改列ALTERTABLE表名MODIFY列名类型;(3)删除完整性约束ALTERTABLE表名DROP完整性约束名;  

  • 极大似然估计详解,写的太好了!

    https://blog.csdn.net/qq_39355550/article/details/81809467

  • datax安装(Windows版)

    一、安装datax 下载地址:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz      将其解压即可。 二、测试安装是否成功    1,打开cmd界面(同时按下Windows键+R键)   2,输入CHCP65001防止中文乱码   3,跳转到datax的bin目录下     命令行:d:         cd D:\BigDataTools\datax\datax\bin       4,查看模板     命令行: pythondatax.py-rstreamreader-wstreamwriter   5,使用datax    首先我们需要自定义好的json文件(从网上获取的,内容如下),命名为stream2stream.json { "job":{ "content":[ { "reader":{ "name":"streamreader", "parameter":{ "sliceRecordCount":10

  • memory error python报错

    np.array时报错内存溢出,检查了python安装的是64位版本,通过下面dtype=np.uint8不再报错texts_vec=(np.array(texts_vec,dtype=np.uint8))复制

  • linux下安装nginx

    linux版本:CentOS764位 【yum安装最新版nginx:https://www.cnblogs.com/xxoome/p/7256214.html】 在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。 Linux下检查是否安装过某软件包:http://www.cnblogs.com/xxoome/p/5866553.html 安装命令: yum-yinstallgccpcre-develzlib-developensslopenssl-devel复制 nginx下载地址:https://nginx.org/download/ 下载“nginx-1.9.9.tar.gz”,移动到/usr/local/下。 ##解压 tar-zxvfnginx-1.9.9.tar.gz ##进入nginx目录 cdnginx-1.9.9复制 ##配置./configure--prefix=/usr/local/nginx#makemakemakeinstall复制 OK,现在可以执行make了。  &

  • JS,Jquery获取屏幕的宽度和高度

    Javascript: 网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth(包括边线的宽)网页可见区域高:document.body.offsetHeight(包括边线的高)网页正文全文宽:document.body.scrollWidth网页正文全文高:document.body.scrollHeight网页被卷去的高:document.body.scrollTop网页被卷去的左:document.body.scrollLeft网页正文部分上:window.screenTop网页正文部分左:window.screenLeft屏幕分辨率的高:window.screen.height屏幕分辨率的宽:window.screen.width屏幕可用工作区高度:window.screen.availHeight屏幕可用工作区宽度:window.screen.availWidth   JQuery: $(document).ready(f

  • 数据库的索引到底是怎么起作用的?

    该文做出很好的解释: https://www.jianshu.com/p/814c1675361c

  • 基于SignalR实现B/S系统对windows服务运行状态的监测

    通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进行交互,来实现更好的用户体验,搭配redis,memcached等来实现分布式缓存,消息列队处理等等。。。 但是通常情况我们在B/S端是无法得知其依赖的windows服务当前处于什么样的运行状态,只能通过到server里面去进行查看,或者通过其他途径! 今天我们就通过SignalR来实现一个B/S端对windows服务运行状态的监控,这里我们用SignalRselfHost,不依赖IIS,然后利用topshelf把SignalRServer部署成windows服务,然后在B/S端通过SignalRjsclient进行连接获取服务运行状态!   首先创建一个控制台应用程序,.NET4.5,Nuget添加 Microsoft.AspNet.SignalR.SelfHost Microsoft.Owin.CorsTopShelf(实现windows服务安装) 具体新

  • Leetcode 98 验证二叉搜索树 Python实现

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例1:输入:  2 /\1 3输出:true输入: 5 /\1 4  /\ 3 6输出:false解释:输入为:[5,1,4,null,null,3,6]。  根节点的值为5,但是其右子节点值为4。​思路1:递归判断是否满足条件,传递变化的最大最小值复制 classSolution: defis_val(self,node,min_v,max_v): ifnode==None: returnTrue ifnode.left!=None: ifnode.left.val>=node.valornode.left.val<=min_v: returnFalse ifnode.right!=None: ifnode.right.val&l

  • Java中的四舍五入

    经典案例分析:publicclassRoundTest{   publicstaticvoidmain(String[]args){      System.err.println("12.5的四舍五入值:"+Math.round(12.5));      System.err.println("-12.5的四舍五入的值:"+Math.round(-12.5));   }}   这是四舍五入的经典案例,从上面结果中发现,这个两个绝对值相同的数字,为何近似值会不同呢?其实这与Math.round采用的四舍五入的规则来决定的。   举例说明:11.556=11.56 --六入        11.554=11.55  ----四舍     &nb

相关推荐

推荐阅读