搞懂深度学习到底须要哪些数学知识

IT互联网行业有个有趣现象,玩资本的人、玩产品的人、玩技术的人都能很好的在这个行业找到本身的位置并取得成功,并且能够只懂其中同样,不须要懂其他两样。玩技术的人是里面最难作的,也是三者收益最低的,永远都要不停学习,不停把画饼变成煎饼。web

在今年5月底,Alphago又打败了围棋世界冠军柯洁,AI再次呈现燎原之势席卷科技行业,吸引了众多架构师对这个领域技术发展的持续关注和学习,思考AI如何作工程化,如何把咱们系统的应用架构、中间件分布式架构、大数据架构跟AI相结合,面向什么样的应用场景落地,对将来作好技术上的规划和布局。算法

以前发表过一篇文章《如何用70行Java代码实现深度神经网络算法》(点击「阅读原文」得到文章),记录了深度神经网络的计算过程和程序实现,本文再进一步研究一下背后的数学原理。数据库

为了完全理解深度学习,咱们到底须要掌握哪些数学知识呢?常常看到会列出一系列数学科目:微积分、线性代数、几率论、复变函数、数值计算等等。这些数学知识有相关性,但实际上这是一个最大化的知识范围,学习成本会很是久,本文尝试概括理解深度学习所须要的最小化数学知识和推导过程。数组

(如下根据做者的学习理解整理,有误之处,欢迎专家学者提出指导批评)。网络

多层神经网络的函数构成关系

多层神经网络从输入层,跨多个隐含层,到最后输出层计算偏差,从数学上能够看作一系列函数的嵌套组合而成,上一层函数输出作为下一层函数输入,以下图1所示。架构

在这里插入图片描述

先从偏差函数提及,深度学习的偏差函数有典型的差平方函数,也有交叉熵函数,本文以差平方函数为例:app

在这里插入图片描述

Tj表明每一个神经元目标值,Oj表明每一个神经元输出值框架

这里Oj=f(Zj),f是激活函数,通常是s函数:
在这里插入图片描述分布式

或者relu函数:svg

在这里插入图片描述

Zj是线性函数(Wij泛指i层和j层节点链接权重,bj泛指j层节点截距):

在这里插入图片描述

Oi再往前依次类推,整个神经网络均可以由上面的函数嵌套去表达。

如今咱们的问题是,如何经过屡次调整上面的Wij和bj,能让偏差函数E达到最小值?

在这里插入图片描述

换言之,上面这个变量w和变量b应该怎么取值才能达到效果呢?为了回答这个问题,咱们先看看偏差函数的几何意义。

偏差函数的几何意义及梯度降低

为了方便看懂,咱们从二维和三维去理解偏差函数,若是输出值Oj只有一项,并设定Tj=1,那么Oj和偏差函数E恰好构成X,Y的坐标关系如图2所示:
在这里插入图片描述

也就是Oj只有一项的时候,偏差函数E恰好就是一个简单的抛物线,能够看到它的底部在O=1的时候,这时E=0最小值。

那么,当O不等于1的时候,咱们须要一种方法调整O,让O像一个小球同样,把抛物线看作碗,它沿着碗切面向下滚动,越过底部因为重力做用又返回,直到在底部的位置中止不动。什么方法能达到这样神奇的效果呢,就是数学家发明的导数,若是O每次减去一个导数的步长,在离底部远的地方,导数对应的正切值就大,降低就快,离底部近的地方,导数正切值就小,降低就慢,在底部O=1这个点导数为0,再也不降低,而且越过底部后,导数的正切值变负数,因而又调整了它的方向,恰好达到重力同样的效果。咱们把这种方法取个难懂的名字,叫作梯度降低。

再看看三维的几何意义,假设输出值为O1,O2两项,并设定T1=1,T2=1那么O1,O2和偏差函数E恰好构成X,Y,Z的坐标关系如图3所示:

在这里插入图片描述

在这里插入图片描述

任意给定一个X,Y值,经过函数E计算获得一个Z值,造成一个三维曲面,最小值在谷底。咱们继续使用上面的梯度降低方法,会产生一个问题,如今的变量是O1,O2两项,到底使用哪一个求导数呢?根据上面的几何图形能够看到,若是O1,O2轴同时往谷底方向降低,那么E能达到最小值,能够试想O2等于一个常数,就至关于一个O1和E构成的二维截面,采用上面的方法减去O1导数的步长就能获得O1的变化量,一样将O1等于一个常数,能获得O2和E构成的二维截面,并求得O2的变化量。这种将其余变量视为常数,而只对当前变量求导的方法叫求偏导。

从上面得知对二元函数z=f(x,y)的梯度降低求法,是对每一个X,Y求偏导,那么对于多元函数呢,也是同样的求法,只是多维世界的几何图形就很难表达了,由于咱们生活在三维世界,很难想像出克莱因瓶这样的四维世界,瓶底经过第四维空间穿过瓶身去和瓶口相连,人类的眼睛也只能看到三维世界,世界上的三维物体可否经过第四维通道传送到另一个位置上去呢,看上去像这个物体消失了,在其余地方又忽然出现了,跑题了,言归正传。

因为导数的特色是到一个谷底就为0了,也就是不变化了,因此梯度降低求法有可能只到一个山窝里,没有到达最深的谷底,有局部最小值的缺陷,因此咱们要不停调整初始参数,和进行屡次的训练摸索,争取能碰到一个到达谷底的最好效果。

如今还有个问题,这里是以O为变量来解释梯度降低求法,可是其实咱们要求的是Wij和bj的调整值,根据上面的结论,咱们能够经过偏差函数E对Wij和bj求偏导获得,步长为本身设置的一个常数,以下:

在这里插入图片描述

那么如何求呢,经过前面的第一部分的神经网络函数构成关系,Wij和bj到偏差函数E是一个多层嵌套的函数关系,这里须要用到复合函数的求偏导方法,截至这里,咱们理解了数学原理,再结合下面所用到的数学公式,就构成了推导所须要的最小化数学知识。

推导须要的数学公式

一、复合函数求偏导公式

在这里插入图片描述

二、导数四则运算公式

在这里插入图片描述

三、导数公式
在这里插入图片描述

咱们只要记住上面3组公式,就能够支持下面完整的推导了。

数学推导过程

先将多层神经网络转成一个数学问题定义,如图4所示:

在这里插入图片描述

一、对于输出层的权重Wij和截距bj,经过偏差函数E对Wij求偏导,因为函数E不能直接由Wij表达,咱们根据第1组的复合函数求偏导公式,能够表达成Oj和Zj对Wij求偏导的方式:

在这里插入图片描述

因为Zj是线性函数咱们是知道的

在这里插入图片描述

而且Oj是能够直接用Zj表达的:

在这里插入图片描述

因此E对Wij求偏导能够写成f(Zj)的导数表达,一样对bj求偏导也能够用f(Zj)的导数表达(记作推导公式一)

在这里插入图片描述

因为偏差函数E是能够直接用Oj表达的,咱们继续推导以下,根据第2组和第3组导数四则运算公式和导数公式:

在这里插入图片描述

最后获得一个只用f(Zj)的导数表达的通用公式,其中Oj是输出层的输出项,Oi是上一层的输出项:

在这里插入图片描述

从前面得知,Oj=f(Zj),f是激活函数,通常是s函数或者relu函数,咱们继续推导以下:

(1)若是激活函数是s函数,根据它的导数公式:

在这里插入图片描述

能够获得结论一(1),权重Wij和截距bj,的更新公式为:

在这里插入图片描述

(2)若是激活函数是relu函数,根据它的导数公式:

在这里插入图片描述

能够获得结论一(2),权重Wij和截距bj,的更新公式为:

在这里插入图片描述

二、除了对输出层的权重Wij和截距bj外,更广泛的隐含层权重Wki和截距bi更新应该如何去求呢?

咱们仍然用偏差函数E对Wki和bi求偏导,借助前面的推导公式一,能够获得

在这里插入图片描述

对于输出层来讲,偏差函数E能够直接用Oj表达,可是对于隐含层,偏差函数E并不能直接用Oi表达,根据多层神经网络的函数构成关系,我知道Oj能够经过Oi向前传递进行一系列函数组合获得的。

因为深度学习不必定是全链接,咱们假设Oi只和输出层j的s个节点相链接,下标记为j0到js,如上面图四所示,对于Oi来讲,只跟和它节点相链接的Oj构成函数关系,跟不相链接的Oj没有函数关系,因此咱们根据复合函数求偏导能够把不相链接的Oj视为常数。

而且,根据函数构成关系,Oi可直接构成Zjs,Zjs可直接构成Oj,根据复合函数求偏导公式的链式写法推导以下:

在这里插入图片描述

同时,对上式的Zjs来讲,偏差函数E对它求偏导,其他项能够视为常数:

在这里插入图片描述

因此,在上式的结果继续推导以下,能够彻底用E对Zjs的偏导数来表达:

在这里插入图片描述

如今咱们将偏差函数E对Zjs的偏导数记作输出层相连节点的偏差项,根据前面的推导公式一,在计算Wij更新值能够获得:
在这里插入图片描述

因此,隐含层的权重和截距更新,能够由输出层的偏差项获得,同理也适用于其余隐含层,均可以由它的后一层(nextlayer)的偏差项获得,下面是结论二,隐含层权重Wki和截距bi的更新公式为:

在这里插入图片描述

总结

经过掌握以上数学原理和推导,咱们就理解了深度学习为何要这样计算,接下来利用推导的结论一和结论二,能够完成深度学习的算法程序实现了,剩下的只是架构和工程化的问题。对卷积类的深度学习模型,为了下降训练复杂性,它的权重不少是相同的(权重共享),而且只和下一层部分神经元节点链接(局部链接),数学原理、计算方法、训练方式和上面是同样的,最终的模型结果都是获得一组参数,用该组参数保证偏差函数最接近最小值。

做者介绍:彭渊,资深架构师,在Java技术领域从业十多年,曾撰写多款开源软件,历任阿里资深专家,华为中间件首席架构师,淘宝高级专家等。开源表明做有Fourinone(四不像)分布式核心技术框架、CoolHash并行数据库引擎等,曾出版书籍《大规模分布式系统架构与设计实战》,拥有多项软件著做权和专利。