概述

最优化问题中很多算法,包括非线性最优化、非线性等式等都需要计算导数。简单函数可以直接进行人工计算或者编码实现,对于复杂的情况,需要寻找一些方法进行计算或者近似。本节主要内容包括
1. 常见导数求解方法
2. 有限差分方法
3. 自动微分方法
4. 总结

常见导数求解方法

有限差分方法(Finite Differencing)

根据导数的定义,导数表示函数在给定点x处,给定无限小的涉动后函数值的改动。因此我们可以根据定义,在给定点x处给定一个无限小的抖动,看函数值的变化率,即

∂f∂xi≈f(x+ϵei)−f(x−ϵei)2ϵ

\frac{\partial f}{\partial x_i} \approx \frac{f(x+\epsilon e_i)-f(x-\epsilon e_i)}{2\epsilon}

自动微分方法

基本思路就是将复杂的函数分解为基本函数以及基本运算,然后通过构建有向无环图进行求解。常见函数导数求解方法

另外就是导数运算法则,例如函数加、减、乘除以及链式法则的应用。

符号微分法

有限微分近似算法

基础思想是泰勒定理和Lipschitz连续。介绍如下:
1. 泰勒公式:

f(x+p)=f(x)+∇f(x)Tp+12pT∇2f(x+tp)p

f(x+p)=f(x) + \nabla f(x)^Tp+\frac 12 p^T\nabla ^2 f(x+tp)p
2. Lipschitz continuous: 对任意的x和x2

dY(f(x1,x2))≤KdX(x1,x2)

d_Y(f(x_1,x_2)) \le Kd_X(x1,x2) 参考wiki

有限微分近似算法主要是基于导数定义,在给定点x处给定一个无限小的改动,看函数的变化。

前向微分

定义:

∂f(x)∂xi≈f(x+ϵei)−f(x)ϵ

\frac{\partial f(x)}{\partial x_i} \approx \frac{f(x+\epsilon e_i)-f(x)}{\epsilon}
对于n维的向量,需要计算量为(n+1)

方法推导

根据泰勒公式:

f(x+p)=f(x)+∇f(x)Tp+12pT∇2f(x+tp)p

f(x+p)=f(x) + \nabla f(x)^Tp+\frac 12 p^T\nabla ^2 f(x+tp)p
假设 ||∇2f(x)||≤L ||\nabla^2f(x)|| \le L,L在一定范围内,则有

||f(x+p)−f(x)−∇f(x)Tp||≤(L/2)||p||2

||f(x+p)-f(x)-\nabla f(x)^Tp||\le (L/2)||p||^2,此时令 p=ϵei p=\epsilon e_i,代入可以得到

∂f(x)∂xi≈f(x+ϵei)−f(x)ϵ+δ ;δ≤(L/2)ϵ

\frac{\partial f(x)}{\partial x_i} \approx \frac{f(x+\epsilon e_i)-f(x)}{\epsilon} + \delta \ ; \delta \le (L/2)\epsilon
可见误差和无限小的改动相关。

在用计算机解决问题时,需要注意的是计算机浮点数本身就会有误差,例如对于double类型,该误差为u=1.1*10^(-16)。此时 ϵ=u√ \epsilon=\sqrt{u}会得到最优的结果

中心微分方法

定义

∂f∂xi≈f(x+ϵei)−f(x−ϵei)2ϵ

\frac{\partial f}{\partial x_i} \approx \frac{f(x+\epsilon e_i)-f(x-\epsilon e_i)}{2\epsilon}
对于N维向量,需要进行(2N+1)次运算

方法推导

该方法的基础就是函数必须能保证二级导数存在并且满足Lipschitz连续,此时根据泰勒公式

f(x+p)=f(x)+∇f(x)Tp+12pT∇2f(x+tp)p

f(x+p)=f(x) + \nabla f(x)^Tp+\frac 12 p^T\nabla ^2 f(x+tp)p
变换后有

f(x+p)=f(x)+∇f(x)Tp+12pT∇2f(x)p+O(||p||3)

f(x+p)=f(x) + \nabla f(x)^Tp+\frac 12 p^T\nabla ^2 f(x)p + O(||p||^3)
代入 p=ϵei和p=−ϵei p=\epsilon e_i和p=-\epsilon e_i,可以得到

f(x+ϵei)=f(x)+ϵ∂f(x)∂xi+12ϵ2∂2f∂x2i+O(||ϵ||3)

f(x+\epsilon e_i)=f(x) + \epsilon \frac{\partial f(x)}{\partial x_i}+\frac 12 \epsilon^2 \frac{\partial ^2f}{\partial x_i^2}+O(||\epsilon||^3)

f(x−ϵei)=f(x)−ϵ∂f(x)∂xi+12ϵ2∂2f∂x2i+O(||ϵ||3)

f(x-\epsilon e_i)=f(x) - \epsilon \frac{\partial f(x)}{\partial x_i}+\frac 12 \epsilon^2 \frac{\partial ^2f}{\partial x_i^2}+O(||\epsilon||^3)
两个等式相减,同时两端同时除以 ϵ \epsilon可以得到

∂f∂xi≈f(x+ϵei)−f(x−ϵei)2ϵ+O(ϵ2)

\frac{\partial f}{\partial x_i} \approx \frac{f(x+\epsilon e_i)-f(x-\epsilon e_i)}{2\epsilon} + O(\epsilon^2)
可见相比于前向微分,它的误差变成 O(ϵ2) O(\epsilon^2)。考虑到计算机的精度问题,参数 ϵ=u1/3 \epsilon=u^{1/3}最优。

应用

雅克比矩阵(Jacobian)

定义,对于函数向量r: Rn→Rm R^n \rightarrow R^m,雅克比矩阵就是每一个函数对x求导得到的矩阵

J(x)=⎡⎣⎢⎢⎢⎢⎢∇r1(x)T∇r2(x)T...∇rm(x)T⎤⎦⎥⎥⎥⎥⎥

J(x)=\begin{bmatrix} \nabla r_1(x)^T \\ \nabla r_2(x)^T \\ ... \\ \nabla r_m(x)^T \end{bmatrix}
根据有限微分的定义可以扩展到函数向量上

∂r(x)∂xi≈r(x+ϵei)−r(x)ϵ

\frac{\partial r(x)}{\partial x_i} \approx \frac{r(x+\epsilon e_i)-r(x)}{\epsilon}此时计算一次可以得到矩阵的一列。
对于某些稀疏的矩阵,可以将不相交的变量进行分类,一次计算可以得到多列。

Hessian矩阵

Hessian矩阵是对称的,如果按照优先微分的方法得到的Hessian矩阵可能不是对称的,可以通过对称位置取平均的方法。
对于很多重要的算法,需要求解的是Hessian和某向量的乘积,根据泰勒公式有

∇f(x+ϵp)=∇f(x)+ϵ∇2f(x)Tp+O(||ϵ||3)

\nabla f(x+\epsilon p)=\nabla f(x) + \epsilon \nabla ^2f(x)^Tp+O(||\epsilon||^3),从而有

∇2f(x)Tp≈∇f(x+ϵp)−∇f(x)ϵ

\nabla ^2f(x)^Tp \approx \frac {\nabla f(x+\epsilon p)-\nabla f(x)}{\epsilon},由于一阶导数可以得到,因此可以计算得到Hessian和某向量的乘积。

如果需要计算Hessian矩阵本身,则根据

f(x+p)=f(x)+∇f(x)Tp+12pT∇2f(x)p+O(||p||3)

f(x+p)=f(x) + \nabla f(x)^Tp+\frac 12 p^T\nabla ^2 f(x)p + O(||p||^3)
代入 p=ϵei ;p=ϵej ;p=ϵ(ei+ej) p=\epsilon e_i \ ;p=\epsilon e_j\ ; p=\epsilon (e_i+e_j)推导可以得到

∂2f∂xi∂xj≈f(x+ϵei+ϵej)−f(x−ϵei)−f(x−ϵej)−f(x)ϵ2+O(ϵ)

\frac{\partial^2 f}{\partial x_i \partial x_j} \approx \frac{f(x+\epsilon e_i + \epsilon e_j)-f(x-\epsilon e_i)-f(x-\epsilon e_j)-f(x)}{\epsilon^2} + O(\epsilon)

对于稀疏的Hessian矩阵,可以利用Hessian对称原理得到高效算法。

自动微分方法

根据前面的介绍,自动微分方法的主要思路是将复杂函数分解成简单函数的简单运算,然后合成最终的结果。主要有前向模式和后向模式,分别介绍如下。
在进行算法之前,一般需要将复杂函数表示成简单函数以及运算的有向无环图,例如: f(x)=(x1x2sinx3+ex1x2)/x3 f(x)=(x_1x_2\sin x_3+e^{x_1x_2})/x_3,可以表示为

图示为

在实际应用中不需要人工构建该图。

前向模式

从前向后依次计算各个节点对目标节点的导数,思路是链式规则。
例如

∇x7=∂x7∂x4∇x4+∂x7∂x5∇x5

\nabla x_7=\frac{\partial x_7}{\partial x_4}\nabla x_4+\frac{\partial x_7}{\partial x_5}\nabla x_5
如果计算了所有的 ∇xi \nabla x_i则最终的结果 ∇x9 \nabla x_9

后向模式

和前向模式相反,根据节点的孩子节点计算得到该节点的导数,BP算法和图置信传播都是利用该思想。

∂f∂xi=∑j a child ofi∂f∂xj∂xj∂xi

\frac{\partial f}{\partial x_i}=\sum_{j \ a \ child \ of i} {\frac{\partial f}{\partial x_j} \frac{\partial x_j}{\partial x_i}}

对比

  1. 对于结果是实数的函数,即 f:Rn→R f: R^n \rightarrow R,此时后向方式效率更高,对于函数向量,即 f:Rn→Rm f: R^n \rightarrow R^m,两者效率差不多
  2. 对于存储空间,后向模式需要保存所有的中间导数结果,可以通过一些优化算法进行优化,例如check pointing

总结

通过该小结的学习,可以了解到
1. 常见计算导数的方法
2. 有限微分原理和可选方法
3. 自动微分原理和可选方法
4. 应用到计算梯度、雅克比矩阵或者Hessian矩阵,以及稀疏情况下如何优化。

数值优化(Numerical Optimization)学习系列-计算导数(Calculating Derivatives)相关推荐

  1. 深度学习核心技术精讲100篇(二十三)-深度学习系列计算广告与推荐系统有哪些区别?使用的主流模型有哪些?

    计算广告与推荐系统有哪些区别? 这两个领域的联系大于区别,区别的根本在于两个领域尝试解决的问题是不同的. 对于计算广告来说,本质上要处理的是三方利益的协调问题,这三方分别是广告主.用户和媒体. 对于推 ...

  2. 经典数值优化算法--专题学习

    通用的损失函数最优化的数值方法,来源于泰勒展开式,多元函数的泰勒展开式为: 一.一阶逼近与一阶方法 一阶泰勒展开式: 其中,是代表了β变化的可能性,t在之后说到的梯度下降方法中演变成了学习速率. 现在 ...

  3. Caffe 学习系列

    学习列表: Google protocol buffer在windows下的编译 caffe windows 学习第一步:编译和安装(vs2012+win 64) caffe windows学习:第一 ...

  4. 数值优化(Numerical Optimization)学习系列-文件夹

    概述 数值优化对于最优化问题提供了一种迭代算法思路,通过迭代逐渐接近最优解,分别对无约束最优化问题和带约束最优化问题进行求解. 该系列教程能够參考的资料有 1. <Numerical Optim ...

  5. 数值优化(Numerical Optimization)学习系列-目录

    概述 数值优化对于最优化问题提供了一种迭代算法思路,通过迭代逐渐接近最优解,分别对无约束最优化问题和带约束最优化问题进行求解. 该系列教程可以参考的资料有 1. <Numerical Optim ...

  6. 数值优化(Numerical Optimization)学习系列-惩罚和增广拉格朗日方法(Augmented Lagrangian Methods)

    原文地址为: 数值优化(Numerical Optimization)学习系列-惩罚和增广拉格朗日方法(Augmented Lagrangian Methods) 概述 求解带约束的最优化问题,一类很 ...

  7. 复旦大学吴立德《数值优化》、《深度学习》和

    http://i.youku.com/i/UNjAzMzA4NjQ=/playlists?spm=a2hzp.8253869.0.0 [1]复旦大学吴立德教授讲授的<数值优化>. 使用教材 ...

  8. 吴恩达deeplearning.ai系列课程笔记+编程作业(6)第二课 改善深层神经网络-第二周:优化算法 (Optimization algorithms)

    第二门课 改善深层神经网络:超参数调试.正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and ...

  9. Caffe学习系列(8):solver优化方法

    Caffe学习系列(8):solver优化方法 上文提到,到目前为止,caffe总共提供了六种优化方法: Stochastic Gradient Descent (type: "SGD&qu ...

最新文章

  1. LaTex中的任意以及存在符号以及{}
  2. 紧急更新下降难度,《王者荣耀》绝悟 AI 难倒一片玩家
  3. Kali Linux渗透测试实战 2.2 操作系统指纹识别
  4. 《Java 核心技术卷1 第10版》学习笔记------ Object类的 hashCode 方法
  5. php网站搭建致命错误203终止,PHP致命错误:无法重新分配$this
  6. ASPxGridView 结合CheckBox实现多选(在后台事件代码控制)
  7. iOS菜鸟之AFN的二次封装
  8. Kudu :主键冲突 status=Already present: key already present
  9. oracle中自定义异常编号,Oracle自定义异常的使用
  10. Oracle日志切换及频率跟踪脚本
  11. 十三五规划中中国制造2025
  12. 如何快速开通微信商户现金红包
  13. 光子晶体的应用背景和研究历史
  14. AI转型中的思考和洞见
  15. 南通大学java期末_南通大学生学Java,掌握这20%知识点至关重要!
  16. Macbook Pro上运行windows to go
  17. Android上传图片到七牛云
  18. 根轨迹和系统参数的确定
  19. LAMPSECURITY: CTF8-20220522
  20. 07夯实基础之JavaEE基础

热门文章

  1. Google Service大全
  2. hql 字符串where语句_Hibernate HQL查询语句总结
  3. 在CF卡上安装Gentoo
  4. 专访轮子哥:我在微软「造轮子」,一不小心成了知乎大V
  5. 3W字带你C语言入门即精通-最新更新截至5.22
  6. JS阿拉伯数字转大写
  7. 字符串与JSON互转
  8. linux如何挂载swap分区,Linux挂载新硬盘和创建Swap分区的方法
  9. mysql数据库备份命令-mysqldump
  10. 51nod1989 竞赛表格