Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /www/wwwroot/blog/wp-content/plugins/UEditor-KityFormula-for-wordpress/main.php on line 13
【机器学习】神经网络中前向传播,反向传播公式推导 – Machine World

【背景】

        从深入了解了当前流行机器学习算法之后,我们可以总结出,一个机器学习算法其实只有两部分:

1、Model <-> Hypothesis <-> 从输入特征x预测输出y的函数h(x)

2、Costfunction  <-> Objectfuntion <-> 目标函数/损失函数(虽然在深度学习领域这两个函数定义还有所不同,但从机器学习领域这两个函数我们不做过多的分界)

        知道机器学习这两个关键部分,我们要介绍一个算法(机器学习), 只需要列出这两个函数就可以了。

        机器学习的的本质是利用优化算法(Grandient Descent / Grandient Ascent)来针对目标函数/损失函数进行优化,从而能找到一个局部最优值。而这些局部最优值(模型参数)就组成了我们的Model.

        在机器学习中,算法往往不是关键,真正的关键之处在于特征选取,选取特征需要我们人类对问题的深刻理解,经验、思考。(What 's the Model we need? )即我们需要的Model是一个Linear Regression问题解法,Or Logist Regression even more?

        在机器学习有这么一个算法:深度学习。其一个优势就是它能自动学习到应该提取什么特征,从而使算法不那么依赖人类,这是神经网络暴露在当今人类视野中的一个方面,但也是让人感觉到一股玄学之所在面。

【神经网络基础】

计算机中的神经网络可以说是仿真人脑的神经单元的应用。与初中生物学习的神经单元结构类似。两者对比图如下所示:

1.png

image.png

        感知机和神经元本质上是一样的,只不过我们说感知机的时候,它的激活函数是阶跃函数,当我们说神经元时,激活函数往往选择为sigmoid函数或tanh函数。计算某个神经元输出的方法和计算一个感知机的输出是一样的。假设神经元的输入是向量x,权重向量是ω(其中偏置项是ω0),激活函数是sigmoid函数,则其输出y:

y=sigmoid(ωTx)(1)

其中sigmoid函数定义如下:

sigmoid(x)=11+ex

将sigmoid函数代入式(1):

y=11+eωTx

sigmoid函数是一个非线性函数,其值域是(0, 1)。函数图像如下图所示:

image.png

sigmoid函数的导数是:

y=y(1y)

【神经网络架构】

        神经网络就是按照一定规则连接起来的多个神经元,以下图全连接神经网络(Full connected, FC)为例对神经网络的架构进行说明。

QQ图片20191013154741.png

  • 神经元按层来布局,最左边的层叫做输入层,负责接收输入数据,最右边的层叫做输出层,我们可以从这层获取神经网络输出数据。输入层和输出层之间的层叫做隐藏层,因为它们对于外部来说是不可见的

  • 同一层神经元之间没有连接

  • 第N层的每个神经元和第N-1层的所有神经元相连(Full Conneted),第N-1层神经元的输出就是第N层神经元的输入求和(summation).

  • 每个连接都有一个权值(Weight)

【全连接网络前向传播】

        从全局上看,神经网络实际上就是一个输入向量x到输出向量y 的函数,即:

y=fmodel(x)

        以神经元为单位上来看,欲计算整个神经网络模型fmodel,需要利用输入向量x来求出下一层隐藏层(n+1)中每一个神经元的输出值,然后再用这些输出值作为再下一层隐藏层(n+2)层的输入求出该层的每一个神经元输出值,依此递推直到求出输出层的输出值。即为我们的输出向量y

举例说明:

以上图全连接网络的前向传播进行介绍。我们人为地给神经网络编号。以及进行数学符号量化。

image.png

(笔者用VISIO制图,_后的数字代表下标如w_41代表ω41)

结构说明:

        上图中我们以单个数字对神经元进行编号,如图,1,2,3号神经元是输入层的三个节点,4,5,6为隐藏层的三个节点,7,8为输出层的两个节点。全神经网络的性质显而易见:每个节点都与上一层的节点进行连接,如节点4同时与1,2,3节点进行连接。其连接线路(权重)为ω41,ω42,ω43。那么欲求节点4的输出o4。我们用到如下式子。(输入层的输出即为x

1:sum=x1w41+x2w42+x3w432o4:o4=sigmoid(sum)

为了使式子更直观,我们将式子向量化表示:于是得出式子:

o4=sigmoid(wTx)

从这个式子可以延伸出两种情况:

1、若全连接网络中只有一层隐藏层,则:

{onhidden=sigmoid(wTx)(1)y=sigmoid(wTon1hidden)(2)

2、若全连接网络中有多层隐藏层,则:

{onh1=sigmoid(w1Tx)m==1onhm=sigmoid(wmTom)m>1y=sigmoid(wlastTolast)m==last+1

这两条式子则为神经网络的前向传播公式。

因为神经网络的特殊性质,我们知道,神经元的参数传递很大程度可以递归求解。给我们计算机编程带来了便利性。

【全连接网络反向传播】

        神经网络的训练就是需要知道一个神经网络的每个连接上的权值是如何知道的,我们可以说神经网络就是一个模型,那么这些权值就是模型中的参数,也就是模型要学习的东西,然而,一个神经网络的连接方式、网络的层数、每层的节点数这些参数,则不是模型学习出来的,而是人为事先设置的,对于这些认为设置的参数,我们称之为超参数(Hyper-Parameters)。而得出模型参数的方法(神经网络的训练算法)就是我们接下来推导的反向传播算法。前后结合,我们还是利用前向传播中的全连接网络进行公式推导。结合前文,我们使用监督学习为例来解释。并且图中每个神经元的激活函数为sigmoid函数。而不同的激活函数计算公式不同。!!!

我们假设每个训练样本为(x,t),其中向量x是训练样本的特征,而t是样本的目标值。

一个反向传播算法流程基本如下:

1、我们使用前向传播算法,用样本的特征x,计算出每个隐藏层节点的输出oi, 以及输出层每个节点的输出yi.

2、我们按照下面公式计算出每个节点的误差项δi:

2.1、那么对于输出层节点i:

δi=yi(1yi)(tiyi)(1)

        其中,δi是节点i的误差项,yi是节点i的输出项,ti是样本对于节点i的目标值。举个例子,根据上图,对于输出层节点7来说。它的输出值为y1,而样本的目标值是t1,带入上面的公式得到节点7的误差项δ7应该是:

δ7=y1(1y1)(t1y1)

2.2、对于隐藏层节点,

δi=ai(1ai)koutputswkiδk(2)

        其中,ai是节点i的输出值,wki是节点i到它的下一层节点k的连接权重,δk是节点i的下一层节点k的误差项,例如对于隐藏层节点4来说,计算方法如下:

δ4=a4(1a4)i4thoutputsw4iδ4

3、最后,更新每个连接上的权值:

 wjiwji+ηδjxji(3)

        其中, wji是节点 i到节点 j的权重, η是学习速率的常数(超参数), δj是节点 j的误差项, xji是节点 i传递给节点 j的输入,例如,权重 w84的更新方法如下:

 w84w84+ηδ8a4

        从反向传播的计算过程中,我们直到,这个过程是通过正向传播的结果逆向利用梯度求导的一个流程。故名反向传播。其本质还是利用之前提及的梯度上升/下降进行优化 w 而得出的局部最优解。

下文,我们针对本节提及的三条式子进行推导。

【全连接网络反向传播关键公式推导】

反向传播算法是链式求导法则的应用。

按照机器学习的通用套路,我们先确定神经网络的目标函数,然后用随机梯度下降优化算法取求目标函数最小值时的参数值。

我们取网络所有输出层节点的误差平方和作为目标函数:

Ed12ioutputs(tiyi)2

其中, Ed表示样本d的误差。

接着,我们对目标函数用随机梯度下降算法对目标函数进行优化:

 wji=wjiηEdwji

我们看图:

image.png

在图中我们得知wji仅能通过影响节点j的输入值影响网络的其他部分,在此我们设netj是节点j的加权输入,即:

net=wjxj=iwjixji

Ednetj的函数,netjwji的函数,根据链式求导法则,可以得到:

Edwji=Ednetjnetjwji=Ednetjiwjixjiwji=Ednetjxji

化简后的结果中xji是节点i传递给节点的值,对于j是输入值,对于i是输出值。

而对于Ednetj的推导,需要区分输出层和隐藏层两种情况。

case 1、输出层权值训练

对于输出层,netj仅能通过节点j的输入值yj来影响网络的其他部分,也就是说Edyj的函数,而yjnetj的函数,其中yj=sigmoid(netj)。所以我们再次利用链式求导法则得出:

Ednetj=Edyjyjnetj

对于Edyj:

Edyj=yj12ioutputs(tiyi)2=yj12(tjyj)2=(tjyj)

对于yjnetj

yjnetj=sigmoid(netj)netj=yj(1yj)

将上述推导结果代入,得:

Ednetj=(tjyj)yj(1yJ)

δj=Ednetj,也就是一个节点的误差项δ是网络误差对这个节点输入的偏导数的相反数,带入上式,得:

δj=(tjyj)yj(1yj)1 

将上述推导代入SGD(随机梯度下降公式),得:

wji=←wjiηEdwji=wji+η(tjyj)yj(1yj)xji=wji+ηδjxji2

case2、对于隐藏层:

我们事先定义j的所有直接下游节点集合D(j),下游节点是指与节点j的输出层直接相邻的节点。这样我们根据图解可知。netj只能通过影响D(j)再影响Ed。设netk是节点j的下游节点的输入,则Ednetk的函数,而netknetj的函数。而netk有多个,我们应用全导数公式,做出下列推导。

Ednetj=kD(j)EdnetkEdnetk=kD(j)δnetknetj=kD(j)δknetkajajnetj=kD(j)δkwkjajnetj=kD(j)δwkjaj(1aj)=aj(1aj)kD(j)δkwkj

同样δj=Ednetj,带入上式:

δj=aj(1aj)kD(j)δkwkj3

【总结】

        我们利用数学原理对神经网络进行了一次推导,但计算机对于真正意义上的仿真还存在一定的距离。但要真正踏入深度学习领域的大门,还有很长的路子要走。

【参考文献】

作者 WellLee

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注