之前讲解逻辑回归模型之初就提到学透逻辑回归,有利于学习人工神经网络。因为BP神经网络的核心数学原理与逻辑回归模型一样,是梯度下降。
【阅读前提】:理解梯度下降的基本原理。如果需要补课,请参考《》。
【阅读提示】:本文从代码实现的视角推导BP算法的整个过程,请耐心读完本文,对理解深度学习有莫大帮助。
图1 本文在传统ANN专题中所处的章节位置
本文将从以下4个章节详细描述BP神经网络的数学模型及算法原理。
图2 三层BP网络
一、神经网络的数学标识
1、数学符号习惯
二层神经网络是最简单的BP网络结构,即1个隐藏层,1个输出层。实际BP网络可以有多个隐藏层。隐藏层越多,网络深度越深。为了简化公式推导过程,以如图2所示的3层BP网络为例,假设网络只有单个样本的输入来推导BP网络的梯度下降公式,之后再泛化到针对含有多个隐藏层的BP网络,有多个样本输入的情况。
建模前,统一数学符号习惯:
2、每层符号表示
为方便公式表示,假设当前只有1个样本,以下章节在根据特征x计算z与
暂时将上标
去除。到第四章多样本向量化时矩阵相乘的前提条件,再恢复上标
。
3、梯度下降总述
梯度下降算法的核心:每次迭代,需要为BP神经网络的每一层权值W[l]、偏置b[l],沿梯度下降方向计算其更新值W[l] := W[l]–
×dW[l]、b[l] := b[l] –
× db[l],l = 1, 2, … , L。权值与偏置经过多次迭代更新后,在某个取值上,代价函数J(w,b)最小,此时BP网络学会了从输入特征x到输出y之间的映射关系。
这个算法的关键是计算
,
,
。整个算法主要分为两大步骤:前向传播计算,反向传播计算。
前向传播负责根据输入特征,计算出预测值,及代价函数。计算公式如(1)~(4)所示,按照箭头从左到右一步一步计算。
【注】激活函数g(z)在公式中写成g [l](z[l])格式,是因为神经网络的每一层的激活函数可以是不一样的。
反向传播负责对代价函数求导,计算每一层权值(包括偏置)的微分。计算公式如(5)~(8)所示,按照箭头从右到左一步一步计算。
二、前向传播向量化
1、每层前向向量化
本节推导前向传播过程的向量化过程。去除上标
的单个样本表示为
其中,
其中,
其中,
2、前向传播规律
我们在计算神经网络的层数时,输入层是不算入总层数内的,但是如果把输入层当作是神经网络的第0层,将输入特征x当作是第0层的激活输出,即
,则公式(9)可以改写成
【注】:输入层被当作神经网络的第0层,第0层是没有权值W[0]和偏置b[0]的。
仔细观察每一层激活单元的2步工作:线性求和z[l],计算激活值a[l],能够发现以下三条规律:
1.1节数学符号习惯中,定义n[l]为第l层的隐藏单元数,结合图2,z[l]的秩为n[l]×1。
的秩与z[l]一样,为n[l]×1。
三、反向传播向量化
1、每层反向向量化
本节推导反向传播过程的向量化过程。目标是计算出每层的
,
因为
,在这个关系中z[3]是自变量,所以:
公式(18)、(19)的公共部分(用蓝底标识)正好是dz[3],即
而
,所以:
将(20)、(21)代入到公式(18),(22)、(20)代入到公式(19),则:
因为
,在这个关系中,将
当作自变量。而
,在这个关系中,z[2]是自变量,所以:
公式(25)、(26)的公共部分(用绿底标识)正好是dz[2],即
而
,所以:
将(27)、(28)代入到公式(25),(27)、(29)代入到公式(26),则:
,在这个关系中,将
当作自变量。而
,在这个关系中,z[1]是自变量,所以
公式(32)、(33)的公共部分(用紫底标识)正好是dz[1],即
而
,将输入层看成是BP网络的第0层,则
。替换x后,
,则公式(32)、(33)最终为:
2、反向传播规律
(1)dW[l]与db[l]的计算规律
由公式(23)、(24)、 (30)、(31) 、(35)、(36),得到规律:
【注】:这里
是矩阵,而非一个数值,两个矩阵相乘必须满足:左矩阵的列秩必须等于右矩阵的行秩。
2.2节前向传播规律中,各矩阵的秩满足如下规律:
由上述秩的规律,来检验公式(37)是否满足2个矩阵相乘,左矩阵列秩=右矩阵的行秩的条件。
而公式(37)中矩阵相乘的前提条件,等号的右边是dz[l]×a[l-1],即n[l]×1的矩阵与n[l-1]×1的矩阵相乘,左矩阵dz[l]的列秩为1,右矩阵a[l-1]的行秩为n[l-1],两者不相等,不能相乘。这2个矩阵如果要相乘,只有2种情况:
公式(37)等号的左边是dW[l],是一个n[l]×n[l-1]的矩阵。所以,希望该公式等号的右边也是一个n[l]×n[l-1]的矩阵。显然,应该选择情况一,所以公式(37)应该修正为公式(39)
(2)dz[l]的计算规律
公式(37)、(38)中,a[l-1]可以通过前向传播计算求得,dz[l]如何求得,有什么规律?本小节将详细推导dz[l]的计算规律。
因为
,所以
是第三层激活函数的导数,将其带入到公式(20),则:
因为
,所以
是第二层激活函数的导数,将其带入到公式(27),则:
公式(42)蓝底部分就是公式(20),即dz[3]。
因为z[3] = W[3]a[2]+ b[3],则:
将公式(43)、(20)代入到公式(42),则:
上式中,将矩阵的秩写在下面,根据矩阵相乘,左矩阵列秩=右矩阵行秩序的关系,上式修正为
其中×是矩阵行列式相乘的符号,*是两个矩阵对应元素相乘的符号。
因为
,所以
是第一层激活函数的导数,将其带入到公式(34),则:
公式(46)绿底部分就是公式(27),即dz[2]。
因为
,则:
将公式(47)、(27)代入到公式(46),则:
同理,根据矩阵相乘,矩阵对应元素相乘的条件,上式修正为:
dz[l]的计算规律总结:
假设BP网络的总层数是L层,由公式(40)、(44)、(48)得到如下2条规律:
BP网络最后一层的dz[L],除了与最后一层激活函数有关,也与损失函数Loss有关。
四、多样本向量化
第2节、第3节是以单个样本作为BP网络的输入,推导了BP网络前向传播、反向传播的公式规律。在公式推导的过程中,为了防止与层数上标
混淆,暂时将样本的上标
去除。本章开始泛化到多个样本作为BP网络输入的情况。
1、多样本符号表示
多个样本作为BP网络的输入,则BP网络输入特征可表示为如下格式:
其中,某个样本x(i)的特征向量为
,则特征矩阵x的秩是n[0]×M。n[0]是BP网络输入层(即第0层)的单元的个数。
例如:图2所示的三层神经网络,如果输入样本一共10个,则网络输入层(即第0层)的特征矩阵为
多个样本作为BP网络的输入,第l层隐藏层的线性输出为:
其中,某个样本i在第l层隐藏层的线性输出向量为
(i=1, 2, …, M)(l=1, 2, …, L),
则第l层隐藏层的线性输出矩阵Z[l]的秩是n[l]×M。n[l]是BP网络第l层隐藏单元的个数。
例如:图2所示的三层神经网络,如果输入样本一共10个,则网络第1层线性输出矩阵为
,
网络第2层线性输出矩阵为:
。
多个样本作为BP网络的输入,第l层隐藏层的输出为:
其中,某个样本i在第l层隐藏层的输出为:
(i=1, 2, …, M)(l=1, 2, …, L),
则第l层隐藏层的输出矩阵A[l]的秩是n[l]×M。n[l]是BP网络第l层隐藏单元的个数。
例如:图2所示的三层神经网络,如果输入样本一共10个,则网络第1层输出矩阵为
,
网络第2层的输出矩阵为
。
2、多样本BP算法
(1)多样本前向传播规律
根据2.2节前向传播规律中总结的公式(16)与(17),结合4.1节多样本符号表示,则当有多个样本输入到BP网络时,前向传播的3条规律为:
其中,Rank(Z[l])=n[l]×M,
Rank(W[l])= n[l]×n[l-1],
Rank(A[l-1])= n[l-1]×M,
Rank(b[l])= n[l]×1。
检查公式(54)等号左右的秩,等号右边W[l]与A[l-1]相乘结果是一个n[l]×M的矩阵;再加一个n[l]×1的列向量b[l]。
【问题】行秩相等的一个矩阵与一个列向量如何相加?
实际上,对于每个样本,在第l层隐藏层,W[l]与A[l-1]相乘后,相加的偏置b[l](i)是一个常向量,即
在公式(54)中,希望b[l]复制M份,然后形成n[l]×M的矩阵
,再与W[l]A[l-1]相乘的结果形成的矩阵,逐元素相加。相加后的结果n[l]×M,公式(54)等号两边秩相等。
上述扩展列向量b[l]的过程由的广播机制()[2]完成的。在编码时,直接按照公式(54)写计算式赋值给Z[l]是不会报错的。所以,在后续文章中,遇到类似公式(54)这样行秩相等的一个矩阵与一个列向量相加的情况,都维持原样。
检查公式(55)等号两边的秩,都是n[l]×M。
最后一层,即输出层的预测值
(2)多样本反向传播规律
根据3.2节反向传播规律中总结的公式(38)、(39)、(49)与(50),结合4.1节多样本符号表示,则当有多个样本输入到BP网络时,反向传播的4条规律为:
其中×是矩阵行列式相乘的符号,*是两个矩阵对应元素相乘的符号。公式(57)等号两边的秩相等。
BP网络最后一层的dZ[L],除了与最后一层激活函数有关,也与损失函数Loss有关。
与单个样本的公式(39)相比,为何多个样本的公式(59)需要除以M?假设
:
当输入为单个样本的特征向量时,β00的数值是由列向量中
中的0位元素,与行向量
中的0位元素相乘的结果,符合单个样本推导的公式(39)的结论。
当输入为M个样本的特征矩阵时。根据矩阵相乘原理,β00的数值是由矩阵
中的所有0行的元素,与矩阵
中对应颜色0列的元素相乘求和的结果。β00为M个数值的和,即M个样本都对β00做了贡献,M越大,β00越大,所以要对M个样本贡献的求和结果β00求平均。
所以多样本向量化结果,公式(59)等号右边需要对M求平均。
与单个样本的公式(38)相比,因为M个样本对偏置微分的贡献,所以需要对M求平均。np.sum(X, axis=1)是的模块 numpy的API[2],对矩阵X沿着行的维度求和。
虽然Rank(dZ[l])=n[l]×M,但是经过np.sum ()沿着行的维度求和后,Rank[np.sum(dZ[l],axis=1)] =n[l]×1。
五、结束语
至此,BP神经网的算法全部讲解完毕。
【预告】下一篇文章将介绍“BP神经网络的实现”,用代码实现一个BP网络,用代码解释本文提到的各公式。
六、参考文献
1、雪梨姐 《》
2、的官方文档:
3、吴恩达《深度学习》
对作者所写文章有兴趣,可继续关注公众号:点金要术(),或扫描下面的二维码。也欢迎读者朋友在互联网上分享你认为有帮助的文章。