[3]数值计算与基于梯度的优化算法-程序员宅基地

技术标签: 深度学习笔记  

1 数值计算

1.1 上溢和下溢以及softmax函数

计算机在存储连续数学信息的时候,只能通过有限位数来近似逼近我们期望的“无限长度”的数字。
下溢指的是当数据过小导致计算机近似成0,极小的数和零是有区别的,零的出现往往会直接改变函数的某些性质。
上溢指的是当数据过大时,计算机将它处理成无穷大,也就是经常程序可能返回的NaN占位符,让数值计算失效。
解决上溢下溢的有效方法是使用softmax函数,其定义为:
s o f t m a x ( x ) i = e x p ( x i ) ∑ j = 1 n e x p ( x j ) softmax(x)_i=\frac{exp(x_i)}{\sum_{j=1}^nexp(x_j)} softmax(x)i=j=1nexp(xj)exp(xi)
式中x是输入向量,等式左边表示经softmax函数处理过后的向量的第i个分量。直观上看softmax将每个分量处理成了“分量在总量中的占比”的形式。
但是往往我们不会直接用softmax函数处理向量x,而是处理 z = x − m a x { x } z=x-max\{x\} z=xmax{ x}原因见下
如果用softmax函数直接处理向量x,我们假设x的每个分量都是一个常数c,那么理想状态下函数映射的结果应该是1/n。

  • 如果c是一个很小的量,以至于计算机近似成了0,那么分母会出现下溢,结果出错
  • 如果c是一个很大的量,仍然导致结果包含NaN的非数字占位符

如果使用 z = x − m a x { x } z=x-max\{x\} z=xmax{ x}将会解决这些问题

  • 由softmax函数的形式易知,输入向量加一个常量不会改变输出结果,也就是说用softmax函数处理z和x得到的结果相同
  • 由于每一项减去了最大项,导致exp的参数最大为0,于是排除了上溢的可能性
  • z必有一项是0,也就是分母一定是大于1的,排除了分母下溢的可能性

综上,使用softmax函数处理z向量的方法可以一定程度上有效解决数值计算上下溢的问题,但其实仍不够全面。如果要开发底层库,数值计算的上下溢应该是需要仔细考量的问题,但是好在已经有足够全面解决这些问题的软件包了,并且已经封装好的机器学习算法都在内部实现了对数值计算问题的处理。

1.2 病态条件

条件数指的是函数相对于输入的微小变化而变化的快慢程度。
通常考虑的是线性方程Ax=b,其中b是输入向量,产生x输出解向量,A的条件数很大就意味着输入的小偏差会导致输出的大偏差。
假设输入产生偏差导致了输出的偏差 A ( x + Δ x ) = b + Δ b A(x+\Delta x)=b+\Delta b A(x+Δx)=b+Δb,由于A是线性映射,可知 A Δ x = Δ b A\Delta x =\Delta b AΔx=Δb,这里假设A存在逆,那么 Δ x = A − 1 Δ b \Delta x=A^{-1}\Delta b Δx=A1Δb
对上面的两个式子两边取二范数,并利用范数定义的不等式性质:
∣ ∣ A x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ x ∣ ∣ = ∣ ∣ b ∣ ∣ ∣ ∣ Δ x ∣ ∣ = ∣ ∣ A − 1 Δ b ∣ ∣ ≤ ∣ ∣ A − 1 ∣ ∣ ⋅ ∣ ∣ Δ b ∣ ∣ ||Ax|| \le||A||\cdot||x||=||b|| \\ ||\Delta x|| = ||A^{-1}\Delta b|| \le||A^{-1}||\cdot||\Delta b|| AxAx=bΔx=A1ΔbA1Δb
综合两式可得
∣ ∣ Δ x x ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ A − 1 ∣ ∣ ⋅ ∣ ∣ Δ b b ∣ ∣ ||\frac{\Delta x}{x}||\le ||A||\cdot||A^{-1}||\cdot||\frac{\Delta b}{b}|| xΔxAA1bΔb
其中A的条件数cond(A)就被定义为 ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ A − 1 ∣ ∣ ||A||\cdot||A^{-1}|| AA1,可以发现:

  • 当cond(A)很大时,同样的输入误差会导致输出误差的上限很大
  • 当cond(A)很小时,同样的输入误差会导致输出误差的上限很小

根据矩阵二范数的定义,可以求出不同性质的矩阵具体的条件度是多少,通常我们考虑简单的情况,也就是矩阵A具有特征值分解,那么其条件数就是
m a x i , j { λ i λ j } max_{i,j}\{\frac{\lambda_i}{\lambda_j}\} maxi,j{ λjλi}
即矩阵A最大特征值除以最小特征值。关于更详细的条件数计算方法可以参考百度百科条件数
由于在计算机计算的时候不可避免地会使用近似值代入计算,所以我们总希望矩阵运算具有较小的条件数。对于一个很大条件数的矩阵,使用计算机计算会累计产生很明显的偏差。具有很大条件数的矩阵就被成为病态矩阵

2 基于梯度的优化方法

2.1 基本概念

大多数深度学习算法都涉及某种形式的优化优化指的是改变x使得函数f(x)最大或者最小,通常我们只讨论使最小的情况即可,使最大可以通过使-f(x)最小来转换。

其中被优化函数f(x)被称为目标函数(objective function)、准则(criterion),当要把f(x)最小化的时候,也称为代价函数(cost function)、损失函数(loss function)、误差函数(error function)
使f(x)被优化的x值被记作 x ∗ = a r g   m i n f ( x ) x^*=arg\ minf(x) x=arg minf(x)

2.2 梯度下降

只有在多维情况下,梯度才有讨论的意义,但是一维情况可以帮助理解梯度下降的思想。
将函数f(x)做一阶展开
f ( x + ϵ ) ≈ f ( x ) + ϵ f ′ ( x ) f(x+\epsilon)\approx f(x)+\epsilon f'(x) f(x+ϵ)f(x)+ϵf(x)
导函数的符号可以说明函数在某一点是在下降还是上升,为了完成使f(x)最小的优化问题,完全可以让x向着导函数小于零的方向前进一个小步长 ϵ \epsilon ϵ来逼近最小点。
所以我们更新 x n e x t = x − ϵ s i g n ( f ′ ( x ) ) x_{next}=x-\epsilon sign(f'(x)) xnext=xϵsign(f(x))
可以想象到当步长很小的时候,函数会下降到一个局部最小点,但是局部最小点并不一定是全局最小点,如果这一个局部最小点还不够小,没有达到优化可接受的程度,或许需要设定一个大步长“迈出”这个低谷,往后寻找更小的局部最小点。
找到绝对的全局最小点具有难度,有时候一些局部最小点已经显著低于周边的函数值,与全局最小点差别已经没有很大了,我们完全可以接受它作为优化的近似结果。
局部最小和全局最小
这时我们将情况拓展到多维。向量函数f(x)进行一阶展开的结果为:
x n e c t = x − ϵ ∇ f ( x ) x_{nect}=x-\epsilon \nabla f(x) xnect=xϵf(x)
因为梯度指向函数增长最快的方向,所以取逆方向增长步长 ϵ \epsilon ϵ,这种方法被称为梯度下降法,步长 ϵ \epsilon ϵ被称为学习率

2.3 Jacobian和Hessian矩阵

Jacobian矩阵可以表达n维向量y对于m维向量x的偏导数情况,雅克比矩阵J定义为 J i , j = ∂ ∂ x j y i J_{i,j}=\frac{\partial}{\partial x_j}y_i Ji,j=xjyi

梯度下降的方法仅仅采用了一阶近似,但是二阶导数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/GrandpaDZB/article/details/116563765

智能推荐

【C/C++】JAVA与C/C++ AES加密算法同步_botan c++ aes java 互通-程序员宅基地

文章浏览阅读4.6k次。此处我们使用的是AES的基础加密模式,即:电码本模式 ECBJAVA代码如下: //创建AES加密实例 SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES"); Cipher cip = Cipher.getInstance("AES/ECB/NoPadding");//算法/模式/补码方式 cip.init(C_botan c++ aes java 互通

民工哥折腾了2年多的《Linux系统运维指南》终于和大家见面了_linux系统运维指南:从入门到企业实战 pdf-程序员宅基地

文章浏览阅读2.5k次,点赞5次,收藏17次。2018年3月,我与张老师就这么在微信上聊了起来,起初我并没有写书的打算,我们之间只是通过讨论、交流的形式聊聊关于出书的方方面面。最终,敌不过张老师超强的专业能力、细致的解说与盛情相邀,我答应张老师写一本Linux系统运维的图书并由人邮出版。由此,我踏上了漫漫2年多的写书之路。为什么写这本书写书一方面是我对自己所学知识的查漏补缺过程,另一方面也可以向即将进入或已经入行的Linux系统运维同..._linux系统运维指南:从入门到企业实战 pdf

tf.reduce_sum()方法深度解析-程序员宅基地

文章浏览阅读2k次,点赞6次,收藏5次。tf.reduce_sum()函数深度解析从矩阵,数组,数据存储的角度 解析axis参数的意义_tf.reduce_sum

adb获取app包名的方法_adb获取包名-程序员宅基地

文章浏览阅读9.8k次,点赞4次,收藏29次。adb获取app包名的方法_adb获取包名

虾皮、lazada店铺运营攻略,如何搭建高效、稳定的自养号测评系统-程序员宅基地

文章浏览阅读913次,点赞16次,收藏10次。总之,要做好虾皮店铺,不仅需要明确的定位和优质的产品,还需要精心的运营和持续的改进。通过不断优化店铺形象、制定有效的营销策略、提供优质的客户服务以及加强供应链管理等手段,您将能够在激烈的竞争中脱颖而出,实现店铺的长足发展。1.稳定的网络环境是基石,它需要经过技术手段的洗礼,将电脑或手机的底层硬件参数伪装成国外数据,以躲避平台通过IP进行的深度检测。这种真实性高的评价能够帮助商家获得更多的信任和认可,从而提升产品的排名和流量的分配。您可以关注行业动态,学习先进的经营理念和技术,以提高店铺的运营水平。

统计检验问题:Friedman Test,Nemenyi test检验和Bonferroni-Dunn test检验_统计测试 cd diagrams-程序员宅基地

文章浏览阅读5k次,点赞11次,收藏43次。统计检验_统计测试 cd diagrams

随便推点

【合集】常见中间件漏洞_hrs中间件-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏37次。1. IIS1. PUT漏洞用户配置不当,exp:https://github.com/hackping/HTTPMLScan.git2. 短文件名猜解IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400。exp:https://github.com/WebBreacher/tilde_enum3.远程代码执行(CVE-2017-7269))**exp**:https://github.com/zcgonv_hrs中间件

db2基本概念-程序员宅基地

文章浏览阅读368次。DB2支持以下两种类型的表空间: 1、 系统管理存储器表空间(SMS-SYSTEM MANAGED STORAGE) 2、 数据库管理存储器表空间(DMS-DATABASE MANAGED STORAGE) SMS、DMS用户表空间的特性对照 特性 ..._db2

模拟window桌面实现-程序员宅基地

文章浏览阅读84次。正在开发中的游戏有个全屏功能--可以在window桌面背景上运行,就像一些视频播放器在桌面背景上播放一样的,花了个上午整了个Demo放出来留个纪念。实现功能:显示图标,双击图标执行相应的程序,右击图标弹出该图标对应得菜单,点击非图标区则弹出桌面菜单。需要完整工程可以点此下载:DesktopWindow.rar。程序效果图如下:在这个程序里,定义了一个XShellItem..._模拟实现windows桌面效果

https://www.byhy.net/tut/webdev/django/01/-程序员宅基地

文章浏览阅读944次。https://www.byhy.net/tut/webdev/django/01/_byhy.net

vue玩转移动端H5微信支付和支付宝支付_移动端支付宝微信支付vue项目怎么写-程序员宅基地

文章浏览阅读5.8k次,点赞13次,收藏57次。业务场景介绍:H5移动端支持微信支付 [ 微信支付分为微信内支付(JSAPI支付官方API)和微信外支付(H5支付官方API)] && 支付宝支付 [手机网站支付转 APP 支付 官方API ]订单生成逻辑:前端请求后端提交订单,后端去和微信或者支付宝对接生成订单(后续支付都是这个逻辑进行的对接)一、移动端微信支付,vue中如何玩?在移动端微信支付分为微信内支付和微信外支付。1.在订单组件中选择支付方式之后在支付页面先去判断是否是在微信内://判断是否微信 is__移动端支付宝微信支付vue项目怎么写

深度学习AI编译器-TVM简介_tvm编译器-程序员宅基地

文章浏览阅读2k次,点赞5次,收藏9次。深度学习编译器主要为解决不同框架下训练的模型部署到指定的某些设备上时所遇到的一系列复杂的问题,即将各种深度学习训练框架的模型部署到各种硬件所面临的问题;_tvm编译器

推荐文章

热门文章

相关标签